Wîkîferheng
kuwiktionary
https://ku.wiktionary.org/wiki/Destp%C3%AAk
MediaWiki 1.47.0-wmf.20
case-sensitive
Medya
Taybet
Gotûbêj
Bikarhêner
Gotûbêja bikarhêner
Wîkîferheng
Gotûbêja Wîkîferhengê
Wêne
Gotûbêja wêneyî
MediaWiki
Gotûbêja MediaWiki
Şablon
Gotûbêja şablonê
Alîkarî
Gotûbêja alîkariyê
Kategorî
Gotûbêja kategoriyê
Pêvek
Gotûbêja pêvekê
Nimînok
Gotûbêja nimînokê
Portal
Gotûbêja portalê
Tewandin
Gotûbêja tewandinê
Jinûvesazî
Gotûbêja jinûvesaziyê
TimedText
TimedText talk
Modul
Gotûbêja modulê
Event
Event talk
pênc
0
3195
6532044
6426624
2026-09-18T17:05:37Z
Wikihez
7344
Kurmancî/Hejmar: beşa «Etîmolojî» hate nûkirin (DefSideBoxes)
6532044
wikitext
text/x-wiki
{{h-bnr|penc|pênç}}
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{IPA|ku|/peːnd͡ʒ/}}
* {{deng|ku|LL-Q36163 (kmr)-Ebulfîda-pênc.wav|dever=Bidlîs}}
* {{ku-kîte}}
=== Hejmar ===
{{hejmar|ku}}, {{p-ya nerm}}
# [[hejmar]] [[5]] ([[V]])
==== Bi alfabeyên din ====
* {{ku-ar|پێنج}}
* {{ku-kr|пенщ}}
==== Jê ====
{{kol3|ku|cure=Jê
|pêncem
|pêncemî
|pêncemîn
|pêncemînî
|pêncî
|pêncşem
|pêncşemb
|pêncşembî
|pêncşemî
}}
==== Etîmolojî ====
{{etîmon|ku|:mîr|ine-pro:*pénkʷe|dar=1|metn=++}}
Hevreha soranî {{g|ckb|پێنج|tr=pênc}} / {{g|ckb|پهنج|tr=penc}}, hewramî [[penc]], zazakî [[panc]] / [[ponc]], belûçî {{g|bal|پنچ|tr=penç}}, mazenderanî ''penc'', parsî ''penc'', farisî {{g|fa|پنج|tr=penc}}, pehlewî ''penz'', tacikî [[панҷ]] (penc), avestayî [[𐬞𐬀𐬧𐬗𐬀]] (peṇçe-), sogdî ''penc-'', xwarezmî ''p'nç-'', peştûyî {{g|ps|پنځه|tr=pindzê}}, osetî [[фондз]] (fondz), sanskrîtî [[पञ्चन्]] (páñcan), hindî [[पाँच]] (paçe), urdûyî {{g|ur|پانچ|tr=pāñć}}, yûnanî [[πέντε]] (pêntê), albaniya kevn [[pensë]] (nû: [[pesë]]), lîtwanî [[penki]], tokarî A ''päñ'', tokarî B ''piś'', polonî [[pięć]], rusî [[пять]] (pyati), almanî [[fünf]] (p-ya {{ji|ine-pro|ku|-}} di cermenî de dibe "f"), danmarkî / norwecî / swêdî [[fem]], îngilîzî [[five]], holendî [[vijf]], latînî [[quinque]] (p-ya {{ji|ine-pro|ku|-}} gelek caran li destpêkê di latînî de dibe "k" > fransî [[cinq]], portugalî û spanî [[cinco]])...
<font style="font-size:10px">'''Çavkanî:''' [[Şablon:Horn|Horn p.73]], [[Şablon:Watkins|Watkins p.64]], [[Şablon:Etymonline|Etymonline]]</font>
==== Herwiha binêre ====
{{hejmar/ku}}
==== Bizelêv ====
* [[pênc]] in bi hev sênc in
==== Bi zaravayên din ====
* Kurmancî:
** Reşwî: [[pênc]] (hw [[pyênc]])
* Soranî: {{W-|ckb|پێنج}}
* {{Z|sdh}}: {{W-|sdh|penc|sc=Latn}}
* {{Z|lki}}: {{W-|lki|penc|sc=Latn}}
* Hewramî: {{W-|hac|penc|sc=Latn}}
* Zazakî: {{W+|zza|panc}}, {{W-|zza|ponc}}, {{W-|zza|panj}}
==== Werger ====
{{werger-ser}}
* {{Z|aiw}}: {{W-|aiw|dónq}}
* {{Z|abx}}: {{W-|abx|lima}}
* {{Z|abq}}: {{W-|abq|хвба}}
* {{Z|abl}}: {{W-|abl|lemou}}
* {{Z|ab}}: {{W-|ab|хуба|sc=Cyrl}}
* {{Z|ady}}: {{W-|ady|тфы}}
* {{Z|aa}}: {{W-|aa|konóy}}
* {{Z|af}}: {{W+|af|vyf}}
* {{Z|xag}}: {{W-|xag|𐕇𐕒}}
* {{Z|aho}}: {{W-|aho|𑜑𑜡}}
* {{Z|akm}}: {{W-|akm|kumugyĭ}}
* {{Z|ak}}: {{W-|ak|anum}}
* {{Z|akl}}: {{W-|akl|lima}}
* {{Z|akz}}: {{W-|akz|táɬɬàapi}}
* {{Z|sq}}: {{W+|sq|pesë}}
* {{Z|pdc}}: {{W-|pdc|fimf}}
* {{Z|de}}: {{W+|de|fünf}}
* {{Z|ems}}: {{W-|ems|talliman}}
* {{Z|am}}: {{W+|am|አምስት}} (numeral: {{W-|am|፭}})
* {{Z|ami}}: {{W-|ami|lima}}
* Apaçî:
*: {{Z|apw}}: {{W-|apw|ashdla'i}}
* {{Z|an}}: {{W-|an|cinco}}, {{W-|an|cinc}}
* {{Z|arc}}:
*: {{Z|aii}}: {{W-|aii|ܚܲܡܫܵܐ|tr=ḳāmša|n}}, {{W-|aii|ܚܲܡܸܫ|tr=ḳāmmeš|m}}
*: {{Z|syc}}: {{W-|syc|ܚܡܫܐ|n|tr=ḥamšā}}, {{W-|syc|ܚܡܫ|m|tr=ḥammeš}}
*: {{Z|tmr}}: {{W-|arc|חַמְשָׁא|n|tr=ḥamšā|sc=Hebr}}, {{W-|arc|חֲמֵשׁ|m|tr=ḥămēš|sc=Hebr}}
*: {{Z|amw}}: {{W-|amw|ܚܡܫܐ|n|tr=ḥamša}}, {{W-|amw|ܚܡܫ|m|tr=ḥammeš}}
* {{Z|arp}}: {{W-|arp|yoo3on}}
* {{Z|aqc}}: {{W-|aqc|ллъо}}
* {{Z|agj}}: {{W-|agj|ሀምስት|tr=ammest}}
* {{Z|rup}}: {{W-|rup|tsintsi}}
* {{Z|as}}: {{W-|as|পাঁচ}}
* {{Z|bno}}: {{W-|bno|lima}}
* {{Z|ast}}: {{W+|ast|cinco}}
* {{Z|aot}}: {{W-|aot|banga}}
* {{Z|av}}: {{W-|av|щуго}}
* {{Z|ay}}: {{W+|ay|phisqa}}
* {{Z|ain}}: {{W-|ain|アシㇰネ|tr=asikne}}
* {{Z|az}}: {{W+|az|beş}}
* {{Z|bdq}}: {{W-|bdq|pơđăm}}
* {{Z|ban}}: {{W-|ban|lima}}
* {{Z|bjn}}: {{W-|bjn|lima}}
* {{Z|eu}}: {{W+|eu|bost}}
* {{Z|bsq}}: {{W-|bsq|hm̀m̌}}
* {{Z|ba}}: {{W-|ba|биш|sc=Cyrl}}
* {{Z|be}}: {{W+|be|пяць}}, {{W-|be|пяцёра|sc=Cyrl}}
* {{Z|bn}}: {{W+|bn|পাঁচ|sc=Beng}} (numeral: [[৫]])
* {{Z|bkd}}: {{W-|bkd|lalima}}
* {{Z|bcl}}: {{W-|bcl|lima}}
* {{Z|bi}}: {{W-|bi|faef}}
* {{Z|br}}: {{W+|br|pemp}}
* {{Z|kxd}}: {{W-|kxd|lima}}
* {{Z|bdk}}: {{W-|bdk|фуд}}
* {{Z|bug}}: {{W-|bug|lima}}
* {{Z|mbb}}: {{W-|mbb|lelima}}
* {{Z|bg}}: {{W+|bg|пет}}
* {{Z|my}}: {{W+|my|ငါး|sc=Mymr}} (numeral: {{W+|my|၅}})
* {{Z|bua}}: {{W-|bua|табан}}
* {{Z|pcc}}: {{W-|pcc|hac}}
* {{Z|cia}}: {{W-|cia|lima}}
* {{Z|coj}}: {{W-|coj|sarap}}
* {{Z|dz}}: {{W-|dz|ལྔ}} (numeral: {{W-|bo|༥}})
* {{Z|cow}}: {{W-|cow|čílačš}}
* {{Z|cro}}: {{W-|cro|chiaxxó}}
* {{Z|ccc}}: {{W-|ccc|pichka}}
* {{Z|cja}}: {{W-|cja|ليما}}
* {{Z|cjm}}: {{W-|cjm|ꨤꨟꨩ|tr=lamư’}}, {{W-|cjm|ꨤꨪꨟꨩ|tr=limư’}}
* {{Z|ce}}: {{W-|ce|пхиъ}}
* {{Z|cs}}: {{W+|cs|pět}}, {{W-|cs|patery}}
* {{Z|cdm}}: {{W-|cdm|पोङा|tr=ponga}}
* {{Z|chr}}: {{W-|chr|ᎯᏍᎩ}}
* {{Z|chn}}: {{W-|chn|qwinəm}}
* {{Z|ny}}: {{W-|ny|sanu}}
* {{Z|cic}}: {{W-|cic|talhlhá'pi}}, {{W-|cic|tulhape}}
* {{Z|zh}}:
*: {{Z|yue}}: {{W+|yue|五|tr=ng5}}
*: {{Z|dng}}: {{W-|dng|ву}}
*: {{Z|hak}}: {{W-|hak|五|tr=ng3}}
*: {{Z|cmn}}: {{W+|cmn|五|tr=wǔ}} (numeral: {{W+|cmn|伍}})
*: {{Z|cdo}}: {{W-|cdo|五|tr=ngū}}, {{W-|cdo|五|tr=ngô}}
*: {{Z|nan}}: {{W+|nan|五|tr=go, ngò}}, {{W+|nan|五|tr=ngou6}}
*: {{Z|wuu}}: {{W-|wuu|五}}
* {{Z|ctu}}: {{W-|ctu|jo'p'ej}}
* {{Z|ckt}}: {{W-|ckt|мэтлыӈэн|tr=mėtlyṇėn}}
* {{Z|cv}}: {{W-|cv|пиллӗк|sc=Cyrl}}, {{W-|cv|пилӗк|sc=Cyrl}}
* {{Z|chk}}: {{W-|chk|nimu}}, {{W-|chk|nime-}}, {{W-|chk|nimechö}}, {{W-|chk|nimmön}}
* {{Z|dlm}}: {{W-|dlm|čenc}}
* {{Z|da}}: {{W+|da|fem}}
* {{Z|dar}}: {{W-|dar|шол}}
* {{Z|tfn}}: {{W-|tfn|ch'qilu}}
* {{Z|dv}}: {{W-|dv|ފަސް}}
* {{Z|dlg}}: {{W-|dlg|биэс}}
* {{Z|duu}}: {{W-|duu|pv'nga}}
* {{Z|dtp}}: {{W-|dtp|limo}}
* {{Z|erk}}: {{W-|erk|ilim}}
* {{Z|id}}: {{W+|id|lima}}
* {{Z|ar}}: {{W+|ar|خَمْسَة}} (numeral: {{W-|ar|٥}})
*: {{Z|arz}}: {{W-|arz|خمسة|tr=ḵamsa|sc=Arab}}
* {{Z|hy}}: {{W+|hy|հինգ}}
* {{Z|myv}}: {{W-|myv|вете}}
* {{Z|eo}}: {{W+|eo|kvin}}
* {{Z|et}}: {{W+|et|viis}}
* {{Z|gez}}: {{W-|gez|ኀምስቱ|n|sc=Ethi}}, {{W-|gez|ኀምስ|m|sc=Ethi}} (numeral: {{W-|gez|፭}})
* {{Z|eve}}: {{W-|eve|ту̇нӈа̇н}}
* {{Z|evn}}: {{W-|evn|тунӈа}}
* {{Z|ee}}: {{W-|ee|atɔ̃}}
* {{Z|ext}}: {{W-|ext|cincu}}
* {{Z|fa}}: {{W+|fa|پنج|tr=panj}} (numeral: {{W-|fa|۵}})
* {{Z|ddg}}: {{W-|ddg|lime}}
* {{Z|fo}}: {{W+|fo|fimm}}
* {{Z|fi}}: {{W+|fi|viisi}}
* {{Z|fro}}: {{W-|fro|cinc}}
* {{Z|fr}}: {{W+|fr|cinq}}
*: {{Z|fro}}: {{W-|fro|cinc}}
* {{Z|fur}}: {{W-|fur|cinc}}
* {{Z|frr}}:
*: {{Z|frr}}: {{W-|frr|fiiw}}
*: {{Z|frr}}: {{W-|frr|fiuw}}
*: {{Z|frr}}: {{W-|frr|fif}}
* {{Z|ofs}}: {{W-|ofs|fīf}}
* {{Z|stq}}: {{W-|stq|fieuw}}
* {{Z|fy}}: {{W+|fy|fiif}}
* {{Z|gd}}: {{W-|gd|còig}}, {{W-|gd|còignear|n}}
* {{Z|gl}}: {{W+|gl|cinco}}
* {{Z|cab}}: {{W-|cab|seingü}}
* {{Z|cel-gau}}: {{W-|cel-gau|pempe}}
* {{Z|gaa}}: {{W-|gaa|enumɔ}}
* {{Z|glk}}: {{W-|glk|پنج|tr=panj}}
* {{Z|got}}: {{W-|got|𐍆𐌹𐌼𐍆}}
* {{Z|gu}}: {{W-|gu|પાંચડો}} (numeral: [[૫]])
* {{Z|ka}}: {{W+|ka|ხუთი}}
* {{Z|gn}}: {{W+|gn|po}}
* {{Z|hts}}: {{W-|hts|botano}} and inflections
* {{Z|ht}}: {{W-|ht|senk}}
* {{Z|haw}}: {{W-|haw|lima}}, {{W-|haw|ʻelima}}
* {{Z|ha}}: {{W-|ha|biyar|cuda=bìyar̃}}
* {{Z|mba}}: {{W-|mba|lalima}}
* {{Z|hi}}: {{W+|hi|पाँच}} (numeral: {{W+|hi|५}}), {{W+|hi|पंच}}, {{W+|hi|पंज}}, {{W+|hi|पंजा}}
* {{Z|ho}}: {{W-|ho|ima}}
* {{Z|meu}}: {{W-|meu|ima}}
* {{Z|lic}}: {{W-|lic|ba}}
* {{Z|mww}}: {{W-|mww|tsib}}
* {{Z|nl}}: {{W+|nl|vijf}}
* {{Z|hop}}: {{W-|hop|tsivot}}
* {{Z|hrx}}: {{W-|hrx|finnef}}
* {{Z|huz}}: {{W-|huz|лъино}}
* {{Z|he}}: {{W+|he|חָמֵשׁ|tr=khamésh|m}}, {{W+|he|חֲמִשָּׁה|n|tr=khamisha}}
* {{Z|io}}: {{W+|io|kin}}
* {{Z|ig}}: {{W-|ig|ise}}
* {{Z|ilo}}: {{W-|ilo|lima}}
* {{Z|ang}}: {{W-|ang|fif}}
* {{Z|enm}}: {{W-|enm|five}}
* {{Z|en}}: {{W+|en|five}}
* {{Z|izh}}: {{W-|izh|viis}}
* {{Z|ia}}: {{W+|ia|cinque}}
* {{Z|ill}}: {{W-|ill|lima}}
* {{Z|ga}}: {{W+|ga|cúig}}
*: {{Z|sga}}: {{W-|sga|cóic}}
* {{Z|ist}}: {{W-|ist|sinque}}
* {{Z|ruo}}: {{W-|ruo|ćinć}}
* {{Z|it}}: {{W+|it|cinque}}
* {{Z|ium}}: {{W-|ium|biaa}}
* {{Z|is}}: {{W+|is|fimm}}
* {{Z|ja}}: {{W+|ja|五|tr=ご, go}}, {{W+|ja|五つ|tr=いつつ, itsutsu}}
* {{Z|jra}}: {{W-|jra|rơma}}
* {{Z|kaw}}: {{W-|kaw|lima}}
* {{Z|juc}}: {{W-|juc|ʃundʒa}}
* {{Z|quc}}: {{W-|quc|jo'ob'}}
* {{Z|kbd}}: {{W-|kbd|тху}}
* {{Z|kab}}: {{W-|kab|semmus|n}}, {{W-|kab|semmuset|m}}, {{W-|kab|xemsa}}
* {{Z|kl}}: {{W+|kl|tallimat}}
* {{Z|xal}}: {{W-|xal|тавн}}
* {{Z|kn}}: {{W+|kn|ಐದು|sc=Knda}} (numeral: {{W+|kn|೫}})
* {{Z|kr}}: {{W-|kr|úgù}}
* {{Z|kea}}: {{W-|kea|sinku}}
* {{Z|cak}}: {{W-|cak|wo'o'}}
* {{Z|krc}}: {{W-|krc|беш}}
* {{Z|kdr}}: {{W-|kdr|bieš}}
* {{Z|xqa}}: {{W-|xqa|بٖيشْ|tr=bḗš}}
* {{Z|krl}}: {{W-|krl|viisi}}
* {{Z|csb}}: {{W-|csb|piãc}}
* {{Z|ca}}: {{W+|ca|cinc}}
* {{Z|zku}}: {{W-|zku|mila}}, {{W-|zku|yarapurla kuma}}
* {{Z|qu}}: {{W-|qu|pichka}}, {{W-|qu|pisqa}}, {{W-|qu|pichka}}, {{W-|qu|phisqa}}, {{W-|qu|picga}}, {{W-|qu|pizga}}
* {{Z|kha}}: {{W-|kha|san}}
* {{Z|kjj}}: {{W-|kjj|пхьу}}
* {{Z|klb}}: {{W-|klb|salchipam}}
* {{Z|krj}}: {{W-|krj|lima}}
* {{Z|ky}}: {{W+|ky|беш|sc=Cyrl}}
* {{Z|kg}}: {{W-|kg|tanu}}
* {{Z|si}}: {{W+|si|පහ}}
* {{Z|rw}}: {{W-|rw|gatanu}}
* {{Z|gil}}: {{W-|gil|nimaua}}
* {{Z|kpv}}: {{W-|kpv|вит}}
* {{Z|wni}}: {{W-|wni|tsanu|cuda=-tsanu}}
* {{Z|ko}}: {{W+|ko|다섯}}, {{W+|ko|오}}, {{W+|ko|五}}
* {{Z|kw}}: {{W-|kw|pymp}}
* {{Z|co}}: {{W+|co|cinqui}}
* {{Z|lou}}: {{W-|lou|sink}}
* {{Z|mfe}}: {{W-|mfe|senk}}
* {{Z|cr}}: {{W-|cr|nîyânan}}
*: {{Z|crk}}: {{W-|crk|niyānan}}
* {{Z|nai-kum}}: {{W-|nai-kum|sarap}}
* {{Z|lld}}: {{W-|lld|cinch}}
* {{Z|lkt}}: {{W-|lkt|záptaŋ}}
* {{Z|ltg}}: {{W-|ltg|pīci|n}}, {{W-|ltg|pīcys|m}}
* {{Z|la}}: {{W+|la|quīnque}}
* {{Z|lv}}: {{W+|lv|pieci|n}}, {{W-|lv|piecas|m}}
* Lenape:
*: {{Z|unm}}: {{W-|unm|palenàxk}}
* {{Z|lo}}: {{W-|lo|ຫ້າ}} (numeral: {{W-|lo|໕}})
* {{Z|lez}}: {{W-|lez|вад}}
* {{Z|ln}}: {{W-|ln|mítáno}}
* {{Z|lij}}: {{W-|lij|çìnque}}
* {{Z|lt}}: {{W+|lt|penki|n}}, {{W-|lt|penkios|m}}
* {{Z|liv}}: {{W-|liv|vīž}}
* {{Z|lmo}}: {{W-|lmo|çinc}}, {{W-|lmo|çincu}}
* {{Z|khb}}: {{W-|khb|ᦠᦱᧉ}} (numeral: [[᧕]])
* {{Z|lb}}: {{W+|lb|fënnef}}
* {{Z|mhn}}: {{W-|mhn|vinf}}
* {{Z|mad}}: {{W-|mad|lɛma}}
* {{Z|mdh}}: {{W-|mdh|lima}}
* {{Z|mkz}}: {{W-|mkz|lima}}
* {{Z|mak}}: {{W-|mak|lima}}
* Malay:
*: {{Z|ms}}: {{W+|ms|ليم|sc=Arab}}, {{W-|ms|ڤنچا|sc=Arab}}
*: Rûmî: {{W+|ms|lima}}, {{W-|ms|panca}}
* {{Z|mk}}: {{W+|mk|пет}}
* {{Z|ml}}: {{W-|ml|അഞ്ചു|sc=Mlym}}, {{W+|ml|അഞ്ച്|sc=Mlym}} (numeral: [[൫]])
* {{Z|mt}}: {{W+|mt|ħamsa}}
* {{Z|mnc}}: {{W-|mnc|ᠰᡠᠨᠵᠠ}}
* {{Z|mrv}}: {{W-|mrv|rima}}
* {{Z|gv}}: {{W-|gv|queig}}
* {{Z|msk}}: {{W-|msk|lima}}
* {{Z|mrw}}: {{W-|mrw|lima}}
* {{Z|mr}}: {{W-|mr|पाच}}
* {{Z|mhr}}: {{W-|mhr|визыт}}
* {{Z|mrc}}: {{W-|mrc|sarapk}}, {{W-|mrc|srap}}
* {{Z|mh}}: {{W-|mh|ļalem}}
* {{Z|mat}}: {{W-|mat|rokut'a}}
* {{Z|yua}}: {{W-|yua|jo'}}
* {{Z|mzn}}: {{W-|mzn|پنج|tr=panj}}
* {{Z|hu}}: {{W+|hu|öt}}
* {{Z|lus}}: {{W-|lus|pa-nga}}
* {{Z|min}}: {{W-|min|limo}}
* {{Z|mwl}}: {{W-|mwl|cinco}}
* {{Z|mov}}: {{W-|mov|tharap}}
* {{Z|mdf}}: {{W-|mdf|вете}}
* {{Z|mn}}:
*: Kirîlî: {{W+|mn|тав}}
*: Mongolî: {{W-|mn|ᠲᠠᠪᠤ}}, {{W-|mn|᠕}}
* {{Z|mnw}}: {{W-|mnw|မသုန်}}
* {{Z|moe}}: {{W-|moe|patetat}}
* {{Z|mlm}}: {{W-|mlm|ŋɔ⁴}}
* {{Z|mtq}}: {{W-|mtq|đằm}}, {{W-|mtq|đăm}}
* {{Z|nah}}: {{W+|nah|makwilli}}, {{W+|nah|macuilli}}
* {{Z|naq}}: {{W-|naq|koro}}
* {{Z|nmb}}: {{W-|nmb|iləm'}}
* {{Z|gld}}: {{W-|gld|тойңга}}
* {{Z|nap}}: {{W-|nap|cìnche}}
* {{Z|nv}}: {{W-|nv|ashdlaʼ}}
* {{Z|na}}: {{W+|na|aijimo}}
* {{Z|nds}}:
*: {{Z|nds-de}}: {{W-|nds-de|fîf}}
* {{Z|yrk}}: {{W-|yrk|самляӈг}}
* {{Z|ne}}: {{W+|ne|पाँच}}
* {{Z|hlt}}: {{W-|hlt|panga}}
* {{Z|niv}}: {{W-|niv|тʼорӈ}}
* {{Z|niu}}: {{W-|niu|lima}}
* {{Z|non}}: {{W-|non|fimm}}
* {{Z|no}}: {{W+|no|fem}}
* {{Z|ood}}: {{W-|ood|hetasp}}
* {{Z|cst}}: {{W-|cst|parwes}}
* {{Z|css}}: {{W-|css|parue}}
* {{Z|oj}}: {{W-|oj|naanan}}
* {{Z|oc}}: {{W+|oc|cinc}}
* {{Z|or}}: {{W+|or|ପାଞ୍ଚ}} (numeral: {{W-|or|୫}})
* {{Z|oac}}: {{W-|oac|туӈа}}
* {{Z|om}}: {{W+|om|shan}}
* {{Z|orh}}: {{W-|orh|tʊŋŋa}}
* {{Z|os}}: {{W-|os|фондз|sc=Cyrl}}
* {{Z|ota}}: {{W-|ota|بش|tr=beš|sc=ota-Arab}}
* {{Z|ug}}: {{W+|ug|بەش|sc=ug-Arab}}
* {{Z|uz}}: {{W+|uz|besh}}
* {{Z|pac}}: {{W-|pac|xông}}
* {{Z|ppi}}: {{W-|ppi|sirap}}
* {{Z|pau}}: {{W-|pau|eim}}
* {{Z|pap}}: {{W-|pap|sinku}}
* {{Z|bxd}}: {{W-|bxd|ŋa³¹}}
* {{Z|ps}}: {{W-|ps|پنځه|tr=pinjë|sc=ps-Arab}}
* {{Z|pms}}: {{W-|pms|sinch}}
* {{Z|pis}}: {{W-|pis|faef}}
* {{Z|ppl}}: {{W-|ppl|makwil}}, {{W-|ppl|macuil}}
* {{Z|pl}}: {{W+|pl|pięć}}, {{W+|pl|pięcioro}}
* {{Z|pt}}: {{W+|pt|cinco}}
* {{Z|pa}}: {{W-|pa|ਪੰਜ}} (numeral: {{W-|pa|੫}})
* {{Z|kk}}: {{W+|kk|бес|sc=Cyrl}}
* {{Z|rah}}: {{W-|rah|বৗং}}
* {{Z|lml}}: {{W-|lml|lima}}
* {{Z|rap}}: {{W-|rap|ka [[rima]]}}
* {{Z|rar}}: {{W-|rar|rima}}
* {{Z|rth}}: {{W-|rth|lima}}
* {{Z|raw}}: {{W-|raw|pvngwà}}
* {{Z|rhg}}: {{W-|rhg|fañs}}
* {{Z|rgn}}: {{W-|rgn|zéncv}}
* {{Z|rom}}: {{W-|rom|panʒ}}
*: {{Z|rmf}}: {{W-|rmf|pangȟ}}
* {{Z|ro}}: {{W+|ro|cinci}}
* {{Z|rug}}: {{W-|rug|lima}}
* {{Z|ru}}: {{W+|ru|пять}}, {{W+|ru|пя́теро}}
* {{Z|rue}}: {{W-|rue|пять|sc=Cyrl}}
* {{Z|ksw}}: {{W-|ksw|ယဲၢ်}}
* {{Z|ssy}}: {{W-|ssy|koon}}
* Samî:
*: {{Z|smn}}: {{W-|smn|vittâ}}
*: {{Z|se}}: {{W-|se|vihtta}}
*: {{Z|sms}}: {{W-|sms|vitt}}
*: {{Z|sma}}: {{W-|sma|vïjhte}}
* {{Z|sma}}: {{W-|sma|vïjhte}}
* {{Z|sm}}: {{W+|sm|lima}}
* {{Z|sg}}: {{W+|sg|ukü}}
* {{Z|sa}}: {{W+|sa|पञ्चन्|tr=páñcan}}
* {{Z|sat}}: {{W-|sat|ᱢᱚᱬᱮ}}, {{W-|sat|ᱢᱚᱬᱮᱸ}}
* {{Z|srs}}: {{W-|srs|gúùt'áá}}
* Sardinian:
*: {{Z|sc}}: {{W-|sc|cincu}}
*: {{Z|sc}}: {{W-|sc|chimbe}}
* {{Z|ceb}}: {{W-|ceb|lima}}
* {{Z|sea}}: {{W-|sea|limak}}
* {{Z|scn}}: {{W+|scn|cincu}}
* {{Z|sid}}: {{W-|sid|onte}}
* {{Z|csm}}: {{W-|csm|máš·ok·a-}}
* {{Z|szl}}: {{W-|szl|pjyńć}}
* {{Z|sd}}: {{W-|sd|پنج|cuda=پَنجَ|tr=panja}}
* {{Z|srn}}: {{W-|srn|feifi}}, {{W-|srn|feyfi}}
* {{Z|sh}}:
*: Kirîlî: {{W-|sh|пе̑т}}
*: Latînî: {{W-|sh|pȇt}}
* {{Z|sip}}: {{W-|sip|ང}}
* {{Z|sco}}: {{W-|sco|five}}
* {{Z|cu}}:
*: Kirîlî: {{W-|cu|пѧть|sc=Cyrs}} (numeral: [[е҃]])
*: Glagolîtîk: {{W-|cu|ⱂⱔⱅⱐ|sc=Glag}}
* {{Z|sk}}: {{W+|sk|päť}}
* {{Z|sl}}: {{W+|sl|pét}}
* {{Z|tuw-sol}}: {{W-|tuw-sol|tonga}}
* {{Z|so}}: {{W+|so|shan}}
* Sorbî:
*: {{Z|dsb}}: {{W-|dsb|pěś}}
*: {{Z|hsb}}: {{W-|hsb|pjeć}}
* {{Z|es}}: {{W+|es|cinco}}
* {{Z|suk}}: {{W-|suk|itaano}}
* {{Z|sw}}: {{W+|sw|tano}}
* {{Z|ss}}: {{W-|ss|hlanu}}
* {{Z|sv}}: {{W+|sv|fem}}
* {{Z|shn}}: {{W-|shn|ႁႃႈ}} (numeral: [[႕]])
* {{Z|tg}}: {{W+|tg|панҷ|sc=Cyrl}}
* {{Z|tl}}: {{W+|tl|lima}}
* {{Z|ty}}: {{W-|ty|pae}}
* {{Z|ta}}: {{W+|ta|ஐந்து}} (numeral: {{W-|ta|௫}}), {{W+|ta|ஐந்து|sc=Taml}}
* {{Z|txg}}: {{W-|txg|𗏁}}
* {{Z|twf}}: {{W-|twf|p’ą́nyuo}}
* {{Z|tar}}: {{W-|tar|marí}}
* {{Z|roa-tar}}: {{W-|roa-tar|cinghe}}
* {{Z|trv}}: {{W-|trv|lima}}
* {{Z|shi}}: {{W-|shi|semmos|n}}, {{W-|shi|semmost|m}}
* {{Z|tsg}}: {{W-|tsg|lima}}
* {{Z|blt}}: {{W-|blt|ꪬ꫁ꪱ}}
* {{Z|nod}}: {{W-|nod|ᩉ᩶ᩣ}}
* {{Z|th}}: {{W+|th|ห้า}} (numeral: {{W+|th|๕}})
* {{Z|tdd}}: {{W-|tdd|ᥞᥣᥲ}}
* {{Z|tbl}}: {{W-|tbl|limu}}
* {{Z|ctd}}: {{W-|ctd|nga}}
* {{Z|te}}: {{W+|te|ఐదు}} (numeral: {{W+|te|౫}})
* {{Z|tzm}}: {{W-|tzm|ⵙⵎⵎⵓⵙ|sc=Tfng}}
* {{Z|tft}}: {{W-|tft|romtoha}}
* {{Z|crh}}: {{W-|crh|beş}}
* {{Z|tt}}: {{W+|tt|биш|sc=Cyrl}}
* {{Z|tet}}: {{W-|tet|lima}}
* {{Z|tvo}}: {{W-|tvo|romotoha}}
* {{Z|tig}}: {{W-|tig|ሐምስ|sc=Ethi}} (numeral: {{W-|tig|፭}})
* {{Z|ti}}: {{W-|ti|ሓሙሽተ|sc=Ethi}} (numeral: {{W-|ti|፭}})
* {{Z|otk}}: {{W-|otk|𐰋𐰃𐱁|ts=béš}}
* {{Z|tr}}: {{W+|tr|beş}}
* {{Z|tk}}: {{W+|tk|bäş}}
* {{Z|bo}}: {{W-|bo|ལྔ|sc=Tibt}} (numeral: {{W-|bo|༥}})
* {{Z|ocu}}: {{W-|ocu|kuit'aa}}
* {{Z|tpi}}: {{W-|tpi|faipela}}
* {{Z|to}}: {{W-|to|nima}}
* {{Z|ttj}}: {{W-|ttj|taano}}, {{W-|ttj|itaano}}
* {{Z|xto}}: {{W-|xto|päñ}}
* {{Z|txb}}: {{W-|txb|piś}}
* {{Z|tn}}: {{W-|tn|tlhano}}
* {{Z|tum}}: {{W-|tum|nkhonde}}
* {{Z|tvl}}: {{W-|tvl|lima}}
* {{Z|tzj}}: {{W-|tzj|kho’o}}
* {{Z|ude}}: {{W-|ude|туӈа}}
* {{Z|udi}}: {{W-|udi|хъо}}
* {{Z|udm}}: {{W-|udm|вить}}
* {{Z|xum}}: {{W-|xum|𐌐𐌖𐌌𐌐𐌄}}
* {{Z|ur}}: {{W-|ur|پانچ|tr=pāñc|sc=ur-Arab}}
* {{Z|uby}}: {{W-|uby|ʃxə}}
* {{Z|uk}}: {{W+|uk|п'ять}}
* {{Z|vec}}: {{W-|vec|sinque}}, {{W-|vec|zsinque}}
* {{Z|vep}}: {{W-|vep|viž}}
* {{Z|vi}}: {{W+|vi|năm}}
* {{Z|vo}}: {{W+|vo|lul}}
* {{Z|vro}}: {{W-|vro|viiś}}
* {{Z|vot}}: {{W-|vot|viis}}, {{W-|vot|viisi}}
* {{Z|wls}}: {{W-|wls|nima}}
* {{Z|wa}}: {{W+|wa|cénk}}
* {{Z|war}}: {{W-|war|lima}}
* {{Z|cy}}: {{W+|cy|pump}}
* {{Z|wrh}}: {{W-|wrh|marra}}
* {{Z|wym}}: {{W-|wym|fynf}}
* {{Z|win}}: {{W-|win|saacą}}
* {{Z|wo}}: {{W-|wo|juróom}}
* {{Z|kjh}}: {{W-|kjh|пис}}
* {{Z|kca}}: {{W-|kca|вет}}
* {{Z|km}}: {{W+|km|ប្រាំ}} (hejmar: {{W-|km|៥}})
* {{Z|xh}}: {{W-|xh|hlanu}}
* {{Z|yai}}: {{W-|yai|панч}}
* {{Z|yka}}: {{W-|yka|lime}}
* {{Z|sah}}: {{W-|sah|биэс|sc=Cyrl}}
* {{Z|yao}}: {{W-|yao|msano}}
* {{Z|yaq}}: {{W-|yaq|mámni}}
* {{Z|yi}}: {{W-|yi|פֿינף}}
* {{Z|ii}}: {{W-|ii|ꉬ}}
* {{Z|yo}}: {{W-|yo|márùn-ún}}
* {{Z|esu}}: {{W-|esu|talliman}}
* {{Z|el}}: {{W+|el|πέντε}}, {{W-|el|ε΄}}
*: Kevn: {{W-|grc|πέντε}}, {{W-|grc|ε΄}}
* {{Z|zea}}: {{W-|zea|vuuf}}, {{W-|zea|vuve}}
* {{Z|za}}: {{W-|za|ngux}}, {{W-|za|haj}} (''Sawndip'' [[五]])
* {{Z|zom}}: {{W-|zom|nga}}
* {{Z|zu}}: {{W-|zu|hlanu}}
* {{Z|zun}}: {{W-|zun|apde}}
{{werger-bin}}
=== Navdêr ===
{{navdêr|ku|z=n}}
# [[hejmar|Hejmara]] [[5]].
==== Tewandin ====
{{ku-tewîn-nav|nêr}}
==== Werger ====
{{werger-ser}}
* {{Z|fr}}: {{W+|fr|cinq|n}}
* {{Z|en}}: {{W+|en|five}}
{{werger-bin}}
==== Anagram ====
* {{anagram|ku|a=cênp|PCên}}
9wr6e48vbmwaunwcv78c60dk4t23v72
kirin
0
3487
6532111
6427009
2026-09-18T20:42:53Z
Wikihez
7344
Kurmancî/Lêker: beşa «Etîmolojî» hate nûkirin (DefSideBoxes)
6532111
wikitext
text/x-wiki
{{h-bnr|kirîn}}
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-IPA}}
* {{deng|ku|LL-Q36163_(kmr)-Key Mîrza-kirin.wav|dever=Wan}}
* {{ku-kîte}}
=== Lêker ===
{{ku-tewîn-lk|kirin|form=gerguhêz|niha=k|borî=kir}}
[[Wêne:Lewis_Hine_Power_house_mechanic_working_on_steam_pump.jpg|thumb|Kesek kar '''dike'''. Peyvên ''[[kar]]'' û ''[[kirin#Kurdî|kirin]]'' [[hevreh]] in.]]
{{lêker|ku|c=x-gh}}, {{bilêv|k|nerm}}
# [[bi cih anîn]], [[pêk anîn]], [[encam dan]]
#: {{mk|ku|Tu çi '''dikî'''?}}
#: {{mk|ku|'''Bikin'''! – '''Neke'''! – '''Meke'''!}}
#: {{mk|ku|Min hemû ev kar '''kiriye'''.}}
#* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=Were nîşanê Nişanî de xwe bêperde seher<br />Lê ji xûnê '''bike''' perhîz ku şehîdan çi hisab}}
# [[niyet]] hebûn, [[li ber bûn]], [[biniyet]] bûn, [[hewl]] dan, [[armanc]] bûn
#: {{mk|ku|Min '''dikir''' bipirsim lê ez newêriyam.}}
# [[nêzîk]] bûn, [[kêm]] man ku tiştek [[qewimîn|biqewime]]
#: {{mk|ku|Ji qehran '''dike''' xwe bikuje.}}
# [[lîstin]], [[pê ve]] [[mijûl]] bûn
#: {{mk|ku|Ez futbolê '''dikim'''.|Ez futbolê dilîzim.|birêz=1}}
# [[zewicîn]], [[mêr]] kirin, [[şû]] kirin, [[jin anîn]], wek [[hevser]] [[qebûl]] kirin
#: {{mk|ku|Ez bêmêr bimirim jî, ez te '''nakim'''.}}
# [[gan]] kirin, [[seks]] kirin
# [[xwestin]]
#* {{jêder-kitêb|ku|jêgirtin= '''Kir''' ku ji avê derbas bibe. |nivîskar={{w|Mela Mûsayê Hekarî}}|sernav=Durrû’l Mecalîs|amadekar=Hêmin Omer|sala weşandinê=2022|sal=1857|rûpel=116}}
# {{înm|wek [[lêkera sivik|lêkereke sivik]] bo çêkirina [[lêker]]ên [[nû]] ji [[navdêr]] û [[rengdêr]]an}}
#: {{mk|ku|[[qebûl kirin]], [[razî kirin]], [[xwedî kirin]], [[dest pê kirin]]}}
#: {{mk|ku|[[mezin kirin]], [[xurt kirin]], [[bihêz kirin]], [[perîşan kirin]]}}
==== Bi alfabeyên din ====
* {{ku-ar|کرن}}
* {{ku-kr|кьрьн}}
==== Jê ====
{{agadarî|Agadarî}}: Gelek peyv bi alîkariya [[lêkera sivik]] ya "kirin" tên çêkirin loma rêzkirina hemûyan li vir ne mimkin e. Bnr. '''[[:Kategorî:Tewandin:lêkerên pêkhatî yên kurmancî li gel "kirin"|Lêkerên li gel "kirin" (pêkhatî)]]''', '''[[:Kategorî:Peyvên kurmancî yên hevedudanî bi kirin|Peyvên kurmancî yên hevedudanî bi kirin]].
==== Etîmolojî ====
{{etîmon|ku|:mîr<metn:Taliyê ji>|ine-pro:*kʷer-<t:kirin, [[çêkirin]], [[ava kirin]]>|dar=1|metn=++}}
{{veşêre-ser|Bêhtir malûmat û hevreh}}
Hevreha soranî {{g|ckb|کردن}}, kurdiya başûrî {{q|sdh|kirdin|sc=Latn}}, lekî {{q|lki|kirdin|sc=Latn}}, goranî/hewramî {{q|hac|kerdey|sc=Latn}}, zazakî {{q|zza|kerdene}}, farisî {{g|fa|کردن|tr=kerden}}, tacikî {{g|tg|кардан|tr=kardan}}, partî {{g|xpr|𐭪𐭫𐭲|tr=kirt}}, pehlewî {{g|pal|𐭪𐭫𐭲|tr=kirt}}, avestayî {{g|ae|𐬐𐬆𐬭𐬆𐬙𐬀|tr=kərəta|w=[[kirî]]}} û {{g|ae|𐬐𐬆𐬭𐬆𐬥𐬀𐬊𐬌𐬙𐬌|tr=kərənaoiti|w=ew dike}}, hexamenişî {{g|peo|𐎠𐎤𐎢𐎫𐎠|tr=a-ku-u-t-a /akutā/|w=wî kir}}, sanskrîtî {{g|sa|कृणोति|tr=kṛṇóti}} û {{g|sa|करोति|tr=karóti}}, hindî {{g|hi|करना|tr=kerna}}, ûrdûyî {{g|ur|کرنا|tr=kerna}}, hîtîtî {{g|hit|𒆪𒂊𒅕𒋫|tr=ku-e-er-ta|w=kir}} û {{g|hit|𒆪𒅕𒈪|tr=ku-er-mi|w=dikim}}, lîtwanî {{q|lt|kùrti|w=kirin, çêkirin, ava kirin}} û {{q|lt|kerė́ti|w=[[sihr]] kirin}}, rûsî {{q|ru|ча́ры|tr=čáry|w=[[sihr]]kirin}}.
Ji heman rehî herwiha peyva {{q|ku|kar}} û paşgirên {{q|ku|-kar}}, {{q|ku|-ker}}, {{q|ku|-gar}}, {{q|ku|-ger}} (''-ger'' wek bo nimûne di peyva {{q|ku|asinger}}, {{q|ku|hesinger}} de).
Peyv ji zimanekî [[hindûîranî]] ketiye hinek zimanên [[ûralî]] jî, bo nimûne: ûdmûrtî {{g|udm|карыны|tr=karini}} û komî-permyakî {{g|koi|керны|tr=kêrni}}.
Wek paşgirên {{q|ku|-kâr}}, {{q|ku|-ker}}, {{q|ku|-gâr}} ketiye tirkî û gelek zimanên din jî yên [[tirkîkî]], bo nimûne di van peyvên tirkî de: {{q|tr|muhafazakâr}}, {{q|tr|peyker}}, {{q|tr|rüzgâr}} û bi dehan an bi sedan peyvên din.
;{{biçûk|Çavkanî:
* {{Cheung}}
* {{Chyet}}
* {{Derksen}}
* {{Kloekhorst}}
* {{Lubotsky}}
* {{Mallory}}
* {{Tsabolov}}
}}
{{veşêre-bin}}
==== Bi zaravayên din ====
* {{Z|hac}}: {{W-|hac|kerdey|sc=Latn}}
* {{Z|sdh}}: {{W-|sdh|کردن}}, {{W-|sdh|kirdin|sc=Latn}}
* {{Z|lki}}: {{W-|lki|کردن}}, {{W-|lki|kirdin|sc=Latn}}
* {{Z|ckb}}: {{W-|ckb|کردن|tr=kirdin}}
* {{Z|zza}}: {{W-|zza|kerdene}}
==== Werger ====
{{werger-ser|bi cih anîn, encam dan, çêkirin (1)}}
* {{Z|af}}: {{W+|af|doen}}
* {{Z|sq}}: {{W+|sq|bëj}}
* {{Z|de}}: {{W+|de|tun}}, {{W+|de|machen}}
*: {{Z|gsw}}: {{W-|gsw|tue}}
* {{Z|am}}: {{W-|am|ማድረግ}}
* {{Z|an}}: {{W+|an|fer}}
* {{Z|aii}}: {{W-|aii|ܥܵܒ݂ܹܕ|tr=ʿawed}}
* {{Z|rup}}: {{W-|rup|fac}}
* {{Z|as}}: {{W-|as|কৰ}}
* {{Z|ast}}: {{W+|ast|facer}}
* {{Z|ask}}: {{W-|ask|ko}}
* {{Z|ain}}: {{W-|ain|キ|tr=ki}}
* {{Z|az}}: {{W-|az|eləmək}}, {{W+|az|etmək}}, {{W-|az|qılmaq}}
* {{Z|ban}}: {{W-|ban|gaé}}
* {{Z|eu}}: {{W-|eu|egin}}
* {{Z|be}}: {{W-|be|рабі́ць|impf}}, {{W-|be|зрабі́ць|pf}}
* {{Z|bn}}: {{W-|bn|করা}}
* {{Z|bqi}}: {{W-|bqi|کردن|tr=kerden}}
* {{Z|br}}: {{W+|br|ober}}
* {{Z|bg}}: {{W-|bg|пра́вя}}
* {{Z|my}}: {{W+|my|လုပ်}}, {{W+|my|ပြု}}
* {{Z|ce}}: {{W-|ce|да}}, {{W-|ce|дан}}
* {{Z|cs}}: {{W-|cs|dělat|impf}}, {{W-|cs|udělat|pf}}
* {{Z|chr}}: {{W-|chr|ᎾᏛᏁᎭ}}
* {{Z|zh}}:
*: {{Z|cmn}}: {{W-|cmn|做|tr=zuò}}, {{W+|cmn|作|tr=zuò}}
* {{Z|cv}}: {{W-|cv|ту}}
* {{Z|dlm}}: {{W-|dlm|fur}}
* {{Z|da}}: {{W+|da|gøre}}, {{W-|da|udføre}}
* {{Z|id}}: {{W+|id|buat}}, {{W+|id|laku}}, {{W+|id|melakukan}}
* {{Z|ar}}: {{W-|ar|فَعَلَ}}, {{W-|ar|عَمِلَ}}
*: {{Z|arq}}: {{W-|arq|دار}}
*: {{Z|arz}}: {{W-|arz|عمل|tr=ʕamal}}
*: {{Z|acw}}: {{W-|acw|سَوَّى|tr=sawwa}}
* {{Z|hy}}: {{W+|hy|անել}}
* {{Z|eo}}: {{W+|eo|fari}}
* {{Z|et}}: {{W+|et|tegema}}
* {{Z|ext}}: {{W-|ext|hazel}}
* {{Z|fa}}: {{W-|fa|کَردَن|tr=kardan}}
* {{Z|fi}}: {{W-|fi|tehdä}}
* {{Z|fr}}: {{W-|fr|faire}}
* {{Z|fur}}: {{W-|fur|fâ}}
* {{Z|frr}}: {{W-|frr|düünj}}, {{W-|frr|du}}
* {{Z|fy}}: {{W-|fy|dwaan}}
* {{Z|gd}}: {{W-|gd|dèan}}
* {{Z|gl}}: {{W+|gl|facer}}
* {{Z|got}}: {{W-|got|𐍄𐌰𐌿𐌾𐌰𐌽}}
* {{Z|ka}}: {{W+|ka|კეთება}}
* {{Z|gn}}: {{W+|gn|japo}}
* {{Z|ht}}: {{W-|ht|fè}}
* {{Z|hi}}: {{W+|hi|करना}}
* {{Z|hil}}: {{W-|hil|buhat}}, {{W-|hil|pagbuhat}}
* {{Z|mww}}: {{W-|mww|ua}}
* {{Z|nl}}: {{W+|nl|doen}}
* {{Z|he}}: {{W-|he|עָשָׂה|tr=asá}},{{W-|he|פָּעַל|tr=pa'al}}
* {{Z|io}}: {{W+|io|facar}}
* {{Z|ilo}}: {{W-|ilo|aramid}}
* {{Z|ang}}: {{W-|ang|dōn}}
* {{Z|en}}: {{W+|en|do}}, {{W+|en|perform}}, {{W+|en|execute}}
* {{Z|inh}}: {{W-|inh|де}}
* {{Z|ia}}: {{W-|ia|facer}}
* {{Z|ga}}: {{W-|ga|déan}}, {{W-|ga|dein}}
* {{Z|ist}}: {{W-|ist|fà}}
* {{Z|it}}: {{W+|it|fare}}
* {{Z|is}}: {{W+|is|gera}}, {{W-|is|gjöra}}
* {{Z|ja}}: {{W+|ja|する|tr=suru}}, {{W+|ja|やる|tr=yaru}}, {{W-|ja|なさる|tr=nasaru}}, {{W+|ja|致す|tr=いたす, itasu}}
* {{Z|jv}}: {{W+|jv|gawe}}, {{W+|jv|gawé}}
* {{Z|bsh}}: {{W-|bsh|ku}}
* {{Z|xnn}}: {{W-|xnn|ikkan}}
* {{Z|kn}}: {{W+|kn|ಮಾಡು}}
* {{Z|kea}}: {{W-|kea|faze}}
* {{Z|ca}}: {{W-|ca|fer}}
* {{Z|qu}}: {{W+|qu|ruray}}, {{W-|qu|rurai}}
* {{Z|ks}}: {{W-|ks|کَرُن}}
* {{Z|ky}}: {{W-|ky|этүү}}
* {{Z|si}}: {{W-|si|කරනවා}}
* {{Z|ko}}: {{W+|ko|하다}}
* {{Z|co}}: {{W-|co|fà}}
* {{Z|mfe}}: {{W-|mfe|fer}}
* {{Z|kum}}: {{W-|kum|этмек}}
* {{Z|lld}}: {{W-|lld|fé}}, {{W-|lld|fèr}}
* {{Z|ltg}}: {{W-|ltg|dareit}}
* {{Z|la}}: {{W+|la|faciō}}, {{W+|la|agō}}
* {{Z|lv}}: {{W+|lv|darīt}}, {{W-|lv|veikt}}
* {{Z|lo}}: {{W+|lo|ເຮັດ}}, {{W-|lo|ທຳ}}
* {{Z|lez}}: {{W-|lez|авун}}
* {{Z|lt}}: {{W+|lt|daryti}}
* {{Z|lmo}}: {{W-|lmo|fà}}
* {{Z|mhn}}: {{W-|mhn|mòchen}}
* {{Z|mk}}: {{W+|mk|прави}}, {{W-|mk|врши}}, {{W+|mk|направи}}
* {{Z|ml}}: {{W+|ml|ചെയ്യുക}}
* {{Z|ms}}: {{W+|ms|buat}}
* {{Z|mt}}: {{W-|mt|għamel}}
* {{Z|mzn}}: {{W-|mzn|هاکردن|tr=hâkërden}}
* {{Z|gun}}: {{W-|gun|japo}}
* {{Z|hu}}: {{W+|hu|tesz}}, {{W+|hu|csinál}}
* {{Z|egy}}: {{W-egy|jrj|h=ir}}
* {{Z|mn}}:
*: Kirîlî: {{W+|mn|хийх}}
* {{Z|nci}}: {{W-|nci|chīhua}}
* {{Z|nah}}: {{W+|nah|chīhua}}
* {{Z|gld}}: {{W-|gld|анго-}}
* {{Z|nap}}: {{W-|nap|fà}}
* {{Z|nds}}:
*: {{Z|nds-nl}}: {{W-|nds-nl|doan}}
*: {{Z|nds-de}}: {{W-|nds-de|doon}}
* {{Z|ne}}: {{W+|ne|गर्नु}}
* {{Z|nrf}}: {{W-|nrf|faithe}}
* {{Z|no}}:
*: {{Z|nb}}: {{W+|nb|gjøre}}, {{W+|nb|utføre}}
*: {{Z|nn}}: {{W+|nn|gjere}}, {{W+|nn|utføre}}
* {{Z|pro}}: {{W-|pro|far}}
* {{Z|oc}}: {{W+|oc|far}}, {{W+|oc|har}}, {{W+|oc|faire}}
* {{Z|or}}: {{W+|or|କରିବା}}
* {{Z|os}}: {{W-|os|кӕнын}}
* {{Z|ug}}: {{W-|ug|قىلماق}}
* {{Z|uz}}: {{W+|uz|qilmoq}}
* {{Z|pi}}: {{W-|pi|karoti}}
* {{Z|pap}}: {{W-|pap|hasi}}
* {{Z|ps}}: {{W-|ps|کول|tr=kawël}}
* {{Z|ppl}}: {{W-|ppl|-chiwa}}, {{W-|ppl|-chihua}}
* {{Z|pl}}: {{W+|pl|robić|impf}}, {{W+|pl|zrobić|pf}}, {{W+|pl|czynić|impf}}, {{W+|pl|uczynić|pf}}
* {{Z|roa-opt}}: {{W-|roa-opt|fazer}}
* {{Z|pt}}: {{W+|pt|fazer}}, {{W+|pt|realizar}}
* {{Z|pa}}: {{W-|pa|ਕਰਨਾ}}
* {{Z|kk}}: {{W+|kk|істеу}}
* {{Z|cop}}: {{W-|cop|ⲉⲓⲣⲉ}}
* {{Z|rap}}: {{W-|rap|haka}}
* {{Z|rgn}}: {{W-|rgn|fêr}}
* {{Z|rm}}: {{W-|rm|far}}
* {{Z|ro}}: {{W+|ro|face}}
* {{Z|ru}}: {{W-|ru|де́лать|impf}}, {{W-|ru|сде́лать|pf}}
* {{Z|rue}}: {{W-|rue|роби́ти|impf}}
* {{Z|osx}}: {{W-|osx|dôn}}, {{W-|osx|fremmian}}, {{W-|osx|gifrummian}}
* {{Z|sgs}}: {{W-|sgs|darītė}}, {{W-|sgs|dėrbtė}}
* {{Z|sa}}: {{W+|sa|करोति|tr=karóti}}
*: {{Z|sa}}: {{W+|sa|कृणोति|tr=kṛṇóti}}
* {{Z|sc}}: {{W-|sc|fàchere}}
*: {{Z|sc}}: {{W-|sc|fai}}
* {{Z|ceb}}: {{W-|ceb|buhat}}, {{W-|ceb|buhaton}}
* {{Z|scn}}: {{W+|scn|fari}}
* {{Z|sd}}: {{W+|sd|ڪَرَڻُ}}
* {{Z|sh}}:
*: Kirîlî: {{W-|sh|радити}}
*: Latînî: {{W+|sh|raditi}}, {{W+|sh|činiti}}
* {{Z|syl}}: {{W-|syl|ꠇꠞꠣ}}
* {{Z|sco}}: {{W-|sco|dae}}
* {{Z|orv}}: {{W-|orv|робити|impf}}
* {{Z|sk}}: {{W+|sk|robiť|impf}}, {{W-|sk|urobiť|pf}}
* {{Z|sl}}: {{W-|sl|storiti}},{{W-|sl|ukreniti}}, {{W-|sl|narediti}}
* Sorbî:
*: {{Z|dsb}}: {{W-|dsb|cyniś|impf}}
*: {{Z|hsb}}: {{W-|hsb|činić|impf}}, {{W-|hsb|sčinić|pf}}
* {{Z|es}}: {{W-|es|hacer}}
* {{Z|sv}}: {{W+|sv|göra}}
* {{Z|shn}}: {{W-|shn|ႁဵတ်း}}
* {{Z|tab}}: {{W-|tab|апӏуб}}
* {{Z|tg}}: {{W+|tg|кардан}}
* {{Z|tl}}: {{W-|tl|gawin}}, {{W-|tl|gumawa}}, {{W-|tl|isagawa}}
* {{Z|ta}}: {{W+|ta|செய்}}, {{W+|ta|பண்ணு}}
* {{Z|nod}}: {{W-|nod|ᩁᩮᩢ᩠ᨯ}}, {{W-|nod|ᨿᩮ᩠ᨿᩡ}}, {{W-|nod|ᨿᩡ}}, {{W-|nod|ᨿ}}
* {{Z|th}}: {{W+|th|ทำ}}
* {{Z|te}}: {{W+|te|చేయు}}
* {{Z|tt}}: {{W-|tt|эшләү}}
* {{Z|tet}}: {{W-|tet|halo}}
* {{Z|tr}}: {{W+|tr|yapmak}}, {{W+|tr|etmek}}, {{W+|tr|kılmak}}
* {{Z|tk}}: {{W+|tk|etmek}}
* {{Z|tpi}}: {{W+|tpi|mekim}}, {{W-|tpi|wokim}}
* {{Z|txb}}: {{W-|txb|yām-}}
* {{Z|tyv}}: {{W-|tyv|кылыр}}
* {{Z|udm}}: {{W-|udm|карыны}}
* {{Z|ur}}: {{W-|ur|کَرْنا|tr=karnā}}
* {{Z|uk}}: {{W-|uk|роби́ти|impf}}, {{W-|uk|зроби́ти|pf}}
* {{Z|vec}}: {{W+|vec|far}}
* {{Z|vi}}: {{W+|vi|làm}}
* {{Z|wbk}}: {{W-|wbk|ća}}
* {{Z|wa}}: {{W+|wa|fé}}
* {{Z|wbl}}: {{W-|wbl|car-}}
* {{Z|cy}}: {{W-|cy|gwneud}}
* {{Z|km}}: {{W+|km|ធ្វើ}}
* {{Z|yai}}: {{W-|yai|карак}}
* {{Z|yi}}: {{W-|yi|טאָן}}
* {{Z|yoi}}: {{W-|yoi|きるん|tr=kirun}}
* {{Z|el}}: {{W+|el|κάνω}}
*: Kevn: {{W-|grc|πράσσω}}, {{W-|grc|ποιέω}}, {{W-|grc|ῥέζω}}, {{W-|grc|ἔρδω}}, {{W-|grc|δράω}}, {{W-|grc|τελέω}}
* {{Z|ase}}: {{W-|ase|C@SideTrunkhigh-PalmDown-C@SideTrunkhigh-PalmDown RoundVertSidetoside-RoundVertSidetoside}}, {{W-|ase|Claw5@SideTrunkhigh-PalmDown-Claw5@SideTrunkhigh-PalmDown RoundVertSidetoside-RoundVertSidetoside}}
{{werger-bin}}
=== Navdêr ===
{{navdêr|z=m|ku}}
# [[kar]], [[kiryar]], [[emel]], [[fêl]], [[fealiyet]], [[xebat]], [[şol]], [[encamdan]], [[bicihanîn]], [[çêkirin]]
#: {{mk|ku|'''Kirina''' wî karî ne hêsan e.}}
#: {{mk|ku|Divê mirov ji '''kirinê''' netirse.}}
#* {{jêder-malper|ku|jêgirtin=Di berhemên Fiqih û Usûlu’l-Fiqhê derbas dibe; fermaneke ku '''kirina''' tiştekî/’îbadeketekê di wextê wê lazim bike, qezakirina vê peywira ku di dema xwe nehatiye edakirin jî pêwîst didêre. Ma ev tişt ne rast e? Hûn dikarin di çarçoveya nimêja qeza de vê şîrove bikin?|malper=fetwayenkurdi.com|url=http://www.fetwayenkurdi.com/?p=3995|dîrok=21.07.2019}}
#* {{jêder-malper|ku|jêgirtin=Lêkera netêger an jî întransîtîv ew tewre lêker e ku tevger an '''kirina''' wê yekser tesîrê li objektekê nake. Ew çalakî an bûyer bê objekt çêdibe û dema ku ew çalakî pêk tê, tesîreke yekser li tişt an kesekî nayê.|url=https://sites.google.com/a/baranrizgar.co.cc/azadiya-kurdistane/home/lekeren-transitiv--intransitiv-ci-cudati-hene-cawa-ji-hev-veqetinin?tmpl=%2Fsystem%2Fapp%2Ftemplates%2Fprint%2F&showPrintDialog=1|malper=bloga Baran Rizgar|dîrok=21.07.2019}}
==== Tewandin ====
{{ku-tewîn-nav|mê}}
==== Jê ====
* {{g|ku|kirinî}}
==== Etîmolojî ====
Li jortir [[kirin#Etîmolojî|binêrin]].
==== Bi zaravayên din ====
* {{Z|ckb}}: {{W-|ckb|kar|sc=Latn}}, {{W-|ckb|kirdewe|sc=Latn}}
* {{Z|zza}}: {{W-|zza|kerdiş}}
==== Werger ====
{{werger-ser}}
* {{Z|de}}: {{W+|de|Tat|m}}, {{W+|de|Akt|n}}, {{W+|de|Werk|nt}}
* {{Z|ba}}: {{W|ba|ғәмәл}}
* {{Z|be}}: {{W|be|дзе́янне|nt}}, {{W|be|акт|n}}
* {{Z|bg}}: {{W+|bg|де́йствие|nt}}, {{W+|bg|постъпка|m}}, {{W+|bg|акт|n}}
* {{Z|cs}}: {{W+|cs|skutek|n}}, {{W+|cs|čin|n}}
* {{Z|zh}}: {{W+|cmn|行為|sc=Hani}}, {{W+|cmn|行为|tr=xíngwéi|sc=Hani}}
* {{Z|da}}: {{W|da|gerning|c}}, {{W+|da|handling|c}}
* {{Z|ar}}: {{W+|ar|عَمَل|n}}, {{W+|ar|فِعْل|n}}
* {{Z|hy}}: {{W+|hy|արարք}}
* {{Z|eo}}: {{W+|eo|faro}}, {{W|eo|ago}}
* {{Z|ee}}: {{W|ee|dɔwɔwɔ}}
* {{Z|fa}}: {{W+|fa|کردار|tr=kirdar}}, {{W+|fa|کار|tr=kâr}}, {{W+|fa|اعمال|p|tr=e'mal}}
* {{Z|fi}}: {{W+|fi|teko}}, {{W+|fi|toimi}}
* {{Z|fr}}: {{W+|fr|acte|n}}, {{W+|fr|action|m}}, {{W+|fr|œuvre|m}}
* {{Z|fy}}: {{W|fy|died|nt}}
* {{Z|gd}}: {{W|gd|gnìomh|n}}
* {{Z|nl}}: {{W+|nl|daad|m}}
* {{Z|he}}: {{W+|he|מעשה|m|tr=ma'ase|sc=Hebr}}
* {{Z|en}}: {{W|en|deed}}, {{W|en|action}}, {{W|en|disposition}}, {{W|en|doing}}, {{W|en|execution}}, {{W|en|performance}}, {{W|en|executing}}
* {{Z|it}}: {{W+|it|fatto|n}}, {{W+|it|gesto}}, {{W+|it|gesta}}
* {{Z|is}}: {{W+|is|dáð|m}}
* {{Z|ja}}: {{W+|ja|行為|tr=こうい, kōi|sc=Jpan}}
* {{Z|ca}}: {{W+|ca|fet|n}}, {{W+|ca|acte|n}}
* {{Z|ko}}: {{W+|ko|행위}}
* {{Z|la}}: {{W+|la|āctus|n}}
* {{Z|lb}}: {{W|lb|Dot|m}}
* {{Z|mk}}: {{W|mk|дело|nt}}, {{W|mk|постапка|m}}
* {{Z|hu}}: {{W+|hu|tett}}
* {{Z|no}}: {{W+|no|dåd}}, {{W|no|gjerning}}
* {{Z|pt}}: {{W+|pt|ação|m}}, {{W+|pt|feito|n}}
* {{Z|pt}}: {{W+|ro|faptă}}
* {{Z|ru}}: {{W+|ru|посту́пок|n}}, {{W+|ru|де́йствие|nt}}, {{W+|ru|дея́ние|nt}}, {{W+|ru|акт|n}}
* {{Z|sa}}: {{W+|sa|कार्य|nt}}
* {{Z|sh}}: {{W|sh|чи̑н|n}}
*: {{Z|sh}}: {{W+|sh|čȋn|n}}
* {{Z|sk}}: {{W|sk|skutok|n}}, {{W+|sk|čin|n}}
* {{Z|sl}}: {{W+|sl|dejanje|nt}}
* {{Z|es}}: {{W+|es|hecho|n}}, {{W+|es|acto|n}}, {{W+|es|acción|m}}, {{W+|es|obra|m}}
* {{Z|sv}}: {{W+|sv|gärning}}, {{W+|sv|dåd}}
* {{Z|te}}: {{W+|te|చర్య|sc=Telu}}
* {{Z|tr}}: {{W+|tr|iş}}, {{W|tr|yapma}}, {{W|tr|etme}}, {{W|tr|koyma}}, {{W+|tr|hareket}}, {{W|tr|eylem}}, {{W|tr|fiiliyat}}, {{W|tr|icra}}, {{W|tr|ika}}, {{W|tr|iştira}}, {{W|tr|gezdirme}}
* {{Z|uk}}: {{W+|uk|ді́я|m}}, {{W+|uk|ді́яння|nt}}, {{W+|uk|акт|n}}
* {{Z|el}}: {{W+|el|πράξη|m}}
*: {{Z|grc}}: {{W|grc|πρᾶξις|m}}
{{werger-bin}}
==== Anagram ====
* {{anagram|ku|a=iiknr|rikin}}
j2mbynef11tu8st52u2oi3qel9nvr90
6532112
6532111
2026-09-18T20:45:21Z
Wikihez
7344
Kurmancî/Lêker: beşa «Etîmolojî» hate nûkirin (DefSideBoxes)
6532112
wikitext
text/x-wiki
{{h-bnr|kirîn}}
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-IPA}}
* {{deng|ku|LL-Q36163_(kmr)-Key Mîrza-kirin.wav|dever=Wan}}
* {{ku-kîte}}
=== Lêker ===
{{ku-tewîn-lk|kirin|form=gerguhêz|niha=k|borî=kir}}
[[Wêne:Lewis_Hine_Power_house_mechanic_working_on_steam_pump.jpg|thumb|Kesek kar '''dike'''. Peyvên ''[[kar]]'' û ''[[kirin#Kurdî|kirin]]'' [[hevreh]] in.]]
{{lêker|ku|c=x-gh}}, {{bilêv|k|nerm}}
# [[bi cih anîn]], [[pêk anîn]], [[encam dan]]
#: {{mk|ku|Tu çi '''dikî'''?}}
#: {{mk|ku|'''Bikin'''! – '''Neke'''! – '''Meke'''!}}
#: {{mk|ku|Min hemû ev kar '''kiriye'''.}}
#* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=Were nîşanê Nişanî de xwe bêperde seher<br />Lê ji xûnê '''bike''' perhîz ku şehîdan çi hisab}}
# [[niyet]] hebûn, [[li ber bûn]], [[biniyet]] bûn, [[hewl]] dan, [[armanc]] bûn
#: {{mk|ku|Min '''dikir''' bipirsim lê ez newêriyam.}}
# [[nêzîk]] bûn, [[kêm]] man ku tiştek [[qewimîn|biqewime]]
#: {{mk|ku|Ji qehran '''dike''' xwe bikuje.}}
# [[lîstin]], [[pê ve]] [[mijûl]] bûn
#: {{mk|ku|Ez futbolê '''dikim'''.|Ez futbolê dilîzim.|birêz=1}}
# [[zewicîn]], [[mêr]] kirin, [[şû]] kirin, [[jin anîn]], wek [[hevser]] [[qebûl]] kirin
#: {{mk|ku|Ez bêmêr bimirim jî, ez te '''nakim'''.}}
# [[gan]] kirin, [[seks]] kirin
# [[xwestin]]
#* {{jêder-kitêb|ku|jêgirtin= '''Kir''' ku ji avê derbas bibe. |nivîskar={{w|Mela Mûsayê Hekarî}}|sernav=Durrû’l Mecalîs|amadekar=Hêmin Omer|sala weşandinê=2022|sal=1857|rûpel=116}}
# {{înm|wek [[lêkera sivik|lêkereke sivik]] bo çêkirina [[lêker]]ên [[nû]] ji [[navdêr]] û [[rengdêr]]an}}
#: {{mk|ku|[[qebûl kirin]], [[razî kirin]], [[xwedî kirin]], [[dest pê kirin]]}}
#: {{mk|ku|[[mezin kirin]], [[xurt kirin]], [[bihêz kirin]], [[perîşan kirin]]}}
==== Bi alfabeyên din ====
* {{ku-ar|کرن}}
* {{ku-kr|кьрьн}}
==== Jê ====
{{agadarî|Agadarî}}: Gelek peyv bi alîkariya [[lêkera sivik]] ya "kirin" tên çêkirin loma rêzkirina hemûyan li vir ne mimkin e. Bnr. '''[[:Kategorî:Tewandin:lêkerên pêkhatî yên kurmancî li gel "kirin"|Lêkerên li gel "kirin" (pêkhatî)]]''', '''[[:Kategorî:Peyvên kurmancî yên hevedudanî bi kirin|Peyvên kurmancî yên hevedudanî bi kirin]].
==== Etîmolojî ====
{{etîmon|ku|:mîr|ine-pro:*kʷer-<t:kirin, [[çêkirin]], [[ava kirin]]>|dar=1|metn=++}}
{{veşêre-ser|Bêhtir malûmat û hevreh}}
Hevreha soranî {{g|ckb|کردن}}, kurdiya başûrî {{q|sdh|kirdin|sc=Latn}}, lekî {{q|lki|kirdin|sc=Latn}}, goranî/hewramî {{q|hac|kerdey|sc=Latn}}, zazakî {{q|zza|kerdene}}, farisî {{g|fa|کردن|tr=kerden}}, tacikî {{g|tg|кардан|tr=kardan}}, partî {{g|xpr|𐭪𐭫𐭲|tr=kirt}}, pehlewî {{g|pal|𐭪𐭫𐭲|tr=kirt}}, avestayî {{g|ae|𐬐𐬆𐬭𐬆𐬙𐬀|tr=kərəta|w=[[kirî]]}} û {{g|ae|𐬐𐬆𐬭𐬆𐬥𐬀𐬊𐬌𐬙𐬌|tr=kərənaoiti|w=ew dike}}, hexamenişî {{g|peo|𐎠𐎤𐎢𐎫𐎠|tr=a-ku-u-t-a /akutā/|w=wî kir}}, sanskrîtî {{g|sa|कृणोति|tr=kṛṇóti}} û {{g|sa|करोति|tr=karóti}}, hindî {{g|hi|करना|tr=kerna}}, ûrdûyî {{g|ur|کرنا|tr=kerna}}, hîtîtî {{g|hit|𒆪𒂊𒅕𒋫|tr=ku-e-er-ta|w=kir}} û {{g|hit|𒆪𒅕𒈪|tr=ku-er-mi|w=dikim}}, lîtwanî {{q|lt|kùrti|w=kirin, çêkirin, ava kirin}} û {{q|lt|kerė́ti|w=[[sihr]] kirin}}, rûsî {{q|ru|ча́ры|tr=čáry|w=[[sihr]]kirin}}.
Ji heman rehî herwiha peyva {{q|ku|kar}} û paşgirên {{q|ku|-kar}}, {{q|ku|-ker}}, {{q|ku|-gar}}, {{q|ku|-ger}} (''-ger'' wek bo nimûne di peyva {{q|ku|asinger}}, {{q|ku|hesinger}} de).
Peyv ji zimanekî [[hindûîranî]] ketiye hinek zimanên [[ûralî]] jî, bo nimûne: ûdmûrtî {{g|udm|карыны|tr=karini}} û komî-permyakî {{g|koi|керны|tr=kêrni}}.
Wek paşgirên {{q|ku|-kâr}}, {{q|ku|-ker}}, {{q|ku|-gâr}} ketiye tirkî û gelek zimanên din jî yên [[tirkîkî]], bo nimûne di van peyvên tirkî de: {{q|tr|muhafazakâr}}, {{q|tr|peyker}}, {{q|tr|rüzgâr}} û bi dehan an bi sedan peyvên din.
;{{biçûk|Çavkanî:
* {{Cheung}}
* {{Chyet}}
* {{Derksen}}
* {{Kloekhorst}}
* {{Lubotsky}}
* {{Mallory}}
* {{Tsabolov}}
}}
{{veşêre-bin}}
==== Bi zaravayên din ====
* {{Z|hac}}: {{W-|hac|kerdey|sc=Latn}}
* {{Z|sdh}}: {{W-|sdh|کردن}}, {{W-|sdh|kirdin|sc=Latn}}
* {{Z|lki}}: {{W-|lki|کردن}}, {{W-|lki|kirdin|sc=Latn}}
* {{Z|ckb}}: {{W-|ckb|کردن|tr=kirdin}}
* {{Z|zza}}: {{W-|zza|kerdene}}
==== Werger ====
{{werger-ser|bi cih anîn, encam dan, çêkirin (1)}}
* {{Z|af}}: {{W+|af|doen}}
* {{Z|sq}}: {{W+|sq|bëj}}
* {{Z|de}}: {{W+|de|tun}}, {{W+|de|machen}}
*: {{Z|gsw}}: {{W-|gsw|tue}}
* {{Z|am}}: {{W-|am|ማድረግ}}
* {{Z|an}}: {{W+|an|fer}}
* {{Z|aii}}: {{W-|aii|ܥܵܒ݂ܹܕ|tr=ʿawed}}
* {{Z|rup}}: {{W-|rup|fac}}
* {{Z|as}}: {{W-|as|কৰ}}
* {{Z|ast}}: {{W+|ast|facer}}
* {{Z|ask}}: {{W-|ask|ko}}
* {{Z|ain}}: {{W-|ain|キ|tr=ki}}
* {{Z|az}}: {{W-|az|eləmək}}, {{W+|az|etmək}}, {{W-|az|qılmaq}}
* {{Z|ban}}: {{W-|ban|gaé}}
* {{Z|eu}}: {{W-|eu|egin}}
* {{Z|be}}: {{W-|be|рабі́ць|impf}}, {{W-|be|зрабі́ць|pf}}
* {{Z|bn}}: {{W-|bn|করা}}
* {{Z|bqi}}: {{W-|bqi|کردن|tr=kerden}}
* {{Z|br}}: {{W+|br|ober}}
* {{Z|bg}}: {{W-|bg|пра́вя}}
* {{Z|my}}: {{W+|my|လုပ်}}, {{W+|my|ပြု}}
* {{Z|ce}}: {{W-|ce|да}}, {{W-|ce|дан}}
* {{Z|cs}}: {{W-|cs|dělat|impf}}, {{W-|cs|udělat|pf}}
* {{Z|chr}}: {{W-|chr|ᎾᏛᏁᎭ}}
* {{Z|zh}}:
*: {{Z|cmn}}: {{W-|cmn|做|tr=zuò}}, {{W+|cmn|作|tr=zuò}}
* {{Z|cv}}: {{W-|cv|ту}}
* {{Z|dlm}}: {{W-|dlm|fur}}
* {{Z|da}}: {{W+|da|gøre}}, {{W-|da|udføre}}
* {{Z|id}}: {{W+|id|buat}}, {{W+|id|laku}}, {{W+|id|melakukan}}
* {{Z|ar}}: {{W-|ar|فَعَلَ}}, {{W-|ar|عَمِلَ}}
*: {{Z|arq}}: {{W-|arq|دار}}
*: {{Z|arz}}: {{W-|arz|عمل|tr=ʕamal}}
*: {{Z|acw}}: {{W-|acw|سَوَّى|tr=sawwa}}
* {{Z|hy}}: {{W+|hy|անել}}
* {{Z|eo}}: {{W+|eo|fari}}
* {{Z|et}}: {{W+|et|tegema}}
* {{Z|ext}}: {{W-|ext|hazel}}
* {{Z|fa}}: {{W-|fa|کَردَن|tr=kardan}}
* {{Z|fi}}: {{W-|fi|tehdä}}
* {{Z|fr}}: {{W-|fr|faire}}
* {{Z|fur}}: {{W-|fur|fâ}}
* {{Z|frr}}: {{W-|frr|düünj}}, {{W-|frr|du}}
* {{Z|fy}}: {{W-|fy|dwaan}}
* {{Z|gd}}: {{W-|gd|dèan}}
* {{Z|gl}}: {{W+|gl|facer}}
* {{Z|got}}: {{W-|got|𐍄𐌰𐌿𐌾𐌰𐌽}}
* {{Z|ka}}: {{W+|ka|კეთება}}
* {{Z|gn}}: {{W+|gn|japo}}
* {{Z|ht}}: {{W-|ht|fè}}
* {{Z|hi}}: {{W+|hi|करना}}
* {{Z|hil}}: {{W-|hil|buhat}}, {{W-|hil|pagbuhat}}
* {{Z|mww}}: {{W-|mww|ua}}
* {{Z|nl}}: {{W+|nl|doen}}
* {{Z|he}}: {{W-|he|עָשָׂה|tr=asá}},{{W-|he|פָּעַל|tr=pa'al}}
* {{Z|io}}: {{W+|io|facar}}
* {{Z|ilo}}: {{W-|ilo|aramid}}
* {{Z|ang}}: {{W-|ang|dōn}}
* {{Z|en}}: {{W+|en|do}}, {{W+|en|perform}}, {{W+|en|execute}}
* {{Z|inh}}: {{W-|inh|де}}
* {{Z|ia}}: {{W-|ia|facer}}
* {{Z|ga}}: {{W-|ga|déan}}, {{W-|ga|dein}}
* {{Z|ist}}: {{W-|ist|fà}}
* {{Z|it}}: {{W+|it|fare}}
* {{Z|is}}: {{W+|is|gera}}, {{W-|is|gjöra}}
* {{Z|ja}}: {{W+|ja|する|tr=suru}}, {{W+|ja|やる|tr=yaru}}, {{W-|ja|なさる|tr=nasaru}}, {{W+|ja|致す|tr=いたす, itasu}}
* {{Z|jv}}: {{W+|jv|gawe}}, {{W+|jv|gawé}}
* {{Z|bsh}}: {{W-|bsh|ku}}
* {{Z|xnn}}: {{W-|xnn|ikkan}}
* {{Z|kn}}: {{W+|kn|ಮಾಡು}}
* {{Z|kea}}: {{W-|kea|faze}}
* {{Z|ca}}: {{W-|ca|fer}}
* {{Z|qu}}: {{W+|qu|ruray}}, {{W-|qu|rurai}}
* {{Z|ks}}: {{W-|ks|کَرُن}}
* {{Z|ky}}: {{W-|ky|этүү}}
* {{Z|si}}: {{W-|si|කරනවා}}
* {{Z|ko}}: {{W+|ko|하다}}
* {{Z|co}}: {{W-|co|fà}}
* {{Z|mfe}}: {{W-|mfe|fer}}
* {{Z|kum}}: {{W-|kum|этмек}}
* {{Z|lld}}: {{W-|lld|fé}}, {{W-|lld|fèr}}
* {{Z|ltg}}: {{W-|ltg|dareit}}
* {{Z|la}}: {{W+|la|faciō}}, {{W+|la|agō}}
* {{Z|lv}}: {{W+|lv|darīt}}, {{W-|lv|veikt}}
* {{Z|lo}}: {{W+|lo|ເຮັດ}}, {{W-|lo|ທຳ}}
* {{Z|lez}}: {{W-|lez|авун}}
* {{Z|lt}}: {{W+|lt|daryti}}
* {{Z|lmo}}: {{W-|lmo|fà}}
* {{Z|mhn}}: {{W-|mhn|mòchen}}
* {{Z|mk}}: {{W+|mk|прави}}, {{W-|mk|врши}}, {{W+|mk|направи}}
* {{Z|ml}}: {{W+|ml|ചെയ്യുക}}
* {{Z|ms}}: {{W+|ms|buat}}
* {{Z|mt}}: {{W-|mt|għamel}}
* {{Z|mzn}}: {{W-|mzn|هاکردن|tr=hâkërden}}
* {{Z|gun}}: {{W-|gun|japo}}
* {{Z|hu}}: {{W+|hu|tesz}}, {{W+|hu|csinál}}
* {{Z|egy}}: {{W-egy|jrj|h=ir}}
* {{Z|mn}}:
*: Kirîlî: {{W+|mn|хийх}}
* {{Z|nci}}: {{W-|nci|chīhua}}
* {{Z|nah}}: {{W+|nah|chīhua}}
* {{Z|gld}}: {{W-|gld|анго-}}
* {{Z|nap}}: {{W-|nap|fà}}
* {{Z|nds}}:
*: {{Z|nds-nl}}: {{W-|nds-nl|doan}}
*: {{Z|nds-de}}: {{W-|nds-de|doon}}
* {{Z|ne}}: {{W+|ne|गर्नु}}
* {{Z|nrf}}: {{W-|nrf|faithe}}
* {{Z|no}}:
*: {{Z|nb}}: {{W+|nb|gjøre}}, {{W+|nb|utføre}}
*: {{Z|nn}}: {{W+|nn|gjere}}, {{W+|nn|utføre}}
* {{Z|pro}}: {{W-|pro|far}}
* {{Z|oc}}: {{W+|oc|far}}, {{W+|oc|har}}, {{W+|oc|faire}}
* {{Z|or}}: {{W+|or|କରିବା}}
* {{Z|os}}: {{W-|os|кӕнын}}
* {{Z|ug}}: {{W-|ug|قىلماق}}
* {{Z|uz}}: {{W+|uz|qilmoq}}
* {{Z|pi}}: {{W-|pi|karoti}}
* {{Z|pap}}: {{W-|pap|hasi}}
* {{Z|ps}}: {{W-|ps|کول|tr=kawël}}
* {{Z|ppl}}: {{W-|ppl|-chiwa}}, {{W-|ppl|-chihua}}
* {{Z|pl}}: {{W+|pl|robić|impf}}, {{W+|pl|zrobić|pf}}, {{W+|pl|czynić|impf}}, {{W+|pl|uczynić|pf}}
* {{Z|roa-opt}}: {{W-|roa-opt|fazer}}
* {{Z|pt}}: {{W+|pt|fazer}}, {{W+|pt|realizar}}
* {{Z|pa}}: {{W-|pa|ਕਰਨਾ}}
* {{Z|kk}}: {{W+|kk|істеу}}
* {{Z|cop}}: {{W-|cop|ⲉⲓⲣⲉ}}
* {{Z|rap}}: {{W-|rap|haka}}
* {{Z|rgn}}: {{W-|rgn|fêr}}
* {{Z|rm}}: {{W-|rm|far}}
* {{Z|ro}}: {{W+|ro|face}}
* {{Z|ru}}: {{W-|ru|де́лать|impf}}, {{W-|ru|сде́лать|pf}}
* {{Z|rue}}: {{W-|rue|роби́ти|impf}}
* {{Z|osx}}: {{W-|osx|dôn}}, {{W-|osx|fremmian}}, {{W-|osx|gifrummian}}
* {{Z|sgs}}: {{W-|sgs|darītė}}, {{W-|sgs|dėrbtė}}
* {{Z|sa}}: {{W+|sa|करोति|tr=karóti}}
*: {{Z|sa}}: {{W+|sa|कृणोति|tr=kṛṇóti}}
* {{Z|sc}}: {{W-|sc|fàchere}}
*: {{Z|sc}}: {{W-|sc|fai}}
* {{Z|ceb}}: {{W-|ceb|buhat}}, {{W-|ceb|buhaton}}
* {{Z|scn}}: {{W+|scn|fari}}
* {{Z|sd}}: {{W+|sd|ڪَرَڻُ}}
* {{Z|sh}}:
*: Kirîlî: {{W-|sh|радити}}
*: Latînî: {{W+|sh|raditi}}, {{W+|sh|činiti}}
* {{Z|syl}}: {{W-|syl|ꠇꠞꠣ}}
* {{Z|sco}}: {{W-|sco|dae}}
* {{Z|orv}}: {{W-|orv|робити|impf}}
* {{Z|sk}}: {{W+|sk|robiť|impf}}, {{W-|sk|urobiť|pf}}
* {{Z|sl}}: {{W-|sl|storiti}},{{W-|sl|ukreniti}}, {{W-|sl|narediti}}
* Sorbî:
*: {{Z|dsb}}: {{W-|dsb|cyniś|impf}}
*: {{Z|hsb}}: {{W-|hsb|činić|impf}}, {{W-|hsb|sčinić|pf}}
* {{Z|es}}: {{W-|es|hacer}}
* {{Z|sv}}: {{W+|sv|göra}}
* {{Z|shn}}: {{W-|shn|ႁဵတ်း}}
* {{Z|tab}}: {{W-|tab|апӏуб}}
* {{Z|tg}}: {{W+|tg|кардан}}
* {{Z|tl}}: {{W-|tl|gawin}}, {{W-|tl|gumawa}}, {{W-|tl|isagawa}}
* {{Z|ta}}: {{W+|ta|செய்}}, {{W+|ta|பண்ணு}}
* {{Z|nod}}: {{W-|nod|ᩁᩮᩢ᩠ᨯ}}, {{W-|nod|ᨿᩮ᩠ᨿᩡ}}, {{W-|nod|ᨿᩡ}}, {{W-|nod|ᨿ}}
* {{Z|th}}: {{W+|th|ทำ}}
* {{Z|te}}: {{W+|te|చేయు}}
* {{Z|tt}}: {{W-|tt|эшләү}}
* {{Z|tet}}: {{W-|tet|halo}}
* {{Z|tr}}: {{W+|tr|yapmak}}, {{W+|tr|etmek}}, {{W+|tr|kılmak}}
* {{Z|tk}}: {{W+|tk|etmek}}
* {{Z|tpi}}: {{W+|tpi|mekim}}, {{W-|tpi|wokim}}
* {{Z|txb}}: {{W-|txb|yām-}}
* {{Z|tyv}}: {{W-|tyv|кылыр}}
* {{Z|udm}}: {{W-|udm|карыны}}
* {{Z|ur}}: {{W-|ur|کَرْنا|tr=karnā}}
* {{Z|uk}}: {{W-|uk|роби́ти|impf}}, {{W-|uk|зроби́ти|pf}}
* {{Z|vec}}: {{W+|vec|far}}
* {{Z|vi}}: {{W+|vi|làm}}
* {{Z|wbk}}: {{W-|wbk|ća}}
* {{Z|wa}}: {{W+|wa|fé}}
* {{Z|wbl}}: {{W-|wbl|car-}}
* {{Z|cy}}: {{W-|cy|gwneud}}
* {{Z|km}}: {{W+|km|ធ្វើ}}
* {{Z|yai}}: {{W-|yai|карак}}
* {{Z|yi}}: {{W-|yi|טאָן}}
* {{Z|yoi}}: {{W-|yoi|きるん|tr=kirun}}
* {{Z|el}}: {{W+|el|κάνω}}
*: Kevn: {{W-|grc|πράσσω}}, {{W-|grc|ποιέω}}, {{W-|grc|ῥέζω}}, {{W-|grc|ἔρδω}}, {{W-|grc|δράω}}, {{W-|grc|τελέω}}
* {{Z|ase}}: {{W-|ase|C@SideTrunkhigh-PalmDown-C@SideTrunkhigh-PalmDown RoundVertSidetoside-RoundVertSidetoside}}, {{W-|ase|Claw5@SideTrunkhigh-PalmDown-Claw5@SideTrunkhigh-PalmDown RoundVertSidetoside-RoundVertSidetoside}}
{{werger-bin}}
=== Navdêr ===
{{navdêr|z=m|ku}}
# [[kar]], [[kiryar]], [[emel]], [[fêl]], [[fealiyet]], [[xebat]], [[şol]], [[encamdan]], [[bicihanîn]], [[çêkirin]]
#: {{mk|ku|'''Kirina''' wî karî ne hêsan e.}}
#: {{mk|ku|Divê mirov ji '''kirinê''' netirse.}}
#* {{jêder-malper|ku|jêgirtin=Di berhemên Fiqih û Usûlu’l-Fiqhê derbas dibe; fermaneke ku '''kirina''' tiştekî/’îbadeketekê di wextê wê lazim bike, qezakirina vê peywira ku di dema xwe nehatiye edakirin jî pêwîst didêre. Ma ev tişt ne rast e? Hûn dikarin di çarçoveya nimêja qeza de vê şîrove bikin?|malper=fetwayenkurdi.com|url=http://www.fetwayenkurdi.com/?p=3995|dîrok=21.07.2019}}
#* {{jêder-malper|ku|jêgirtin=Lêkera netêger an jî întransîtîv ew tewre lêker e ku tevger an '''kirina''' wê yekser tesîrê li objektekê nake. Ew çalakî an bûyer bê objekt çêdibe û dema ku ew çalakî pêk tê, tesîreke yekser li tişt an kesekî nayê.|url=https://sites.google.com/a/baranrizgar.co.cc/azadiya-kurdistane/home/lekeren-transitiv--intransitiv-ci-cudati-hene-cawa-ji-hev-veqetinin?tmpl=%2Fsystem%2Fapp%2Ftemplates%2Fprint%2F&showPrintDialog=1|malper=bloga Baran Rizgar|dîrok=21.07.2019}}
==== Tewandin ====
{{ku-tewîn-nav|mê}}
==== Jê ====
* {{g|ku|kirinî}}
==== Etîmolojî ====
Li jortir [[kirin#Etîmolojî|binêrin]].
==== Bi zaravayên din ====
* {{Z|ckb}}: {{W-|ckb|kar|sc=Latn}}, {{W-|ckb|kirdewe|sc=Latn}}
* {{Z|zza}}: {{W-|zza|kerdiş}}
==== Werger ====
{{werger-ser}}
* {{Z|de}}: {{W+|de|Tat|m}}, {{W+|de|Akt|n}}, {{W+|de|Werk|nt}}
* {{Z|ba}}: {{W|ba|ғәмәл}}
* {{Z|be}}: {{W|be|дзе́янне|nt}}, {{W|be|акт|n}}
* {{Z|bg}}: {{W+|bg|де́йствие|nt}}, {{W+|bg|постъпка|m}}, {{W+|bg|акт|n}}
* {{Z|cs}}: {{W+|cs|skutek|n}}, {{W+|cs|čin|n}}
* {{Z|zh}}: {{W+|cmn|行為|sc=Hani}}, {{W+|cmn|行为|tr=xíngwéi|sc=Hani}}
* {{Z|da}}: {{W|da|gerning|c}}, {{W+|da|handling|c}}
* {{Z|ar}}: {{W+|ar|عَمَل|n}}, {{W+|ar|فِعْل|n}}
* {{Z|hy}}: {{W+|hy|արարք}}
* {{Z|eo}}: {{W+|eo|faro}}, {{W|eo|ago}}
* {{Z|ee}}: {{W|ee|dɔwɔwɔ}}
* {{Z|fa}}: {{W+|fa|کردار|tr=kirdar}}, {{W+|fa|کار|tr=kâr}}, {{W+|fa|اعمال|p|tr=e'mal}}
* {{Z|fi}}: {{W+|fi|teko}}, {{W+|fi|toimi}}
* {{Z|fr}}: {{W+|fr|acte|n}}, {{W+|fr|action|m}}, {{W+|fr|œuvre|m}}
* {{Z|fy}}: {{W|fy|died|nt}}
* {{Z|gd}}: {{W|gd|gnìomh|n}}
* {{Z|nl}}: {{W+|nl|daad|m}}
* {{Z|he}}: {{W+|he|מעשה|m|tr=ma'ase|sc=Hebr}}
* {{Z|en}}: {{W|en|deed}}, {{W|en|action}}, {{W|en|disposition}}, {{W|en|doing}}, {{W|en|execution}}, {{W|en|performance}}, {{W|en|executing}}
* {{Z|it}}: {{W+|it|fatto|n}}, {{W+|it|gesto}}, {{W+|it|gesta}}
* {{Z|is}}: {{W+|is|dáð|m}}
* {{Z|ja}}: {{W+|ja|行為|tr=こうい, kōi|sc=Jpan}}
* {{Z|ca}}: {{W+|ca|fet|n}}, {{W+|ca|acte|n}}
* {{Z|ko}}: {{W+|ko|행위}}
* {{Z|la}}: {{W+|la|āctus|n}}
* {{Z|lb}}: {{W|lb|Dot|m}}
* {{Z|mk}}: {{W|mk|дело|nt}}, {{W|mk|постапка|m}}
* {{Z|hu}}: {{W+|hu|tett}}
* {{Z|no}}: {{W+|no|dåd}}, {{W|no|gjerning}}
* {{Z|pt}}: {{W+|pt|ação|m}}, {{W+|pt|feito|n}}
* {{Z|pt}}: {{W+|ro|faptă}}
* {{Z|ru}}: {{W+|ru|посту́пок|n}}, {{W+|ru|де́йствие|nt}}, {{W+|ru|дея́ние|nt}}, {{W+|ru|акт|n}}
* {{Z|sa}}: {{W+|sa|कार्य|nt}}
* {{Z|sh}}: {{W|sh|чи̑н|n}}
*: {{Z|sh}}: {{W+|sh|čȋn|n}}
* {{Z|sk}}: {{W|sk|skutok|n}}, {{W+|sk|čin|n}}
* {{Z|sl}}: {{W+|sl|dejanje|nt}}
* {{Z|es}}: {{W+|es|hecho|n}}, {{W+|es|acto|n}}, {{W+|es|acción|m}}, {{W+|es|obra|m}}
* {{Z|sv}}: {{W+|sv|gärning}}, {{W+|sv|dåd}}
* {{Z|te}}: {{W+|te|చర్య|sc=Telu}}
* {{Z|tr}}: {{W+|tr|iş}}, {{W|tr|yapma}}, {{W|tr|etme}}, {{W|tr|koyma}}, {{W+|tr|hareket}}, {{W|tr|eylem}}, {{W|tr|fiiliyat}}, {{W|tr|icra}}, {{W|tr|ika}}, {{W|tr|iştira}}, {{W|tr|gezdirme}}
* {{Z|uk}}: {{W+|uk|ді́я|m}}, {{W+|uk|ді́яння|nt}}, {{W+|uk|акт|n}}
* {{Z|el}}: {{W+|el|πράξη|m}}
*: {{Z|grc}}: {{W|grc|πρᾶξις|m}}
{{werger-bin}}
==== Anagram ====
* {{anagram|ku|a=iiknr|rikin}}
dp0vbb5z4yxnv5szuixu25qp30ok43m
ker
0
3570
6532109
6368007
2026-09-18T20:38:21Z
Wikihez
7344
Kurmancî/Navdêr 3: beşa «Etîmolojî» hate nûkirin (DefSideBoxes)
6532109
wikitext
text/x-wiki
{{h-bnr|ker|kêr|kerr|kêrr|-ker}}
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{q|ku|ker|cuda=(dewarek)|id=dewarek}} {{IPA|ku|/kʰɜɾ/}}, {{arF|کهر}}
** {{deng|ku|LL-Q36368 (kur)-Dildadil-ker.wav|dever=Amed}}
*** {{beş|Navdêr 1}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (navdêr 1).wav|dever=Bidlîs}}
* {{beş|Navdêr 3}} {{deng|ku|LL-Q36163 (kmr)-Ebulfîda-ker (Navdêr 3).wav|dever=Bidlîs}}
* {{q|ku|ker|cuda=(parçe)|id=parçe}} {{IPA|ku|/kɜɾ/}}, {{arF|کهر}}
** {{q|ku|ker|cuda=(koma pezî)|id=koma pezî}} {{IPA|ku|/kɜɾ/}}, {{arF|کهر}}
*** {{deng|ku|LL-Q36368 (kur)-Mihemed Qers-ker(koma pez).wav|dever=Qers}}
**** {{beş|Navdêr 4}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (navdêr 4).wav|dever=Bidlîs}}
* {{q|ku|ker|cuda=(guhgiran)|id=guhgiran}} {{IPA|ku|/kɜr/}}, {{arF|کهڕ}}
** {{deng|ku|LL-Q36368 (kur)-Mihemed Qers-kerr.wav|dever=Qers}}
*** {{deng|ku|LL-Q36368 (kur)-Dildadil-ker (kesê ku nabihîze).wav|dever=Amed}}
**** {{deng|ku|Kmr-Efrîn--kerr.oga|dever=Efrîn}}
**** {{beş|Rengdêr 1}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (rengdêr 1).wav|dever=Bidlîs}}
***** {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (rengdêr).wav|Deng|dever=Bidlîs}}
=== Navdêr 1 ===
[[Wêne:Donkey in Clovelly, North Devon, England.jpg|thumb|Kerek (1)]]
[[Wêne:S Veahmätle13.JPG|thumb|'''Kerê''' pezî (2)]]
{{navdêr|ku|z=n}}
# {{maneid|ku|dewarek}} {{f|ku|guhandar}} [[cûn|Cûnek]] [[dewar]]an e ku [[şibîn|dişibe]] [[hesp]]an û [[hêstir]]an lê ji wan [[kurt]]tir û [[biçûk]]tir e <br>(bi taybetî bo barhilgirtinê tê bikaranîn).
#* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=ابله چه کت طوافی نابینتن بری رش</br>بیزی دکت ژ قنجان ژ رمز و ناز و غنجان</br>قدری گلان چه زانت کربش دڤیت '''کری''' رش|tr=Ebleh çi kit ṭewafê nabînitin Berê reş</br>Bêzê dikit ji qencan ji remz û naz û x̣encan</br>Qedrê gulan çi zanit kerbeş divêt '''kerê''' reş}}
# {{maneid|ku|koma pezî}} [[kom|Komeke]] [[pez]]î, [[garan]]a pezî, [[ber]]ê pezî
# {{maneid|ku|bêaqil}} {{f|ku|mecazî}} [[bêaqil|Bêaqil]], [[bêhiş]], [[bêmejî]], [[mejîreş]], [[aqilsivik]], [[nezan]].
# {{f|ku|mecazî|heqaret}} (ji peyva ker a heywan) ji bo kesê zir, serhişk û bêpîr û şerde
#* {{J:Firat Cewerî:Girtî:1986|jêgirtin=- Hûn in, ha!. . . Ji bo çi hûn diziyê dikin '''ker''' lawê '''keran'''?}}
==== Tewandin ====
{{ku-tewîn-nav/nû|nêr}}
==== Notên bikaranînê ====
{{agadarî}} Di gelek devokên kurmancî de '''ker''' tenê bo van cûn dewarên nêr bi kar tê. Yên mê '''[[maker]]''' in.
==== Jê ====
{{kol3|ku
| keratî
| kerçove
| kerçovetî
| kerî
| kerînî
| kerîtî
| kertî
| kurrûk
| maker
| nêreker
}}
==== Etîmolojî ====
Ji {{mîr|ira-pro||*xárah||ker}}, ji {{mîr|iir-pro||*kʰáras||ker}}; belkî taliyê ji zimanekî [[samî]]{{çp}}, bo nimûne ji {{ji|akk|ku|tr=xeradu|w=ker, nêreker}}.{{çp}}
Hevreha soranî {{g|ckb|کهر|tr=ker}}, zazakî {{q|zza|her}}, hewramî {{g|hac|ھەر|tr=her}}, farisî {{g|fa|خر|tr=xer}}, avestayî {{g|ae|𐬑𐬀𐬭𐬀|tr=xere}}, sanskrîtî {{g|sa|खर|tr=khére}}, osetî {{g|os|хӕрӕг|tr=xereg}}, peştûyî {{g|ps|خر|tr=xer}}, belûçî {{g|bal|ہر|tr=her}}.
==== Gotinên pêşiyan ====
* [[şîreta kîrê ker e]]
==== Bi zaravayên din ====
* {{Z|ckb}}: {{W-|ckb|کەر|tr=ker}}
* {{Z|sdh}}: {{W-|sdh|xer|sc=Latn}}
* {{Z|lki}}: {{W-|lki|xer|sc=Latn}}
* {{Z|hac}}: {{W-|hac|her|sc=Latn}}
* {{Z|zza}}: {{W-|zza|her}}
==== Werger ====
{{werger-ser|dewarek}}
* {{Z|ab}}: {{W-|ab|аҽада}}
* {{Z|ady}}: {{W-|ady|щыды}}
* {{Z|aa}}: {{W-|aa|danán|n}}
* {{Z|af}}: {{W+|af|donkie}}
* {{Z|akk}}: {{W-|akk|𒀲|n|tr=imēru}}
* {{Z|sq}}: {{W+|sq|gomar|n}}, {{W-|sq|magar|n}}
* {{Z|de}}: {{W+|de|Esel|n}}; {{W+|de|Grauchen|nt}}, {{W-|de|Grautier|nt}}
* {{Z|alt}}: {{W-|alt|эштек}}
* {{Z|am}}: {{W-|am|አህያ|tr=äheyya}}
* {{Z|ani}}: {{W-|ani|гьаморохи}}
* {{Z|arc}}:
*: {{Z|syc}}: {{W-|syc|ܚܡܪܐ|g|tr=ḥəmārā}}, {{W-|syc|ܚܡܪܬܐ|m|tr=ḥəmārtā}}, {{W-|syc|ܐܬܢܐ|m|tr=ʾăṯānā}}
*: {{Z|tmr}}: {{W-|arc|חֲמָרָא|n|tr=ḥămārā}}
* {{Z|rup}}: {{W-|rup|cãci}}, {{W-|rup|dãngã}}, {{W-|rup|gumar}}, {{W-|rup|dãnglãrã}}, {{W-|rup|shonj}}, {{W-|rup|tãronj}}, {{W-|rup|uci}}, {{W-|rup|uricljat}}, {{W-|rup|tar}}
* {{Z|as}}: {{W-|as|গাধ}}
* {{Z|ast}}: {{W+|ast|burru|n}}, {{W+|ast|burra|m}}, {{W+|ast|pollín|n}}
* {{Z|aot}}: {{W-|aot|gada}}
* {{Z|av}}: {{W-|av|хӏама}}
* {{Z|awa}}: {{W-|awa|गदहा|n}}
* {{Z|az}}: {{W+|az|eşşək}}, {{W-|az|ulaq}}
* {{Z|bdr}}: {{W-|bdr|keribas}}
* {{Z|eu}}: {{W+|eu|asto}}
* {{Z|ba}}: {{W-|ba|ишәк}}
* {{Z|sne}}: {{W-|sne|kaldei}}
* {{Z|be}}: {{W-|be|асёл|n}}
* {{Z|bal}}: {{W-|bal|ہر|tr=har}}
* {{Z|bn}}: {{W+|bn|গাধা}}
* {{Z|br}}: {{W+|br|azen|n}}
* {{Z|bdk}}: {{W-|bdk|лем}}
* {{Z|bg}}: {{W-|bg|мага́ре|nt}}, {{W-|bg|осе́л|n}}
* {{Z|my}}: {{W+|my|မြည်း}}
* {{Z|bua}}: {{W-|bua|элжэгэн}}
* {{Z|ce}}: {{W-|ce|вир}}
* {{Z|cs}}: {{W+|cs|osel|n}}
* {{Z|chr}}: {{W-|chr|ᏗᎦᎵᏅᎯᏛ}}
* {{Z|chy}}: {{W-|chy|a'éevo'ha}}
* {{Z|ny}}: {{W-|ny|bulu}}
* {{Z|cic}}: {{W-|cic|haksibish falaa'}}
* {{Z|zh}}:
*: {{Z|yue}}: {{W-|yue|驢|tr=leoi4}}, {{W-|yue|驢仔|tr=leoi4 zai2}}
*: {{Z|dng}}: {{W-|dng|лү}}
*: {{Z|hak}}: {{W-|hak|驢仔|tr=lì-è}}
*: {{Z|cmn}}: {{W+|cmn|驢|tr=lǘ}}, {{W-|cmn|驢子|tr=lǘzi}}
*: {{Z|cdo}}: {{W-|cdo|驢|tr=lè̤}}
*: {{Z|nan}}: {{W+|nan|驢|tr=lîr / lû / lî}}, {{W+|nan|驢仔|tr=lû-á / lî-á / lîr-á}}
*: {{Z|wuu}}: {{W-|wuu|驢}}
* {{Z|cv}}: {{W-|cv|ашак}}
* {{Z|chk}}: {{W-|chk|tongki}}
* {{Z|dlm}}: {{W-|dlm|samur|n}}
* {{Z|da}}: {{W+|da|æsel|nt}}
* {{Z|dv}}: {{W-|dv|ހިާމރު}}
* {{Z|ovd}}: {{W-|ovd|åsn|m}}
* {{Z|id}}: {{W+|id|keledai}}
* {{Z|ar}}: {{W+|ar|حِمَار|n}}
*: {{Z|arz}}: {{W-|arz|حمار|n|tr=ḥumār, ḥmār}}
*: {{Z|acw}}: {{W-|acw|حُمار|n|tr=ḥumār}}
*: {{Z|acm}}: {{W-|acm|زمال|n|tr=zmāl}}
*: {{Z|afb}}: {{W-|afb|حمار|n|tr=ḥmār}}
*: {{Z|aeb}}: {{W-|aeb|بهيم|n|tr=bhīm}}
*: {{Z|ary}}: {{W-|ary|حمار|n|tr=ḥmār}}, {{W-|ary|حمارة|m|tr=ḥmāra}}, {{W-|ary|دحش|tr=daḥš}}, {{W-|ary|دحشة|m|tr=daḥša}}
* {{Z|hy}}: {{W+|hy|էշ}}, {{W+|hy|ավանակ}}
* {{Z|eo}}: {{W+|eo|azeno}}
* {{Z|et}}: {{W+|et|eesel}}
* {{Z|gez}}: {{W-|gez|አድግ}}
* {{Z|ee}}: {{W-|ee|tedzi|nt}}
* {{Z|fa}}: {{W+|fa|خر|tr=xar}}, {{W+|fa|الاغ|tr=olâğ}}
* {{Z|fo}}: {{W-|fo|asni}}
* {{Z|fi}}: {{W+|fi|aasi}}
* {{Z|fro}}: {{W-|fro|asne|n}}
* {{Z|fr}}: {{W+|fr|âne|n}}
* {{Z|fur}}: {{W-|fur|mus}}
* {{Z|fy}}: {{W-|fy|ezel}}
* {{Z|gd}}: {{W-|gd|asal|m}}
* {{Z|gag}}: {{W-|gag|eşek}}, {{W-|gag|yeşek}}
* {{Z|gl}}: {{W+|gl|asno}}, {{W+|gl|burro}}
* {{Z|got}}: {{W-|got|𐌰𐍃𐌹𐌻𐌿𐍃}}
* {{Z|gu}}: {{W-|gu|ગધેડો}}
* {{Z|ka}}: {{W+|ka|ვირი}}, {{W+|ka|ჯორი}}
* {{Z|ha}}: {{W+|ha|jaki}}
* {{Z|hi}}: {{W+|hi|गधा|n}}
* {{Z|nl}}: {{W+|nl|ezel|n}}
* {{Z|he}}: {{W-|he|חֲמוֹר|n|tr=khamór}}, {{W-|he|אָתוֹן|m|tr=atón}}
* {{Z|io}}: {{W+|io|asno}}
* {{Z|ang}}: {{W-|ang|esol|n}}
* {{Z|en}}: {{W+|en|donkey}}
* {{Z|inh}}: {{W-|inh|вир}}
* {{Z|ia}}: {{W-|ia|asino}}
* {{Z|ga}}: {{W+|ga|asal|n}}
* {{Z|ist}}: {{W-|ist|samèri|n-p}}
* {{Z|it}}: {{W+|it|asino|n}}, {{W+|it|somaro|n}}, {{W-|it|buricco|n}}, {{W+|it|ciuco}}
* {{Z|is}}: {{W+|is|asni}}
* {{Z|ja}}: {{W+|ja|驢馬|tr=ろば, roba}}, {{W+|ja|ロバ|tr=roba}}
* {{Z|kab}}: {{W-|kab|aɣyul|n}}
* {{Z|kl}}: {{W-|kl|siutitooq}}
* {{Z|xal}}: {{W-|xal|элҗгн}}
* {{Z|ktb}}: {{W-|ktb|harreta}}
* {{Z|kn}}: {{W+|kn|ಕತ್ತೆ}}
* {{Z|krc}}: {{W-|krc|эшек|tr=eşek}}
* {{Z|csb}}: {{W-|csb|osoł|n}}, {{W-|csb|òseł}}
* {{Z|ca}}: {{W+|ca|ase|n}}, {{W+|ca|somera|m}}, {{W+|ca|burro|n}}, {{W+|ca|burra|m}}, {{W+|ca|ruc|n}}, {{W+|ca|ruca|m}}
* {{Z|qu}}: {{W-|qu|wuru}}, {{W-|qu|asnu}}
* {{Z|ks}}: {{W-|ks|خَر|n}}
* {{Z|ky}}: {{W+|ky|эшек}}
* Ladin:
*: {{Z|lld}}: {{W-|lld|musciat|n}}
*: {{Z|lld}}: {{W-|lld|müsc|n}}
*: {{Z|lld}}: {{W-|lld|èsen|n}},{{W-|lld|musciat|n}}
* {{Z|si}}: {{W+|si|බූරුවා}}
* {{Z|ko}}: {{W+|ko|당나귀}}, {{W+|ko|나귀}}
* {{Z|rop}}: {{W-|rop|ginggong ginggong}}
* {{Z|la}}: {{W-|la|asellus}}, {{W-|la|asinus|n}}
* {{Z|lv}}: {{W-|lv|ēzelis|n}}
* {{Z|lo}}: {{W-|lo|ລາ}}, {{W-|lo|ມ້າລໍ}}
* {{Z|lzz}}: {{W-|lzz|ეშეღი}}
* {{Z|lez}}: {{W-|lez|лам}}
* {{Z|lij}}: {{W-|lij|ase}}
* {{Z|li}}: {{W+|li|aezel}}
* {{Z|lt}}: {{W+|lt|asilas|n}}
* {{Z|khb}}: {{W-|khb|ᩃᩣ}}
* {{Z|lb}}: {{W-|lb|Iesel|n}}
* {{Z|luo}}: {{W-|luo|punda}}
* {{Z|mk}}: {{W-|mk|магаре|nt}}
* Malay:
*: {{Z|ms}}: {{W-|ms|کلداي}}, {{W-|ms|حمار}}
*: Rûmî: {{W+|ms|keldai}}, {{W-|ms|himar}}
* {{Z|ml}}: {{W+|ml|കഴുത}}
* {{Z|mt}}: {{W-|mt|ħmar|n}}
* {{Z|mnc}}: {{W-|mnc|ᡝᡳᡥᡝᠨ}}
* {{Z|gv}}: {{W-|gv|assyl|n}}
* {{Z|mi}}: {{W-|mi|kāihe}}
* {{Z|mr}}: {{W+|mr|गाढव|n}}
* {{Z|mhr}}: {{W-|mhr|осёл}}
* {{Z|hu}}: {{W+|hu|szamár}}
* {{Z|xmf}}: {{W-|xmf|გირინი}}
* {{Z|mel}}: {{W-|mel|keledai}}
* {{Z|egy}}: {{W-egy|ꜥꜣ|n|h=aA:D52-E7}}
* {{Z|mdf}}: {{W-|mdf|ишме}}
* {{Z|mn}}: {{W+|mn|илжиг}}
* {{Z|nap}}: {{W-|nap|ciuccio}}
* {{Z|nv}}: {{W-|nv|télii|sc=Latn}}
* {{Z|nds}}: {{W+|nds|Esel|n}}
* {{Z|nrf}}: {{W-|nrf|âne|n}}
* {{Z|no}}: {{W+|no|esel|nt}}
* {{Z|oc}}: {{W+|oc|ase}}, {{W+|oc|asne|n}}
* {{Z|or}}: {{W+|or|ଗଧ}}
* {{Z|om}}: {{W+|om|harree}}
* {{Z|os}}: {{W-|os|хӕрӕг}}
* {{Z|ota}}: {{W-|ota|اشك|tr=eşek}}
* {{Z|ug}}: {{W-|ug|ئېشەك}}
* {{Z|uz}}: {{W+|uz|eshak}}
* {{Z|pi}}: {{W-|pi|gadrabha|n}}
* {{Z|ps}}: {{W+|ps|خر|n|tr=xar}}
* {{Z|pdt}}: {{W-|pdt|Äsel|n}}
* {{Z|pox}}: {{W-|pox|asål|n}}
* {{Z|pl}}: {{W+|pl|osioł|n}}, {{W+|pl|oślica|m}}
* {{Z|pt}}: {{W+|pt|asno|n}}, {{W+|pt|jerico|n}}, {{W+|pt|jegue|n}}, {{W+|pt|jumento|n}}, {{W+|pt|burro|n}}
* {{Z|pa}}: {{W-|pa|ਗਧਾ}}
* {{Z|kk}}: {{W-|kk|есек}}
* {{Z|cop}}: {{W-|cop|ⲉⲱ}}
* {{Z|rm}}: {{W-|rm|asen}}
* {{Z|rom}}: {{W-|rom|magari|n}}, {{W-|rom|magarka|m}}
* {{Z|ro}}: {{W+|ro|măgar|n}}, {{W+|ro|asin|n}}
* {{Z|ru}}: {{W+|ru|осёл|n}}, {{W-|ru|осли́ца|m}}, {{W-|ru|иша́к|n}}
* {{Z|ssy}}: {{W-|ssy|zanan}}
* {{Z|se}}: {{W-|se|ásen}}
* {{Z|sm}}: {{W-|sm|asini}}
* {{Z|sa}}: {{W+|sa|गर्दभ|n}}
* {{Z|sc}}: {{W-|sc|burriccu}}, {{W-|sc|molenti}}, {{W-|sc|molingianu}}, {{W-|sc|àinu}}
*: {{Z|sc}}: {{W-|sc|àinu}}, {{W-|sc|bestiolu}}, {{W-|sc|molènti}}, {{W-|sc|bistrassu}}
*: {{Z|sc}}: {{W-|sc|poleddu}}, {{W-|sc|polléddu}}, {{W-|sc|pulléddu}}, {{W-|sc|àinu}}, {{W-|sc|àinu}}
* {{Z|scn}}: {{W+|scn|sceccu|n}}
* {{Z|sid}}: {{W-|sid|harre}}
* {{Z|sd}}: {{W-|sd|گڏھ|tr=gaḋahu}}
* {{Z|sh}}:
*: Kirîlî: {{W-|sh|ма̀гарац|n}}, {{W-|sh|то̀вар|n}}
*: Latînî: {{W+|sh|màgarac|n}}, {{W+|sh|tòvar|n}}
* {{Z|sco}}: {{W-|sco|cuddie}}
* {{Z|cu}}:
*: Kirîlî: {{W-|cu|осьлъ|n}}
* {{Z|orv}}: {{W-|orv|осьлъ|n}}
* {{Z|sk}}: {{W-|sk|somár|n}}, {{W+|sk|osol|n}}
* {{Z|sl}}: {{W+|sl|osel|n}}, {{W-|sl|oslica|m}}
* {{Z|so}}: {{W+|so|dameer|n}}
* Sorbî:
*: {{Z|dsb}}: {{W-|dsb|ezel|n}}, {{W-|dsb|wósoł|n}}
*: {{Z|hsb}}: {{W-|hsb|wosoł|n}}
* {{Z|st}}: {{W+|st|tonki}}
* {{Z|es}}: {{W+|es|asno|n}}, {{W+|es|burro|n}}, {{W+|es|jumento}}
* {{Z|sux}}: {{W-|sux|𒀲|tr=ANŠE}}
* {{Z|sw}}: {{W+|sw|punda}}
* {{Z|sv}}: {{W+|sv|åsna}}
* {{Z|tg}}: {{W+|tg|хар}}
* {{Z|tl}}: {{W+|tl|asno}}, {{W-|tl|buriko}}
* {{Z|ta}}: {{W+|ta|கழுதை}}
* {{Z|twf}}: {{W-|twf|mùldu’úna}}
* {{Z|rif}}: {{W-|rif|aɣyur|n}}
* {{Z|th}}: {{W+|th|ลา}}
* {{Z|te}}: {{W+|te|గాడిద}}
* {{Z|crh}}: {{W-|crh|eşek}}
* {{Z|tt}}: {{W+|tt|ишәк}}
* {{Z|ti}}: {{W-|ti|ኣድጊ}}
* {{Z|tr}}: {{W+|tr|eşek}}, {{W+|tr|merkep}}, {{W+|tr|sıpa}}
* {{Z|tk}}: {{W-|tk|eşek}}
* {{Z|bo}}: {{W-|bo|བོང་བུ}}
* {{Z|tpi}}: {{W-|tpi|donki}}, {{W-|tpi|esel}}
* {{Z|txb}}: {{W-|txb|kercapo}}
* {{Z|tum}}: {{W-|tum|bulu}}
* {{Z|tyv}}: {{W-|tyv|элчиген}}
* {{Z|udi}}: {{W-|udi|елем}}
* {{Z|udm}}: {{W-|udm|ишак}}, {{W-|udm|осёл}}
* {{Z|ur}}: {{W-|ur|گدھا|n|tr=gadhā}}
* {{Z|uk}}: {{W-|uk|осе́л|n}}, {{W-|uk|віслю́к|n}}, {{W-|uk|іша́к|n}}
* {{Z|vec}}: {{W+|vec|muso|n}}, {{W+|vec|àxeno|n}}
* {{Z|vi}}: {{W+|vi|lừa}}
* {{Z|vo}}: {{W+|vo|cuk}}
* {{Z|wa}}: {{W+|wa|ågne|n|m}}, {{W+|wa|bådet|n}}, {{W+|wa|både|m}}, {{W+|wa|bourike|m}}, {{W+|wa|ågntea|n}}
* {{Z|wbl}}: {{W-|wbl|xur}}
* {{Z|cy}}: {{W-|cy|asyn|n}}
* {{Z|wo}}: {{W-|wo|mbaam-sëf|cuda=mbaam-sëf mi}}, {{W-|wo|mbaam-sëf}}
* {{Z|km}}: {{W-|km|សត្វលា}}, {{W+|km|លា}}
* {{Z|xh}}: {{W-|xh|imbongolo}}
* {{Z|sah}}: {{W-|sah|осёл}}
* {{Z|yi}}: {{W-|yi|אייזל|n}}, {{W-|yi|חמור|n|tr=khamer}}
* {{Z|yo}}: {{W-|yo|kẹ́tẹ́kẹ́tẹ́}}
* {{Z|el}}: {{W+|el|γάιδαρος|n}}, {{W+|el|γαϊδούρα|m}}, {{W+|el|γαϊδούρι|nt}}, {{W+|el|όνος|n|m}}
*: Kevn: {{W-|grc|ὄνος|n|m}}
* {{Z|zu}}: {{W-|zu|imbongolo}}, {{W-|zu|udonki}}
* {{Z|zun}}: {{W-|zun|moshok'o}}
{{werger-bin}}
:{{werger çavkanî|en|donkey|beş=Ev qismê Wergerê|oldid=75539477}}
=== Navdêr 2 ===
[[Wêne:Cut-apple-slices_21575-480x360_(4900266300).jpg|thumb|Çend '''kerên''' sêvan.]]
{{navdêr|ku|z=n}} {{k-ya nerm}}
# {{maneid|ku|parçe}} [[felqe]], [[parçe]], [[qet]], [[par]], [[pirt]]<br> (bi taybetî ya ku bi [[kêr]]ê hatiye [[birîn]]).
#* ''Hisreta me '''kerî nanê reş''', [[kas]]ek dewê tirş, [[yan]]ê hin [[toraq]] bû; lê dîsa em ji hale xwe razî bûn.''<ref>1931, ''Hakob Qezeryan-Lazo'', ''Serhatiya Casim'', guhastin:Haciyê Cindî-Emînê Evdal </ref>
#: {{mk|ku|'''Kerek''' ji sêva xwe da min.}}
#* {{J:Mela Hisênê Bateyî:Mewlûda Kurdî|jêgirtin=Cewherek lê kir nezer ew bû du '''ker'''<br />Paşê Wî çêkir ji nûra [[namuwer]]}}
==== Bi alfabeyên din ====
* {{ku-ar|کهر}}
==== Formên alternatîv ====
* {{g|ku|kert}}
==== Jê ====
{{kol3|ku
| kerker
| ker kirin
| kerkirin
| kerkirî
| kêr
| ker bûn<q:lêker>
| ker kirin<q:lêker>
| kerbûn<q:navdêr>
| kerkirin<q:navdêr>
| kerbûyî<q:rengdêr>
| kerkirî<q:rengdêr>
}}
==== Etîmolojî ====
Hevreha soranî {{g|ckb|کهرت|tr=[[kert]]}}, hewramî û zazakî {{q|zza|kerd}}, [[kurdiya başûrî]] {{q|sdh|qeł|sc=Latn}}, belûçî {{q|bal||tr=karç}}, farisî {{g|fa|کارد|tr=kard}}, pehlewî ''kart'', avestayî ''kerite-'', sanskrîtî ''krti-'', ermeniya kevn {{g|xcl|քերեմ|tr=k'êrêm|w=[[jê birin]], [[xîç]] kirin}}, yûnaniya kevn {{g|grc|κείρω|tr=kêiro|w=[[birîn]], [[cew]] kirin}}, latînî {{q|la|curtus|w=[[kurt]]}}, îngilîzî {{q|en|share|w=[[par]], [[beş]]}}, {{q|en|shear|w=[[birîn]], [[cew]] kirin}}, {{q|en|short|w=[[kurt]]}}, hemû ji {{ji|ine-pro|ku|*(s)ker-|w=[[birîn]], [[jê kirin]]}}.
:<font style="font-size:10px">'''Çavkanî:''' [[Şablon:Cheung|Cheung p.243]], [[Şablon:Horn|Horn p.185]], [[Şablon:MacKenzie|MacKenzie P.129]], [[Şablon:Watkins|Watkins p.100]] </font> | <font style="font-size:10px">'''Pokorny: '''941 - 942</font>
:<font style="font-size:10px">'''[[Hevreh]]''': [[kêr]] [[kurt]], [[çerm]]</font>
==== Bi zaravayên din ====
* {{Z|ckb}}: [[kert]]
* {{Z|sdh}}: [[qeł]]
==== Werger ====
{{werger-ser}}
* {{Z|de}}: {{W+|de|Brotscheibe|m}}, {{W+|de|Scheibe|m}}, {{W+|de|Anteil|n}}, {{W+|de|Teil|n}}, {{W+|de|Stück|nt}}
* {{Z|be}}: {{W-|be|лу́ста|m}}, {{W-|be|скрыль|n}}, {{W-|be|скі́ба|m}}
* {{Z|bg}}: {{W+|bg|филия|nt}}, {{W+|bg|резен|n}}
* {{Z|cs}}: {{W+|cs|krajíc|n}}, {{W+|cs|plátek|n}}
* {{Z|zh}}:
*: {{Z|yue}}: {{W-|yue|片|tr=pin3}}
*: {{Z|cmn}}: {{W+|cmn|片|tr=piàn}}
* {{Z|da}}: {{W+|da|skive|g}}
* {{Z|ar}}: {{W-|ar|شريحة|m}}
* {{Z|eo}}: {{W-|eo|tranĉaĵo}}
* {{Z|et}}: {{W-|et|viilukas}}, {{W-|et|viil}}
* {{Z|fa}}: {{W+|fa|قاچ|tr=qâč}}, {{W+|fa|تیکه|tr=tikke}}, {{W+|fa|لزگه|tr=lazge}}, {{W+|fa|کرچ|tr=karč}}
* Polish: [[plaster]], [[plasterek]] ; [[kromka]], [[pajda]] ; [[kawałek]] ;
* {{Z|fi}}: {{W+|fi|viipale}}
* {{Z|fr}}: {{W+|fr|tranche|m}}, {{W+|fr|tronçon|n}}
* {{Z|gd}}: {{W-|gd|sliseag|m}}
* {{Z|gl}}: {{W+|gl|rebanda|m}}, {{W+|gl|toro|n}}, {{W-|gl|tallada|m}}, {{W+|gl|posta|m}}
* {{Z|nl}}: {{W+|nl|plak|nt}}, {{W+|nl|schijf|nt}}
* {{Z|he}}: {{W-|he|פְּרוּסָה|m|tr=prusá}}, {{W-|he|נֵתַח|n|tr=nétaḥ}}, {{W-|he|פֶּלַח|n|tr=pélaḥ}}
* {{Z|io}}: {{W+|io|loncho}}
* {{Z|en}}: {{W+|en|slice}}
* {{Z|izh}}: {{W-|izh|pytky}}
* {{Z|it}}: {{W+|it|fetta|m}}, {{W+|it|trancio|n}}
* {{Z|is}}: {{W-|is|sneið|m}}
* {{Z|ja}}: {{W-|ja|切れ|tr=きれ, kire|sc=Jpan}}, {{W+|ja|一片|tr=いっぺん, ippen|sc=Jpan}}, {{W-|ja|スライス|tr=suraisu|sc=Jpan}}
* {{Z|ca}}: {{W+|ca|llesca|m}}
* {{Z|ko}}: {{W+|ko|부분}}, {{W+|ko|몫}}, {{W-|ko|슬라이스}}
* {{Z|lv}}: {{W+|lv|rika|m}}
* {{Z|lo}}: {{W-|lo|ປ່ຽງ}}, {{W-|lo|ແຜ່ນບາງໆ}}
* {{Z|lt}}: {{W-|lt|riekė̃|m}}
* {{Z|mi}}: {{W-|mi|kōripi}}, {{W-|mi|topenga}}
* {{Z|hu}}: {{W+|hu|szelet}}, {{W+|hu|karéj}}
* {{Z|egy}}: {{W-egy|fdq|h=f:d-q-Z9:D40}}
* {{Z|nrf}}: {{W-|nrf|tranche|m}}
* {{Z|pt}}: {{W+|pt|fatia}}
* {{Z|ro}}: {{W+|ro|felie|m}}
* {{Z|ru}}: {{W-|ru|ломо́ть|n}}, {{W-|ru|ло́мтик|n}}, {{W-|ru|кусо́к|n}}, {{W-|ru|кусо́чек|n}}, {{W+|ru|слайс|n}}
* {{Z|scn}}: {{W-|scn|feḍḍa|m}}, {{W+|scn|pezzu|n}}
* {{Z|sh}}: {{W+|sh|kriška|m}}
* {{Z|es}}: {{W+|es|rebanada|m}}
* {{Z|sv}}: {{W+|sv|skiva|g}}
* {{Z|th}}: {{W+|th|ชิ้น}}
* {{Z|tr}}: {{W+|tr|dilim}}
* {{Z|uk}}: {{W-|uk|ски́ба|m}}, {{W-|uk|ски́бка|m}}, {{W-|uk|шмато́к|n}}, {{W-|uk|кусо́к|n}}
* {{Z|vi}}: {{W-|vi|lát mỏng}}, {{W-|vi|miếng mỏng}}
* {{Z|cy}}: {{W-|cy|tafelll|m}}
* {{Z|el}}: {{W+|el|φέτα|m}}
*: Kevn: {{W-|grc|τέμαχος|nt}}
{{werger-bin}}
:{{werger çavkanî|en|slice|beş=Ev qismê Wergerê|oldid=75505183}}
=== Navdêr 3 ===
{{navdêr|ku|z=mn}} {{k-ya nerm}}
# Kesa/ê tiştekî dike yan tiştek kiriye.
#: {{mk|ku|Divê '''kerên''' vê xirabiyê bên sizadan.}}
==== Notên bikaranînê ====
{{agadarî}} Peyva '''ker''' bi vê maneyê kêm serbixwe peyda dibe lê pirtir wek paşgirekê di gel hin peyvan tê bikaranîn: ''[[çêker]], [[şerker]], [[sazker]]
==== Etîmolojî ====
{{etîmon|ku|:ji<metn:Ji [[rehê dema niha]] yê kevn ê>|kirin|id=kirin|metn=++|dar=1}}
==== Werger ====
{{werger-ser}}
* {{Z|en}}: {{W+|en|doer}}, {{W+|en|actor}}, {{W+|en|agent}}
{{werger-bin}}
=== Navdêr 4 ===
{{navdêr|ku|z=n}}
# {{mj|kom, grûp}} {{bnr|kerî}}
=== Rengdêr 1 ===
{{rengdêr|ku}} {{k-ya nerm}}, {{r-ya req}}
# {{senseid|ku|guhgiran}}Kesa/ê [[qet]] yan [[baş]] [[deng]]an [[bihîstin|nabihîze]].
#: {{hevmane|ku|guhgiran|nebihîz}}
#: {{mk|ku|'''Ker''' û [[lal]]|kesa/ê ne [[karîn|dikare]] [[axiftin|biaxive]] û ne jî [[bîstin|bibîze]]|birêz=1}}
==== Bi alfabeyên din ====
* {{ku-ar|کهڕ}}
==== Formên alternatîv ====
* {{g|ku|kerr}}
==== Jê ====
{{kol3|ku
| ker bûn<q:lêker>
| ker kirin<q:lêker>
| xwe lê ker kirin
| kerbûn<q:navdêr>
| kerkirin<q:navdêr>
| kerbûyî<q:rengdêr>
| kerkirî<q:rengdêr>
| kerî
| kerînî
| kerîtî
| kerker
| kertî
}}
==== Etîmolojî ====
Hevreha soranî {{g|ckb|کهڕ|tr=kerr}}, [[kurdiya başûrî]] [[keř]], zazakî ''kerr'', hewramî ''kerr'', belûçî {{g|ckb|کر|tr=kerr}}, {{hv|fa|کر|tr=kerr}}, {{hv|pal||k-rr|sc=Latn}}, soxdî ''k-rn-'', {{hv|ae||kerne-|sc=Latn}}, peştûyî {{g|ps|کوڼ|tr=kuṇ}}, {{hv|sa|कर्ण}} (kárṇa-: [[guh]]), slavoniya kevn [[кърнъ]] (kŭrnŭ), latviyayî [[kurls]], {{hv|lt|kurčias}}, hemû ji {{ji|ine-pro|ku|*kʷorno-|w=[[guh]]}}. Maneya bingehîn "guh" bû lê di zimanên îranî û yên [[baltî]] de maneya "[[guhgiran]]" wergirtiye. Di zimanên hindî de bi maneya "guh" maye: hindî [[कान]] (kan), urdûyî {{g|ur|کان|tr=kan}}, bengalî [[কর্ণ]] (korno) û [[কান]] (kan)...
==== Bide ber ====
{{kol2|ku|
| {{g|ku|kor}}
| {{g|ku|lal}}
}}
==== Werger ====
{{werger-ser|guhgiran}}
* {{Z|ab}}: {{W-|ab|адагәа}}
* {{Z|ady}}: {{W-|ady|дэгу}}
* {{Z|af}}: {{W-|af|dowe}}
* {{Z|xag}}: {{W-|xag|𐕆𐔼𐕒𐔽𐔰}}
* {{Z|akl}}: {{W-|akl|bungoe}}
* {{Z|sq}}: {{W-|sq|i shurdhër}}
* {{Z|de}}: {{W+|de|taub}}, {{W+|de|gehörlos}}
* {{Z|an}}: {{W-|an|xordo}}
* {{Z|rup}}: {{W-|rup|surdu}}
* {{Z|as}}: {{W-|as|কলা}}, {{W-|as|অন্ধ}}
* {{Z|ast}}: {{W-|ast|sordu}}, {{W-|ast|xordu}}
* {{Z|av}}: {{W-|av|гӏинкъаб}}
* {{Z|az}}: {{W+|az|kar}}
* {{Z|ban}}: {{W-|ban|bongol}}
* {{Z|eu}}: {{W+|eu|gor}}
* {{Z|ba}}: {{W-|ba|һаңғырау}}
* {{Z|sne}}: {{W-|sne|bongam}}
* {{Z|be}}: {{W-|be|глухі́}}
* {{Z|bcl}}: {{W-|bcl|bungog}}
* {{Z|br}}: {{W+|br|bouzar}}
* {{Z|bg}}: {{W+|bg|глух}}
* {{Z|my}}: {{W+|my|နားပင်း}}
* {{Z|ccc}}: {{W-|ccc|majchayi}}
* {{Z|ce}}: {{W-|ce|къора}}
* {{Z|cs}}: {{W+|cs|hluchý|n}}
* {{Z|chr}}: {{W-|chr|ᏧᎵᎡᎾ}}
* {{Z|zh}}:
*: {{Z|yue}}: {{W-|yue|耳聾|tr=ji5 lung4}}, {{W-|yue|聾|tr=lung4}}
*: {{Z|cmn}}: {{W+|cmn|聾|tr=lóng}}, {{W+|cmn|耳聾|tr=ěrlóng}}
*: {{Z|nan}}: {{W-|nan|耳聾|tr=hīⁿ-lâng}}
* {{Z|dlm}}: {{W-|dlm|suard}}
* {{Z|da}}: {{W+|da|døv}}
* {{Z|id}}: {{W+|id|tuli}}, {{W-|id|tuna rungu}}
* {{Z|ar}}: {{W-|ar|أَصَمّ}}
*: {{Z|arz}}: {{W-|arz|أصم|n|tr=ʔaṣamm}}, {{W-|arz|أطرش|n|tr=ʔaṭraš}}
* {{Z|hy}}: {{W+|hy|խուլ}}
* {{Z|eo}}: {{W+|eo|surda}}
* {{Z|et}}: {{W-|et|kurt}}
* {{Z|fa}}: {{W+|fa|کر|tr=kar}}, {{W+|fa|ناشنوا|tr=nâšenavâ}}
* {{Z|fo}}: {{W-|fo|deyvur}}
* {{Z|fi}}: {{W+|fi|kuuro}}, {{W-|fi|kuulovammainen}}
* {{Z|fr}}: {{W+|fr|sourd}}
* {{Z|fur}}: {{W-|fur|sort}}, {{W-|fur|sord}}
* {{Z|frr}}: {{W-|frr|duuf}}
* {{Z|fy}}: {{W-|fy|dôf}}
* {{Z|gd}}: {{W-|gd|bodhar}}
* {{Z|gl}}: {{W-|gl|xordo}}
* {{Z|got}}: {{W-|got|𐌱𐌰𐌿𐌸𐍃}}
* {{Z|ka}}: {{W+|ka|ყრუ}}, {{W-|ka|სმენადაკარგული}}
* {{Z|ht}}: {{W-|ht|soud}}
* {{Z|haw}}: {{W-|haw|kuli}}
* {{Z|mba}}: {{W-|mba|bungol}}
* {{Z|hi}}: {{W+|hi|बहरा}}
* {{Z|nl}}: {{W+|nl|doof}}, {{W+|nl|dove}}
* {{Z|hrx}}: {{W-|hrx|daab}}
* {{Z|iba}}: {{W-|iba|achak}}
* {{Z|he}}: {{W-|he|חֵירֵשׁ|tr=kheresh}}
* {{Z|ang}}: {{W-|ang|dēaf}}
* {{Z|en}}: {{W+|en|deaf}}
* {{Z|izh}}: {{W-|izh|gluuhkoi}}
* {{Z|ga}}: {{W-|ga|bodhar}}
*: {{Z|sga}}: {{W-|sga|bodar}}
* {{Z|ist}}: {{W-|ist|surdo}}
* {{Z|it}}: {{W+|it|sordo}}
* {{Z|is}}: {{W+|is|daufur}}
* {{Z|ja}}: {{W-|ja|[[耳]]の[[聞こえる|聞こえない]]|tr=みみのきこえない, mimi no kikoenai}}, {{W-|ja|耳が不自由|tr=mimi ga fujiyuu}}
* {{Z|kaw}}: {{W-|kaw|buḍĕg}}
* {{Z|jv}}: {{W+|jv|budheg}}, {{W+|jv|jampeng}}
* {{Z|kbd}}: {{W-|kbd|дэгу}}
* {{Z|ca}}: {{W+|ca|sord}}
* {{Z|kjj}}: {{W-|kjj|баьш}}
* {{Z|si}}: {{W+|si|බිහිරි}}
* {{Z|ko}}: {{W-|ko|[[귀머거리]]-의}}
* {{Z|kw}}: {{W-|kw|bodhar}}
* {{Z|co}}: {{W+|co|sordu}}
* {{Z|lld}}: {{W-|lld|sëurt}}
* {{Z|lad}}: {{W-|lad|sodro}}
* {{Z|ltg}}: {{W-|ltg|kūrslys|n}}
* {{Z|la}}: {{W+|la|surdus|n}}
* {{Z|lv}}: {{W-|lv|kurls|n}}, {{W-|lv|nedzirdīgs}}
* {{Z|lo}}: {{W-|lo|ຫູໜວກ}}
* {{Z|lez}}: {{W-|lez|биши}}
* {{Z|lt}}: {{W-|lt|kurčias}}
* {{Z|lb}}: {{W+|lb|daf}}
* {{Z|mk}}: {{W-|mk|глув}}
* {{Z|pse}}: {{W-|pse|pekak}}
* {{Z|ms}}: {{W+|ms|pekak}}, {{W-|ms|tuli}}, {{W-|ms|congek}}, {{W-|ms|tunakerna}}
* {{Z|mt}}: {{W-|mt|trux}}
* {{Z|mnc}}: {{W-|mnc|ᡩᡠᡨᡠ}}
* {{Z|msk}}: {{W-|msk|bungul}}
* {{Z|mi}}: {{W+|mi|turi}}, {{W-|mi|pūwharawhara}}
* {{Z|mrw}}: {{W-|mrw|bengel}}, {{W-|mrw|biso}}
* {{Z|mr}}: {{W-|mr|बधीर}}, {{W+|mr|बहिरा}}
* {{Z|hu}}: {{W+|hu|süket}}, {{W+|hu|siket}}
* {{Z|xmf}}: {{W-|xmf|ჸუნგა}}, {{W-|xmf|ჸურუ}}, {{W-|xmf|ჸუჯა}}, {{W-|xmf|დაგუა|cuda=დაგუ̂ა}}
* {{Z|mel}}: {{W-|mel|pakeak}}, {{W-|mel|tulek}}
* {{Z|mui}}: {{W-|mui|pekak}}
* {{Z|nv}}: {{W-|nv|ajéékałgo ąąh dahazʼą́}}, {{W-|nv|jééhkał}}
* {{Z|nds}}: {{W-|nds|dow}}
* {{Z|nay}}: {{W-|nay|plombatji}}
* {{Z|no}}:
*: {{Z|no}}: {{W+|no|døv}}
*: {{Z|nn}}: {{W+|nn|døv}}, {{W-|nn|dauv}}
* {{Z|oc}}: {{W+|oc|sord}}
* {{Z|or}}: {{W+|or|ବଧିର}}
* {{Z|om}}: {{W-|om|duudaa}}
* {{Z|ota}}: {{W-|ota|صاغر|tr=sağır}}
* {{Z|ps}}: {{W+|ps|کوڼ|tr=kuṇ}}
* {{Z|pdt}}: {{W-|pdt|doof}}
* {{Z|pl}}: {{W+|pl|głuchy|n}}
* {{Z|pt}}: {{W+|pt|surdo}}
* {{Z|kk}}: {{W-|kk|саңырау}}
* {{Z|ro}}: {{W+|ro|surd}}
* {{Z|ru}}: {{W-|ru|глухо́й}}
* {{Z|se}}: {{W-|se|bealjeheapmi}}
* {{Z|sms}}: {{W-|sms|kluuǥǥai}}
* {{Z|sa}}: {{W+|sa|बधिर}}, {{W+|sa|कल्ल}}
* {{Z|sc}}: {{W-|sc|suldu}}, {{W-|sc|surdu}}
* {{Z|ceb}}: {{W-|ceb|bungol}}
* {{Z|sh}}:
*: Kirîlî: {{W-|sh|глув}}, {{W-|sh|глух}}
*: Latînî: {{W+|sh|gluv}}, {{W+|sh|gluh}}
* {{Z|sco}}: {{W-|sco|deif}}
* {{Z|sk}}: {{W-|sk|hluchý|n}}
* {{Z|sl}}: {{W+|sl|gluh}}
* Sorbî:
*: {{Z|dsb}}: {{W-|dsb|głuchy}}
* {{Z|es}}: {{W+|es|sordo}}
* {{Z|su}}: {{W-|su|torék}}
* {{Z|sva}}: {{W-|sva|ყუ̂რიუ̂}}, {{W-|sva|ყუგ}}
* {{Z|sv}}: {{W+|sv|döv}}
* {{Z|tg}}: {{W+|tg|кар}}
* {{Z|tl}}: {{W-|tl|bingi}}
* {{Z|th}}: {{W-|th|หูหนวก}}
* {{Z|te}}: {{W+|te|చెవిటి}}
* {{Z|crh}}: {{W-|crh|sağır}}
* {{Z|tr}}: {{W+|tr|sağır}}
* {{Z|bo}}: {{W-|bo|འོན་པ}}
* {{Z|tli}}: {{W-|tli|lkhool.áxhji}}
* {{Z|ur}}: {{W-|ur|بہرا|tr=bahrā}}
* {{Z|uby}}: {{W-|uby|дагәы}}
* {{Z|uk}}: {{W-|uk|глухи́й}}
* {{Z|vec}}: {{W-|vec|sórdo}}
* {{Z|vi}}: {{W+|vi|điếc}}
* {{Z|vo}}: {{W-|vo|surdik}}
* {{Z|cy}}: {{W+|cy|byddar}}
* {{Z|km}}: {{W+|km|ថ្លង់|tr=tlɑŋ}}
* {{Z|yai}}: {{W-|yai|кар}}
* {{Z|yi}}: {{W-|yi|טויב}}, {{W-|yi|טויבלעך}}, {{W-|yi|חושימדיק|tr=khushemdik}}
* {{Z|esu}}: {{W-|esu|niitesciigatelria}}
* {{Z|el}}: {{W+|el|κωφός|n}}, {{W+|el|κουφός|n}}
*: Kevn: {{W-|grc|κωφός}}
* {{Z|bfi}}: {{W-|bfi|H@Ear}}
* {{Z|ase}}: {{W-|ase|1@Jaw 1@Chin}}
{{werger-bin}}
:{{werger çavkanî|en|deaf|beş=Ev qismê Wergerê|oldid=75710619}}
=== Rengdêr 2 ===
{{rengdêr|ku}}
# {{mj|bêdeng}} {{bnr|kirr}}
==== Anagram ====
* {{anagram|ku|a=ekr|ekr|erk|rek}}
=== Çavkanî ===
{{çavkanî}}
== {{ziman|ckb}} ==
=== Navdêr ===
{{navdêr|ckb|sc=Latn}}
# {{f|ckb|guhandar}} {{ckb-Arab|کەر}}
== {{ziman|sl}} ==
=== Girêdek ===
{{girêdek|sl}}
# [[çimkî#ku|çimkî]], [[çunkî#ku|çunkî]], [[ji ber ku#ku|ji ber ku]]
29fsxxawc0s4llpq63o5k7qlfkssf96
6532110
6532109
2026-09-18T20:39:00Z
Wikihez
7344
Kurmancî/Navdêr 3: beşa «Jê» hate zêdekirin (DefSideBoxes)
6532110
wikitext
text/x-wiki
{{h-bnr|ker|kêr|kerr|kêrr|-ker}}
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{q|ku|ker|cuda=(dewarek)|id=dewarek}} {{IPA|ku|/kʰɜɾ/}}, {{arF|کهر}}
** {{deng|ku|LL-Q36368 (kur)-Dildadil-ker.wav|dever=Amed}}
*** {{beş|Navdêr 1}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (navdêr 1).wav|dever=Bidlîs}}
* {{beş|Navdêr 3}} {{deng|ku|LL-Q36163 (kmr)-Ebulfîda-ker (Navdêr 3).wav|dever=Bidlîs}}
* {{q|ku|ker|cuda=(parçe)|id=parçe}} {{IPA|ku|/kɜɾ/}}, {{arF|کهر}}
** {{q|ku|ker|cuda=(koma pezî)|id=koma pezî}} {{IPA|ku|/kɜɾ/}}, {{arF|کهر}}
*** {{deng|ku|LL-Q36368 (kur)-Mihemed Qers-ker(koma pez).wav|dever=Qers}}
**** {{beş|Navdêr 4}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (navdêr 4).wav|dever=Bidlîs}}
* {{q|ku|ker|cuda=(guhgiran)|id=guhgiran}} {{IPA|ku|/kɜr/}}, {{arF|کهڕ}}
** {{deng|ku|LL-Q36368 (kur)-Mihemed Qers-kerr.wav|dever=Qers}}
*** {{deng|ku|LL-Q36368 (kur)-Dildadil-ker (kesê ku nabihîze).wav|dever=Amed}}
**** {{deng|ku|Kmr-Efrîn--kerr.oga|dever=Efrîn}}
**** {{beş|Rengdêr 1}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (rengdêr 1).wav|dever=Bidlîs}}
***** {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (rengdêr).wav|Deng|dever=Bidlîs}}
=== Navdêr 1 ===
[[Wêne:Donkey in Clovelly, North Devon, England.jpg|thumb|Kerek (1)]]
[[Wêne:S Veahmätle13.JPG|thumb|'''Kerê''' pezî (2)]]
{{navdêr|ku|z=n}}
# {{maneid|ku|dewarek}} {{f|ku|guhandar}} [[cûn|Cûnek]] [[dewar]]an e ku [[şibîn|dişibe]] [[hesp]]an û [[hêstir]]an lê ji wan [[kurt]]tir û [[biçûk]]tir e <br>(bi taybetî bo barhilgirtinê tê bikaranîn).
#* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=ابله چه کت طوافی نابینتن بری رش</br>بیزی دکت ژ قنجان ژ رمز و ناز و غنجان</br>قدری گلان چه زانت کربش دڤیت '''کری''' رش|tr=Ebleh çi kit ṭewafê nabînitin Berê reş</br>Bêzê dikit ji qencan ji remz û naz û x̣encan</br>Qedrê gulan çi zanit kerbeş divêt '''kerê''' reş}}
# {{maneid|ku|koma pezî}} [[kom|Komeke]] [[pez]]î, [[garan]]a pezî, [[ber]]ê pezî
# {{maneid|ku|bêaqil}} {{f|ku|mecazî}} [[bêaqil|Bêaqil]], [[bêhiş]], [[bêmejî]], [[mejîreş]], [[aqilsivik]], [[nezan]].
# {{f|ku|mecazî|heqaret}} (ji peyva ker a heywan) ji bo kesê zir, serhişk û bêpîr û şerde
#* {{J:Firat Cewerî:Girtî:1986|jêgirtin=- Hûn in, ha!. . . Ji bo çi hûn diziyê dikin '''ker''' lawê '''keran'''?}}
==== Tewandin ====
{{ku-tewîn-nav/nû|nêr}}
==== Notên bikaranînê ====
{{agadarî}} Di gelek devokên kurmancî de '''ker''' tenê bo van cûn dewarên nêr bi kar tê. Yên mê '''[[maker]]''' in.
==== Jê ====
{{kol3|ku
| keratî
| kerçove
| kerçovetî
| kerî
| kerînî
| kerîtî
| kertî
| kurrûk
| maker
| nêreker
}}
==== Etîmolojî ====
Ji {{mîr|ira-pro||*xárah||ker}}, ji {{mîr|iir-pro||*kʰáras||ker}}; belkî taliyê ji zimanekî [[samî]]{{çp}}, bo nimûne ji {{ji|akk|ku|tr=xeradu|w=ker, nêreker}}.{{çp}}
Hevreha soranî {{g|ckb|کهر|tr=ker}}, zazakî {{q|zza|her}}, hewramî {{g|hac|ھەر|tr=her}}, farisî {{g|fa|خر|tr=xer}}, avestayî {{g|ae|𐬑𐬀𐬭𐬀|tr=xere}}, sanskrîtî {{g|sa|खर|tr=khére}}, osetî {{g|os|хӕрӕг|tr=xereg}}, peştûyî {{g|ps|خر|tr=xer}}, belûçî {{g|bal|ہر|tr=her}}.
==== Gotinên pêşiyan ====
* [[şîreta kîrê ker e]]
==== Bi zaravayên din ====
* {{Z|ckb}}: {{W-|ckb|کەر|tr=ker}}
* {{Z|sdh}}: {{W-|sdh|xer|sc=Latn}}
* {{Z|lki}}: {{W-|lki|xer|sc=Latn}}
* {{Z|hac}}: {{W-|hac|her|sc=Latn}}
* {{Z|zza}}: {{W-|zza|her}}
==== Werger ====
{{werger-ser|dewarek}}
* {{Z|ab}}: {{W-|ab|аҽада}}
* {{Z|ady}}: {{W-|ady|щыды}}
* {{Z|aa}}: {{W-|aa|danán|n}}
* {{Z|af}}: {{W+|af|donkie}}
* {{Z|akk}}: {{W-|akk|𒀲|n|tr=imēru}}
* {{Z|sq}}: {{W+|sq|gomar|n}}, {{W-|sq|magar|n}}
* {{Z|de}}: {{W+|de|Esel|n}}; {{W+|de|Grauchen|nt}}, {{W-|de|Grautier|nt}}
* {{Z|alt}}: {{W-|alt|эштек}}
* {{Z|am}}: {{W-|am|አህያ|tr=äheyya}}
* {{Z|ani}}: {{W-|ani|гьаморохи}}
* {{Z|arc}}:
*: {{Z|syc}}: {{W-|syc|ܚܡܪܐ|g|tr=ḥəmārā}}, {{W-|syc|ܚܡܪܬܐ|m|tr=ḥəmārtā}}, {{W-|syc|ܐܬܢܐ|m|tr=ʾăṯānā}}
*: {{Z|tmr}}: {{W-|arc|חֲמָרָא|n|tr=ḥămārā}}
* {{Z|rup}}: {{W-|rup|cãci}}, {{W-|rup|dãngã}}, {{W-|rup|gumar}}, {{W-|rup|dãnglãrã}}, {{W-|rup|shonj}}, {{W-|rup|tãronj}}, {{W-|rup|uci}}, {{W-|rup|uricljat}}, {{W-|rup|tar}}
* {{Z|as}}: {{W-|as|গাধ}}
* {{Z|ast}}: {{W+|ast|burru|n}}, {{W+|ast|burra|m}}, {{W+|ast|pollín|n}}
* {{Z|aot}}: {{W-|aot|gada}}
* {{Z|av}}: {{W-|av|хӏама}}
* {{Z|awa}}: {{W-|awa|गदहा|n}}
* {{Z|az}}: {{W+|az|eşşək}}, {{W-|az|ulaq}}
* {{Z|bdr}}: {{W-|bdr|keribas}}
* {{Z|eu}}: {{W+|eu|asto}}
* {{Z|ba}}: {{W-|ba|ишәк}}
* {{Z|sne}}: {{W-|sne|kaldei}}
* {{Z|be}}: {{W-|be|асёл|n}}
* {{Z|bal}}: {{W-|bal|ہر|tr=har}}
* {{Z|bn}}: {{W+|bn|গাধা}}
* {{Z|br}}: {{W+|br|azen|n}}
* {{Z|bdk}}: {{W-|bdk|лем}}
* {{Z|bg}}: {{W-|bg|мага́ре|nt}}, {{W-|bg|осе́л|n}}
* {{Z|my}}: {{W+|my|မြည်း}}
* {{Z|bua}}: {{W-|bua|элжэгэн}}
* {{Z|ce}}: {{W-|ce|вир}}
* {{Z|cs}}: {{W+|cs|osel|n}}
* {{Z|chr}}: {{W-|chr|ᏗᎦᎵᏅᎯᏛ}}
* {{Z|chy}}: {{W-|chy|a'éevo'ha}}
* {{Z|ny}}: {{W-|ny|bulu}}
* {{Z|cic}}: {{W-|cic|haksibish falaa'}}
* {{Z|zh}}:
*: {{Z|yue}}: {{W-|yue|驢|tr=leoi4}}, {{W-|yue|驢仔|tr=leoi4 zai2}}
*: {{Z|dng}}: {{W-|dng|лү}}
*: {{Z|hak}}: {{W-|hak|驢仔|tr=lì-è}}
*: {{Z|cmn}}: {{W+|cmn|驢|tr=lǘ}}, {{W-|cmn|驢子|tr=lǘzi}}
*: {{Z|cdo}}: {{W-|cdo|驢|tr=lè̤}}
*: {{Z|nan}}: {{W+|nan|驢|tr=lîr / lû / lî}}, {{W+|nan|驢仔|tr=lû-á / lî-á / lîr-á}}
*: {{Z|wuu}}: {{W-|wuu|驢}}
* {{Z|cv}}: {{W-|cv|ашак}}
* {{Z|chk}}: {{W-|chk|tongki}}
* {{Z|dlm}}: {{W-|dlm|samur|n}}
* {{Z|da}}: {{W+|da|æsel|nt}}
* {{Z|dv}}: {{W-|dv|ހިާމރު}}
* {{Z|ovd}}: {{W-|ovd|åsn|m}}
* {{Z|id}}: {{W+|id|keledai}}
* {{Z|ar}}: {{W+|ar|حِمَار|n}}
*: {{Z|arz}}: {{W-|arz|حمار|n|tr=ḥumār, ḥmār}}
*: {{Z|acw}}: {{W-|acw|حُمار|n|tr=ḥumār}}
*: {{Z|acm}}: {{W-|acm|زمال|n|tr=zmāl}}
*: {{Z|afb}}: {{W-|afb|حمار|n|tr=ḥmār}}
*: {{Z|aeb}}: {{W-|aeb|بهيم|n|tr=bhīm}}
*: {{Z|ary}}: {{W-|ary|حمار|n|tr=ḥmār}}, {{W-|ary|حمارة|m|tr=ḥmāra}}, {{W-|ary|دحش|tr=daḥš}}, {{W-|ary|دحشة|m|tr=daḥša}}
* {{Z|hy}}: {{W+|hy|էշ}}, {{W+|hy|ավանակ}}
* {{Z|eo}}: {{W+|eo|azeno}}
* {{Z|et}}: {{W+|et|eesel}}
* {{Z|gez}}: {{W-|gez|አድግ}}
* {{Z|ee}}: {{W-|ee|tedzi|nt}}
* {{Z|fa}}: {{W+|fa|خر|tr=xar}}, {{W+|fa|الاغ|tr=olâğ}}
* {{Z|fo}}: {{W-|fo|asni}}
* {{Z|fi}}: {{W+|fi|aasi}}
* {{Z|fro}}: {{W-|fro|asne|n}}
* {{Z|fr}}: {{W+|fr|âne|n}}
* {{Z|fur}}: {{W-|fur|mus}}
* {{Z|fy}}: {{W-|fy|ezel}}
* {{Z|gd}}: {{W-|gd|asal|m}}
* {{Z|gag}}: {{W-|gag|eşek}}, {{W-|gag|yeşek}}
* {{Z|gl}}: {{W+|gl|asno}}, {{W+|gl|burro}}
* {{Z|got}}: {{W-|got|𐌰𐍃𐌹𐌻𐌿𐍃}}
* {{Z|gu}}: {{W-|gu|ગધેડો}}
* {{Z|ka}}: {{W+|ka|ვირი}}, {{W+|ka|ჯორი}}
* {{Z|ha}}: {{W+|ha|jaki}}
* {{Z|hi}}: {{W+|hi|गधा|n}}
* {{Z|nl}}: {{W+|nl|ezel|n}}
* {{Z|he}}: {{W-|he|חֲמוֹר|n|tr=khamór}}, {{W-|he|אָתוֹן|m|tr=atón}}
* {{Z|io}}: {{W+|io|asno}}
* {{Z|ang}}: {{W-|ang|esol|n}}
* {{Z|en}}: {{W+|en|donkey}}
* {{Z|inh}}: {{W-|inh|вир}}
* {{Z|ia}}: {{W-|ia|asino}}
* {{Z|ga}}: {{W+|ga|asal|n}}
* {{Z|ist}}: {{W-|ist|samèri|n-p}}
* {{Z|it}}: {{W+|it|asino|n}}, {{W+|it|somaro|n}}, {{W-|it|buricco|n}}, {{W+|it|ciuco}}
* {{Z|is}}: {{W+|is|asni}}
* {{Z|ja}}: {{W+|ja|驢馬|tr=ろば, roba}}, {{W+|ja|ロバ|tr=roba}}
* {{Z|kab}}: {{W-|kab|aɣyul|n}}
* {{Z|kl}}: {{W-|kl|siutitooq}}
* {{Z|xal}}: {{W-|xal|элҗгн}}
* {{Z|ktb}}: {{W-|ktb|harreta}}
* {{Z|kn}}: {{W+|kn|ಕತ್ತೆ}}
* {{Z|krc}}: {{W-|krc|эшек|tr=eşek}}
* {{Z|csb}}: {{W-|csb|osoł|n}}, {{W-|csb|òseł}}
* {{Z|ca}}: {{W+|ca|ase|n}}, {{W+|ca|somera|m}}, {{W+|ca|burro|n}}, {{W+|ca|burra|m}}, {{W+|ca|ruc|n}}, {{W+|ca|ruca|m}}
* {{Z|qu}}: {{W-|qu|wuru}}, {{W-|qu|asnu}}
* {{Z|ks}}: {{W-|ks|خَر|n}}
* {{Z|ky}}: {{W+|ky|эшек}}
* Ladin:
*: {{Z|lld}}: {{W-|lld|musciat|n}}
*: {{Z|lld}}: {{W-|lld|müsc|n}}
*: {{Z|lld}}: {{W-|lld|èsen|n}},{{W-|lld|musciat|n}}
* {{Z|si}}: {{W+|si|බූරුවා}}
* {{Z|ko}}: {{W+|ko|당나귀}}, {{W+|ko|나귀}}
* {{Z|rop}}: {{W-|rop|ginggong ginggong}}
* {{Z|la}}: {{W-|la|asellus}}, {{W-|la|asinus|n}}
* {{Z|lv}}: {{W-|lv|ēzelis|n}}
* {{Z|lo}}: {{W-|lo|ລາ}}, {{W-|lo|ມ້າລໍ}}
* {{Z|lzz}}: {{W-|lzz|ეშეღი}}
* {{Z|lez}}: {{W-|lez|лам}}
* {{Z|lij}}: {{W-|lij|ase}}
* {{Z|li}}: {{W+|li|aezel}}
* {{Z|lt}}: {{W+|lt|asilas|n}}
* {{Z|khb}}: {{W-|khb|ᩃᩣ}}
* {{Z|lb}}: {{W-|lb|Iesel|n}}
* {{Z|luo}}: {{W-|luo|punda}}
* {{Z|mk}}: {{W-|mk|магаре|nt}}
* Malay:
*: {{Z|ms}}: {{W-|ms|کلداي}}, {{W-|ms|حمار}}
*: Rûmî: {{W+|ms|keldai}}, {{W-|ms|himar}}
* {{Z|ml}}: {{W+|ml|കഴുത}}
* {{Z|mt}}: {{W-|mt|ħmar|n}}
* {{Z|mnc}}: {{W-|mnc|ᡝᡳᡥᡝᠨ}}
* {{Z|gv}}: {{W-|gv|assyl|n}}
* {{Z|mi}}: {{W-|mi|kāihe}}
* {{Z|mr}}: {{W+|mr|गाढव|n}}
* {{Z|mhr}}: {{W-|mhr|осёл}}
* {{Z|hu}}: {{W+|hu|szamár}}
* {{Z|xmf}}: {{W-|xmf|გირინი}}
* {{Z|mel}}: {{W-|mel|keledai}}
* {{Z|egy}}: {{W-egy|ꜥꜣ|n|h=aA:D52-E7}}
* {{Z|mdf}}: {{W-|mdf|ишме}}
* {{Z|mn}}: {{W+|mn|илжиг}}
* {{Z|nap}}: {{W-|nap|ciuccio}}
* {{Z|nv}}: {{W-|nv|télii|sc=Latn}}
* {{Z|nds}}: {{W+|nds|Esel|n}}
* {{Z|nrf}}: {{W-|nrf|âne|n}}
* {{Z|no}}: {{W+|no|esel|nt}}
* {{Z|oc}}: {{W+|oc|ase}}, {{W+|oc|asne|n}}
* {{Z|or}}: {{W+|or|ଗଧ}}
* {{Z|om}}: {{W+|om|harree}}
* {{Z|os}}: {{W-|os|хӕрӕг}}
* {{Z|ota}}: {{W-|ota|اشك|tr=eşek}}
* {{Z|ug}}: {{W-|ug|ئېشەك}}
* {{Z|uz}}: {{W+|uz|eshak}}
* {{Z|pi}}: {{W-|pi|gadrabha|n}}
* {{Z|ps}}: {{W+|ps|خر|n|tr=xar}}
* {{Z|pdt}}: {{W-|pdt|Äsel|n}}
* {{Z|pox}}: {{W-|pox|asål|n}}
* {{Z|pl}}: {{W+|pl|osioł|n}}, {{W+|pl|oślica|m}}
* {{Z|pt}}: {{W+|pt|asno|n}}, {{W+|pt|jerico|n}}, {{W+|pt|jegue|n}}, {{W+|pt|jumento|n}}, {{W+|pt|burro|n}}
* {{Z|pa}}: {{W-|pa|ਗਧਾ}}
* {{Z|kk}}: {{W-|kk|есек}}
* {{Z|cop}}: {{W-|cop|ⲉⲱ}}
* {{Z|rm}}: {{W-|rm|asen}}
* {{Z|rom}}: {{W-|rom|magari|n}}, {{W-|rom|magarka|m}}
* {{Z|ro}}: {{W+|ro|măgar|n}}, {{W+|ro|asin|n}}
* {{Z|ru}}: {{W+|ru|осёл|n}}, {{W-|ru|осли́ца|m}}, {{W-|ru|иша́к|n}}
* {{Z|ssy}}: {{W-|ssy|zanan}}
* {{Z|se}}: {{W-|se|ásen}}
* {{Z|sm}}: {{W-|sm|asini}}
* {{Z|sa}}: {{W+|sa|गर्दभ|n}}
* {{Z|sc}}: {{W-|sc|burriccu}}, {{W-|sc|molenti}}, {{W-|sc|molingianu}}, {{W-|sc|àinu}}
*: {{Z|sc}}: {{W-|sc|àinu}}, {{W-|sc|bestiolu}}, {{W-|sc|molènti}}, {{W-|sc|bistrassu}}
*: {{Z|sc}}: {{W-|sc|poleddu}}, {{W-|sc|polléddu}}, {{W-|sc|pulléddu}}, {{W-|sc|àinu}}, {{W-|sc|àinu}}
* {{Z|scn}}: {{W+|scn|sceccu|n}}
* {{Z|sid}}: {{W-|sid|harre}}
* {{Z|sd}}: {{W-|sd|گڏھ|tr=gaḋahu}}
* {{Z|sh}}:
*: Kirîlî: {{W-|sh|ма̀гарац|n}}, {{W-|sh|то̀вар|n}}
*: Latînî: {{W+|sh|màgarac|n}}, {{W+|sh|tòvar|n}}
* {{Z|sco}}: {{W-|sco|cuddie}}
* {{Z|cu}}:
*: Kirîlî: {{W-|cu|осьлъ|n}}
* {{Z|orv}}: {{W-|orv|осьлъ|n}}
* {{Z|sk}}: {{W-|sk|somár|n}}, {{W+|sk|osol|n}}
* {{Z|sl}}: {{W+|sl|osel|n}}, {{W-|sl|oslica|m}}
* {{Z|so}}: {{W+|so|dameer|n}}
* Sorbî:
*: {{Z|dsb}}: {{W-|dsb|ezel|n}}, {{W-|dsb|wósoł|n}}
*: {{Z|hsb}}: {{W-|hsb|wosoł|n}}
* {{Z|st}}: {{W+|st|tonki}}
* {{Z|es}}: {{W+|es|asno|n}}, {{W+|es|burro|n}}, {{W+|es|jumento}}
* {{Z|sux}}: {{W-|sux|𒀲|tr=ANŠE}}
* {{Z|sw}}: {{W+|sw|punda}}
* {{Z|sv}}: {{W+|sv|åsna}}
* {{Z|tg}}: {{W+|tg|хар}}
* {{Z|tl}}: {{W+|tl|asno}}, {{W-|tl|buriko}}
* {{Z|ta}}: {{W+|ta|கழுதை}}
* {{Z|twf}}: {{W-|twf|mùldu’úna}}
* {{Z|rif}}: {{W-|rif|aɣyur|n}}
* {{Z|th}}: {{W+|th|ลา}}
* {{Z|te}}: {{W+|te|గాడిద}}
* {{Z|crh}}: {{W-|crh|eşek}}
* {{Z|tt}}: {{W+|tt|ишәк}}
* {{Z|ti}}: {{W-|ti|ኣድጊ}}
* {{Z|tr}}: {{W+|tr|eşek}}, {{W+|tr|merkep}}, {{W+|tr|sıpa}}
* {{Z|tk}}: {{W-|tk|eşek}}
* {{Z|bo}}: {{W-|bo|བོང་བུ}}
* {{Z|tpi}}: {{W-|tpi|donki}}, {{W-|tpi|esel}}
* {{Z|txb}}: {{W-|txb|kercapo}}
* {{Z|tum}}: {{W-|tum|bulu}}
* {{Z|tyv}}: {{W-|tyv|элчиген}}
* {{Z|udi}}: {{W-|udi|елем}}
* {{Z|udm}}: {{W-|udm|ишак}}, {{W-|udm|осёл}}
* {{Z|ur}}: {{W-|ur|گدھا|n|tr=gadhā}}
* {{Z|uk}}: {{W-|uk|осе́л|n}}, {{W-|uk|віслю́к|n}}, {{W-|uk|іша́к|n}}
* {{Z|vec}}: {{W+|vec|muso|n}}, {{W+|vec|àxeno|n}}
* {{Z|vi}}: {{W+|vi|lừa}}
* {{Z|vo}}: {{W+|vo|cuk}}
* {{Z|wa}}: {{W+|wa|ågne|n|m}}, {{W+|wa|bådet|n}}, {{W+|wa|både|m}}, {{W+|wa|bourike|m}}, {{W+|wa|ågntea|n}}
* {{Z|wbl}}: {{W-|wbl|xur}}
* {{Z|cy}}: {{W-|cy|asyn|n}}
* {{Z|wo}}: {{W-|wo|mbaam-sëf|cuda=mbaam-sëf mi}}, {{W-|wo|mbaam-sëf}}
* {{Z|km}}: {{W-|km|សត្វលា}}, {{W+|km|លា}}
* {{Z|xh}}: {{W-|xh|imbongolo}}
* {{Z|sah}}: {{W-|sah|осёл}}
* {{Z|yi}}: {{W-|yi|אייזל|n}}, {{W-|yi|חמור|n|tr=khamer}}
* {{Z|yo}}: {{W-|yo|kẹ́tẹ́kẹ́tẹ́}}
* {{Z|el}}: {{W+|el|γάιδαρος|n}}, {{W+|el|γαϊδούρα|m}}, {{W+|el|γαϊδούρι|nt}}, {{W+|el|όνος|n|m}}
*: Kevn: {{W-|grc|ὄνος|n|m}}
* {{Z|zu}}: {{W-|zu|imbongolo}}, {{W-|zu|udonki}}
* {{Z|zun}}: {{W-|zun|moshok'o}}
{{werger-bin}}
:{{werger çavkanî|en|donkey|beş=Ev qismê Wergerê|oldid=75539477}}
=== Navdêr 2 ===
[[Wêne:Cut-apple-slices_21575-480x360_(4900266300).jpg|thumb|Çend '''kerên''' sêvan.]]
{{navdêr|ku|z=n}} {{k-ya nerm}}
# {{maneid|ku|parçe}} [[felqe]], [[parçe]], [[qet]], [[par]], [[pirt]]<br> (bi taybetî ya ku bi [[kêr]]ê hatiye [[birîn]]).
#* ''Hisreta me '''kerî nanê reş''', [[kas]]ek dewê tirş, [[yan]]ê hin [[toraq]] bû; lê dîsa em ji hale xwe razî bûn.''<ref>1931, ''Hakob Qezeryan-Lazo'', ''Serhatiya Casim'', guhastin:Haciyê Cindî-Emînê Evdal </ref>
#: {{mk|ku|'''Kerek''' ji sêva xwe da min.}}
#* {{J:Mela Hisênê Bateyî:Mewlûda Kurdî|jêgirtin=Cewherek lê kir nezer ew bû du '''ker'''<br />Paşê Wî çêkir ji nûra [[namuwer]]}}
==== Bi alfabeyên din ====
* {{ku-ar|کهر}}
==== Formên alternatîv ====
* {{g|ku|kert}}
==== Jê ====
{{kol3|ku
| kerker
| ker kirin
| kerkirin
| kerkirî
| kêr
| ker bûn<q:lêker>
| ker kirin<q:lêker>
| kerbûn<q:navdêr>
| kerkirin<q:navdêr>
| kerbûyî<q:rengdêr>
| kerkirî<q:rengdêr>
}}
==== Etîmolojî ====
Hevreha soranî {{g|ckb|کهرت|tr=[[kert]]}}, hewramî û zazakî {{q|zza|kerd}}, [[kurdiya başûrî]] {{q|sdh|qeł|sc=Latn}}, belûçî {{q|bal||tr=karç}}, farisî {{g|fa|کارد|tr=kard}}, pehlewî ''kart'', avestayî ''kerite-'', sanskrîtî ''krti-'', ermeniya kevn {{g|xcl|քերեմ|tr=k'êrêm|w=[[jê birin]], [[xîç]] kirin}}, yûnaniya kevn {{g|grc|κείρω|tr=kêiro|w=[[birîn]], [[cew]] kirin}}, latînî {{q|la|curtus|w=[[kurt]]}}, îngilîzî {{q|en|share|w=[[par]], [[beş]]}}, {{q|en|shear|w=[[birîn]], [[cew]] kirin}}, {{q|en|short|w=[[kurt]]}}, hemû ji {{ji|ine-pro|ku|*(s)ker-|w=[[birîn]], [[jê kirin]]}}.
:<font style="font-size:10px">'''Çavkanî:''' [[Şablon:Cheung|Cheung p.243]], [[Şablon:Horn|Horn p.185]], [[Şablon:MacKenzie|MacKenzie P.129]], [[Şablon:Watkins|Watkins p.100]] </font> | <font style="font-size:10px">'''Pokorny: '''941 - 942</font>
:<font style="font-size:10px">'''[[Hevreh]]''': [[kêr]] [[kurt]], [[çerm]]</font>
==== Bi zaravayên din ====
* {{Z|ckb}}: [[kert]]
* {{Z|sdh}}: [[qeł]]
==== Werger ====
{{werger-ser}}
* {{Z|de}}: {{W+|de|Brotscheibe|m}}, {{W+|de|Scheibe|m}}, {{W+|de|Anteil|n}}, {{W+|de|Teil|n}}, {{W+|de|Stück|nt}}
* {{Z|be}}: {{W-|be|лу́ста|m}}, {{W-|be|скрыль|n}}, {{W-|be|скі́ба|m}}
* {{Z|bg}}: {{W+|bg|филия|nt}}, {{W+|bg|резен|n}}
* {{Z|cs}}: {{W+|cs|krajíc|n}}, {{W+|cs|plátek|n}}
* {{Z|zh}}:
*: {{Z|yue}}: {{W-|yue|片|tr=pin3}}
*: {{Z|cmn}}: {{W+|cmn|片|tr=piàn}}
* {{Z|da}}: {{W+|da|skive|g}}
* {{Z|ar}}: {{W-|ar|شريحة|m}}
* {{Z|eo}}: {{W-|eo|tranĉaĵo}}
* {{Z|et}}: {{W-|et|viilukas}}, {{W-|et|viil}}
* {{Z|fa}}: {{W+|fa|قاچ|tr=qâč}}, {{W+|fa|تیکه|tr=tikke}}, {{W+|fa|لزگه|tr=lazge}}, {{W+|fa|کرچ|tr=karč}}
* Polish: [[plaster]], [[plasterek]] ; [[kromka]], [[pajda]] ; [[kawałek]] ;
* {{Z|fi}}: {{W+|fi|viipale}}
* {{Z|fr}}: {{W+|fr|tranche|m}}, {{W+|fr|tronçon|n}}
* {{Z|gd}}: {{W-|gd|sliseag|m}}
* {{Z|gl}}: {{W+|gl|rebanda|m}}, {{W+|gl|toro|n}}, {{W-|gl|tallada|m}}, {{W+|gl|posta|m}}
* {{Z|nl}}: {{W+|nl|plak|nt}}, {{W+|nl|schijf|nt}}
* {{Z|he}}: {{W-|he|פְּרוּסָה|m|tr=prusá}}, {{W-|he|נֵתַח|n|tr=nétaḥ}}, {{W-|he|פֶּלַח|n|tr=pélaḥ}}
* {{Z|io}}: {{W+|io|loncho}}
* {{Z|en}}: {{W+|en|slice}}
* {{Z|izh}}: {{W-|izh|pytky}}
* {{Z|it}}: {{W+|it|fetta|m}}, {{W+|it|trancio|n}}
* {{Z|is}}: {{W-|is|sneið|m}}
* {{Z|ja}}: {{W-|ja|切れ|tr=きれ, kire|sc=Jpan}}, {{W+|ja|一片|tr=いっぺん, ippen|sc=Jpan}}, {{W-|ja|スライス|tr=suraisu|sc=Jpan}}
* {{Z|ca}}: {{W+|ca|llesca|m}}
* {{Z|ko}}: {{W+|ko|부분}}, {{W+|ko|몫}}, {{W-|ko|슬라이스}}
* {{Z|lv}}: {{W+|lv|rika|m}}
* {{Z|lo}}: {{W-|lo|ປ່ຽງ}}, {{W-|lo|ແຜ່ນບາງໆ}}
* {{Z|lt}}: {{W-|lt|riekė̃|m}}
* {{Z|mi}}: {{W-|mi|kōripi}}, {{W-|mi|topenga}}
* {{Z|hu}}: {{W+|hu|szelet}}, {{W+|hu|karéj}}
* {{Z|egy}}: {{W-egy|fdq|h=f:d-q-Z9:D40}}
* {{Z|nrf}}: {{W-|nrf|tranche|m}}
* {{Z|pt}}: {{W+|pt|fatia}}
* {{Z|ro}}: {{W+|ro|felie|m}}
* {{Z|ru}}: {{W-|ru|ломо́ть|n}}, {{W-|ru|ло́мтик|n}}, {{W-|ru|кусо́к|n}}, {{W-|ru|кусо́чек|n}}, {{W+|ru|слайс|n}}
* {{Z|scn}}: {{W-|scn|feḍḍa|m}}, {{W+|scn|pezzu|n}}
* {{Z|sh}}: {{W+|sh|kriška|m}}
* {{Z|es}}: {{W+|es|rebanada|m}}
* {{Z|sv}}: {{W+|sv|skiva|g}}
* {{Z|th}}: {{W+|th|ชิ้น}}
* {{Z|tr}}: {{W+|tr|dilim}}
* {{Z|uk}}: {{W-|uk|ски́ба|m}}, {{W-|uk|ски́бка|m}}, {{W-|uk|шмато́к|n}}, {{W-|uk|кусо́к|n}}
* {{Z|vi}}: {{W-|vi|lát mỏng}}, {{W-|vi|miếng mỏng}}
* {{Z|cy}}: {{W-|cy|tafelll|m}}
* {{Z|el}}: {{W+|el|φέτα|m}}
*: Kevn: {{W-|grc|τέμαχος|nt}}
{{werger-bin}}
:{{werger çavkanî|en|slice|beş=Ev qismê Wergerê|oldid=75505183}}
=== Navdêr 3 ===
{{navdêr|ku|z=mn}} {{k-ya nerm}}
# Kesa/ê tiştekî dike yan tiştek kiriye.
#: {{mk|ku|Divê '''kerên''' vê xirabiyê bên sizadan.}}
==== Notên bikaranînê ====
{{agadarî}} Peyva '''ker''' bi vê maneyê kêm serbixwe peyda dibe lê pirtir wek paşgirekê di gel hin peyvan tê bikaranîn: ''[[çêker]], [[şerker]], [[sazker]]
==== Jê ====
{{kol3|ku|cure=Jê
|-ker
}}
==== Etîmolojî ====
{{etîmon|ku|:ji<metn:Ji [[rehê dema niha]] yê kevn ê>|kirin|id=kirin|metn=++|dar=1}}
==== Werger ====
{{werger-ser}}
* {{Z|en}}: {{W+|en|doer}}, {{W+|en|actor}}, {{W+|en|agent}}
{{werger-bin}}
=== Navdêr 4 ===
{{navdêr|ku|z=n}}
# {{mj|kom, grûp}} {{bnr|kerî}}
=== Rengdêr 1 ===
{{rengdêr|ku}} {{k-ya nerm}}, {{r-ya req}}
# {{senseid|ku|guhgiran}}Kesa/ê [[qet]] yan [[baş]] [[deng]]an [[bihîstin|nabihîze]].
#: {{hevmane|ku|guhgiran|nebihîz}}
#: {{mk|ku|'''Ker''' û [[lal]]|kesa/ê ne [[karîn|dikare]] [[axiftin|biaxive]] û ne jî [[bîstin|bibîze]]|birêz=1}}
==== Bi alfabeyên din ====
* {{ku-ar|کهڕ}}
==== Formên alternatîv ====
* {{g|ku|kerr}}
==== Jê ====
{{kol3|ku
| ker bûn<q:lêker>
| ker kirin<q:lêker>
| xwe lê ker kirin
| kerbûn<q:navdêr>
| kerkirin<q:navdêr>
| kerbûyî<q:rengdêr>
| kerkirî<q:rengdêr>
| kerî
| kerînî
| kerîtî
| kerker
| kertî
}}
==== Etîmolojî ====
Hevreha soranî {{g|ckb|کهڕ|tr=kerr}}, [[kurdiya başûrî]] [[keř]], zazakî ''kerr'', hewramî ''kerr'', belûçî {{g|ckb|کر|tr=kerr}}, {{hv|fa|کر|tr=kerr}}, {{hv|pal||k-rr|sc=Latn}}, soxdî ''k-rn-'', {{hv|ae||kerne-|sc=Latn}}, peştûyî {{g|ps|کوڼ|tr=kuṇ}}, {{hv|sa|कर्ण}} (kárṇa-: [[guh]]), slavoniya kevn [[кърнъ]] (kŭrnŭ), latviyayî [[kurls]], {{hv|lt|kurčias}}, hemû ji {{ji|ine-pro|ku|*kʷorno-|w=[[guh]]}}. Maneya bingehîn "guh" bû lê di zimanên îranî û yên [[baltî]] de maneya "[[guhgiran]]" wergirtiye. Di zimanên hindî de bi maneya "guh" maye: hindî [[कान]] (kan), urdûyî {{g|ur|کان|tr=kan}}, bengalî [[কর্ণ]] (korno) û [[কান]] (kan)...
==== Bide ber ====
{{kol2|ku|
| {{g|ku|kor}}
| {{g|ku|lal}}
}}
==== Werger ====
{{werger-ser|guhgiran}}
* {{Z|ab}}: {{W-|ab|адагәа}}
* {{Z|ady}}: {{W-|ady|дэгу}}
* {{Z|af}}: {{W-|af|dowe}}
* {{Z|xag}}: {{W-|xag|𐕆𐔼𐕒𐔽𐔰}}
* {{Z|akl}}: {{W-|akl|bungoe}}
* {{Z|sq}}: {{W-|sq|i shurdhër}}
* {{Z|de}}: {{W+|de|taub}}, {{W+|de|gehörlos}}
* {{Z|an}}: {{W-|an|xordo}}
* {{Z|rup}}: {{W-|rup|surdu}}
* {{Z|as}}: {{W-|as|কলা}}, {{W-|as|অন্ধ}}
* {{Z|ast}}: {{W-|ast|sordu}}, {{W-|ast|xordu}}
* {{Z|av}}: {{W-|av|гӏинкъаб}}
* {{Z|az}}: {{W+|az|kar}}
* {{Z|ban}}: {{W-|ban|bongol}}
* {{Z|eu}}: {{W+|eu|gor}}
* {{Z|ba}}: {{W-|ba|һаңғырау}}
* {{Z|sne}}: {{W-|sne|bongam}}
* {{Z|be}}: {{W-|be|глухі́}}
* {{Z|bcl}}: {{W-|bcl|bungog}}
* {{Z|br}}: {{W+|br|bouzar}}
* {{Z|bg}}: {{W+|bg|глух}}
* {{Z|my}}: {{W+|my|နားပင်း}}
* {{Z|ccc}}: {{W-|ccc|majchayi}}
* {{Z|ce}}: {{W-|ce|къора}}
* {{Z|cs}}: {{W+|cs|hluchý|n}}
* {{Z|chr}}: {{W-|chr|ᏧᎵᎡᎾ}}
* {{Z|zh}}:
*: {{Z|yue}}: {{W-|yue|耳聾|tr=ji5 lung4}}, {{W-|yue|聾|tr=lung4}}
*: {{Z|cmn}}: {{W+|cmn|聾|tr=lóng}}, {{W+|cmn|耳聾|tr=ěrlóng}}
*: {{Z|nan}}: {{W-|nan|耳聾|tr=hīⁿ-lâng}}
* {{Z|dlm}}: {{W-|dlm|suard}}
* {{Z|da}}: {{W+|da|døv}}
* {{Z|id}}: {{W+|id|tuli}}, {{W-|id|tuna rungu}}
* {{Z|ar}}: {{W-|ar|أَصَمّ}}
*: {{Z|arz}}: {{W-|arz|أصم|n|tr=ʔaṣamm}}, {{W-|arz|أطرش|n|tr=ʔaṭraš}}
* {{Z|hy}}: {{W+|hy|խուլ}}
* {{Z|eo}}: {{W+|eo|surda}}
* {{Z|et}}: {{W-|et|kurt}}
* {{Z|fa}}: {{W+|fa|کر|tr=kar}}, {{W+|fa|ناشنوا|tr=nâšenavâ}}
* {{Z|fo}}: {{W-|fo|deyvur}}
* {{Z|fi}}: {{W+|fi|kuuro}}, {{W-|fi|kuulovammainen}}
* {{Z|fr}}: {{W+|fr|sourd}}
* {{Z|fur}}: {{W-|fur|sort}}, {{W-|fur|sord}}
* {{Z|frr}}: {{W-|frr|duuf}}
* {{Z|fy}}: {{W-|fy|dôf}}
* {{Z|gd}}: {{W-|gd|bodhar}}
* {{Z|gl}}: {{W-|gl|xordo}}
* {{Z|got}}: {{W-|got|𐌱𐌰𐌿𐌸𐍃}}
* {{Z|ka}}: {{W+|ka|ყრუ}}, {{W-|ka|სმენადაკარგული}}
* {{Z|ht}}: {{W-|ht|soud}}
* {{Z|haw}}: {{W-|haw|kuli}}
* {{Z|mba}}: {{W-|mba|bungol}}
* {{Z|hi}}: {{W+|hi|बहरा}}
* {{Z|nl}}: {{W+|nl|doof}}, {{W+|nl|dove}}
* {{Z|hrx}}: {{W-|hrx|daab}}
* {{Z|iba}}: {{W-|iba|achak}}
* {{Z|he}}: {{W-|he|חֵירֵשׁ|tr=kheresh}}
* {{Z|ang}}: {{W-|ang|dēaf}}
* {{Z|en}}: {{W+|en|deaf}}
* {{Z|izh}}: {{W-|izh|gluuhkoi}}
* {{Z|ga}}: {{W-|ga|bodhar}}
*: {{Z|sga}}: {{W-|sga|bodar}}
* {{Z|ist}}: {{W-|ist|surdo}}
* {{Z|it}}: {{W+|it|sordo}}
* {{Z|is}}: {{W+|is|daufur}}
* {{Z|ja}}: {{W-|ja|[[耳]]の[[聞こえる|聞こえない]]|tr=みみのきこえない, mimi no kikoenai}}, {{W-|ja|耳が不自由|tr=mimi ga fujiyuu}}
* {{Z|kaw}}: {{W-|kaw|buḍĕg}}
* {{Z|jv}}: {{W+|jv|budheg}}, {{W+|jv|jampeng}}
* {{Z|kbd}}: {{W-|kbd|дэгу}}
* {{Z|ca}}: {{W+|ca|sord}}
* {{Z|kjj}}: {{W-|kjj|баьш}}
* {{Z|si}}: {{W+|si|බිහිරි}}
* {{Z|ko}}: {{W-|ko|[[귀머거리]]-의}}
* {{Z|kw}}: {{W-|kw|bodhar}}
* {{Z|co}}: {{W+|co|sordu}}
* {{Z|lld}}: {{W-|lld|sëurt}}
* {{Z|lad}}: {{W-|lad|sodro}}
* {{Z|ltg}}: {{W-|ltg|kūrslys|n}}
* {{Z|la}}: {{W+|la|surdus|n}}
* {{Z|lv}}: {{W-|lv|kurls|n}}, {{W-|lv|nedzirdīgs}}
* {{Z|lo}}: {{W-|lo|ຫູໜວກ}}
* {{Z|lez}}: {{W-|lez|биши}}
* {{Z|lt}}: {{W-|lt|kurčias}}
* {{Z|lb}}: {{W+|lb|daf}}
* {{Z|mk}}: {{W-|mk|глув}}
* {{Z|pse}}: {{W-|pse|pekak}}
* {{Z|ms}}: {{W+|ms|pekak}}, {{W-|ms|tuli}}, {{W-|ms|congek}}, {{W-|ms|tunakerna}}
* {{Z|mt}}: {{W-|mt|trux}}
* {{Z|mnc}}: {{W-|mnc|ᡩᡠᡨᡠ}}
* {{Z|msk}}: {{W-|msk|bungul}}
* {{Z|mi}}: {{W+|mi|turi}}, {{W-|mi|pūwharawhara}}
* {{Z|mrw}}: {{W-|mrw|bengel}}, {{W-|mrw|biso}}
* {{Z|mr}}: {{W-|mr|बधीर}}, {{W+|mr|बहिरा}}
* {{Z|hu}}: {{W+|hu|süket}}, {{W+|hu|siket}}
* {{Z|xmf}}: {{W-|xmf|ჸუნგა}}, {{W-|xmf|ჸურუ}}, {{W-|xmf|ჸუჯა}}, {{W-|xmf|დაგუა|cuda=დაგუ̂ა}}
* {{Z|mel}}: {{W-|mel|pakeak}}, {{W-|mel|tulek}}
* {{Z|mui}}: {{W-|mui|pekak}}
* {{Z|nv}}: {{W-|nv|ajéékałgo ąąh dahazʼą́}}, {{W-|nv|jééhkał}}
* {{Z|nds}}: {{W-|nds|dow}}
* {{Z|nay}}: {{W-|nay|plombatji}}
* {{Z|no}}:
*: {{Z|no}}: {{W+|no|døv}}
*: {{Z|nn}}: {{W+|nn|døv}}, {{W-|nn|dauv}}
* {{Z|oc}}: {{W+|oc|sord}}
* {{Z|or}}: {{W+|or|ବଧିର}}
* {{Z|om}}: {{W-|om|duudaa}}
* {{Z|ota}}: {{W-|ota|صاغر|tr=sağır}}
* {{Z|ps}}: {{W+|ps|کوڼ|tr=kuṇ}}
* {{Z|pdt}}: {{W-|pdt|doof}}
* {{Z|pl}}: {{W+|pl|głuchy|n}}
* {{Z|pt}}: {{W+|pt|surdo}}
* {{Z|kk}}: {{W-|kk|саңырау}}
* {{Z|ro}}: {{W+|ro|surd}}
* {{Z|ru}}: {{W-|ru|глухо́й}}
* {{Z|se}}: {{W-|se|bealjeheapmi}}
* {{Z|sms}}: {{W-|sms|kluuǥǥai}}
* {{Z|sa}}: {{W+|sa|बधिर}}, {{W+|sa|कल्ल}}
* {{Z|sc}}: {{W-|sc|suldu}}, {{W-|sc|surdu}}
* {{Z|ceb}}: {{W-|ceb|bungol}}
* {{Z|sh}}:
*: Kirîlî: {{W-|sh|глув}}, {{W-|sh|глух}}
*: Latînî: {{W+|sh|gluv}}, {{W+|sh|gluh}}
* {{Z|sco}}: {{W-|sco|deif}}
* {{Z|sk}}: {{W-|sk|hluchý|n}}
* {{Z|sl}}: {{W+|sl|gluh}}
* Sorbî:
*: {{Z|dsb}}: {{W-|dsb|głuchy}}
* {{Z|es}}: {{W+|es|sordo}}
* {{Z|su}}: {{W-|su|torék}}
* {{Z|sva}}: {{W-|sva|ყუ̂რიუ̂}}, {{W-|sva|ყუგ}}
* {{Z|sv}}: {{W+|sv|döv}}
* {{Z|tg}}: {{W+|tg|кар}}
* {{Z|tl}}: {{W-|tl|bingi}}
* {{Z|th}}: {{W-|th|หูหนวก}}
* {{Z|te}}: {{W+|te|చెవిటి}}
* {{Z|crh}}: {{W-|crh|sağır}}
* {{Z|tr}}: {{W+|tr|sağır}}
* {{Z|bo}}: {{W-|bo|འོན་པ}}
* {{Z|tli}}: {{W-|tli|lkhool.áxhji}}
* {{Z|ur}}: {{W-|ur|بہرا|tr=bahrā}}
* {{Z|uby}}: {{W-|uby|дагәы}}
* {{Z|uk}}: {{W-|uk|глухи́й}}
* {{Z|vec}}: {{W-|vec|sórdo}}
* {{Z|vi}}: {{W+|vi|điếc}}
* {{Z|vo}}: {{W-|vo|surdik}}
* {{Z|cy}}: {{W+|cy|byddar}}
* {{Z|km}}: {{W+|km|ថ្លង់|tr=tlɑŋ}}
* {{Z|yai}}: {{W-|yai|кар}}
* {{Z|yi}}: {{W-|yi|טויב}}, {{W-|yi|טויבלעך}}, {{W-|yi|חושימדיק|tr=khushemdik}}
* {{Z|esu}}: {{W-|esu|niitesciigatelria}}
* {{Z|el}}: {{W+|el|κωφός|n}}, {{W+|el|κουφός|n}}
*: Kevn: {{W-|grc|κωφός}}
* {{Z|bfi}}: {{W-|bfi|H@Ear}}
* {{Z|ase}}: {{W-|ase|1@Jaw 1@Chin}}
{{werger-bin}}
:{{werger çavkanî|en|deaf|beş=Ev qismê Wergerê|oldid=75710619}}
=== Rengdêr 2 ===
{{rengdêr|ku}}
# {{mj|bêdeng}} {{bnr|kirr}}
==== Anagram ====
* {{anagram|ku|a=ekr|ekr|erk|rek}}
=== Çavkanî ===
{{çavkanî}}
== {{ziman|ckb}} ==
=== Navdêr ===
{{navdêr|ckb|sc=Latn}}
# {{f|ckb|guhandar}} {{ckb-Arab|کەر}}
== {{ziman|sl}} ==
=== Girêdek ===
{{girêdek|sl}}
# [[çimkî#ku|çimkî]], [[çunkî#ku|çunkî]], [[ji ber ku#ku|ji ber ku]]
r8r050ip46jpe0glkoxzw9tt54wlxc8
6532116
6532110
2026-09-18T22:12:10Z
Balyozbot
7867
Bot: Paqijiyên kozmetîk ({{ku-tewîn-nav/nû}} → {{ku-tewîn-nav}}.)
6532116
wikitext
text/x-wiki
{{h-bnr|ker|kêr|kerr|kêrr|-ker}}
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{q|ku|ker|cuda=(dewarek)|id=dewarek}} {{IPA|ku|/kʰɜɾ/}}, {{arF|کهر}}
** {{deng|ku|LL-Q36368 (kur)-Dildadil-ker.wav|dever=Amed}}
*** {{beş|Navdêr 1}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (navdêr 1).wav|dever=Bidlîs}}
* {{beş|Navdêr 3}} {{deng|ku|LL-Q36163 (kmr)-Ebulfîda-ker (Navdêr 3).wav|dever=Bidlîs}}
* {{q|ku|ker|cuda=(parçe)|id=parçe}} {{IPA|ku|/kɜɾ/}}, {{arF|کهر}}
** {{q|ku|ker|cuda=(koma pezî)|id=koma pezî}} {{IPA|ku|/kɜɾ/}}, {{arF|کهر}}
*** {{deng|ku|LL-Q36368 (kur)-Mihemed Qers-ker(koma pez).wav|dever=Qers}}
**** {{beş|Navdêr 4}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (navdêr 4).wav|dever=Bidlîs}}
* {{q|ku|ker|cuda=(guhgiran)|id=guhgiran}} {{IPA|ku|/kɜr/}}, {{arF|کهڕ}}
** {{deng|ku|LL-Q36368 (kur)-Mihemed Qers-kerr.wav|dever=Qers}}
*** {{deng|ku|LL-Q36368 (kur)-Dildadil-ker (kesê ku nabihîze).wav|dever=Amed}}
**** {{deng|ku|Kmr-Efrîn--kerr.oga|dever=Efrîn}}
**** {{beş|Rengdêr 1}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (rengdêr 1).wav|dever=Bidlîs}}
***** {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (rengdêr).wav|Deng|dever=Bidlîs}}
=== Navdêr 1 ===
[[Wêne:Donkey in Clovelly, North Devon, England.jpg|thumb|Kerek (1)]]
[[Wêne:S Veahmätle13.JPG|thumb|'''Kerê''' pezî (2)]]
{{navdêr|ku|z=n}}
# {{maneid|ku|dewarek}} {{f|ku|guhandar}} [[cûn|Cûnek]] [[dewar]]an e ku [[şibîn|dişibe]] [[hesp]]an û [[hêstir]]an lê ji wan [[kurt]]tir û [[biçûk]]tir e <br>(bi taybetî bo barhilgirtinê tê bikaranîn).
#* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=ابله چه کت طوافی نابینتن بری رش</br>بیزی دکت ژ قنجان ژ رمز و ناز و غنجان</br>قدری گلان چه زانت کربش دڤیت '''کری''' رش|tr=Ebleh çi kit ṭewafê nabînitin Berê reş</br>Bêzê dikit ji qencan ji remz û naz û x̣encan</br>Qedrê gulan çi zanit kerbeş divêt '''kerê''' reş}}
# {{maneid|ku|koma pezî}} [[kom|Komeke]] [[pez]]î, [[garan]]a pezî, [[ber]]ê pezî
# {{maneid|ku|bêaqil}} {{f|ku|mecazî}} [[bêaqil|Bêaqil]], [[bêhiş]], [[bêmejî]], [[mejîreş]], [[aqilsivik]], [[nezan]].
# {{f|ku|mecazî|heqaret}} (ji peyva ker a heywan) ji bo kesê zir, serhişk û bêpîr û şerde
#* {{J:Firat Cewerî:Girtî:1986|jêgirtin=- Hûn in, ha!. . . Ji bo çi hûn diziyê dikin '''ker''' lawê '''keran'''?}}
==== Tewandin ====
{{ku-tewîn-nav|nêr}}
==== Notên bikaranînê ====
{{agadarî}} Di gelek devokên kurmancî de '''ker''' tenê bo van cûn dewarên nêr bi kar tê. Yên mê '''[[maker]]''' in.
==== Jê ====
{{kol3|ku
| keratî
| kerçove
| kerçovetî
| kerî
| kerînî
| kerîtî
| kertî
| kurrûk
| maker
| nêreker
}}
==== Etîmolojî ====
Ji {{mîr|ira-pro||*xárah||ker}}, ji {{mîr|iir-pro||*kʰáras||ker}}; belkî taliyê ji zimanekî [[samî]]{{çp}}, bo nimûne ji {{ji|akk|ku|tr=xeradu|w=ker, nêreker}}.{{çp}}
Hevreha soranî {{g|ckb|کهر|tr=ker}}, zazakî {{q|zza|her}}, hewramî {{g|hac|ھەر|tr=her}}, farisî {{g|fa|خر|tr=xer}}, avestayî {{g|ae|𐬑𐬀𐬭𐬀|tr=xere}}, sanskrîtî {{g|sa|खर|tr=khére}}, osetî {{g|os|хӕрӕг|tr=xereg}}, peştûyî {{g|ps|خر|tr=xer}}, belûçî {{g|bal|ہر|tr=her}}.
==== Gotinên pêşiyan ====
* [[şîreta kîrê ker e]]
==== Bi zaravayên din ====
* {{Z|ckb}}: {{W-|ckb|کەر|tr=ker}}
* {{Z|sdh}}: {{W-|sdh|xer|sc=Latn}}
* {{Z|lki}}: {{W-|lki|xer|sc=Latn}}
* {{Z|hac}}: {{W-|hac|her|sc=Latn}}
* {{Z|zza}}: {{W-|zza|her}}
==== Werger ====
{{werger-ser|dewarek}}
* {{Z|ab}}: {{W-|ab|аҽада}}
* {{Z|ady}}: {{W-|ady|щыды}}
* {{Z|aa}}: {{W-|aa|danán|n}}
* {{Z|af}}: {{W+|af|donkie}}
* {{Z|akk}}: {{W-|akk|𒀲|n|tr=imēru}}
* {{Z|sq}}: {{W+|sq|gomar|n}}, {{W-|sq|magar|n}}
* {{Z|de}}: {{W+|de|Esel|n}}; {{W+|de|Grauchen|nt}}, {{W-|de|Grautier|nt}}
* {{Z|alt}}: {{W-|alt|эштек}}
* {{Z|am}}: {{W-|am|አህያ|tr=äheyya}}
* {{Z|ani}}: {{W-|ani|гьаморохи}}
* {{Z|arc}}:
*: {{Z|syc}}: {{W-|syc|ܚܡܪܐ|g|tr=ḥəmārā}}, {{W-|syc|ܚܡܪܬܐ|m|tr=ḥəmārtā}}, {{W-|syc|ܐܬܢܐ|m|tr=ʾăṯānā}}
*: {{Z|tmr}}: {{W-|arc|חֲמָרָא|n|tr=ḥămārā}}
* {{Z|rup}}: {{W-|rup|cãci}}, {{W-|rup|dãngã}}, {{W-|rup|gumar}}, {{W-|rup|dãnglãrã}}, {{W-|rup|shonj}}, {{W-|rup|tãronj}}, {{W-|rup|uci}}, {{W-|rup|uricljat}}, {{W-|rup|tar}}
* {{Z|as}}: {{W-|as|গাধ}}
* {{Z|ast}}: {{W+|ast|burru|n}}, {{W+|ast|burra|m}}, {{W+|ast|pollín|n}}
* {{Z|aot}}: {{W-|aot|gada}}
* {{Z|av}}: {{W-|av|хӏама}}
* {{Z|awa}}: {{W-|awa|गदहा|n}}
* {{Z|az}}: {{W+|az|eşşək}}, {{W-|az|ulaq}}
* {{Z|bdr}}: {{W-|bdr|keribas}}
* {{Z|eu}}: {{W+|eu|asto}}
* {{Z|ba}}: {{W-|ba|ишәк}}
* {{Z|sne}}: {{W-|sne|kaldei}}
* {{Z|be}}: {{W-|be|асёл|n}}
* {{Z|bal}}: {{W-|bal|ہر|tr=har}}
* {{Z|bn}}: {{W+|bn|গাধা}}
* {{Z|br}}: {{W+|br|azen|n}}
* {{Z|bdk}}: {{W-|bdk|лем}}
* {{Z|bg}}: {{W-|bg|мага́ре|nt}}, {{W-|bg|осе́л|n}}
* {{Z|my}}: {{W+|my|မြည်း}}
* {{Z|bua}}: {{W-|bua|элжэгэн}}
* {{Z|ce}}: {{W-|ce|вир}}
* {{Z|cs}}: {{W+|cs|osel|n}}
* {{Z|chr}}: {{W-|chr|ᏗᎦᎵᏅᎯᏛ}}
* {{Z|chy}}: {{W-|chy|a'éevo'ha}}
* {{Z|ny}}: {{W-|ny|bulu}}
* {{Z|cic}}: {{W-|cic|haksibish falaa'}}
* {{Z|zh}}:
*: {{Z|yue}}: {{W-|yue|驢|tr=leoi4}}, {{W-|yue|驢仔|tr=leoi4 zai2}}
*: {{Z|dng}}: {{W-|dng|лү}}
*: {{Z|hak}}: {{W-|hak|驢仔|tr=lì-è}}
*: {{Z|cmn}}: {{W+|cmn|驢|tr=lǘ}}, {{W-|cmn|驢子|tr=lǘzi}}
*: {{Z|cdo}}: {{W-|cdo|驢|tr=lè̤}}
*: {{Z|nan}}: {{W+|nan|驢|tr=lîr / lû / lî}}, {{W+|nan|驢仔|tr=lû-á / lî-á / lîr-á}}
*: {{Z|wuu}}: {{W-|wuu|驢}}
* {{Z|cv}}: {{W-|cv|ашак}}
* {{Z|chk}}: {{W-|chk|tongki}}
* {{Z|dlm}}: {{W-|dlm|samur|n}}
* {{Z|da}}: {{W+|da|æsel|nt}}
* {{Z|dv}}: {{W-|dv|ހިާމރު}}
* {{Z|ovd}}: {{W-|ovd|åsn|m}}
* {{Z|id}}: {{W+|id|keledai}}
* {{Z|ar}}: {{W+|ar|حِمَار|n}}
*: {{Z|arz}}: {{W-|arz|حمار|n|tr=ḥumār, ḥmār}}
*: {{Z|acw}}: {{W-|acw|حُمار|n|tr=ḥumār}}
*: {{Z|acm}}: {{W-|acm|زمال|n|tr=zmāl}}
*: {{Z|afb}}: {{W-|afb|حمار|n|tr=ḥmār}}
*: {{Z|aeb}}: {{W-|aeb|بهيم|n|tr=bhīm}}
*: {{Z|ary}}: {{W-|ary|حمار|n|tr=ḥmār}}, {{W-|ary|حمارة|m|tr=ḥmāra}}, {{W-|ary|دحش|tr=daḥš}}, {{W-|ary|دحشة|m|tr=daḥša}}
* {{Z|hy}}: {{W+|hy|էշ}}, {{W+|hy|ավանակ}}
* {{Z|eo}}: {{W+|eo|azeno}}
* {{Z|et}}: {{W+|et|eesel}}
* {{Z|gez}}: {{W-|gez|አድግ}}
* {{Z|ee}}: {{W-|ee|tedzi|nt}}
* {{Z|fa}}: {{W+|fa|خر|tr=xar}}, {{W+|fa|الاغ|tr=olâğ}}
* {{Z|fo}}: {{W-|fo|asni}}
* {{Z|fi}}: {{W+|fi|aasi}}
* {{Z|fro}}: {{W-|fro|asne|n}}
* {{Z|fr}}: {{W+|fr|âne|n}}
* {{Z|fur}}: {{W-|fur|mus}}
* {{Z|fy}}: {{W-|fy|ezel}}
* {{Z|gd}}: {{W-|gd|asal|m}}
* {{Z|gag}}: {{W-|gag|eşek}}, {{W-|gag|yeşek}}
* {{Z|gl}}: {{W+|gl|asno}}, {{W+|gl|burro}}
* {{Z|got}}: {{W-|got|𐌰𐍃𐌹𐌻𐌿𐍃}}
* {{Z|gu}}: {{W-|gu|ગધેડો}}
* {{Z|ka}}: {{W+|ka|ვირი}}, {{W+|ka|ჯორი}}
* {{Z|ha}}: {{W+|ha|jaki}}
* {{Z|hi}}: {{W+|hi|गधा|n}}
* {{Z|nl}}: {{W+|nl|ezel|n}}
* {{Z|he}}: {{W-|he|חֲמוֹר|n|tr=khamór}}, {{W-|he|אָתוֹן|m|tr=atón}}
* {{Z|io}}: {{W+|io|asno}}
* {{Z|ang}}: {{W-|ang|esol|n}}
* {{Z|en}}: {{W+|en|donkey}}
* {{Z|inh}}: {{W-|inh|вир}}
* {{Z|ia}}: {{W-|ia|asino}}
* {{Z|ga}}: {{W+|ga|asal|n}}
* {{Z|ist}}: {{W-|ist|samèri|n-p}}
* {{Z|it}}: {{W+|it|asino|n}}, {{W+|it|somaro|n}}, {{W-|it|buricco|n}}, {{W+|it|ciuco}}
* {{Z|is}}: {{W+|is|asni}}
* {{Z|ja}}: {{W+|ja|驢馬|tr=ろば, roba}}, {{W+|ja|ロバ|tr=roba}}
* {{Z|kab}}: {{W-|kab|aɣyul|n}}
* {{Z|kl}}: {{W-|kl|siutitooq}}
* {{Z|xal}}: {{W-|xal|элҗгн}}
* {{Z|ktb}}: {{W-|ktb|harreta}}
* {{Z|kn}}: {{W+|kn|ಕತ್ತೆ}}
* {{Z|krc}}: {{W-|krc|эшек|tr=eşek}}
* {{Z|csb}}: {{W-|csb|osoł|n}}, {{W-|csb|òseł}}
* {{Z|ca}}: {{W+|ca|ase|n}}, {{W+|ca|somera|m}}, {{W+|ca|burro|n}}, {{W+|ca|burra|m}}, {{W+|ca|ruc|n}}, {{W+|ca|ruca|m}}
* {{Z|qu}}: {{W-|qu|wuru}}, {{W-|qu|asnu}}
* {{Z|ks}}: {{W-|ks|خَر|n}}
* {{Z|ky}}: {{W+|ky|эшек}}
* Ladin:
*: {{Z|lld}}: {{W-|lld|musciat|n}}
*: {{Z|lld}}: {{W-|lld|müsc|n}}
*: {{Z|lld}}: {{W-|lld|èsen|n}},{{W-|lld|musciat|n}}
* {{Z|si}}: {{W+|si|බූරුවා}}
* {{Z|ko}}: {{W+|ko|당나귀}}, {{W+|ko|나귀}}
* {{Z|rop}}: {{W-|rop|ginggong ginggong}}
* {{Z|la}}: {{W-|la|asellus}}, {{W-|la|asinus|n}}
* {{Z|lv}}: {{W-|lv|ēzelis|n}}
* {{Z|lo}}: {{W-|lo|ລາ}}, {{W-|lo|ມ້າລໍ}}
* {{Z|lzz}}: {{W-|lzz|ეშეღი}}
* {{Z|lez}}: {{W-|lez|лам}}
* {{Z|lij}}: {{W-|lij|ase}}
* {{Z|li}}: {{W+|li|aezel}}
* {{Z|lt}}: {{W+|lt|asilas|n}}
* {{Z|khb}}: {{W-|khb|ᩃᩣ}}
* {{Z|lb}}: {{W-|lb|Iesel|n}}
* {{Z|luo}}: {{W-|luo|punda}}
* {{Z|mk}}: {{W-|mk|магаре|nt}}
* Malay:
*: {{Z|ms}}: {{W-|ms|کلداي}}, {{W-|ms|حمار}}
*: Rûmî: {{W+|ms|keldai}}, {{W-|ms|himar}}
* {{Z|ml}}: {{W+|ml|കഴുത}}
* {{Z|mt}}: {{W-|mt|ħmar|n}}
* {{Z|mnc}}: {{W-|mnc|ᡝᡳᡥᡝᠨ}}
* {{Z|gv}}: {{W-|gv|assyl|n}}
* {{Z|mi}}: {{W-|mi|kāihe}}
* {{Z|mr}}: {{W+|mr|गाढव|n}}
* {{Z|mhr}}: {{W-|mhr|осёл}}
* {{Z|hu}}: {{W+|hu|szamár}}
* {{Z|xmf}}: {{W-|xmf|გირინი}}
* {{Z|mel}}: {{W-|mel|keledai}}
* {{Z|egy}}: {{W-egy|ꜥꜣ|n|h=aA:D52-E7}}
* {{Z|mdf}}: {{W-|mdf|ишме}}
* {{Z|mn}}: {{W+|mn|илжиг}}
* {{Z|nap}}: {{W-|nap|ciuccio}}
* {{Z|nv}}: {{W-|nv|télii|sc=Latn}}
* {{Z|nds}}: {{W+|nds|Esel|n}}
* {{Z|nrf}}: {{W-|nrf|âne|n}}
* {{Z|no}}: {{W+|no|esel|nt}}
* {{Z|oc}}: {{W+|oc|ase}}, {{W+|oc|asne|n}}
* {{Z|or}}: {{W+|or|ଗଧ}}
* {{Z|om}}: {{W+|om|harree}}
* {{Z|os}}: {{W-|os|хӕрӕг}}
* {{Z|ota}}: {{W-|ota|اشك|tr=eşek}}
* {{Z|ug}}: {{W-|ug|ئېشەك}}
* {{Z|uz}}: {{W+|uz|eshak}}
* {{Z|pi}}: {{W-|pi|gadrabha|n}}
* {{Z|ps}}: {{W+|ps|خر|n|tr=xar}}
* {{Z|pdt}}: {{W-|pdt|Äsel|n}}
* {{Z|pox}}: {{W-|pox|asål|n}}
* {{Z|pl}}: {{W+|pl|osioł|n}}, {{W+|pl|oślica|m}}
* {{Z|pt}}: {{W+|pt|asno|n}}, {{W+|pt|jerico|n}}, {{W+|pt|jegue|n}}, {{W+|pt|jumento|n}}, {{W+|pt|burro|n}}
* {{Z|pa}}: {{W-|pa|ਗਧਾ}}
* {{Z|kk}}: {{W-|kk|есек}}
* {{Z|cop}}: {{W-|cop|ⲉⲱ}}
* {{Z|rm}}: {{W-|rm|asen}}
* {{Z|rom}}: {{W-|rom|magari|n}}, {{W-|rom|magarka|m}}
* {{Z|ro}}: {{W+|ro|măgar|n}}, {{W+|ro|asin|n}}
* {{Z|ru}}: {{W+|ru|осёл|n}}, {{W-|ru|осли́ца|m}}, {{W-|ru|иша́к|n}}
* {{Z|ssy}}: {{W-|ssy|zanan}}
* {{Z|se}}: {{W-|se|ásen}}
* {{Z|sm}}: {{W-|sm|asini}}
* {{Z|sa}}: {{W+|sa|गर्दभ|n}}
* {{Z|sc}}: {{W-|sc|burriccu}}, {{W-|sc|molenti}}, {{W-|sc|molingianu}}, {{W-|sc|àinu}}
*: {{Z|sc}}: {{W-|sc|àinu}}, {{W-|sc|bestiolu}}, {{W-|sc|molènti}}, {{W-|sc|bistrassu}}
*: {{Z|sc}}: {{W-|sc|poleddu}}, {{W-|sc|polléddu}}, {{W-|sc|pulléddu}}, {{W-|sc|àinu}}, {{W-|sc|àinu}}
* {{Z|scn}}: {{W+|scn|sceccu|n}}
* {{Z|sid}}: {{W-|sid|harre}}
* {{Z|sd}}: {{W-|sd|گڏھ|tr=gaḋahu}}
* {{Z|sh}}:
*: Kirîlî: {{W-|sh|ма̀гарац|n}}, {{W-|sh|то̀вар|n}}
*: Latînî: {{W+|sh|màgarac|n}}, {{W+|sh|tòvar|n}}
* {{Z|sco}}: {{W-|sco|cuddie}}
* {{Z|cu}}:
*: Kirîlî: {{W-|cu|осьлъ|n}}
* {{Z|orv}}: {{W-|orv|осьлъ|n}}
* {{Z|sk}}: {{W-|sk|somár|n}}, {{W+|sk|osol|n}}
* {{Z|sl}}: {{W+|sl|osel|n}}, {{W-|sl|oslica|m}}
* {{Z|so}}: {{W+|so|dameer|n}}
* Sorbî:
*: {{Z|dsb}}: {{W-|dsb|ezel|n}}, {{W-|dsb|wósoł|n}}
*: {{Z|hsb}}: {{W-|hsb|wosoł|n}}
* {{Z|st}}: {{W+|st|tonki}}
* {{Z|es}}: {{W+|es|asno|n}}, {{W+|es|burro|n}}, {{W+|es|jumento}}
* {{Z|sux}}: {{W-|sux|𒀲|tr=ANŠE}}
* {{Z|sw}}: {{W+|sw|punda}}
* {{Z|sv}}: {{W+|sv|åsna}}
* {{Z|tg}}: {{W+|tg|хар}}
* {{Z|tl}}: {{W+|tl|asno}}, {{W-|tl|buriko}}
* {{Z|ta}}: {{W+|ta|கழுதை}}
* {{Z|twf}}: {{W-|twf|mùldu’úna}}
* {{Z|rif}}: {{W-|rif|aɣyur|n}}
* {{Z|th}}: {{W+|th|ลา}}
* {{Z|te}}: {{W+|te|గాడిద}}
* {{Z|crh}}: {{W-|crh|eşek}}
* {{Z|tt}}: {{W+|tt|ишәк}}
* {{Z|ti}}: {{W-|ti|ኣድጊ}}
* {{Z|tr}}: {{W+|tr|eşek}}, {{W+|tr|merkep}}, {{W+|tr|sıpa}}
* {{Z|tk}}: {{W-|tk|eşek}}
* {{Z|bo}}: {{W-|bo|བོང་བུ}}
* {{Z|tpi}}: {{W-|tpi|donki}}, {{W-|tpi|esel}}
* {{Z|txb}}: {{W-|txb|kercapo}}
* {{Z|tum}}: {{W-|tum|bulu}}
* {{Z|tyv}}: {{W-|tyv|элчиген}}
* {{Z|udi}}: {{W-|udi|елем}}
* {{Z|udm}}: {{W-|udm|ишак}}, {{W-|udm|осёл}}
* {{Z|ur}}: {{W-|ur|گدھا|n|tr=gadhā}}
* {{Z|uk}}: {{W-|uk|осе́л|n}}, {{W-|uk|віслю́к|n}}, {{W-|uk|іша́к|n}}
* {{Z|vec}}: {{W+|vec|muso|n}}, {{W+|vec|àxeno|n}}
* {{Z|vi}}: {{W+|vi|lừa}}
* {{Z|vo}}: {{W+|vo|cuk}}
* {{Z|wa}}: {{W+|wa|ågne|n|m}}, {{W+|wa|bådet|n}}, {{W+|wa|både|m}}, {{W+|wa|bourike|m}}, {{W+|wa|ågntea|n}}
* {{Z|wbl}}: {{W-|wbl|xur}}
* {{Z|cy}}: {{W-|cy|asyn|n}}
* {{Z|wo}}: {{W-|wo|mbaam-sëf|cuda=mbaam-sëf mi}}, {{W-|wo|mbaam-sëf}}
* {{Z|km}}: {{W-|km|សត្វលា}}, {{W+|km|លា}}
* {{Z|xh}}: {{W-|xh|imbongolo}}
* {{Z|sah}}: {{W-|sah|осёл}}
* {{Z|yi}}: {{W-|yi|אייזל|n}}, {{W-|yi|חמור|n|tr=khamer}}
* {{Z|yo}}: {{W-|yo|kẹ́tẹ́kẹ́tẹ́}}
* {{Z|el}}: {{W+|el|γάιδαρος|n}}, {{W+|el|γαϊδούρα|m}}, {{W+|el|γαϊδούρι|nt}}, {{W+|el|όνος|n|m}}
*: Kevn: {{W-|grc|ὄνος|n|m}}
* {{Z|zu}}: {{W-|zu|imbongolo}}, {{W-|zu|udonki}}
* {{Z|zun}}: {{W-|zun|moshok'o}}
{{werger-bin}}
:{{werger çavkanî|en|donkey|beş=Ev qismê Wergerê|oldid=75539477}}
=== Navdêr 2 ===
[[Wêne:Cut-apple-slices_21575-480x360_(4900266300).jpg|thumb|Çend '''kerên''' sêvan.]]
{{navdêr|ku|z=n}} {{k-ya nerm}}
# {{maneid|ku|parçe}} [[felqe]], [[parçe]], [[qet]], [[par]], [[pirt]]<br> (bi taybetî ya ku bi [[kêr]]ê hatiye [[birîn]]).
#* ''Hisreta me '''kerî nanê reş''', [[kas]]ek dewê tirş, [[yan]]ê hin [[toraq]] bû; lê dîsa em ji hale xwe razî bûn.''<ref>1931, ''Hakob Qezeryan-Lazo'', ''Serhatiya Casim'', guhastin:Haciyê Cindî-Emînê Evdal </ref>
#: {{mk|ku|'''Kerek''' ji sêva xwe da min.}}
#* {{J:Mela Hisênê Bateyî:Mewlûda Kurdî|jêgirtin=Cewherek lê kir nezer ew bû du '''ker'''<br />Paşê Wî çêkir ji nûra [[namuwer]]}}
==== Bi alfabeyên din ====
* {{ku-ar|کهر}}
==== Formên alternatîv ====
* {{g|ku|kert}}
==== Jê ====
{{kol3|ku
| kerker
| ker kirin
| kerkirin
| kerkirî
| kêr
| ker bûn<q:lêker>
| ker kirin<q:lêker>
| kerbûn<q:navdêr>
| kerkirin<q:navdêr>
| kerbûyî<q:rengdêr>
| kerkirî<q:rengdêr>
}}
==== Etîmolojî ====
Hevreha soranî {{g|ckb|کهرت|tr=[[kert]]}}, hewramî û zazakî {{q|zza|kerd}}, [[kurdiya başûrî]] {{q|sdh|qeł|sc=Latn}}, belûçî {{q|bal||tr=karç}}, farisî {{g|fa|کارد|tr=kard}}, pehlewî ''kart'', avestayî ''kerite-'', sanskrîtî ''krti-'', ermeniya kevn {{g|xcl|քերեմ|tr=k'êrêm|w=[[jê birin]], [[xîç]] kirin}}, yûnaniya kevn {{g|grc|κείρω|tr=kêiro|w=[[birîn]], [[cew]] kirin}}, latînî {{q|la|curtus|w=[[kurt]]}}, îngilîzî {{q|en|share|w=[[par]], [[beş]]}}, {{q|en|shear|w=[[birîn]], [[cew]] kirin}}, {{q|en|short|w=[[kurt]]}}, hemû ji {{ji|ine-pro|ku|*(s)ker-|w=[[birîn]], [[jê kirin]]}}.
:<font style="font-size:10px">'''Çavkanî:''' [[Şablon:Cheung|Cheung p.243]], [[Şablon:Horn|Horn p.185]], [[Şablon:MacKenzie|MacKenzie P.129]], [[Şablon:Watkins|Watkins p.100]] </font> | <font style="font-size:10px">'''Pokorny: '''941 - 942</font>
:<font style="font-size:10px">'''[[Hevreh]]''': [[kêr]] [[kurt]], [[çerm]]</font>
==== Bi zaravayên din ====
* {{Z|ckb}}: [[kert]]
* {{Z|sdh}}: [[qeł]]
==== Werger ====
{{werger-ser}}
* {{Z|de}}: {{W+|de|Brotscheibe|m}}, {{W+|de|Scheibe|m}}, {{W+|de|Anteil|n}}, {{W+|de|Teil|n}}, {{W+|de|Stück|nt}}
* {{Z|be}}: {{W-|be|лу́ста|m}}, {{W-|be|скрыль|n}}, {{W-|be|скі́ба|m}}
* {{Z|bg}}: {{W+|bg|филия|nt}}, {{W+|bg|резен|n}}
* {{Z|cs}}: {{W+|cs|krajíc|n}}, {{W+|cs|plátek|n}}
* {{Z|zh}}:
*: {{Z|yue}}: {{W-|yue|片|tr=pin3}}
*: {{Z|cmn}}: {{W+|cmn|片|tr=piàn}}
* {{Z|da}}: {{W+|da|skive|g}}
* {{Z|ar}}: {{W-|ar|شريحة|m}}
* {{Z|eo}}: {{W-|eo|tranĉaĵo}}
* {{Z|et}}: {{W-|et|viilukas}}, {{W-|et|viil}}
* {{Z|fa}}: {{W+|fa|قاچ|tr=qâč}}, {{W+|fa|تیکه|tr=tikke}}, {{W+|fa|لزگه|tr=lazge}}, {{W+|fa|کرچ|tr=karč}}
* Polish: [[plaster]], [[plasterek]] ; [[kromka]], [[pajda]] ; [[kawałek]] ;
* {{Z|fi}}: {{W+|fi|viipale}}
* {{Z|fr}}: {{W+|fr|tranche|m}}, {{W+|fr|tronçon|n}}
* {{Z|gd}}: {{W-|gd|sliseag|m}}
* {{Z|gl}}: {{W+|gl|rebanda|m}}, {{W+|gl|toro|n}}, {{W-|gl|tallada|m}}, {{W+|gl|posta|m}}
* {{Z|nl}}: {{W+|nl|plak|nt}}, {{W+|nl|schijf|nt}}
* {{Z|he}}: {{W-|he|פְּרוּסָה|m|tr=prusá}}, {{W-|he|נֵתַח|n|tr=nétaḥ}}, {{W-|he|פֶּלַח|n|tr=pélaḥ}}
* {{Z|io}}: {{W+|io|loncho}}
* {{Z|en}}: {{W+|en|slice}}
* {{Z|izh}}: {{W-|izh|pytky}}
* {{Z|it}}: {{W+|it|fetta|m}}, {{W+|it|trancio|n}}
* {{Z|is}}: {{W-|is|sneið|m}}
* {{Z|ja}}: {{W-|ja|切れ|tr=きれ, kire|sc=Jpan}}, {{W+|ja|一片|tr=いっぺん, ippen|sc=Jpan}}, {{W-|ja|スライス|tr=suraisu|sc=Jpan}}
* {{Z|ca}}: {{W+|ca|llesca|m}}
* {{Z|ko}}: {{W+|ko|부분}}, {{W+|ko|몫}}, {{W-|ko|슬라이스}}
* {{Z|lv}}: {{W+|lv|rika|m}}
* {{Z|lo}}: {{W-|lo|ປ່ຽງ}}, {{W-|lo|ແຜ່ນບາງໆ}}
* {{Z|lt}}: {{W-|lt|riekė̃|m}}
* {{Z|mi}}: {{W-|mi|kōripi}}, {{W-|mi|topenga}}
* {{Z|hu}}: {{W+|hu|szelet}}, {{W+|hu|karéj}}
* {{Z|egy}}: {{W-egy|fdq|h=f:d-q-Z9:D40}}
* {{Z|nrf}}: {{W-|nrf|tranche|m}}
* {{Z|pt}}: {{W+|pt|fatia}}
* {{Z|ro}}: {{W+|ro|felie|m}}
* {{Z|ru}}: {{W-|ru|ломо́ть|n}}, {{W-|ru|ло́мтик|n}}, {{W-|ru|кусо́к|n}}, {{W-|ru|кусо́чек|n}}, {{W+|ru|слайс|n}}
* {{Z|scn}}: {{W-|scn|feḍḍa|m}}, {{W+|scn|pezzu|n}}
* {{Z|sh}}: {{W+|sh|kriška|m}}
* {{Z|es}}: {{W+|es|rebanada|m}}
* {{Z|sv}}: {{W+|sv|skiva|g}}
* {{Z|th}}: {{W+|th|ชิ้น}}
* {{Z|tr}}: {{W+|tr|dilim}}
* {{Z|uk}}: {{W-|uk|ски́ба|m}}, {{W-|uk|ски́бка|m}}, {{W-|uk|шмато́к|n}}, {{W-|uk|кусо́к|n}}
* {{Z|vi}}: {{W-|vi|lát mỏng}}, {{W-|vi|miếng mỏng}}
* {{Z|cy}}: {{W-|cy|tafelll|m}}
* {{Z|el}}: {{W+|el|φέτα|m}}
*: Kevn: {{W-|grc|τέμαχος|nt}}
{{werger-bin}}
:{{werger çavkanî|en|slice|beş=Ev qismê Wergerê|oldid=75505183}}
=== Navdêr 3 ===
{{navdêr|ku|z=mn}} {{k-ya nerm}}
# Kesa/ê tiştekî dike yan tiştek kiriye.
#: {{mk|ku|Divê '''kerên''' vê xirabiyê bên sizadan.}}
==== Notên bikaranînê ====
{{agadarî}} Peyva '''ker''' bi vê maneyê kêm serbixwe peyda dibe lê pirtir wek paşgirekê di gel hin peyvan tê bikaranîn: ''[[çêker]], [[şerker]], [[sazker]]
==== Jê ====
{{kol3|ku|cure=Jê
|-ker
}}
==== Etîmolojî ====
{{etîmon|ku|:ji<metn:Ji [[rehê dema niha]] yê kevn ê>|kirin|id=kirin|metn=++|dar=1}}
==== Werger ====
{{werger-ser}}
* {{Z|en}}: {{W+|en|doer}}, {{W+|en|actor}}, {{W+|en|agent}}
{{werger-bin}}
=== Navdêr 4 ===
{{navdêr|ku|z=n}}
# {{mj|kom, grûp}} {{bnr|kerî}}
=== Rengdêr 1 ===
{{rengdêr|ku}} {{k-ya nerm}}, {{r-ya req}}
# {{senseid|ku|guhgiran}}Kesa/ê [[qet]] yan [[baş]] [[deng]]an [[bihîstin|nabihîze]].
#: {{hevmane|ku|guhgiran|nebihîz}}
#: {{mk|ku|'''Ker''' û [[lal]]|kesa/ê ne [[karîn|dikare]] [[axiftin|biaxive]] û ne jî [[bîstin|bibîze]]|birêz=1}}
==== Bi alfabeyên din ====
* {{ku-ar|کهڕ}}
==== Formên alternatîv ====
* {{g|ku|kerr}}
==== Jê ====
{{kol3|ku
| ker bûn<q:lêker>
| ker kirin<q:lêker>
| xwe lê ker kirin
| kerbûn<q:navdêr>
| kerkirin<q:navdêr>
| kerbûyî<q:rengdêr>
| kerkirî<q:rengdêr>
| kerî
| kerînî
| kerîtî
| kerker
| kertî
}}
==== Etîmolojî ====
Hevreha soranî {{g|ckb|کهڕ|tr=kerr}}, [[kurdiya başûrî]] [[keř]], zazakî ''kerr'', hewramî ''kerr'', belûçî {{g|ckb|کر|tr=kerr}}, {{hv|fa|کر|tr=kerr}}, {{hv|pal||k-rr|sc=Latn}}, soxdî ''k-rn-'', {{hv|ae||kerne-|sc=Latn}}, peştûyî {{g|ps|کوڼ|tr=kuṇ}}, {{hv|sa|कर्ण}} (kárṇa-: [[guh]]), slavoniya kevn [[кърнъ]] (kŭrnŭ), latviyayî [[kurls]], {{hv|lt|kurčias}}, hemû ji {{ji|ine-pro|ku|*kʷorno-|w=[[guh]]}}. Maneya bingehîn "guh" bû lê di zimanên îranî û yên [[baltî]] de maneya "[[guhgiran]]" wergirtiye. Di zimanên hindî de bi maneya "guh" maye: hindî [[कान]] (kan), urdûyî {{g|ur|کان|tr=kan}}, bengalî [[কর্ণ]] (korno) û [[কান]] (kan)...
==== Bide ber ====
{{kol2|ku|
| {{g|ku|kor}}
| {{g|ku|lal}}
}}
==== Werger ====
{{werger-ser|guhgiran}}
* {{Z|ab}}: {{W-|ab|адагәа}}
* {{Z|ady}}: {{W-|ady|дэгу}}
* {{Z|af}}: {{W-|af|dowe}}
* {{Z|xag}}: {{W-|xag|𐕆𐔼𐕒𐔽𐔰}}
* {{Z|akl}}: {{W-|akl|bungoe}}
* {{Z|sq}}: {{W-|sq|i shurdhër}}
* {{Z|de}}: {{W+|de|taub}}, {{W+|de|gehörlos}}
* {{Z|an}}: {{W-|an|xordo}}
* {{Z|rup}}: {{W-|rup|surdu}}
* {{Z|as}}: {{W-|as|কলা}}, {{W-|as|অন্ধ}}
* {{Z|ast}}: {{W-|ast|sordu}}, {{W-|ast|xordu}}
* {{Z|av}}: {{W-|av|гӏинкъаб}}
* {{Z|az}}: {{W+|az|kar}}
* {{Z|ban}}: {{W-|ban|bongol}}
* {{Z|eu}}: {{W+|eu|gor}}
* {{Z|ba}}: {{W-|ba|һаңғырау}}
* {{Z|sne}}: {{W-|sne|bongam}}
* {{Z|be}}: {{W-|be|глухі́}}
* {{Z|bcl}}: {{W-|bcl|bungog}}
* {{Z|br}}: {{W+|br|bouzar}}
* {{Z|bg}}: {{W+|bg|глух}}
* {{Z|my}}: {{W+|my|နားပင်း}}
* {{Z|ccc}}: {{W-|ccc|majchayi}}
* {{Z|ce}}: {{W-|ce|къора}}
* {{Z|cs}}: {{W+|cs|hluchý|n}}
* {{Z|chr}}: {{W-|chr|ᏧᎵᎡᎾ}}
* {{Z|zh}}:
*: {{Z|yue}}: {{W-|yue|耳聾|tr=ji5 lung4}}, {{W-|yue|聾|tr=lung4}}
*: {{Z|cmn}}: {{W+|cmn|聾|tr=lóng}}, {{W+|cmn|耳聾|tr=ěrlóng}}
*: {{Z|nan}}: {{W-|nan|耳聾|tr=hīⁿ-lâng}}
* {{Z|dlm}}: {{W-|dlm|suard}}
* {{Z|da}}: {{W+|da|døv}}
* {{Z|id}}: {{W+|id|tuli}}, {{W-|id|tuna rungu}}
* {{Z|ar}}: {{W-|ar|أَصَمّ}}
*: {{Z|arz}}: {{W-|arz|أصم|n|tr=ʔaṣamm}}, {{W-|arz|أطرش|n|tr=ʔaṭraš}}
* {{Z|hy}}: {{W+|hy|խուլ}}
* {{Z|eo}}: {{W+|eo|surda}}
* {{Z|et}}: {{W-|et|kurt}}
* {{Z|fa}}: {{W+|fa|کر|tr=kar}}, {{W+|fa|ناشنوا|tr=nâšenavâ}}
* {{Z|fo}}: {{W-|fo|deyvur}}
* {{Z|fi}}: {{W+|fi|kuuro}}, {{W-|fi|kuulovammainen}}
* {{Z|fr}}: {{W+|fr|sourd}}
* {{Z|fur}}: {{W-|fur|sort}}, {{W-|fur|sord}}
* {{Z|frr}}: {{W-|frr|duuf}}
* {{Z|fy}}: {{W-|fy|dôf}}
* {{Z|gd}}: {{W-|gd|bodhar}}
* {{Z|gl}}: {{W-|gl|xordo}}
* {{Z|got}}: {{W-|got|𐌱𐌰𐌿𐌸𐍃}}
* {{Z|ka}}: {{W+|ka|ყრუ}}, {{W-|ka|სმენადაკარგული}}
* {{Z|ht}}: {{W-|ht|soud}}
* {{Z|haw}}: {{W-|haw|kuli}}
* {{Z|mba}}: {{W-|mba|bungol}}
* {{Z|hi}}: {{W+|hi|बहरा}}
* {{Z|nl}}: {{W+|nl|doof}}, {{W+|nl|dove}}
* {{Z|hrx}}: {{W-|hrx|daab}}
* {{Z|iba}}: {{W-|iba|achak}}
* {{Z|he}}: {{W-|he|חֵירֵשׁ|tr=kheresh}}
* {{Z|ang}}: {{W-|ang|dēaf}}
* {{Z|en}}: {{W+|en|deaf}}
* {{Z|izh}}: {{W-|izh|gluuhkoi}}
* {{Z|ga}}: {{W-|ga|bodhar}}
*: {{Z|sga}}: {{W-|sga|bodar}}
* {{Z|ist}}: {{W-|ist|surdo}}
* {{Z|it}}: {{W+|it|sordo}}
* {{Z|is}}: {{W+|is|daufur}}
* {{Z|ja}}: {{W-|ja|[[耳]]の[[聞こえる|聞こえない]]|tr=みみのきこえない, mimi no kikoenai}}, {{W-|ja|耳が不自由|tr=mimi ga fujiyuu}}
* {{Z|kaw}}: {{W-|kaw|buḍĕg}}
* {{Z|jv}}: {{W+|jv|budheg}}, {{W+|jv|jampeng}}
* {{Z|kbd}}: {{W-|kbd|дэгу}}
* {{Z|ca}}: {{W+|ca|sord}}
* {{Z|kjj}}: {{W-|kjj|баьш}}
* {{Z|si}}: {{W+|si|බිහිරි}}
* {{Z|ko}}: {{W-|ko|[[귀머거리]]-의}}
* {{Z|kw}}: {{W-|kw|bodhar}}
* {{Z|co}}: {{W+|co|sordu}}
* {{Z|lld}}: {{W-|lld|sëurt}}
* {{Z|lad}}: {{W-|lad|sodro}}
* {{Z|ltg}}: {{W-|ltg|kūrslys|n}}
* {{Z|la}}: {{W+|la|surdus|n}}
* {{Z|lv}}: {{W-|lv|kurls|n}}, {{W-|lv|nedzirdīgs}}
* {{Z|lo}}: {{W-|lo|ຫູໜວກ}}
* {{Z|lez}}: {{W-|lez|биши}}
* {{Z|lt}}: {{W-|lt|kurčias}}
* {{Z|lb}}: {{W+|lb|daf}}
* {{Z|mk}}: {{W-|mk|глув}}
* {{Z|pse}}: {{W-|pse|pekak}}
* {{Z|ms}}: {{W+|ms|pekak}}, {{W-|ms|tuli}}, {{W-|ms|congek}}, {{W-|ms|tunakerna}}
* {{Z|mt}}: {{W-|mt|trux}}
* {{Z|mnc}}: {{W-|mnc|ᡩᡠᡨᡠ}}
* {{Z|msk}}: {{W-|msk|bungul}}
* {{Z|mi}}: {{W+|mi|turi}}, {{W-|mi|pūwharawhara}}
* {{Z|mrw}}: {{W-|mrw|bengel}}, {{W-|mrw|biso}}
* {{Z|mr}}: {{W-|mr|बधीर}}, {{W+|mr|बहिरा}}
* {{Z|hu}}: {{W+|hu|süket}}, {{W+|hu|siket}}
* {{Z|xmf}}: {{W-|xmf|ჸუნგა}}, {{W-|xmf|ჸურუ}}, {{W-|xmf|ჸუჯა}}, {{W-|xmf|დაგუა|cuda=დაგუ̂ა}}
* {{Z|mel}}: {{W-|mel|pakeak}}, {{W-|mel|tulek}}
* {{Z|mui}}: {{W-|mui|pekak}}
* {{Z|nv}}: {{W-|nv|ajéékałgo ąąh dahazʼą́}}, {{W-|nv|jééhkał}}
* {{Z|nds}}: {{W-|nds|dow}}
* {{Z|nay}}: {{W-|nay|plombatji}}
* {{Z|no}}:
*: {{Z|no}}: {{W+|no|døv}}
*: {{Z|nn}}: {{W+|nn|døv}}, {{W-|nn|dauv}}
* {{Z|oc}}: {{W+|oc|sord}}
* {{Z|or}}: {{W+|or|ବଧିର}}
* {{Z|om}}: {{W-|om|duudaa}}
* {{Z|ota}}: {{W-|ota|صاغر|tr=sağır}}
* {{Z|ps}}: {{W+|ps|کوڼ|tr=kuṇ}}
* {{Z|pdt}}: {{W-|pdt|doof}}
* {{Z|pl}}: {{W+|pl|głuchy|n}}
* {{Z|pt}}: {{W+|pt|surdo}}
* {{Z|kk}}: {{W-|kk|саңырау}}
* {{Z|ro}}: {{W+|ro|surd}}
* {{Z|ru}}: {{W-|ru|глухо́й}}
* {{Z|se}}: {{W-|se|bealjeheapmi}}
* {{Z|sms}}: {{W-|sms|kluuǥǥai}}
* {{Z|sa}}: {{W+|sa|बधिर}}, {{W+|sa|कल्ल}}
* {{Z|sc}}: {{W-|sc|suldu}}, {{W-|sc|surdu}}
* {{Z|ceb}}: {{W-|ceb|bungol}}
* {{Z|sh}}:
*: Kirîlî: {{W-|sh|глув}}, {{W-|sh|глух}}
*: Latînî: {{W+|sh|gluv}}, {{W+|sh|gluh}}
* {{Z|sco}}: {{W-|sco|deif}}
* {{Z|sk}}: {{W-|sk|hluchý|n}}
* {{Z|sl}}: {{W+|sl|gluh}}
* Sorbî:
*: {{Z|dsb}}: {{W-|dsb|głuchy}}
* {{Z|es}}: {{W+|es|sordo}}
* {{Z|su}}: {{W-|su|torék}}
* {{Z|sva}}: {{W-|sva|ყუ̂რიუ̂}}, {{W-|sva|ყუგ}}
* {{Z|sv}}: {{W+|sv|döv}}
* {{Z|tg}}: {{W+|tg|кар}}
* {{Z|tl}}: {{W-|tl|bingi}}
* {{Z|th}}: {{W-|th|หูหนวก}}
* {{Z|te}}: {{W+|te|చెవిటి}}
* {{Z|crh}}: {{W-|crh|sağır}}
* {{Z|tr}}: {{W+|tr|sağır}}
* {{Z|bo}}: {{W-|bo|འོན་པ}}
* {{Z|tli}}: {{W-|tli|lkhool.áxhji}}
* {{Z|ur}}: {{W-|ur|بہرا|tr=bahrā}}
* {{Z|uby}}: {{W-|uby|дагәы}}
* {{Z|uk}}: {{W-|uk|глухи́й}}
* {{Z|vec}}: {{W-|vec|sórdo}}
* {{Z|vi}}: {{W+|vi|điếc}}
* {{Z|vo}}: {{W-|vo|surdik}}
* {{Z|cy}}: {{W+|cy|byddar}}
* {{Z|km}}: {{W+|km|ថ្លង់|tr=tlɑŋ}}
* {{Z|yai}}: {{W-|yai|кар}}
* {{Z|yi}}: {{W-|yi|טויב}}, {{W-|yi|טויבלעך}}, {{W-|yi|חושימדיק|tr=khushemdik}}
* {{Z|esu}}: {{W-|esu|niitesciigatelria}}
* {{Z|el}}: {{W+|el|κωφός|n}}, {{W+|el|κουφός|n}}
*: Kevn: {{W-|grc|κωφός}}
* {{Z|bfi}}: {{W-|bfi|H@Ear}}
* {{Z|ase}}: {{W-|ase|1@Jaw 1@Chin}}
{{werger-bin}}
:{{werger çavkanî|en|deaf|beş=Ev qismê Wergerê|oldid=75710619}}
=== Rengdêr 2 ===
{{rengdêr|ku}}
# {{mj|bêdeng}} {{bnr|kirr}}
==== Anagram ====
* {{anagram|ku|a=ekr|ekr|erk|rek}}
=== Çavkanî ===
{{çavkanî}}
== {{ziman|ckb}} ==
=== Navdêr ===
{{navdêr|ckb|sc=Latn}}
# {{f|ckb|guhandar}} {{ckb-Arab|کەر}}
== {{ziman|sl}} ==
=== Girêdek ===
{{girêdek|sl}}
# [[çimkî#ku|çimkî]], [[çunkî#ku|çunkî]], [[ji ber ku#ku|ji ber ku]]
18vxy8hexmb58ydp0mwybsqke17ym7g
ava
0
3656
6532022
6362434
2026-09-18T15:38:28Z
Wikihez
7344
Kurmancî/Rengdêr: beşa «Etîmolojî» hate nûkirin (DefSideBoxes)
6532022
wikitext
text/x-wiki
{{h-bnr|Ava|-ava}}
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-IPA}}
* {{beş|Rengdêr}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ava.wav|dever=Wan}}
* {{beş|Formeke navdêrê}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ava-2.wav|dever=Wan}}
* {{ku-kîte}}
=== Rengdêr ===
{{ku-tewîn-rd|ava}}
{{rengdêr|ku}}
# Ne [[kavil]], ne [[xirabe]], ne [[xirabkirî]], ne [[xopan]], ne [[wêran]], ne [[ruxandî]], ne [[hilweşandî]]
#: {{hevmaneyên peyvê|ku|çêkirî|dirist|birêk|birêkûpêk|lidar|çalak|liserxwe}}
#: {{dijmane|ku|kavil|wêran|xirabe|xopan}}
#* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=Spêde kifş-i bû dîsa</br>Merîxa nehsê '''ava''' bû</br>Xwiya bû roj di şerqê da}}
==== Bi alfabeyên din ====
* {{ku-ar|ئاڤا}}
==== Formên alternatîv ====
* {{g|ku|awa}} (2)
==== Jê ====
{{kol3|ku|cure=Jê
|-ava
|avahî
|avakar
|avakarî
|avaker
|avakerî
|avanî
|avatî
|avayî
|ava kirin<q:lêker>
|ava bûn<q:lêker>
|avabûn<q:navdêr>
|avakirin<q:navdêr>
|avadan
|avabûyî<q:rengdêr>
|avakirî<q:rengdêr>
|avaçûyî
}}
==== Etîmolojî ====
{{etîmon|ku|:mîr|ira-pro:*āpāta-<etimon:mîr<ine-pro:*peh₂->>|dar=1|metn=++}} têkilî {{hv|fa|آباد|tr=abad}} û {{hv|ckb|ئاوهدان}} / [[awedan]], {{hv|zza|awan}}. Belkî hevreha {{hv|sa|आवास}}.
==== Werger ====
{{werger-ser}}
* {{Z|en}}: {{W+|en|built}}
* {{Z|tr}}: {{W+|tr|bayındır}}, {{W+|tr|mamur}}, {{W+|tr|şen}}, {{W+|tr|abat}}
{{werger-bin}}
=== Formeke navdêrê ===
{{ku-tew-nav|av|mê|îzafe|binavkirî}}
{{navdêr|ku|form=erê}}
# {{formeke peyvê|ku|av||îzafe|yekjimar|binavkirî}}
t42lsgqk3jldo7as9nfhc92vkr2d72a
6532039
6532022
2026-09-18T16:43:00Z
Wikihez
7344
/* Etîmolojî */ (bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re)
6532039
wikitext
text/x-wiki
{{h-bnr|Ava|-ava}}
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-IPA}}
* {{beş|Rengdêr}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ava.wav|dever=Wan}}
* {{beş|Formeke navdêrê}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ava-2.wav|dever=Wan}}
* {{ku-kîte}}
=== Rengdêr ===
{{ku-tewîn-rd|ava}}
{{rengdêr|ku}}
# Ne [[kavil]], ne [[xirabe]], ne [[xirabkirî]], ne [[xopan]], ne [[wêran]], ne [[ruxandî]], ne [[hilweşandî]]
#: {{hevmaneyên peyvê|ku|çêkirî|dirist|birêk|birêkûpêk|lidar|çalak|liserxwe}}
#: {{dijmane|ku|kavil|wêran|xirabe|xopan}}
#* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=Spêde kifş-i bû dîsa</br>Merîxa nehsê '''ava''' bû</br>Xwiya bû roj di şerqê da}}
==== Bi alfabeyên din ====
* {{ku-ar|ئاڤا}}
==== Formên alternatîv ====
* {{g|ku|awa}} (2)
==== Jê ====
{{kol3|ku|cure=Jê
|-ava
|avahî
|avakar
|avakarî
|avaker
|avakerî
|avanî
|avatî
|avayî
|ava kirin<q:lêker>
|ava bûn<q:lêker>
|avabûn<q:navdêr>
|avakirin<q:navdêr>
|avadan
|avabûyî<q:rengdêr>
|avakirî<q:rengdêr>
|avaçûyî
}}
==== Etîmolojî ====
{{etîmon|ku|id=ne xirabe|:mîr|ira-pro:*āpāta-<etimon:mîr<ine-pro:*peh₂->>|dar=1|metn=++}} têkilî {{hv|fa|آباد|tr=abad}} û {{hv|ckb|ئاوهدان}} / [[awedan]], {{hv|zza|awan}}. Belkî hevreha {{hv|sa|आवास}}.
==== Werger ====
{{werger-ser}}
* {{Z|en}}: {{W+|en|built}}
* {{Z|tr}}: {{W+|tr|bayındır}}, {{W+|tr|mamur}}, {{W+|tr|şen}}, {{W+|tr|abat}}
{{werger-bin}}
=== Formeke navdêrê ===
{{ku-tew-nav|av|mê|îzafe|binavkirî}}
{{navdêr|ku|form=erê}}
# {{formeke peyvê|ku|av||îzafe|yekjimar|binavkirî}}
tfc42pk7r1w4386z3hc4iwaou754xxv
6532040
6532039
2026-09-18T16:43:27Z
Wikihez
7344
Kurmancî/Rengdêr: beşa «Jê» hate nûkirin (DefSideBoxes)
6532040
wikitext
text/x-wiki
{{h-bnr|Ava|-ava}}
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-IPA}}
* {{beş|Rengdêr}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ava.wav|dever=Wan}}
* {{beş|Formeke navdêrê}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ava-2.wav|dever=Wan}}
* {{ku-kîte}}
=== Rengdêr ===
{{ku-tewîn-rd|ava}}
{{rengdêr|ku}}
# Ne [[kavil]], ne [[xirabe]], ne [[xirabkirî]], ne [[xopan]], ne [[wêran]], ne [[ruxandî]], ne [[hilweşandî]]
#: {{hevmaneyên peyvê|ku|çêkirî|dirist|birêk|birêkûpêk|lidar|çalak|liserxwe}}
#: {{dijmane|ku|kavil|wêran|xirabe|xopan}}
#* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=Spêde kifş-i bû dîsa</br>Merîxa nehsê '''ava''' bû</br>Xwiya bû roj di şerqê da}}
==== Bi alfabeyên din ====
* {{ku-ar|ئاڤا}}
==== Formên alternatîv ====
* {{g|ku|awa}} (2)
==== Jê ====
{{kol3|ku|cure=Jê
|-ava
|avahî
|avakar
|avakarî
|avaker
|avakerî
|avanî
|avatî
|avayî
|ava kirin<q:lêker>
|ava bûn<q:lêker>
|avabûn<q:navdêr>
|avakirin<q:navdêr>
|avadan
|avabûyî<q:rengdêr>
|avakirî<q:rengdêr>
|avaçûyî
|malava
}}
==== Etîmolojî ====
{{etîmon|ku|id=ne xirabe|:mîr|ira-pro:*āpāta-<etimon:mîr<ine-pro:*peh₂->>|dar=1|metn=++}} têkilî {{hv|fa|آباد|tr=abad}} û {{hv|ckb|ئاوهدان}} / [[awedan]], {{hv|zza|awan}}. Belkî hevreha {{hv|sa|आवास}}.
==== Werger ====
{{werger-ser}}
* {{Z|en}}: {{W+|en|built}}
* {{Z|tr}}: {{W+|tr|bayındır}}, {{W+|tr|mamur}}, {{W+|tr|şen}}, {{W+|tr|abat}}
{{werger-bin}}
=== Formeke navdêrê ===
{{ku-tew-nav|av|mê|îzafe|binavkirî}}
{{navdêr|ku|form=erê}}
# {{formeke peyvê|ku|av||îzafe|yekjimar|binavkirî}}
dwf7tnv9xhu3w8s97mw8u1fdjkh8l0s
deve
0
3759
6532021
6427293
2026-09-18T15:35:04Z
Wikihez
7344
/* Etîmolojî */ (bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re)
6532021
wikitext
text/x-wiki
{{h-bnr|devê}}
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-IPA}}
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku|z=m}}
# {{f|ku|guhandar}} [[dewar|Dewarek]] [[piştqoz]] e bi taybetî li [[berî|beriyan]] tê [[bikaranîn]] bo lê[[siwar]]bûn û [[bar]][[hilgirtin]]ê.
#: {{hevmane|ku|hêştir}}
==== Tewandin ====
{{ku-tewîn-nav|mê|guherto=hemû}}
==== Bi alfabeyên din ====
* {{ku-ar|دهڤه}}
==== Formên alternatîv ====
* {{g|ku|deveh}}
==== Etîmolojî ====
{{etîmon|ku|:deyn|ota:دوه<tr:deve><id:hêştir>|dar=1|metn=++|id=hêştir}} Hevreha {{hv|az|dəvə}}, {{hv|ba|дөйә}}, {{hv|cv|тӗве}}, {{hv|kk|түйе}}, {{hv|ky|төө}}, {{hv|tk|düýe}}, {{hv|ug|تۆگە}} û {{hv|uz|tuya}}.
==== Werger ====
{{werger-ser}}
* {{Z|de}}: {{W|de|Kamel}} {{n}}, {{W|de|Dromedar|m|guman=erê}}
* {{Z|ar}}: {{W|ar|إبل|guman=erê}}, {{W|ar|جمل|guman=erê}}
* {{Z|fa}}: {{W|fa|شتر|guman=erê}}, {{W|fa|فضولات حیوانی|guman=erê}}, {{W|fa|ناقه|guman=erê}}
* {{Z|en}}: {{W|en|dromedary}}, {{W|en|camel}}
* {{Z|tr}}: {{W|tr|mekkâre|guman=erê}}
{{werger-bin}}
=== Daçek ===
{{daçek|ku}}
# {{maneid|ku|daçek}} {{f|ku|Behdînan}} [[ba]] wê/wî/wan, [[bal]] wê/wî/wan, [[nik]] wê/wî/wan, [[cem]] wê/wî/wan, [[dev]] wê/wî wan
==== Notên bikaranînê ====
* '''deve''': ''Ez çûme deve.''
* '''ji deve''': ''Ez ji deve hatime.''
* '''li deve''': ''Ez li deve bûm.''
==== Etîmolojî ====
Ji {{q|ku|dev|id=daçek}} (2) + ''[[-e|e]]''.
==== Werger ====
{{werger-ser}}
{{werger-bin}}
== {{ziman|sq}} ==
=== Navdêr ===
{{navdêr|sq|z=m}}
# {{mijar|sq|heywan}} {{g|ku|hêştir}}, {{g|ku|deve}}
=== Çavkanî ===
{{rûpela wergerê|sq|hêştir}}
== {{ziman|tr}} ==
=== Bilêvkirin ===
* {{deng|tr|LL-Q256 (tur)-ToprakM-deve.wav|Deng|dever=}}
=== Navdêr ===
{{navdêr|tr}}
# [[deve#Kurdî|deve]], [[hêştir]], [[lok]]
==== Etîmolojî ====
{{etîmon|tr|:mîr|ota:دوه<id:hêştir>|dar=1|metn=++|id=hêştir}}
fjumsex8t07jg42vrofwhnd8179ujut
-van
0
3904
6532019
6369373
2026-09-18T15:33:10Z
Wikihez
7344
/* Etîmolojî */
6532019
wikitext
text/x-wiki
{{h-bnr|van|-van|Van}}
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Paşgir ===
{{paşgir|ku}}
# [[paşgir|Paşgirek]] e maneya "[[çavdêr]]" dide hin gotinan.
#: ''[[gavan]], [[şivan]]''
# [[paşgir|Paşgirek]] e maneya "[[pîşe]]" yan [[kar]] dide hin gotinan.
#: [[xwendevan]]'', ''[[rojnamevan]]''
==== Bi alfabeyên din ====
* {{ku-ar|ـڤان}}
==== Formên alternatîv ====
{{kol3|ku
|-evan
}}
==== Jê ====
* {{g|ku|vanane}}
* {{g|ku|-vanî}}
* {{g|ku|vanîtî}}
* {{g|ku|vantî}}
{{paşgirbibîne|ku}}
==== Etîmolojî ====
{{etîmon|ku|:mîr|ine-pro:*peh₂-<id:parastin>|metn=++|id=paşgira meslekî}}
Hevreha {{hv|ckb|ـوان|tr=-wan}}, {{hv|fa|ـبان|tr=-bân}}, ''pane-'' / ''paneg'' ya farisiya navîn, avestayî ''pane'' ({{q|ku|pena}}, {{q|ku|parastin}}); binêre: {{q|ku|payîn}}.
==== Bide ber ====
{{kol3|ku
|[[-pan]]{{çp}}
}}
==== Herwiha binêre ====
{{kol3|ku
|-cî
|-çî
|-dar
|-der
|-kar
|-ker
|-mend
|-war
|-wer
}}
==== Werger ====
{{werger-ser}}
* {{Z|af}}: {{W-|af|-er}}
* {{Z|sq}}: {{W-|sq|-es|n}}, {{W-|sq|-ese|m}}, {{W-|sq|-ës|n}}, {{W-|sq|-ëse|m}}, {{W-|sq|-tar|n}}, {{W-|sq|-tare|m}}
* {{Z|de}}: {{W+|de|-er|n}}
* {{Z|ba}}: {{W-|ba|-сы|sc=Cyrl}}, {{W-|ba|-се|sc=Cyrl}}, {{W-|ba|-со|sc=Cyrl}}, {{W-|ba|-сө|sc=Cyrl}}
* {{Z|cs}}: {{W-|cs|-ič|n}}, {{W-|cs|-ač|n}}, {{W-|cs|-itel|n}}, {{W-|cs|-átor|n}}, {{W+|cs|-ec|n}}
* {{Z|zh}}:
*: {{Z|cmn}}: {{W+|cmn|者|tr=-zhě|cuda=...者}}, {{W+|cmn|家|tr=-jiā|cuda=...家}}
* {{Z|da}}: {{W+|da|-er}}
* {{Z|id}}: {{W-|id|peng-}}, {{W-|id|pem-}}, {{W+|id|pe}}
* {{Z|ar}}: {{W+|ar|مُـ}}
*: {{Z|arz}}: {{W-|arz|مِـ|tr=mi-}}
* {{Z|hy}}: {{W-|hy|-իչ}}
* {{Z|fa}}: {{W+|fa|کننده|tr=-konande|cuda=ـکننده}}, {{W+|fa|گر|tr=-gar|cuda=ـگر}}
* {{Z|fo}}: {{W-|fo|-ari}}
* {{Z|fi}}: {{W+|fi|-ja}}, {{W+|fi|-ri}}; {{W+|fi|-in}}
* {{Z|fr}}: {{W+|fr|-eur|n}}, {{W+|fr|-euse|m}}
* {{Z|gd}}: {{W-|gd|-adair}}, {{W-|gd|-air}}, {{W-|gd|-aire}}, {{W-|gd|-ear}}, {{W-|gd|-iche}}
* {{Z|gl}}: {{W+|gl|-eiro|n}}, {{W-|gl|-eira|m}}
* {{Z|gn}}: {{W-|gn|-hára}}
* {{Z|io}}: {{W-|io|-er}}
* {{Z|ig}}: {{W-|ig|onye-}}
* {{Z|en}}: {{W+|en|-er}}
* {{Z|ia}}: {{W-|ia|-ero|n}}, {{W-|ia|-era|m}}, {{W-|ia|-ario|n}}, {{W-|ia|-aria|m}}, {{W-|ia|-ista|n|m}}
* {{Z|ga}}: {{W-|ga|-éir|n}}
* {{Z|it}}: {{W-|it|-ore|n}}, {{W-|it|-tore|n}}
* {{Z|is}}: {{W-|is|-ari|n}}
* {{Z|ja}}: {{W+|ja|者|tr=...しゃ, -sha|cuda=...者}}, {{W+|ja|家|tr=...か, -ka|cuda=...家}}, {{W+|ja|手|tr=...て, -te|cuda=...手}}
* {{Z|ca}}: {{W+|ca|-dor|n}}, {{W+|ca|-dora|m}}, {{W-|ca|-triu|m}}, {{W+|ca|-er|n}}, {{W+|ca|-era|m}}
* {{Z|ky}}: {{W-|ky|-чы}}, {{W-|ky|-чы|cuda=-чи}}, {{W-|ky|-чы|cuda=-чу}}, {{W-|ky|-чы|cuda=-чү}}
* {{Z|kg}}: {{W-|kg|mu-}}
* {{Z|la}}: {{W-|la|-tor|n}}
* {{Z|lv}}: {{W+|lv|-ājs|n}}, {{W-|lv|-āja|m}}, {{W+|lv|-ējs|n}}, {{W-|lv|-ēja|m}}, {{W-|lv|-ents|n}}, {{W-|lv|-ente|m}}, {{W-|lv|-ists|n}}, {{W-|lv|-iste|m}}, {{W-|lv|-ors|n}}, {{W-|lv|-ore|m}}, {{W-|lv|-ers|n}}, {{W-|lv|-eris|n}}, {{W-|lv|-ere|m}}, {{W-|lv|-ieris|n}}, {{W-|lv|-iere|m}}
* {{Z|ms}}: {{W-|ms|peng-}}, {{W-|ms|pem-}}
* {{Z|mi}}: {{W-|mi|kai-}}
* {{Z|hu}}: {{W+|hu|-ó}}/{{W+|hu|-ő}}
* {{Z|mn}}: {{W-|mn|-гч|sc=Cyrl}}
* {{Z|nv}}: {{W-|nv|-é}}
* {{Z|nup}}: {{W-|nup|-ci}}
* {{Z|ps}}: {{W-|ps|-ونکی}}
* {{Z|pt}}: {{W+|pt|-dor|n}}
* {{Z|ro}}: {{W+|ro|-tor|n}}, {{W-|ro|-toare|m}}
* {{Z|ru}}: {{W+|ru|-тель|n}}, {{W+|ru|-ник|n}}, {{W-|ru|-о́вщик|n}}, {{W+|ru|-щик|n}}, {{W+|ru|-щи́к|n}}, {{W+|ru|-чик|n}}, {{W+|ru|-ик|n}}, {{W+|ru|-и́к|n}}, {{W+|ru|-ец|n}}, {{W+|ru|-а́тор}}, {{W+|ru|-а́ч|n}}, {{W+|ru|-ер|n}}
* {{Z|sa}}: {{W-|sa|-क|n}}
* {{Z|es}}: {{W+|es|-dor|n}}, {{W+|es|-dora|m}}, {{W+|es|-ero|n}}, {{W+|es|-era|m}}
* {{Z|sw}}: {{W-|sw|m-}}
* {{Z|sv}}: {{W+|sv|-re}}
* {{Z|th}}: {{W+|th|นัก|cuda=นัก...|tr=nák...}}, {{W+|th|ผู้|cuda=ผู้...|tr=pûu...}}, {{W+|th|คน|cuda=คน...|tr=kon...}}, {{W+|th|ช่าง|cuda=ช่าง...|tr=châang...}}
* {{Z|tr}}: {{W+|tr|-cı}}, {{W+|tr|-ci}}, {{W+|tr|-cu}}, {{W+|tr|-cü}}; {{W+|tr|-çı}}, {{W+|tr|-çi}}, {{W+|tr|-çu}}, {{W+|tr|-çü}}
* {{Z|cy}}: {{W+|cy|-wr|n}}, {{W+|cy|-ydd|n}}, {{W-|cy|-wraig|m}}
* {{Z|wrh}}: {{W-|wrh|-daayn}}
* {{Z|yo}}: {{W-|yo|oní-}}
* {{Z|el}}: {{W+|el|-άς|n}}, {{W+|el|-ού|m}}
* {{Z|ase}}: {{W-|ase|OpenB@SideChesthigh-OpenB@SideChesthigh OpenB@SideTrunkhigh-OpenB@SideTrunkhigh}}
{{werger-bin}}
:{{werger çavkanî|en|-er|beş=Ev qismê Wergerê|oldid=75987219}}
9fjavxldctfcmytxesbnv0rm2vjwpyd
destav
0
4720
6532100
6428355
2026-09-18T20:20:39Z
Wikihez
7344
Kurmancî/Navdêr: beşa «Etîmolojî» hate nûkirin (DefSideBoxes)
6532100
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{IPA|ku|/dɛsˈtɑːv/}}
* {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-destav.wav|dever=Bidlîs}}
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku|z=m}}
# {{f|ku|xweşbêjî}} Peyvek [[rêzdar]] e li şûna ''[[gû]]'' û / yan ''[[mîz]]''.
==== Tewandin ====
{{ku-tewîn-nav|mê}}
==== Bi alfabeyên din ====
* {{ku-ar|دەستئاڤ}}
==== Jê ====
* '''destava stûr''': [[gû]]
* '''destava zirav''': [[mîz]]
* çûn destavê
* destav(a xwe) xweş kirin: [[mîstin]] yan [[rîtin]]
* {{g|ku|destavdank}}
* {{g|ku|destavxane}}
==== Etîmolojî ====
{{etîmon|ku|:qf|dest|av|dar=1|metn=+}}
==== Werger ====
{{werger-ser}}
* {{Z|de}}: {{W|de|Waschung|m}}
* {{Z|ar}}: {{W|ar|مرافق}}, {{W|ar|مرحاض}}, {{W|ar|غائط}}
* {{Z|fa}}: {{W|fa|دستشویی}}, {{W|fa|آبدست}}
* {{Z|en}}: {{W|en|rest room}}, {{W|en|water closet}}, {{W|en|bath room|guman=erê}}, {{W|ar|excrement}}, {{W|en|urinating}}
* {{Z|tr}}: {{W|tr|aptes}}, {{W|tr|hacet}}, {{W|tr|fasit olmak}}, {{W|tr|hacet yeri|guman=erê}}
{{werger-bin}}
==== Anagram ====
* {{anagram|ku|a=adestv|avdest}}
5jni4xe2a8zhn50gmdyt4w9qt3f7tbe
şûştin
0
5090
6532018
6337976
2026-09-18T15:22:40Z
Wikihez
7344
/* Lêker */ (bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re)
6532018
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{IPA|ku|/ʃuːʃˈtɘn/}}
** (''[[rojhilatî]]'') {{IPA|ku|/ʃʉːʃˈtɘn/}}
=== Lêker ===
{{ku-tewîn-lk|şûştin|form=gerguhêz|niha=şo|borî=şûşt}}
[[Wêne:OCD handwash.jpg|thumb|Kesek destên xwe '''dişo'''.]]
{{lêker|ku|c=x-gh}}
# Bi [[av]]ê [[paqij]] kirin.
#* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=Destekê sunnet e tê da di yekê nessê kitab e<br />Dil '''bişo''' tu j' vê nifaqê ko bidit sîne beraqê<br />Bi sefa hemrehê erbabê dil û ehlê sefa be}}
#* {{jêder-malper|ku|jêgirtin=Xwîn bi xwînê nayê '''şûştin'''.|nivîskar=Hasan Polat|sernav= Nêrinek li ser romana Mîrzayê Reben|url=https://www.gazeteduvar.com.tr/kitap/2020/02/18/nerinek-li-ser-romana-mirzaye-reben/|dîrok=18.02.2020|malper=gazeteduvar.com.tr}}
#* {{jêder-pirtûk|ku|jêgirtin=Du dest cilên mela bazîd hebûn, yek '''berşûştûnê''' bû yek dişûştin yek jî ber dikirin. Jina mela bazîdî înan ew destêd cilêd mayî ku '''berşûştûnê''' bûn, daye jaran...|nivîskar=Mele Mehmûdê Bazîdî|sernav=Cami’eya Riseleyan û Hikayetan Bi Zimanê Kurmancî|cîh=Stembol|weşanxane={{w|Weşanên Lîs|Lîs}}|sal=2010|çap=1|rûpel=60|isbn=978-605-5683-27-6}}
==== Bi alfabeyên din ====
* {{ku-ar|شووشتن}}
==== Formên alternatîv ====
{{kol3|ku
|şîştin
|şuştin
|şwîştin
}}
==== Jê ====
{{kol3|ku|cure=Jê
|[[aman]] şûştin
|[[cil]] şûştin
|[[firax]] şûşin
|[[leş]]ê xwe şûştin
|serê xwe şûştin
|[[xwe]] şûştin
|amanşo
|amanşok
|amanşokî
|amanşoyî
|destşo
|destşok
|destşokî
|destşoyî
|pêşo
|pêşok
|serşo
|serşok
|serşokî
|têşo
|têşok
|veşo
|veşok
|veşokî
|veşoyî
|veşûştin
|berşûştin
}}
==== Etîmolojî ====
Ji {{ji|ira-pro||-}} '''*xşaud'''- ("şûştin"),
{{ae}}: '''xşaod'''- ("to become liquid"), '''xşaodah'''- ("herrikîna avê"),
{{xpr}}: '''şwd'''- ("şûştin"),
{{pal}}: '''şwd'''-, '''şws'''-, '''şus'''- ("şûştin"),
{{fa}}: '''şo'''- ("şustin"),
{{bal}}: '''şuş'''-, '''şus'''- ("şûştin"),
{{gil}}: '''şos'''- ("şûştin"),
{{kmr}}: '''şûştin'''- ("şûştin"),
{{ckb}}: '''şûştin, şordin'''- ("şûştin"),
{{hac}}: '''şi'''- ("şûştin"),
{{zza}}: ''' şiten / şi'''-) {{ir}},
{{sa}}: '''kşod''' ("to dissolve", "to disintegrate")
<font style="font-size:12px">'''Çavkanî:''' [[Şablon:Cheung|Cheung p.455]]</font>
==== Bide ber ====
* {{g|ku|balav}}
==== Bi zaravayên din ====
* {{Z|ckb}}: [[şitin]], [[şordin]], [[şûştin]]
* Zazakî: şutene, şutiş
==== Werger ====
{{werger-ser}}
* {{Z|af}}: {{W+|af|was}}
* {{Z|akl}}: {{W-|akl|eaba}}
* {{Z|sq}}: {{W+|sq|lan}}
* {{Z|goh}}: {{W-|goh|dwahan}}
* {{Z|de}}: {{W+|de|waschen}}, {{W+|de|spülen}}
* {{Z|arc}}:
*: Siryanî: {{W-|syc|ܣܚܐ|tr=sħā|sc=Syrc}}
* {{Z|rup}}: {{W-|rup|spel}}, {{W-|rup|aspel}}, {{W-|rup|lau}}
* {{Z|as}}: {{W-|as|ধোৱা}}
* {{Z|ast}}: {{W+|ast|llavar}}
* {{Z|az}}: {{W+|az|yumaq}}
* {{Z|eu}}: {{W-|eu|garbitu}}
* {{Z|ba}}: {{W-|ba|йыуыу}}
* {{Z|be}}: {{W-|be|мыць|impf}}, {{W-|be|памы́ць|pf}}; {{W-|be|праць|impf}}
* {{Z|bn}}: {{W+|bn|ধোয়া}}, {{W+|bn|ধোওয়া}}
* {{Z|bcl}}: {{W-|bcl|hugas}}
* {{Z|br}}: {{W+|br|gwalc'hiñ}}
* {{Z|bg}}: {{W+|bg|ми́я|impf}}, {{W+|bg|измивам}}
* {{Z|my}}: {{W+|my|ဆေး|sc=Mymr}}
* {{Z|bua}}: {{W-|bua|угааха}}
* {{Z|cs}}: {{W+|cs|mýt|impf}}, {{W+|cs|prát|impf}}
* {{Z|chr}}: {{W-|chr|ᏕᎬᎩᎶᎠ}}
* {{Z|zh}}:
*: {{Z|yue}}: {{W-|yue|洗|tr=sai2}}
*: {{Z|cmn}}: {{W+|cmn|洗|tr=xǐ}}, {{W-|cmn|洗滌|tr=xǐdí}}, {{W+|cmn|沖洗|tr=chōngxǐ}}
* {{Z|cv}}: {{W-|cv|ҫу}}
* Classical Nahuatl: [[paca|pāca]]
* {{Z|da}}: {{W+|da|vaske}}
* {{Z|dlg}}: {{W-|dlg|һууй|tr=huuy}}
* {{Z|ovd}}: {{W-|ovd|rįesa}}
* {{Z|id}}: {{W+|id|mencuci}}
* {{Z|ar}}: {{W-|ar|غَسَلَ}}
* {{Z|hy}}: {{W+|hy|լվալ|sc=Armn}}, {{W+|hy|լվանալ|sc=Armn}}
* {{Z|eo}}: {{W-|eo|lavi}}
* {{Z|et}}: {{W+|et|pesema}}
* {{Z|eve}}: {{W-|eve|авдай}}, {{W-|eve|хилкадай}}
* {{Z|evn}}: {{W-|evn|авми}}, {{W-|evn|силкими}}
* {{Z|fa}}: {{W+|fa|شستن|tr=šostan}}
* {{Z|fo}}: {{W+|fo|vaska}}
* {{Z|fi}}: {{W+|fi|pestä}}; {{W+|fi|tiskata}}, {{W+|fi|pyykätä}}
* {{Z|fr}}: {{W+|fr|laver}}
* {{Z|fur}}: {{W-|fur|lavâ}}
* {{Z|fy}}: {{W-|fy|waskje}}
* {{Z|gl}}: {{W+|gl|lavar}}
* {{Z|got}}: {{W-|got|𐌸𐍅𐌰𐌷𐌰𐌽}}
* {{Z|ka}}: {{W-|ka|რეცხვა|sc=Geor}}, {{W-|ka|გარეცხვა|sc=Geor}}, {{W-|ka|ბანვა|sc=Geor}}
* {{Z|gn}}: {{W-|gn|johéi}}
* {{Z|ht}}: {{W-|ht|lave}}
* {{Z|haw}}: {{W-|haw|holoi}}
* {{Z|hi}}: {{W+|hi|धोना}}
* {{Z|nl}}: {{W+|nl|wassen}}, {{W+|nl|spoelen}}, {{W+|nl|afspoelen}}
* {{Z|he}}: {{W+|he|רָחַץ|tr=rakháts}}, {{W+|he|שָׁטַף|tr=shatáf}}
* {{Z|io}}: {{W+|io|lavar}}
* {{Z|ang}}: {{W-|ang|þwēan}}, {{W-|ang|wascan}}
* {{Z|enm}}: {{W-|enm|wasshen}}
* {{Z|en}}: {{W+|en|wash}}
* {{Z|ga}}: {{W-|ga|nigh}}
*: {{Z|sga}}: {{W-|sga|nigid}}, {{W-|sga|ind·aim}}
* {{Z|isd}}: {{W-|isd|uxat}}
* {{Z|it}}: {{W+|it|lavare}}
* {{Z|is}}: {{W+|is|þvo}}
* {{Z|ja}}: {{W+|ja|洗う|tr=あらう, arau}}
* {{Z|kaw}}: {{W-|kaw|kumbah}}
* {{Z|jv}}: {{W-|jv|ngumbah}}, {{W+|jv|raup}}, {{W+|jv|wisuh}}
* {{Z|kab}}: {{W-|kab|ssired}}
* {{Z|xal}}: {{W-|xal|уһах}}
* {{Z|csb}}: {{W-|csb|mëc}}
* {{Z|ca}}: {{W+|ca|rentar}}, {{W+|ca|llavar}}
* {{Z|qu}}: {{W-|qu|mayllay}}, {{W-|qu|t'aqsay}}
* {{Z|ks}}: {{W-|ks|چھَلُن}}
* {{Z|ky}}: {{W+|ky|жуу}}
* {{Z|ko}}: {{W+|ko|씻다}}
* {{Z|kw}}: {{W-|kw|golhi}}
* {{Z|la}}: {{W+|la|lavō}}, {{W-|la|luo}}
* {{Z|lv}}: {{W+|lv|mazgāt}}
* {{Z|lo}}: {{W+|lo|ລ້າງ}}, {{W-|lo|ຊັກ}}, {{W-|lo|ສ່ວຍ}}
* {{Z|li}}: {{W+|li|wasje}}, {{W-|li|wesje}}, {{W+|li|speule}}, {{W+|li|aafspeule}}
* {{Z|lt}}: {{W-|lt|pláuti}}, {{W-|lt|mazgoti}}, {{W+|lt|prausti|cuda=praũsti}}
* {{Z|lmo}}: {{W-|lmo|lavà}}
* {{Z|mdh}}: {{W-|mdh|ugas}}
* {{Z|mk}}: {{W-|mk|мие|impf}}
* {{Z|ms}}: {{W-|ms|mencuci}}
* {{Z|mt}}: {{W-|mt|ħasel}}
* {{Z|mnc}}: {{W-|mnc|ᠣᠪᠣᠮᠪᡳ}}
* {{Z|mi}}: {{W-|mi|horoi}}
* {{Z|hu}}: {{W+|hu|mos}}, {{W+|hu|kimos}}
* {{Z|egy}}: {{W-egy|jꜥj|h=i-a:N35B}}
* {{Z|mn}}: {{W+|mn|угаалга|sc=Cyrl}}
* {{Z|gld}}: {{W-|gld|силко-}}
* {{Z|nds}}: {{W-|nds|waschen}}
* {{Z|nrf}}: {{W-|nrf|laver}}
* {{Z|non}}: {{W-|non|þvó}}, {{W-|non|þvætta}}
* {{Z|no}}: {{W-|no|tvette}}, {{W+|no|vaske}}
* {{Z|oc}}: {{W+|oc|lavar}}
* {{Z|om}}: {{W-|om|miiccuu}}
* {{Z|os}}: {{W-|os|ӕхсын}}
* {{Z|ota}}: {{W-|ota|ییقامق|tr=yıkamak|sc=ota-Arab}}
* {{Z|ug}}: {{W-|ug|ياقىماق}}, {{W-|ug|يۇماق}}
*: {{Z|ug}}: {{W-|ug|يۇماق}}, {{W-|ug|يۇيماق}}
*: {{Z|ug}}: {{W-|ug|жумақ}}, {{W-|ug|жуймақ}}
* {{Z|uz}}: {{W+|uz|yuvmoq}}, {{W+|uz|yuvinmoq}}
* {{Z|pap}}: {{W-|pap|laba}}
* {{Z|ps}}: {{W-|ps|ولل|tr=wlᶕl}}, {{W-|ps|اندرېيل|tr=andreyál}}
* {{Z|pms}}: {{W-|pms|lavé}}
* {{Z|pl}}: {{W+|pl|myć|impf}}, {{W+|pl|prać|impf}}
* {{Z|pt}}: {{W+|pt|lavar}}
* {{Z|kk}}: {{W-|kk|жуу|sc=Cyrl}}
* {{Z|rhg}}: {{W-|rhg|dúo}}
* {{Z|rgn}}: {{W-|rgn|lavêr}}
* {{Z|rm}}: {{W-|rm|lavar}}, {{W-|rm|laver}}
* {{Z|rom}}: {{W-|rom|thovel}}
* {{Z|ro}}: {{W+|ro|spăla}}
* {{Z|ru}}: {{W+|ru|мыть|impf}}, {{W+|ru|помы́ть|pf}}, {{W+|ru|вы́мыть|pf}}; {{W+|ru|стира́ть|impf}}, {{W+|ru|постира́ть|pf}}
* {{Z|sm}}: {{W-|sm|fulu}}
* {{Z|sa}}: {{W+|sa|क्षिपति}}
* {{Z|sc}}: {{W-|sc|samunài}}, {{W-|sc|samunàe}}, {{W-|sc|samunàre}}, {{W-|sc|sciacuai}}, {{W-|sc|labare}}
* Scottish Gaelic: [[nigh#Irish|nigh]]
* {{Z|ceb}}: {{W-|ceb|laba}}, {{W-|ceb|hugas}}
* {{Z|scn}}: {{W+|scn|lavari}}
* {{Z|sh}}:
*: Kirîlî: {{W-|sh|ми̏ти|impf}}, {{W-|sh|пра̏ти|impf}}
*: Latînî: {{W+|sh|mȉti|impf}}, {{W+|sh|prȁti|impf}}
* {{Z|syl}}: {{W-|syl|ꠗꠃꠣ}}
* {{Z|cu}}:
*: Kirîlî: {{W-|cu|мꙑти|impf}}
* {{Z|orv}}: {{W-|orv|мꙑти|impf}}
* {{Z|sk}}: {{W-|sk|myť|impf}}, {{W-|sk|prať|impf}}
* {{Z|sl}}: {{W-|sl|miti|impf}}, {{W-|sl|prati|impf}}
* Sorbî:
*: {{Z|dsb}}: {{W-|dsb|myś|impf}}
* {{Z|es}}: {{W+|es|lavar}}
* {{Z|su}}: {{W+|su|kumbah}}
* {{Z|sw}}: {{W-|sw|osha|cuda=-osha}}, {{W+|sw|fua|cuda=-fua}}, {{W-|sw|nawa|cuda=-nawa}}
* {{Z|sv}}: {{W+|sv|tvätta}}, {{W+|sv|tvaga}}, {{W+|sv|två}}
* {{Z|zdj}}: {{W-|zdj|yela|cuda=uyela}}
* {{Z|tg}}: {{W+|tg|шустан}}
* {{Z|tl}}: {{W-|tl|maghugas}}, {{W-|tl|hugasan}}
* {{Z|ta}}: {{W+|ta|கழுவு|sc=Taml}}, {{W+|ta|அலம்பு|sc=Taml}}
* {{Z|tsg}}: {{W-|tsg|hugas}}
* {{Z|th}}: {{W+|th|ล้าง}}, {{W+|th|ซัก}}
* {{Z|te}}: {{W+|te|కడుగు}} ''hands, dishes, etc.'', {{W+|te|ఉతుకు}} ''clothes''
* {{Z|crh}}: {{W-|crh|yuvmaq}}, {{W-|crh|cuvmaq}}
* {{Z|tt}}: {{W+|tt|юарга}}
* {{Z|tet}}: {{W-|tet|fase}}
* {{Z|tr}}: {{W+|tr|yıkamak}}, {{W+|tr|yumak}}
* {{Z|tk}}: {{W-|tk|ýuvmak}}
* {{Z|bo}}: {{W-|bo|བཀྲུ་བ|sc=Tibt}}
* {{Z|to}}: {{W-|to|kaukau}}
* {{Z|tyv}}: {{W-|tyv|чуур}}
* {{Z|uga}}: {{W-|uga|𐎗𐎈𐎕}}
* {{Z|ur}}: {{W-|ur|دھونا|tr=dhonā}}
* {{Z|uk}}: {{W-|uk|ми́ти|impf}}, {{W-|uk|пра́ти|impf}}
* {{Z|vi}}: {{W+|vi|rửa}}, {{W+|vi|giặt}}
* {{Z|vo}}: {{W+|vo|lavön}}
* {{Z|vro}}: {{W-|vro|mõskma}}
* {{Z|wa}}: {{W-|wa|laver}}, {{W+|wa|rinetyî}}, {{W+|wa|rilaver}}
* {{Z|cy}}: {{W+|cy|golchi}}
* {{Z|kjh}}: {{W-|kjh|чуурға}}
* {{Z|km}}: {{W+|km|លាង}}
* {{Z|yi}}: {{W-|yi|וואַשן}}
* {{Z|el}}: {{W+|el|πλένω}}
*: Kevn: {{W-|grc|πλύνω}}, {{W-|grc|νίπτω}}, {{W-|grc|λούω}}
* {{Z|zea}}: {{W-|zea|wasse}}
{{werger-bin}}
:{{werger çavkanî|en|wash|beş=Ev beşa Wergerê|oldid=75572665}}
=== Navdêr ===
{{navdêr|ku|z=m}}
# bi avê pakkirina tiştek an jî kesekî ji qilêrî û lekeyan, karê paqijiya bi avê
#: {{nm|ku|Berî xwarinê '''şûştina''' dest û ser û çavan bi min re bûye adet.}}
==== Tewandin ====
{{ku-tewîn-nav/nû|mê}}
==== Werger ====
{{werger-ser}}
* {{Z|en}}: {{W+|en|clean}}
* {{Z|tr}}: {{W+|tr|yıkama}}
{{werger-bin}}
gp6ilhtcuzyel8x15i08gkq22uc2a7r
6532050
6532018
2026-09-18T17:12:13Z
Balyozbot
7867
Bot: Paqijiyên kozmetîk ({{ku-tewîn-nav/nû}} → {{ku-tewîn-nav}}.)
6532050
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{IPA|ku|/ʃuːʃˈtɘn/}}
** (''[[rojhilatî]]'') {{IPA|ku|/ʃʉːʃˈtɘn/}}
=== Lêker ===
{{ku-tewîn-lk|şûştin|form=gerguhêz|niha=şo|borî=şûşt}}
[[Wêne:OCD handwash.jpg|thumb|Kesek destên xwe '''dişo'''.]]
{{lêker|ku|c=x-gh}}
# Bi [[av]]ê [[paqij]] kirin.
#* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=Destekê sunnet e tê da di yekê nessê kitab e<br />Dil '''bişo''' tu j' vê nifaqê ko bidit sîne beraqê<br />Bi sefa hemrehê erbabê dil û ehlê sefa be}}
#* {{jêder-malper|ku|jêgirtin=Xwîn bi xwînê nayê '''şûştin'''.|nivîskar=Hasan Polat|sernav= Nêrinek li ser romana Mîrzayê Reben|url=https://www.gazeteduvar.com.tr/kitap/2020/02/18/nerinek-li-ser-romana-mirzaye-reben/|dîrok=18.02.2020|malper=gazeteduvar.com.tr}}
#* {{jêder-pirtûk|ku|jêgirtin=Du dest cilên mela bazîd hebûn, yek '''berşûştûnê''' bû yek dişûştin yek jî ber dikirin. Jina mela bazîdî înan ew destêd cilêd mayî ku '''berşûştûnê''' bûn, daye jaran...|nivîskar=Mele Mehmûdê Bazîdî|sernav=Cami’eya Riseleyan û Hikayetan Bi Zimanê Kurmancî|cîh=Stembol|weşanxane={{w|Weşanên Lîs|Lîs}}|sal=2010|çap=1|rûpel=60|isbn=978-605-5683-27-6}}
==== Bi alfabeyên din ====
* {{ku-ar|شووشتن}}
==== Formên alternatîv ====
{{kol3|ku
|şîştin
|şuştin
|şwîştin
}}
==== Jê ====
{{kol3|ku|cure=Jê
|[[aman]] şûştin
|[[cil]] şûştin
|[[firax]] şûşin
|[[leş]]ê xwe şûştin
|serê xwe şûştin
|[[xwe]] şûştin
|amanşo
|amanşok
|amanşokî
|amanşoyî
|destşo
|destşok
|destşokî
|destşoyî
|pêşo
|pêşok
|serşo
|serşok
|serşokî
|têşo
|têşok
|veşo
|veşok
|veşokî
|veşoyî
|veşûştin
|berşûştin
}}
==== Etîmolojî ====
Ji {{ji|ira-pro||-}} '''*xşaud'''- ("şûştin"),
{{ae}}: '''xşaod'''- ("to become liquid"), '''xşaodah'''- ("herrikîna avê"),
{{xpr}}: '''şwd'''- ("şûştin"),
{{pal}}: '''şwd'''-, '''şws'''-, '''şus'''- ("şûştin"),
{{fa}}: '''şo'''- ("şustin"),
{{bal}}: '''şuş'''-, '''şus'''- ("şûştin"),
{{gil}}: '''şos'''- ("şûştin"),
{{kmr}}: '''şûştin'''- ("şûştin"),
{{ckb}}: '''şûştin, şordin'''- ("şûştin"),
{{hac}}: '''şi'''- ("şûştin"),
{{zza}}: ''' şiten / şi'''-) {{ir}},
{{sa}}: '''kşod''' ("to dissolve", "to disintegrate")
<font style="font-size:12px">'''Çavkanî:''' [[Şablon:Cheung|Cheung p.455]]</font>
==== Bide ber ====
* {{g|ku|balav}}
==== Bi zaravayên din ====
* {{Z|ckb}}: [[şitin]], [[şordin]], [[şûştin]]
* Zazakî: şutene, şutiş
==== Werger ====
{{werger-ser}}
* {{Z|af}}: {{W+|af|was}}
* {{Z|akl}}: {{W-|akl|eaba}}
* {{Z|sq}}: {{W+|sq|lan}}
* {{Z|goh}}: {{W-|goh|dwahan}}
* {{Z|de}}: {{W+|de|waschen}}, {{W+|de|spülen}}
* {{Z|arc}}:
*: Siryanî: {{W-|syc|ܣܚܐ|tr=sħā|sc=Syrc}}
* {{Z|rup}}: {{W-|rup|spel}}, {{W-|rup|aspel}}, {{W-|rup|lau}}
* {{Z|as}}: {{W-|as|ধোৱা}}
* {{Z|ast}}: {{W+|ast|llavar}}
* {{Z|az}}: {{W+|az|yumaq}}
* {{Z|eu}}: {{W-|eu|garbitu}}
* {{Z|ba}}: {{W-|ba|йыуыу}}
* {{Z|be}}: {{W-|be|мыць|impf}}, {{W-|be|памы́ць|pf}}; {{W-|be|праць|impf}}
* {{Z|bn}}: {{W+|bn|ধোয়া}}, {{W+|bn|ধোওয়া}}
* {{Z|bcl}}: {{W-|bcl|hugas}}
* {{Z|br}}: {{W+|br|gwalc'hiñ}}
* {{Z|bg}}: {{W+|bg|ми́я|impf}}, {{W+|bg|измивам}}
* {{Z|my}}: {{W+|my|ဆေး|sc=Mymr}}
* {{Z|bua}}: {{W-|bua|угааха}}
* {{Z|cs}}: {{W+|cs|mýt|impf}}, {{W+|cs|prát|impf}}
* {{Z|chr}}: {{W-|chr|ᏕᎬᎩᎶᎠ}}
* {{Z|zh}}:
*: {{Z|yue}}: {{W-|yue|洗|tr=sai2}}
*: {{Z|cmn}}: {{W+|cmn|洗|tr=xǐ}}, {{W-|cmn|洗滌|tr=xǐdí}}, {{W+|cmn|沖洗|tr=chōngxǐ}}
* {{Z|cv}}: {{W-|cv|ҫу}}
* Classical Nahuatl: [[paca|pāca]]
* {{Z|da}}: {{W+|da|vaske}}
* {{Z|dlg}}: {{W-|dlg|һууй|tr=huuy}}
* {{Z|ovd}}: {{W-|ovd|rįesa}}
* {{Z|id}}: {{W+|id|mencuci}}
* {{Z|ar}}: {{W-|ar|غَسَلَ}}
* {{Z|hy}}: {{W+|hy|լվալ|sc=Armn}}, {{W+|hy|լվանալ|sc=Armn}}
* {{Z|eo}}: {{W-|eo|lavi}}
* {{Z|et}}: {{W+|et|pesema}}
* {{Z|eve}}: {{W-|eve|авдай}}, {{W-|eve|хилкадай}}
* {{Z|evn}}: {{W-|evn|авми}}, {{W-|evn|силкими}}
* {{Z|fa}}: {{W+|fa|شستن|tr=šostan}}
* {{Z|fo}}: {{W+|fo|vaska}}
* {{Z|fi}}: {{W+|fi|pestä}}; {{W+|fi|tiskata}}, {{W+|fi|pyykätä}}
* {{Z|fr}}: {{W+|fr|laver}}
* {{Z|fur}}: {{W-|fur|lavâ}}
* {{Z|fy}}: {{W-|fy|waskje}}
* {{Z|gl}}: {{W+|gl|lavar}}
* {{Z|got}}: {{W-|got|𐌸𐍅𐌰𐌷𐌰𐌽}}
* {{Z|ka}}: {{W-|ka|რეცხვა|sc=Geor}}, {{W-|ka|გარეცხვა|sc=Geor}}, {{W-|ka|ბანვა|sc=Geor}}
* {{Z|gn}}: {{W-|gn|johéi}}
* {{Z|ht}}: {{W-|ht|lave}}
* {{Z|haw}}: {{W-|haw|holoi}}
* {{Z|hi}}: {{W+|hi|धोना}}
* {{Z|nl}}: {{W+|nl|wassen}}, {{W+|nl|spoelen}}, {{W+|nl|afspoelen}}
* {{Z|he}}: {{W+|he|רָחַץ|tr=rakháts}}, {{W+|he|שָׁטַף|tr=shatáf}}
* {{Z|io}}: {{W+|io|lavar}}
* {{Z|ang}}: {{W-|ang|þwēan}}, {{W-|ang|wascan}}
* {{Z|enm}}: {{W-|enm|wasshen}}
* {{Z|en}}: {{W+|en|wash}}
* {{Z|ga}}: {{W-|ga|nigh}}
*: {{Z|sga}}: {{W-|sga|nigid}}, {{W-|sga|ind·aim}}
* {{Z|isd}}: {{W-|isd|uxat}}
* {{Z|it}}: {{W+|it|lavare}}
* {{Z|is}}: {{W+|is|þvo}}
* {{Z|ja}}: {{W+|ja|洗う|tr=あらう, arau}}
* {{Z|kaw}}: {{W-|kaw|kumbah}}
* {{Z|jv}}: {{W-|jv|ngumbah}}, {{W+|jv|raup}}, {{W+|jv|wisuh}}
* {{Z|kab}}: {{W-|kab|ssired}}
* {{Z|xal}}: {{W-|xal|уһах}}
* {{Z|csb}}: {{W-|csb|mëc}}
* {{Z|ca}}: {{W+|ca|rentar}}, {{W+|ca|llavar}}
* {{Z|qu}}: {{W-|qu|mayllay}}, {{W-|qu|t'aqsay}}
* {{Z|ks}}: {{W-|ks|چھَلُن}}
* {{Z|ky}}: {{W+|ky|жуу}}
* {{Z|ko}}: {{W+|ko|씻다}}
* {{Z|kw}}: {{W-|kw|golhi}}
* {{Z|la}}: {{W+|la|lavō}}, {{W-|la|luo}}
* {{Z|lv}}: {{W+|lv|mazgāt}}
* {{Z|lo}}: {{W+|lo|ລ້າງ}}, {{W-|lo|ຊັກ}}, {{W-|lo|ສ່ວຍ}}
* {{Z|li}}: {{W+|li|wasje}}, {{W-|li|wesje}}, {{W+|li|speule}}, {{W+|li|aafspeule}}
* {{Z|lt}}: {{W-|lt|pláuti}}, {{W-|lt|mazgoti}}, {{W+|lt|prausti|cuda=praũsti}}
* {{Z|lmo}}: {{W-|lmo|lavà}}
* {{Z|mdh}}: {{W-|mdh|ugas}}
* {{Z|mk}}: {{W-|mk|мие|impf}}
* {{Z|ms}}: {{W-|ms|mencuci}}
* {{Z|mt}}: {{W-|mt|ħasel}}
* {{Z|mnc}}: {{W-|mnc|ᠣᠪᠣᠮᠪᡳ}}
* {{Z|mi}}: {{W-|mi|horoi}}
* {{Z|hu}}: {{W+|hu|mos}}, {{W+|hu|kimos}}
* {{Z|egy}}: {{W-egy|jꜥj|h=i-a:N35B}}
* {{Z|mn}}: {{W+|mn|угаалга|sc=Cyrl}}
* {{Z|gld}}: {{W-|gld|силко-}}
* {{Z|nds}}: {{W-|nds|waschen}}
* {{Z|nrf}}: {{W-|nrf|laver}}
* {{Z|non}}: {{W-|non|þvó}}, {{W-|non|þvætta}}
* {{Z|no}}: {{W-|no|tvette}}, {{W+|no|vaske}}
* {{Z|oc}}: {{W+|oc|lavar}}
* {{Z|om}}: {{W-|om|miiccuu}}
* {{Z|os}}: {{W-|os|ӕхсын}}
* {{Z|ota}}: {{W-|ota|ییقامق|tr=yıkamak|sc=ota-Arab}}
* {{Z|ug}}: {{W-|ug|ياقىماق}}, {{W-|ug|يۇماق}}
*: {{Z|ug}}: {{W-|ug|يۇماق}}, {{W-|ug|يۇيماق}}
*: {{Z|ug}}: {{W-|ug|жумақ}}, {{W-|ug|жуймақ}}
* {{Z|uz}}: {{W+|uz|yuvmoq}}, {{W+|uz|yuvinmoq}}
* {{Z|pap}}: {{W-|pap|laba}}
* {{Z|ps}}: {{W-|ps|ولل|tr=wlᶕl}}, {{W-|ps|اندرېيل|tr=andreyál}}
* {{Z|pms}}: {{W-|pms|lavé}}
* {{Z|pl}}: {{W+|pl|myć|impf}}, {{W+|pl|prać|impf}}
* {{Z|pt}}: {{W+|pt|lavar}}
* {{Z|kk}}: {{W-|kk|жуу|sc=Cyrl}}
* {{Z|rhg}}: {{W-|rhg|dúo}}
* {{Z|rgn}}: {{W-|rgn|lavêr}}
* {{Z|rm}}: {{W-|rm|lavar}}, {{W-|rm|laver}}
* {{Z|rom}}: {{W-|rom|thovel}}
* {{Z|ro}}: {{W+|ro|spăla}}
* {{Z|ru}}: {{W+|ru|мыть|impf}}, {{W+|ru|помы́ть|pf}}, {{W+|ru|вы́мыть|pf}}; {{W+|ru|стира́ть|impf}}, {{W+|ru|постира́ть|pf}}
* {{Z|sm}}: {{W-|sm|fulu}}
* {{Z|sa}}: {{W+|sa|क्षिपति}}
* {{Z|sc}}: {{W-|sc|samunài}}, {{W-|sc|samunàe}}, {{W-|sc|samunàre}}, {{W-|sc|sciacuai}}, {{W-|sc|labare}}
* Scottish Gaelic: [[nigh#Irish|nigh]]
* {{Z|ceb}}: {{W-|ceb|laba}}, {{W-|ceb|hugas}}
* {{Z|scn}}: {{W+|scn|lavari}}
* {{Z|sh}}:
*: Kirîlî: {{W-|sh|ми̏ти|impf}}, {{W-|sh|пра̏ти|impf}}
*: Latînî: {{W+|sh|mȉti|impf}}, {{W+|sh|prȁti|impf}}
* {{Z|syl}}: {{W-|syl|ꠗꠃꠣ}}
* {{Z|cu}}:
*: Kirîlî: {{W-|cu|мꙑти|impf}}
* {{Z|orv}}: {{W-|orv|мꙑти|impf}}
* {{Z|sk}}: {{W-|sk|myť|impf}}, {{W-|sk|prať|impf}}
* {{Z|sl}}: {{W-|sl|miti|impf}}, {{W-|sl|prati|impf}}
* Sorbî:
*: {{Z|dsb}}: {{W-|dsb|myś|impf}}
* {{Z|es}}: {{W+|es|lavar}}
* {{Z|su}}: {{W+|su|kumbah}}
* {{Z|sw}}: {{W-|sw|osha|cuda=-osha}}, {{W+|sw|fua|cuda=-fua}}, {{W-|sw|nawa|cuda=-nawa}}
* {{Z|sv}}: {{W+|sv|tvätta}}, {{W+|sv|tvaga}}, {{W+|sv|två}}
* {{Z|zdj}}: {{W-|zdj|yela|cuda=uyela}}
* {{Z|tg}}: {{W+|tg|шустан}}
* {{Z|tl}}: {{W-|tl|maghugas}}, {{W-|tl|hugasan}}
* {{Z|ta}}: {{W+|ta|கழுவு|sc=Taml}}, {{W+|ta|அலம்பு|sc=Taml}}
* {{Z|tsg}}: {{W-|tsg|hugas}}
* {{Z|th}}: {{W+|th|ล้าง}}, {{W+|th|ซัก}}
* {{Z|te}}: {{W+|te|కడుగు}} ''hands, dishes, etc.'', {{W+|te|ఉతుకు}} ''clothes''
* {{Z|crh}}: {{W-|crh|yuvmaq}}, {{W-|crh|cuvmaq}}
* {{Z|tt}}: {{W+|tt|юарга}}
* {{Z|tet}}: {{W-|tet|fase}}
* {{Z|tr}}: {{W+|tr|yıkamak}}, {{W+|tr|yumak}}
* {{Z|tk}}: {{W-|tk|ýuvmak}}
* {{Z|bo}}: {{W-|bo|བཀྲུ་བ|sc=Tibt}}
* {{Z|to}}: {{W-|to|kaukau}}
* {{Z|tyv}}: {{W-|tyv|чуур}}
* {{Z|uga}}: {{W-|uga|𐎗𐎈𐎕}}
* {{Z|ur}}: {{W-|ur|دھونا|tr=dhonā}}
* {{Z|uk}}: {{W-|uk|ми́ти|impf}}, {{W-|uk|пра́ти|impf}}
* {{Z|vi}}: {{W+|vi|rửa}}, {{W+|vi|giặt}}
* {{Z|vo}}: {{W+|vo|lavön}}
* {{Z|vro}}: {{W-|vro|mõskma}}
* {{Z|wa}}: {{W-|wa|laver}}, {{W+|wa|rinetyî}}, {{W+|wa|rilaver}}
* {{Z|cy}}: {{W+|cy|golchi}}
* {{Z|kjh}}: {{W-|kjh|чуурға}}
* {{Z|km}}: {{W+|km|លាង}}
* {{Z|yi}}: {{W-|yi|וואַשן}}
* {{Z|el}}: {{W+|el|πλένω}}
*: Kevn: {{W-|grc|πλύνω}}, {{W-|grc|νίπτω}}, {{W-|grc|λούω}}
* {{Z|zea}}: {{W-|zea|wasse}}
{{werger-bin}}
:{{werger çavkanî|en|wash|beş=Ev beşa Wergerê|oldid=75572665}}
=== Navdêr ===
{{navdêr|ku|z=m}}
# bi avê pakkirina tiştek an jî kesekî ji qilêrî û lekeyan, karê paqijiya bi avê
#: {{nm|ku|Berî xwarinê '''şûştina''' dest û ser û çavan bi min re bûye adet.}}
==== Tewandin ====
{{ku-tewîn-nav|mê}}
==== Werger ====
{{werger-ser}}
* {{Z|en}}: {{W+|en|clean}}
* {{Z|tr}}: {{W+|tr|yıkama}}
{{werger-bin}}
goo4nbyh5syla16fbss4nq0hyej1ni2
-ker
0
9269
6532107
6368197
2026-09-18T20:36:23Z
Wikihez
7344
Kurmancî/Paşgir: beşa «Etîmolojî» hate nûkirin (DefSideBoxes)
6532107
wikitext
text/x-wiki
{{h-bnr|ker|kêr|kerr|kêrr|-ker}}
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Paşgir ===
{{paşgir|ku}}
# Kesa/ê tiştekê/î dike.
#: ''[[karker|kar'''ker''']], [[nivêjker|nivêj'''ker''']], [[pirsker|pirs'''ker''']]''
==== Formên alternatîv ====
* [[-kar]]
==== Jê ====
{{paşgirbibîne|ku}}
* [[-kerî]]
==== Etîmolojî ====
{{etîmon|ku|:ji|ker<id:kirin>|dar=1|metn=++}}
==== Bide ber ====
* [[-dar]]
* [[-yar]]
==== Werger ====
{{werger-ser}}
{{werger-bin}}
es8jxy8aniuwx5y9rbw0xbppwlinqci
heram
0
10274
6532988
6434758
2026-09-19T10:02:51Z
Şêr
1103
6532988
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Rengdêr ===
{{ku-tewîn-rd|heram}}
{{rengdêr|ku}}
# [[qedexe]], [[yasax]], [[memnû]], tişta/ê ku nabe bêt kirin (bi taybetî li gor [[dîn]]î)
# [[pîs]], [[qirêj]], [[gemarî]], [[genî]], ne [[paqij]], ne [[pak]], ne [[bijûn]], ne [[temîz]]
==== Ji wêjeya klasîk ====
* {{J:Mela Hisênê Bateyî:Mewlûda Kurdî|jêgirtin=Xakîpayê Ehmed ew Beyt-ul '''heram'''<br />Lew şerîf in Zemzem û rukn û meqam}}
==== Bi alfabeyên din ====
* {{ku-ar|حهرام}}
==== Formên alternatîv ====
* [[ḧeram]]
==== Hevmane ====
* [[nehelal]]
==== Dijmane ====
* [[helal]]
==== Jê ====
{{kol3|ku|cure=Jê
|heram bûn<q:lêker>
|heram kirin<q:lêker>
|heram xwarin
|herambûn<q:navdêr>
|heramkirin<q:navdêr>
|heramxwarin<q:navdêr>
|herambûyî<q:rengdêr>
|heramkirî<q:rengdêr>
|heramzade
|heramzadehî
|heramxwer
|heramxwerî
|herimandin
|herimandî
|herimî
|herimîn
|herimînende
|herimînendehî
|herimînendetî
|herimînendeyî
|herimîner
|herimînerî
|hilîheram
}}
==== Etîmolojî ====
Ji {{deyn|ar|ku|حَرَام}}. Ji heman rehî: [[herêm]], [[harem]], [[miherem]]...
==== Werger ====
{{werger-ser}}
* {{Z|de}}: {{W|de|gesetzeswidrig|guman=erê}}, {{W-|de|unberührbar}}, {{W+|de|verboten}}, {{W+|de|unantastbar}}, {{W+|de|schmutzig}}
* {{Z|ar}}: {{W|ar|حرام|guman=erê}}, {{W|ar|البسل|guman=erê}}
* {{Z|fa}}: {{W+|fa|کثیف}}
* {{Z|en}}: {{W+|en|illegal}}, {{W+|en|illicit}}, {{W+|en|uncleanly}}, {{W+|en|unlawful}}, {{W+|en|vulgar}}, {{W+|en|prohibited}}, {{W+|en|illegitimate}}, {{W+|en|excogitate}}, {{W+|en|excommunicate|guman=erê}}, {{W|en|haram|guman=erê}}
* {{Z|tr}}: {{W+|tr|haram}}, {{W+|tr|illegal}}, {{W|tr|hakir|guman=erê}}
{{werger-bin}}
==== Anagram ====
* {{anagram|ku|a=aehmr|ehram|ermah|harem|mehra|merha|rehma}}
90c4h7tdw9sca81yiak48lmjptn87es
mîr
0
11269
6532099
6435250
2026-09-18T20:15:21Z
Ziv
14071
([[c:GR|GR]]) [[File:Bedir Khan Pasha (Bedir Khan Beg).jpg]] → [[File:Portrait of a Lebanese guard.jpg]] [[c:COM:FR#FR3|Criterion 3]] · corr, misleading name
6532099
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-IPA}}
* {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-mîr.wav|dever=Bidlîs}}
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku|z=n}}
[[Wêne:Portrait of a Lebanese guard.jpg|thumb|250px| '''Mîr''' Bedirxan]]
# [[prens]], [[key]], [[paşa]], [[qiral]], [[melik]], [[padîşa]], [[serok]], [[serdar]], [[serwer]], [[pêşeng]], [[pêşewa]]
#* {{jêder|ku|2=Hawar|jêgirtin=Şivan xwe gihand Birca Belek û derket xafa '''Mîr'''.}}
#* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=Secdeyek ber wan du birhan nagirit cih sed nimaz</br>'Îd e û '''mîrê''' me îro dergehê lutfê vekir</br>Go Mela hingî bixwazî dê bidim bes tu bixwaz}}
==== Tewandin ====
{{ku-tewîn-nav|nêr}}
==== Bi alfabeyên din ====
* {{ku-ar|میر}}
==== Formên alternatîv ====
{{kol3|ku
|emîr
}}
==== Jê ====
{{kol3|ku|cure=Jê
|mîr bûn<crz:lêker>
|mîr kirin<crz:lêker>
|mîrbûn<crz:navdêr>
|mîrkirin<crz:navdêr>
|mîrbûyî<crz:rengdêr>
|mîrkirî<crz:rengdêr>
|mîran
|mîrane
|mîranî
|mîrbanî
|mîrek
|mîrekî
|mîrî
|mîrîtî
|mîrnişîn
|mîrnişînî
|mîrza
}}
==== Etîmolojî ====
Ji {{deyn|ar|ku|أمير|tr=emîr}}. Ketina herfên dengdar (vokal, vowel) ji destpêka peyvên ji erebî deynkirî di kurdî de tiştekî gelek normal e: Îbrahîm > Birahîm, Îsmaîl > Simayîl loma emîr > mîr jî.
;{{biçûk|Çavkanî
* {{Chyet|r=396}}
}}
==== Bide ber ====
{{kol3|ku
|mar
|mer
|mêr
|mir
|mor
|mur
|mûr
}}
==== Herwiha binêre ====
{{kol3|ku
|bîr
|çîr
|dîr
|fîr
|gîr
|hîr
|jîr
|kîr
|lîr
|nîr
|pîr
|qîr
|sîr
|şîr
|tîr
|zîr
}}
==== Werger ====
{{werger-ser}}
* {{Z|ady}}: {{W-|ady|пщы}}
* {{Z|af}}: {{W+|af|prins}}
* {{Z|sq}}: {{W-|sq|pringj|n}}
* {{Z|de}}: {{W+|de|Fürst|n}}
* {{Z|as}}: {{W-|as|কোঁৱৰ|tr=kü̃or}}
* {{Z|ast}}: {{W+|ast|príncipe|n}}
* {{Z|az}}: {{W-|az|şahzadə}}, {{W-|az|əmir}}
* {{Z|bar}}: {{W-|bar|Fiarst}}, {{W-|bar|Fiascht}}
* {{Z|be}}: {{W-|be|князь|n}}, {{W-|be|прынц|n}}
* {{Z|bn}}: {{W+|bn|রাজকুমার}}, {{W+|bn|রাজপুত্র}}, {{W-|bn|শাহজাদা}}, {{W-|bn|আমীরজাদা}}
* {{Z|br}}: {{W+|br|priñs|n}}
* {{Z|bg}}: {{W+|bg|княз|n}}, {{W-|bg|принц|n}}
* {{Z|my}}: {{W+|my|မင်းသား}}
* {{Z|chg}}: {{W-|chg|شهزاده}}
* {{Z|ce}}: {{W-|ce|э̄ла}}
* {{Z|cs}}: {{W+|cs|kníže|n}}
* {{Z|zh}}:
*: {{Z|cmn}}: {{W+|cmn|亲王|tr=qīnwáng}} ; {{W-|cmn|國王|tr=guówáng}} ; {{W+|cmn|郡王|tr=jùnwáng}} ; {{W+|cmn|王|tr=wáng}}; {{W+|cmn|王爵|tr=wángjué}}; {{W+|cmn|王爷|tr=huángzǐ}} ; {{W+|cmn|王子|tr=wángzi}}
* {{Z|da}}: {{W+|da|prins|g}}, {{W-|da|fyrste|g}}
* {{Z|id}}: {{W+|id|pangeran}}, {{W+|id|putera}}
* {{Z|ar}}: {{W+|ar|أَمِير|n}}
*: {{Z|ary}}: {{W-|ary|مير|tr=mir}}
* {{Z|hy}}: {{W+|hy|իշխան}}
* {{Z|myv}}: {{W-|myv|каназор}}
* {{Z|eo}}: {{W-|eo|princo}}
* {{Z|et}}: {{W-|et|vürst}}
* {{Z|fa}}: {{W+|fa|شاهزاده|tr=šâhzâde}}, {{W+|fa|امیر|tr=amir}}, {{W+|fa|شهریار|tr=šahryâr}}
* {{Z|fo}}: {{W-|fo|prinsur|n}}, {{W-|fo|fúrsti|n}}
* {{Z|fi}}: {{W+|fi|ruhtinas}}
* {{Z|fr}}: {{W+|fr|prince|n}}
* {{Z|gd}}: {{W-|gd|prionnsa|n}}, {{W-|gd|flath|n}}
* {{Z|gl}}: {{W+|gl|príncipe|n}}
* {{Z|ka}}: {{W-|ka|პრინცი}}, {{W-|ka|უფლისწული}}
* {{Z|hi}}: {{W-|hi|शहज़ादा|n}}, {{W+|hi|राजकुमार|n}}
* {{Z|nl}}: {{W+|nl|prins}}
* {{Z|he}}: {{W+|he|נָסִיךְ|n|tr=nasik}}
* {{Z|ang}}: {{W-|ang|æþeling|n}}
* {{Z|en}}: {{W+|en|prince}}
* {{Z|inh}}: {{W-|inh|аьла}}
* {{Z|ga}}: {{W-|ga|flaith|n}}, {{W-|ga|prionsa|n}}
* {{Z|it}}: {{W+|it|principe}}
* {{Z|is}}: {{W+|is|prins|n}}, {{W-|is|fursti|n}}
* {{Z|ja}}: {{W+|ja|公|tr=こう, kō}}, {{W+|ja|候|tr=こう, kō}}, {{W+|ja|大公|tr=たいこう, taikō}}, {{W+|ja|王子|tr=おうじ, ōji}}, {{W+|ja|皇子|tr=こうし, kōshi}}
* {{Z|kbd}}: {{W-|kbd|пщы}}
* {{Z|pam}}: {{W-|pam|lakan}}, {{W-|pam|datu}}, {{W-|pam|pirinsipi}}
* {{Z|ca}}: {{W+|ca|príncep|n}}
* {{Z|qu}}: {{W-|qu|awki}}
* {{Z|ky}}: {{W+|ky|канзаада}}, {{W-|ky|принц}}
* {{Z|ko}}: {{W+|ko|대공}}, {{W+|ko|대군}}
* {{Z|kw}}: {{W-|kw|pennsevik|n}}
* {{Z|la}}: {{W-|la|regulus}}, {{W+|la|prīnceps|n}}
* {{Z|lv}}: {{W-|lv|princis|n}}
* {{Z|lo}}: {{W-|lo|ເຈົ້າຊາຍ}}
* {{Z|lt}}: {{W-|lt|princas|n}}
* {{Z|khb}}: {{W-|khb|ᦈᧁᦌᦻ}}
* {{Z|lb}}: {{W-|lb|Prënz|n}}
* {{Z|mk}}: {{W-|mk|кнез|n}}, {{W-|mk|принц|n}}
* {{Z|ms}}: {{W+|ms|putera}}
* {{Z|mnc}}: {{W-|mnc|ᠠᡤᡝ}}
* {{Z|gv}}: {{W-|gv|prinse|n}}, {{W-|gv|flah|n}}
* {{Z|mi}}: {{W-|mi|piriniha}}
* {{Z|hu}}: {{W+|hu|fejedelem}}, {{W+|hu|uralkodó}}
* {{Z|egy}}: {{W-egy|jnpw|h=i-n:p-w-A42}}
* {{Z|mn}}:
*: Kirîlî: {{W+|mn|ноён}}
* {{Z|nah}}: {{W+|nah|pilli}}
* {{Z|nrf}}: {{W-|nrf|prînce|n}}
* {{Z|no}}:
*: {{Z|nb}}: {{W+|nb|fyrste|n}}, {{W+|nb|fyrst}}
*: {{Z|nn}}: {{W-|nn|fyrste|n}}, {{W-|nn|fyrst}}
* {{Z|pro}}: {{W-|pro|prince|n}}
* {{Z|ota}}: {{W-|ota|امیر|tr=emir}}, {{W-|ota|خان|tr=han}}
* {{Z|ug}}: {{W+|ug|شاھزادە}}
* {{Z|uz}}: {{W+|uz|shahzoda}}, {{W+|uz|amir}}
* {{Z|xpr}}: {{W-|xpr|𐫇𐫏𐫘𐫛𐫇𐫍𐫡|tr=wispuhr}}
* {{Z|xpr}}: {{W-|xpr|𐫇𐫏𐫘𐫛𐫇𐫍𐫡|tr=wispuhr}}
* {{Z|ps}}: {{W-|ps|شاهزاده|n|tr=šāhzādá}}, {{W-|ps|شازاده|n|tr=šāzãdá}}, {{W-|ps|اميرزاده|n|tr=amirzādá}}, {{W-|ps|شاهزوى|n|tr=šāhzóy}}
* {{Z|pl}}: {{W+|pl|książę|n}}, {{W+|pl|kniaź|n}}
* {{Z|pt}}: {{W+|pt|príncipe}}
* {{Z|kk}}: {{W-|kk|ханзада}}, {{W+|kk|шаһзада}}
* {{Z|ro}}: {{W+|ro|prinț|n}}
* {{Z|ru}}: {{W+|ru|князь|n}}, {{W+|ru|принц|n}}
* {{Z|sm}}: {{W-|sm|aloalii}}, {{W-|sm|purinise}}
* {{Z|sh}}:
*: Kirîlî: {{W-|sh|кра́љевић|n}}, {{W-|sh|ца̏ревић|n}}, {{W-|sh|при̏нц|n}}
*: Latînî: {{W+|sh|králjević|n}}, {{W+|sh|cȁrević|n}}, {{W+|sh|prȉnc|n}}
* {{Z|cu}}:
*: Kirîlî: {{W-|cu|кънѧзь|n}}, {{W-|cu|кънѧѕь}}
*: Glagolîtîk: {{W-|cu|ⰽⱏⱀⱔⰸⱐ|n}}, {{W-|cu|ⰽⱏⱀⱔⰷⱐ|n}}
* {{Z|orv}}: {{W-|orv|кънѧзь|n}}, {{W-|orv|кнѧзь|n}}
* {{Z|sk}}: {{W-|sk|knieža|n}}
* {{Z|sl}}: {{W+|sl|knez|n}}
* Sorbî:
*: {{Z|dsb}}: {{W-|dsb|wjerch|n}}
* {{Z|es}}: {{W+|es|príncipe}}, {{W+|es|conde|n}}
* {{Z|sw}}: {{W+|sw|mkuu}}
* {{Z|sv}}: {{W+|sv|furste|g}}
* {{Z|tg}}: {{W+|tg|шоҳзода}}, {{W-|tg|амир}}
* {{Z|tl}}: {{W-|tl|prinsipe}}, {{W+|tl|lakan}}
* {{Z|th}}: {{W+|th|เจ้าชาย}}, {{W+|th|เจ้า}}
* {{Z|tt}}: {{W+|tt|шаһзадә}}
* {{Z|tr}}: {{W+|tr|prens}}, {{W+|tr|şehzade}}
* {{Z|tk}}: {{W-|tk|şazada}}, {{W-|tk|knýaz}}
* {{Z|bo}}: {{W-|bo|རྒྱལ་སྲས}}, {{W-|bo|རྒྱལ་བུ}}
* {{Z|to}}: {{W-|to|pilinisi}}
* {{Z|ur}}: {{W-|ur|شہزادہ|n|tr=śahzādā}}, {{W-|ur|راجکمار|n|tr=rājkumār}}
* {{Z|uk}}: {{W-|uk|князь|n}}, {{W-|uk|принц|n}}
* {{Z|vi}}: {{W+|vi|hoàng tử}}, {{W+|vi|vương tử}}
* {{Z|vo}}: {{W+|vo|plin}}, {{W-|vo|hiplin}}
* {{Z|wa}}: {{W+|wa|prince|n}}
* {{Z|cy}}: {{W+|cy|tywysog|n}}
* {{Z|km}}: {{W+|km|ព្រះអង្គម្ចាស់}}
* {{Z|yi}}: {{W-|yi|פּרינץ|n}}
* {{Z|el}}: {{W+|el|πρίγκιπας|n}}, {{W+|el|βασιλόπουλο|nt}}
*: {{Z|grc}}: {{W-|grc|πρῖγκιψ|n}}, {{W-|grc|βασιλείδης|n}}
{{werger-bin}}
:{{werger çavkanî|en|prince|beş=Ev qismê Wergerê|oldid=76016362}}
=== Rengdêr 1 ===
{{rengdêr|ku}}
# {{f|ku|Xorasan}} [[sax]], [[saxlem]], bi[[silamet]]
==== Werger ====
{{werger-ser}}
{{werger-bin}}
=== Rengdêr 2 ===
{{rengdêr|ku}}
# ''(hûrûmûr) Binere'': '''[[mûr]]'''
j08xsb14w374m1srg79r3a70rxkbw6v
destavxane
0
11946
6532095
6435472
2026-09-18T19:56:35Z
Wikihez
7344
Kurmancî/Navdêr: beşa «Etîmolojî» hate nûkirin (DefSideBoxes)
6532095
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku|z=m}}
# Cihê ku [[destav]] tê de tê girtin.
# Cihê [[destav]]kirinê, [[cih]]ê lê[[rîtin]] û lê[[mîstin]]ê, cihê mirov lê [[rîtin|dirîn]] û [[mîstin|dimîzin]].
#: {{hevmaneyên peyvê|ku|tiwalet|taharetxane|edeb|WC}}
==== Tewandin ====
{{ku-tewîn-nav|mê|guherto=hemû}}
==== Formên alternatîv ====
{{kol3|ku|cure=Herwiha
| {{herwiha|ku|taharetxane}}
| {{herwiha|ku|abdestga}}
| {{herwiha|ku|abdestgah}}
| {{herwiha|ku|abdestge}}
| {{herwiha|ku|abdestgeh}}
| {{herwiha|ku|abdestgih}}
| {{herwiha|ku|abdestxane}}
| {{herwiha|ku|avdestga}}
| {{herwiha|ku|avdestgah}}
| {{herwiha|ku|avdestge}}
| {{herwiha|ku|avdestgeh}}
| {{herwiha|ku|avdestgih}}
| {{herwiha|ku|avdestxane}}
| {{herwiha|ku|awdestga}}
| {{herwiha|ku|awdestgah}}
| {{herwiha|ku|awdestge}}
| {{herwiha|ku|awdestgeh}}
| {{herwiha|ku|awdestgih}}
| {{herwiha|ku|awdestxane}}
| {{herwiha|ku|destabga}}
| {{herwiha|ku|destabgah}}
| {{herwiha|ku|destabge}}
| {{herwiha|ku|destabgeh}}
| {{herwiha|ku|destabgih}}
| {{herwiha|ku|destabxane}}
| {{herwiha|ku|destavga}}
| {{herwiha|ku|destavgah}}
| {{herwiha|ku|destavge}}
| {{herwiha|ku|destavgeh}}
| {{herwiha|ku|destavgih}}
| {{herwiha|ku|destawga}}
| {{herwiha|ku|destawgah}}
| {{herwiha|ku|destawge}}
| {{herwiha|ku|destawgeh}}
| {{herwiha|ku|destawgih}}
| {{herwiha|ku|destawxane}}
}}
==== Jê ====
* {{g|ku|destavxaneyî}}
==== Etîmolojî ====
{{etîmon|ku|:qertaf|destav|-xane|dar=1|metn=++}}
==== Werger ====
{{werger-ser}}
* {{Z|de}}: {{W|de|Toilette|f|guman=erê}}
* {{Z|fa}}: {{W+|fa|دستشویی}}, {{W+|fa|مستراح|guman=erê}}
* {{Z|en}}: {{W+|en|toilet}}, {{W+|en|water closet}}, {{W+|en|urinal|guman=erê}}, {{W+|en|bog|guman=erê}}
* {{Z|tr}}: {{W+|tr|abdesthane}}, {{W+|tr|hacet yolu}}, {{W+|tr|lavabo}}, {{W+|tr|tuvalet}}, {{W+|tr|apteshane}}, {{W+|tr|aptesthane}}, {{W+|tr|yüz numara|guman=erê}}, {{W+|tr|yüznumara|guman=erê}}, {{W+|tr|helâ|guman=erê}}, {{W|tr|ayakyolu|guman=erê}}, {{W|tr|hela|guman=erê}}
{{werger-bin}}
==== Anagram ====
* {{anagram|ku|a=aadeenstvx|avdestxane}}
n4w93ke5qznkh808sl3tkmu6qv8jxl7
sinî
0
35096
6532591
6453044
2026-09-19T08:59:33Z
Wikihez
7344
Kurmancî/Navdêr: beşa «Etîmolojî» hate nûkirin (DefSideBoxes)
6532591
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-IPA}}
* {{kîte|ku|si|nî}}
=== Navdêr ===
{{navdêr|ku|z=m}}
# [[mezheb]]a [[serekî]] ya [[îslam]]ê
# [[peyrew]]ê/a wê [[mezheb]]ê
==== Tewandin ====
{{ku-tewîn-nav|mê}}
==== Formên alternatîv ====
* [[sine]] (2)
* [[sinne]]
* [[sune]]
* [[sunî]]
==== Jê ====
* [[sinetî]]
==== Etîmolojî ====
{{etîmon|ku|:deyn|ar:سُنِّيّ|metn=++|dar=1|id=mezheba Îslamê}}, têkildarî ''[[sinet]], [[sunet]]''.
==== Bide ber ====
* [[şîî]]
==== Werger ====
{{werger-ser}}
* {{Z|de}}: {{W+|de|künstlich}}, {{W+|de|sunnitisch}}, {{W+|de|Scheibe|f|guman=erê}}
* {{Z|fa}}: {{W+|fa|سینی}}
* {{Z|en}}: {{W+|en|sunnah}}, {{W+|en|sunnite}}
* {{Z|tr}}: {{W+|tr|Sünni|guman=erê}}
{{werger-bin}}
==== Anagram ====
* {{anagram|ku|a=iîns|isîn}}
thy6ujvhyxe5bl0krq5rlyccy0ukqpm
6532595
6532591
2026-09-19T09:00:01Z
Wikihez
7344
Kurmancî/Navdêr: beşa «Etîmolojî» hate nûkirin (DefSideBoxes)
6532595
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-IPA}}
* {{kîte|ku|si|nî}}
=== Navdêr ===
{{navdêr|ku|z=m}}
# [[mezheb]]a [[serekî]] ya [[îslam]]ê
# [[peyrew]]ê/a wê [[mezheb]]ê
==== Tewandin ====
{{ku-tewîn-nav|mê}}
==== Formên alternatîv ====
* [[sine]] (2)
* [[sinne]]
* [[sune]]
* [[sunî]]
==== Jê ====
* [[sinetî]]
==== Etîmolojî ====
{{etîmon|ku|:deyn|ar:سُنِّيّ|metn=++|dar=1|id=mezheba Îslamê|niqtena=1}}, têkildarî ''[[sinet]], [[sunet]]''.
==== Bide ber ====
* [[şîî]]
==== Werger ====
{{werger-ser}}
* {{Z|de}}: {{W+|de|künstlich}}, {{W+|de|sunnitisch}}, {{W+|de|Scheibe|f|guman=erê}}
* {{Z|fa}}: {{W+|fa|سینی}}
* {{Z|en}}: {{W+|en|sunnah}}, {{W+|en|sunnite}}
* {{Z|tr}}: {{W+|tr|Sünni|guman=erê}}
{{werger-bin}}
==== Anagram ====
* {{anagram|ku|a=iîns|isîn}}
cof7schyodcowtk3o00tm04hpazqki9
pencemor
0
38723
6532028
6349424
2026-09-18T15:47:10Z
Wikihez
7344
/* Etîmolojî */
6532028
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
[[Wêne:Fingerprintonpaper.jpg|thumb|250px|pencemor li ser kaxezê]]
{{navdêr|ku|z=m}}
# [[mor]]a [[til]]an
#: {{hevmaneyên peyvê|ku|şûntil|besmat}}
==== Tewandin ====
{{ku-tewîn-nav|mê}}
==== Formên alternatîv ====
{{kol3|ku
|pencemohir
|pencemohr
|pencemuhir
|pencemuhr
}}
==== Etîmolojî ====
{{etîmon|ku|:qertaf|pence|mor|dar=1|metn=++}}
==== Werger ====
{{werger-ser}}
* {{Z|de}}: {{W+|de|Fingerabdruck|m}}
* {{Z|zh}}: {{W+|zh|指印}}
* {{Z|da}}: {{W+|da|fingeraftryk}}
* {{Z|fi}}: {{W+|fi|sormenjälki}}
* {{Z|fr}}: {{W+|fr|empreinte digitale|f}}
* {{Z|nl}}: {{W+|nl|vingerafdruk|m}}
* {{Z|en}}: {{W+|en|fingerprint}}
* {{Z|it}}: {{W-|it|impronta digitale|f}}
* {{Z|ja}}: {{W+|ja|指紋}}
* {{Z|ko}}: {{W+|ko|지문}}
* {{Z|no}}: {{W-|no|fingeravtrykk|n}}
* {{Z|pt}}: {{W+|pt|impressão digital|f}}
* {{Z|ru}}: {{W-|ru|отпечаток пальца|tr=otpečátok pál'ca}}
* {{Z|es}}: {{W-|es|huella digital|f}}
* {{Z|tr}}: {{W+|tr|parmak izi}}
* {{Z|el}}: {{W-|el|δακτυλικό αποτύπωμα|n}}
{{werger-bin}}
8k4e2iqerpi0my8ssh02sbfbihlmm0w
pence
0
39078
6532027
6349427
2026-09-18T15:44:41Z
Wikihez
7344
Kurmancî/Navdêr: beşa «Jê» hate nûkirin (DefSideBoxes)
6532027
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-IPA}}
* {{ku-kîte}}
=== Navdêr ===
[[Wêne: Claw.jpg|thumb|'''Penceyên''' pisîkekê.]]
{{navdêr|ku|z=m}}
# [[nahpik]], [[nînok]], [[pencik]], [[pencirk]] (bi taybetî yên [[tûj]] û [[dirinde]])
# [[til]], [[tilî]], [[tipl]], [[pêçî]]
==== Ji wêjeya klasîk ====
* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=Cinn û teyyarek mi dî werbû di min winda kirim</br>Dame ber '''pence''' w kulaban hilfirandim wek 'uqab</br>Suflewî înam û avêhtim zemîna zulmetê}}
==== Tewandin ====
{{ku-tewîn-nav|mê}}
==== Bi alfabeyên din ====
* {{ku-ar|پهنجه}}
==== Formên alternatîv ====
{{kol3|ku
|penc
}}
==== Jê ====
{{kol3|ku
|pence kirin<crz:lêker>
|pencekirin<crz:navdêr>
|pencekirî<crz:rengdêr>
|pencemor
}}
==== Etîmolojî ====
Hevreha {{hv|ckb|پهنجه|tr=pence|w=[[til]], [[tilî]], [[tipl]]}}, farisî {{g|fa|پنجه|tr=pencê: [[dest]], [[her]] [[pênc]] [[til]]}}, ji {{ji|ira|ku|-}}, têkilî peyva [[pênc]], bi farisî {{g|fa|پنج|tr=penc}} + [[-e]], bide ber îngilîzî [[finger]] (til) ku têkilî peyva [[five]] (pênc) e. Bi heman awayî [[heft]] > [[hefte]] / [[heftî]].
==== Bi zaravayên din ====
* {{Z|ckb}}: {{W-|ckb|ڕنۆک|tr=rinok}}
==== Werger ====
{{werger-ser}}
* {{Z|fa}}: {{W+|fa|پنجه}}
* {{Z|en}}: {{W+|en|claw}}
* {{Z|tr}}: {{W+|tr|pençe}}
{{werger-bin}}
== {{ziman|en}} ==
=== Bilêvkirin ===
:{{ku-tîp|pêns}}
* {{deng|en|LL-Q1860 (eng)-Vealhurl-pence.wav|Deng|dever=Başûrê Îngilistanê, QY}}
=== Formeke navdêrê ===
{{navdêr|en|form=erê}}
# {{pirjimar|en|penny|w=[[pens]], [[pare]]yekê [[hûrde]] yê [[brîtanî]] ye}}
==== Bide ber ====
{{kol3|en
|penny
}}
bs8lgwuwd9yw64ttzlhhmrefaxxlcd3
6532042
6532027
2026-09-18T16:56:08Z
Wikihez
7344
/* Etîmolojî */
6532042
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-IPA}}
* {{ku-kîte}}
=== Navdêr ===
[[Wêne: Claw.jpg|thumb|'''Penceyên''' pisîkekê.]]
{{navdêr|ku|z=m}}
# [[nahpik]], [[nînok]], [[pencik]], [[pencirk]] (bi taybetî yên [[tûj]] û [[dirinde]])
# [[til]], [[tilî]], [[tipl]], [[pêçî]]
==== Ji wêjeya klasîk ====
* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=Cinn û teyyarek mi dî werbû di min winda kirim</br>Dame ber '''pence''' w kulaban hilfirandim wek 'uqab</br>Suflewî înam û avêhtim zemîna zulmetê}}
==== Tewandin ====
{{ku-tewîn-nav|mê}}
==== Bi alfabeyên din ====
* {{ku-ar|پهنجه}}
==== Formên alternatîv ====
{{kol3|ku
|penc
}}
==== Jê ====
{{kol3|ku
|pence kirin<crz:lêker>
|pencekirin<crz:navdêr>
|pencekirî<crz:rengdêr>
|pencemor
}}
==== Etîmolojî ====
{{etîmon|ku|:qertaf|pênc|-e|:drş|fa:پنجه<tr:pencê><t:[[dest]], [[her]] [[pênc]] [[til]]>|metn=++|dar=1}}
Hevreha {{hv|ckb|پهنجه|tr=pence|w=[[til]], [[tilî]], [[tipl]]}}, farisî {{g|fa|پنجه|tr=pencê: [[dest]], [[her]] [[pênc]] [[til]]}}, ji {{ji|ira|ku|-}}, têkilî peyva [[pênc]], bi farisî {{g|fa|پنج|tr=penc}} + [[-e]], bide ber îngilîzî [[finger]] (til) ku têkilî peyva [[five]] (pênc) e. Bi heman awayî [[heft]] > [[hefte]] / [[heftî]].
==== Bi zaravayên din ====
* {{Z|ckb}}: {{W-|ckb|ڕنۆک|tr=rinok}}
==== Werger ====
{{werger-ser}}
* {{Z|fa}}: {{W+|fa|پنجه}}
* {{Z|en}}: {{W+|en|claw}}
* {{Z|tr}}: {{W+|tr|pençe}}
{{werger-bin}}
== {{ziman|en}} ==
=== Bilêvkirin ===
:{{ku-tîp|pêns}}
* {{deng|en|LL-Q1860 (eng)-Vealhurl-pence.wav|Deng|dever=Başûrê Îngilistanê, QY}}
=== Formeke navdêrê ===
{{navdêr|en|form=erê}}
# {{pirjimar|en|penny|w=[[pens]], [[pare]]yekê [[hûrde]] yê [[brîtanî]] ye}}
==== Bide ber ====
{{kol3|en
|penny
}}
i990ojtmfxcml5o1m2ts8yh88lua7zh
sinet
0
39109
6533045
6458350
2026-09-19T10:12:09Z
Wikihez
7344
/* Navdêr 1 */ (bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re)
6533045
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr 1 ===
[[Wêne:Shmadarahd1.png|thumb|250px|Îmamê somalî ku taqiye an '''sinet''' ({{maneno|ku|kulav}}) li serê xwe kiriye]]
{{navdêr|ku|z=m}}
# ([[îslam|''Îslam'']]) Ji kirin û tevgerên [[Muhemmed]] pêxember tê gotin.
# {{f|ku|Îslam}} Tiştên ku mirov ne [[mecbûr]] e bike lê [[baş]] e ku bên kirin.
#: {{nm|ku|nivêjên '''sinet'''|Nivêjên ji bilî her pênc nivêjên rojê|rêz=1}}
#* {{J:Feqiyê Teyran|jêgirtin=Têk û vêk guhdarê pîr bûm</br>B' işqa dîn û '''sinnetê'''</br>Şêxê serdarê xelîfan}}
# [[birîn|Birîna]] [[çerm]]ê ser [[kîr]]î (ku li gor [[Îslam]]ê û [[cihûtî|cihûtiyê]] [[mecbûrî|mecbûriyek]] [[dînî]] ye).
# [[birîn|Birîna]] [[çerm]]ê ser [[quz]]î (ku li gor hin ayînan [[mecbûrî|mecbûriyek]] [[dînî]] ye).
# {{maneid|ku|kulav}} {{f|ku|Îslam}} [[kulav|Kulaveke]] [[kevneşopî]] ya ku hinek Kurdên [[Misilman]], bi [[taybetî]] li [[herêma]] [[Kurdistanê]], li xwe [[dikin]]. Ew bi [[gelemperî]] [[kepek]] [[kinckirî]] ye, ku pir caran bi [[dersok]] ve tê [[pêçandin]].<ref>https://kurdologist.wordpress.com/2021/05/07/a-dictionary-of-duhoki-kurdish/</ref>
==== Formên alternatîv ====
* {{g|ku|sinnet}}
* {{g|ku|sunet}}
* {{g|ku|sunnet}}
==== Jê ====
{{kol3|ku|cure=Jê
|sinet bûn<pos:lêker>
|sinet kirin<pos:lêker>
|sinetbûn<pos:navdêr>
|sinetkirin<pos:navdêr>
|sinetbûyî<pos:rengdêr>
|sinetkirî<pos:rengdêr>
}}
==== Etîmolojî ====
Ji {{deyn|ar|ku|سُنَّة}}, têkildarî [[sinî]].
==== Bide ber ====
* {{g|ku|sanat}}
==== Herwiha binêre ====
* {{g|ku|sened}}
==== Werger ====
{{werger-ser|kirinên Mihemed Pêxemberî}}
* {{Z|de}}: {{W+|de|Handwerk|n}}
* {{Z|ar}}: {{W-|ar|السنة النبوية}}, {{W-|ar|السنة}}, {{W-|ar|ختان}}, {{W-|ar|النفل}}
* {{Z|en}}: {{W+|en|sonnet}}, {{W-|en|Prophetic Tradition}}, {{W+|en|Sunnah}}
* {{Z|tr}}: {{W+|tr|sünnet}}
{{werger-bin}}
{{werger-ser|birîna çermê li ser organa cinsî}}
* {{Z|en}}: {{W+|en|circumcision}}
* {{Z|tr}}: {{W+|tr|sünnet}}
{{werger-bin}}
=== Navdêr 2 ===
{{navdêr|ku|z=m}}
# {{guharto|ku|senet|w=huner}}
=== Çavkanî ===
{{çavkanî}}
fxnd4mlcs7prdzh443drpe16dyf2o77
ahlak
0
41731
6532058
6442231
2026-09-18T17:34:10Z
Taylor 49
5771
([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Tr tr ahlak.ogg]] → [[File:Tr-ahlak.oga]] CRIT 4 CRIT 6
6532058
wikitext
text/x-wiki
== {{ziman|tr}} ==
=== Bilêvkirin ===
* {{deng|tr|Tr-ahlak.oga}}
* {{deng|tr|LL-Q256 (tur)-ToprakM-ahlak.wav|Deng|dever=Îzmîr, Tirkiye}}
=== Navdêr ===
{{navdêr|tr}}
# [[sinc]], [[rewişt]], [[exlaq]], [[moral]], [[etîk]]
==== Etîmolojî ====
Ji {{deyn|ar|tr|أَخْلَاق}}
==== Anagram ====
* {{anagram|tr|a=aahkl|halka}}
mw9rj2xnhd0kazzk1d8b86ernuh1dd0
lojîk
0
42153
6532055
6463193
2026-09-18T17:19:20Z
Avestaboy
5833
6532055
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku|z=m}}
# [[jenk]], [[jîrbêjî]], [[vac]], [[mantiq]], [[beraqilî]], [[hişmendî]], li gor [[hiş]] û [[aqil]]î, ne [[keyfî]], [[feraset]], [[têgihiştin]], [[aqildarî]], [[aqilmendî]], [[aqil]]
==== Tewandin ====
{{ku-tewîn-nav|mê}}
==== Formên alternatîv ====
* {{g|ku|locîk}}
==== Jê ====
* {{g|ku|îlojîk}}
* {{g|ku|lojîkî}}
* {{g|ku|lojîsyen}}
==== Etîmolojî ====
Bi rêya {{deyn|fr|ku|logique}} yan {{hv|en|logic}} ji {{hv|la|logica}} ji {{hv|grc|λογικος}} ji {{g|grc|λόγος|w=[[hiş]], [[aqil]]}}.
==== Werger ====
{{werger-bnr|mantiq}}
==== Anagram ====
* {{anagram|ku|a=îjklo|kolîj}}
4lhgevtyqh3a4xnfzssh05yxdbmwdp4
gîtarîst
0
45350
6532026
6339321
2026-09-18T15:43:17Z
Wikihez
7344
Kurmancî/Navdêr: beşa «Resim» hate nûkirin (DefSideBoxes)
6532026
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
[[Wêne:Guitarist Gretchen Menn 2017.jpg|thumb|250px|'''Gîtarîstek''' li festîvala muzîkê.]]
{{navdêr|ku|z=mn}}
# {{f|ku|muzîsyen|muzîk}} [[hunermend|Hunermendê]]/a [[gîtar]]ê, kesa/ê ku li [[gîtar]]ê dide.
#: {{hevmane|ku|gîtarvan|gîtarjen}}
#: {{jornav|ku|muzîsyen}}
#* {{jêder|ku|jêgirtin=Li dû axaftin û peyaman, koma dansê ya Alman ku ji 3 hezar kesî pêk hatiye, dest pê kir. Li gel barana [[sift]] jî performansa komê gelek bal kişand. Piştre koma bulgarî ya 2 hezar kesî hemû beşdar mest kirin. Di festîvalê de yek ji komên herî balkêş jî koma gîtarê ya 200 kesî bû. Aheng û lihevkirina di navbera '''gîtarîstan''' de ji aliyê temaşevanan ve li piyan hat silavkirin û bi çepikan hat pîrozkirin. Herwisa [[yoga]] û [[medîtasyon]]a ku ji aliyê bi hezaran kesî ve hat kirin, bû sedem ku [[stadyûm]]a Olîmpiyadê di nav bêdengiyeke kûr de bimîne. Armanca yoga û medîtasyonkirinê ew bû ku bikeve nav Pirtûka Rekoran a Guinesê.|Ali Guler ''Di festîvala cîhanê de deng û rengên Kurdan'', Rudaw.net, 7/2011}}
==== Tewandin ====
{{ku-tewîn-nav/nû|mê û nêr}}
==== Jê ====
* {{g|ku|gîtarîstî}}
==== Etîmolojî ====
{{navmiletî|ku}} bide ber {{ji|en|ku|guitarist}}, {{ji|fr|ku|guitariste}}; wekheva {{qertaf|ku|gîtar|-îst}}.
==== Werger ====
{{werger-ser|Kesê li gîtarê dide}}
* {{Z|sq}}: {{W+|sq|kitarist|n}}, {{W-|sq|kitariste|m}}
* {{Z|de}}: {{W+|de|Gitarrenspieler|n}}, {{W+|de|Gitarrenspielerin|m}}, {{W+|de|Gitarrist|n}}, {{W+|de|Gitarristin|m}}
* {{Z|ast}}: {{W-|ast|guitarrista|n|m}}, {{W-|ast|guitarreru|n}}
* {{Z|be}}: {{W-|be|гітары́ст|n}}, {{W-|be|гітары́стка|m}}
* {{Z|bg}}: {{W-|bg|китари́ст|n}}, {{W-|bg|китари́стка|m}}
* {{Z|cs}}: {{W+|cs|kytarista|n}}, {{W-|cs|kytaristka|m}}
* {{Z|zh}}:
*: {{Z|cmn}}: {{W+|cmn|吉他手}}
* {{Z|da}}: {{W+|da|guitarist|g}}
* {{Z|ar}}: {{W-|ar|[[عَازِف]] [[قِيثَارَة]]|n}}
* {{Z|hy}}: {{W+|hy|կիթառահար}}
* {{Z|eo}}: {{W-|eo|gitaristo}}
* {{Z|et}}: {{W-|et|kitarrist}}
* {{Z|fa}}: {{W-|fa|گیتاریست|tr=gitârist}}, {{W-|fa|گیتارنواز|tr=gitârnavâz}}
* {{Z|fi}}: {{W+|fi|kitaristi}}, {{W-|fi|kitaransoittaja}}
* {{Z|fr}}: {{W+|fr|guitariste|n|m}}
* {{Z|gl}}: {{W+|gl|guitarrista|n|m}}, {{W+|gl|guitarra|n|m}}
* {{Z|ka}}: {{W-|ka|გიტარისტი}}
* {{Z|nl}}: {{W+|nl|gitarist|n}}, {{W+|nl|gitariste|m}}, {{W+|nl|gitaarspeler|n}}, {{W-|nl|gitaarspeelster|m}}
* {{Z|he}}: {{W+|he|גִּיטָרִיסְט|n|tr=gitaríst}}
* {{Z|en}}: {{W+|en|guitarist}}
* {{Z|ga}}: {{W-|ga|giotáraí|n}}
* {{Z|it}}: {{W+|it|chitarrista|n|m}}
* {{Z|is}}: {{W-|is|gítaristi|n}}, {{W-|is|gítarleikari|n}}
* {{Z|ja}}: {{W+|ja|ギタリスト|tr=gitarisuto}}
* {{Z|ca}}: {{W+|ca|guitarrista|n|m}}
* {{Z|ko}}: {{W-|ko|[[기타]] [[연주자]]}}, {{W-|ko|기타리스트}}
* {{Z|la}}: {{W-|la|guitarista|m}}, {{W-|la|guitaristus|n}}
* {{Z|lv}}: {{W-|lv|ģitārists|n}}, {{W-|lv|ģitāriste|m}}
* {{Z|lt}}: {{W-|lt|gitaristas|n}}, {{W-|lt|gitaristė|m}}
* {{Z|mk}}: {{W-|mk|гитари́ст|n}}, {{W-|mk|гитари́стка|m}}
* {{Z|mi}}: {{W-|mi|kairakuraku kitā}}
* {{Z|hu}}: {{W+|hu|gitáros}}
* {{Z|no}}:
*: {{Z|nb}}: {{W+|nb|gitarist|n}}
*: {{Z|nn}}: {{W-|nn|gitarist|n}}
* {{Z|pl}}: {{W+|pl|gitarzysta}}, {{W+|pl|gitarzystka|m}}
* {{Z|pt}}: {{W+|pt|guitarrista|n|m}}
* {{Z|ro}}: {{W+|ro|chitarist|n}}, {{W+|ro|chitaristă|m}}
* {{Z|ru}}: {{W+|ru|гитари́ст|n}}, {{W+|ru|гитари́стка|m}}
* {{Z|sh}}:
*: Kirîlî: {{W-|sh|гита̀рист|n}}, {{W-|sh|гитариста|n}}, {{W-|sh|гита̀ристица|m}}, {{W-|sh|гитаристкиња|m}}
*: Latînî: {{W+|sh|gitàrist|n}}, {{W+|sh|gitarista|n}}, {{W+|sh|gitàristica|m}}, {{W-|sh|gitaristkinja|m}}
* {{Z|sk}}: {{W-|sk|gitarista|n}}, {{W-|sk|gitaristka|m}}
* {{Z|sl}}: {{W+|sl|kitarist|n}}, {{W-|sl|kitaristka|m}}
* {{Z|es}}: {{W+|es|guitarrista|n|m}}, {{W-|es|guitarrero|n}}, {{W+|es|guitarra|n|m}}
* {{Z|sw}}: {{W-|sw|mpiga gitaa}}
* {{Z|sv}}: {{W+|sv|gitarrist}}
* {{Z|tl}}: {{W-|tl|gitarista}}
* {{Z|tr}}: {{W+|tr|gitarist}}
* {{Z|uk}}: {{W+|uk|гітари́ст|n}}, {{W-|uk|гітари́стка|m}}
* {{Z|vi}}: {{W-|vi|người chơi ghi-ta}}, {{W-|vi|người đánh ghi-ta}}, {{W-|vi|ghi-ta thủ}}, {{W-|vi|người chơi lục huyền cầm}}, {{W-|vi|người chơi Tây Ban cầm}}, {{W-|vi|người đánh lục huyền cầm}}, {{W-|vi|người đánh Tây Ban cầm}}, {{W-|vi|Tây Ban cầm thủ}}, {{W-|vi|lục huyền cầm thủ}}
* {{Z|sah}}: {{W-|sah|гитараһыт}}
* {{Z|yi}}: {{W-|yi|גיטאַריסט|n}}, {{W-|yi|גיטאַר־שפּילער|n}}
* {{Z|el}}: {{W+|el|κιθαρίστας|n}}, {{W+|el|κιθαριστής|n}}, {{W+|el|κιθαρίστρια|m}}
{{werger-bin}}
:{{werger çavkanî|en|guitarist|beş=Ev qismê Wergerê|oldid=82007208}}
6lrzb65e80cscb6yohxkuronyolk9u1
6532048
6532026
2026-09-18T17:12:07Z
Balyozbot
7867
Bot: Paqijiyên kozmetîk ({{ku-tewîn-nav/nû}} → {{ku-tewîn-nav}}.)
6532048
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
[[Wêne:Guitarist Gretchen Menn 2017.jpg|thumb|250px|'''Gîtarîstek''' li festîvala muzîkê.]]
{{navdêr|ku|z=mn}}
# {{f|ku|muzîsyen|muzîk}} [[hunermend|Hunermendê]]/a [[gîtar]]ê, kesa/ê ku li [[gîtar]]ê dide.
#: {{hevmane|ku|gîtarvan|gîtarjen}}
#: {{jornav|ku|muzîsyen}}
#* {{jêder|ku|jêgirtin=Li dû axaftin û peyaman, koma dansê ya Alman ku ji 3 hezar kesî pêk hatiye, dest pê kir. Li gel barana [[sift]] jî performansa komê gelek bal kişand. Piştre koma bulgarî ya 2 hezar kesî hemû beşdar mest kirin. Di festîvalê de yek ji komên herî balkêş jî koma gîtarê ya 200 kesî bû. Aheng û lihevkirina di navbera '''gîtarîstan''' de ji aliyê temaşevanan ve li piyan hat silavkirin û bi çepikan hat pîrozkirin. Herwisa [[yoga]] û [[medîtasyon]]a ku ji aliyê bi hezaran kesî ve hat kirin, bû sedem ku [[stadyûm]]a Olîmpiyadê di nav bêdengiyeke kûr de bimîne. Armanca yoga û medîtasyonkirinê ew bû ku bikeve nav Pirtûka Rekoran a Guinesê.|Ali Guler ''Di festîvala cîhanê de deng û rengên Kurdan'', Rudaw.net, 7/2011}}
==== Tewandin ====
{{ku-tewîn-nav|mê û nêr}}
==== Jê ====
* {{g|ku|gîtarîstî}}
==== Etîmolojî ====
{{navmiletî|ku}} bide ber {{ji|en|ku|guitarist}}, {{ji|fr|ku|guitariste}}; wekheva {{qertaf|ku|gîtar|-îst}}.
==== Werger ====
{{werger-ser|Kesê li gîtarê dide}}
* {{Z|sq}}: {{W+|sq|kitarist|n}}, {{W-|sq|kitariste|m}}
* {{Z|de}}: {{W+|de|Gitarrenspieler|n}}, {{W+|de|Gitarrenspielerin|m}}, {{W+|de|Gitarrist|n}}, {{W+|de|Gitarristin|m}}
* {{Z|ast}}: {{W-|ast|guitarrista|n|m}}, {{W-|ast|guitarreru|n}}
* {{Z|be}}: {{W-|be|гітары́ст|n}}, {{W-|be|гітары́стка|m}}
* {{Z|bg}}: {{W-|bg|китари́ст|n}}, {{W-|bg|китари́стка|m}}
* {{Z|cs}}: {{W+|cs|kytarista|n}}, {{W-|cs|kytaristka|m}}
* {{Z|zh}}:
*: {{Z|cmn}}: {{W+|cmn|吉他手}}
* {{Z|da}}: {{W+|da|guitarist|g}}
* {{Z|ar}}: {{W-|ar|[[عَازِف]] [[قِيثَارَة]]|n}}
* {{Z|hy}}: {{W+|hy|կիթառահար}}
* {{Z|eo}}: {{W-|eo|gitaristo}}
* {{Z|et}}: {{W-|et|kitarrist}}
* {{Z|fa}}: {{W-|fa|گیتاریست|tr=gitârist}}, {{W-|fa|گیتارنواز|tr=gitârnavâz}}
* {{Z|fi}}: {{W+|fi|kitaristi}}, {{W-|fi|kitaransoittaja}}
* {{Z|fr}}: {{W+|fr|guitariste|n|m}}
* {{Z|gl}}: {{W+|gl|guitarrista|n|m}}, {{W+|gl|guitarra|n|m}}
* {{Z|ka}}: {{W-|ka|გიტარისტი}}
* {{Z|nl}}: {{W+|nl|gitarist|n}}, {{W+|nl|gitariste|m}}, {{W+|nl|gitaarspeler|n}}, {{W-|nl|gitaarspeelster|m}}
* {{Z|he}}: {{W+|he|גִּיטָרִיסְט|n|tr=gitaríst}}
* {{Z|en}}: {{W+|en|guitarist}}
* {{Z|ga}}: {{W-|ga|giotáraí|n}}
* {{Z|it}}: {{W+|it|chitarrista|n|m}}
* {{Z|is}}: {{W-|is|gítaristi|n}}, {{W-|is|gítarleikari|n}}
* {{Z|ja}}: {{W+|ja|ギタリスト|tr=gitarisuto}}
* {{Z|ca}}: {{W+|ca|guitarrista|n|m}}
* {{Z|ko}}: {{W-|ko|[[기타]] [[연주자]]}}, {{W-|ko|기타리스트}}
* {{Z|la}}: {{W-|la|guitarista|m}}, {{W-|la|guitaristus|n}}
* {{Z|lv}}: {{W-|lv|ģitārists|n}}, {{W-|lv|ģitāriste|m}}
* {{Z|lt}}: {{W-|lt|gitaristas|n}}, {{W-|lt|gitaristė|m}}
* {{Z|mk}}: {{W-|mk|гитари́ст|n}}, {{W-|mk|гитари́стка|m}}
* {{Z|mi}}: {{W-|mi|kairakuraku kitā}}
* {{Z|hu}}: {{W+|hu|gitáros}}
* {{Z|no}}:
*: {{Z|nb}}: {{W+|nb|gitarist|n}}
*: {{Z|nn}}: {{W-|nn|gitarist|n}}
* {{Z|pl}}: {{W+|pl|gitarzysta}}, {{W+|pl|gitarzystka|m}}
* {{Z|pt}}: {{W+|pt|guitarrista|n|m}}
* {{Z|ro}}: {{W+|ro|chitarist|n}}, {{W+|ro|chitaristă|m}}
* {{Z|ru}}: {{W+|ru|гитари́ст|n}}, {{W+|ru|гитари́стка|m}}
* {{Z|sh}}:
*: Kirîlî: {{W-|sh|гита̀рист|n}}, {{W-|sh|гитариста|n}}, {{W-|sh|гита̀ристица|m}}, {{W-|sh|гитаристкиња|m}}
*: Latînî: {{W+|sh|gitàrist|n}}, {{W+|sh|gitarista|n}}, {{W+|sh|gitàristica|m}}, {{W-|sh|gitaristkinja|m}}
* {{Z|sk}}: {{W-|sk|gitarista|n}}, {{W-|sk|gitaristka|m}}
* {{Z|sl}}: {{W+|sl|kitarist|n}}, {{W-|sl|kitaristka|m}}
* {{Z|es}}: {{W+|es|guitarrista|n|m}}, {{W-|es|guitarrero|n}}, {{W+|es|guitarra|n|m}}
* {{Z|sw}}: {{W-|sw|mpiga gitaa}}
* {{Z|sv}}: {{W+|sv|gitarrist}}
* {{Z|tl}}: {{W-|tl|gitarista}}
* {{Z|tr}}: {{W+|tr|gitarist}}
* {{Z|uk}}: {{W+|uk|гітари́ст|n}}, {{W-|uk|гітари́стка|m}}
* {{Z|vi}}: {{W-|vi|người chơi ghi-ta}}, {{W-|vi|người đánh ghi-ta}}, {{W-|vi|ghi-ta thủ}}, {{W-|vi|người chơi lục huyền cầm}}, {{W-|vi|người chơi Tây Ban cầm}}, {{W-|vi|người đánh lục huyền cầm}}, {{W-|vi|người đánh Tây Ban cầm}}, {{W-|vi|Tây Ban cầm thủ}}, {{W-|vi|lục huyền cầm thủ}}
* {{Z|sah}}: {{W-|sah|гитараһыт}}
* {{Z|yi}}: {{W-|yi|גיטאַריסט|n}}, {{W-|yi|גיטאַר־שפּילער|n}}
* {{Z|el}}: {{W+|el|κιθαρίστας|n}}, {{W+|el|κιθαριστής|n}}, {{W+|el|κιθαρίστρια|m}}
{{werger-bin}}
:{{werger çavkanî|en|guitarist|beş=Ev qismê Wergerê|oldid=82007208}}
9qdqcq6mhikfs4e9mkjbvk9uyvmmw8h
Sinîstan
0
45818
6532523
6467658
2026-09-19T08:48:55Z
Wikihez
7344
Kurmancî/Navdêr: +nimûneya bikaranînê bi amûra « [[Mediawiki:Gadget-wikt.add-examples|Nimûne zêde bike]] » (v2.0), mane hate guhartin, beşa «Ji wêjeyê» hate rakirin (DefSideBoxes)
6532523
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku|z=m}}
# [[herêm|Herêm]]a [[Iraq]]ê ya ku [[misilman]]ên [[sinî]] yên [[ereb]] lê [[jîn|dijîn]] (ta niha ne navek fermî ye).
#* {{jêder|ku|Nefel.com, 9/2007|jêgirtin=Hillary Clintona senatora ji lîsteya Demokratan jî piştgiriya pêşniyara Joseph Bidenî dike û heger serokê Emerîkayê George Bush guhê xwe bide wê pêşniyarê divêt Iraq bibe sê herêmên konfederal ko ji Şîistan, '''Sinistan''' û Kurdistanê pêk têt.}}
# [['''sinîstan''']]: her [[dever]]a ku [[misilman]]ên [[sinî]] lê [[piranî]] ne
==== Tewandin ====
{{ku-tewîn-nav|mê}}
==== Formên alternatîv ====
* [[Sunîstan]]
==== Jê ====
* [[sinîstanî]]
* [[sinîstanîtî]]
==== Etîmolojî ====
Ji {{qertaf|ku|sinî|-stan}}.
==== Bide ber ====
* [[Kurdistan]]
* [[Şîistan]]
mjpbhtk3hwrgab1wi0m8qr10w9bs98y
6532545
6532523
2026-09-19T08:52:26Z
Wikihez
7344
Kurmancî/Navdêr: beşa «Etîmolojî» hate nûkirin (DefSideBoxes)
6532545
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku|z=m}}
# [[herêm|Herêm]]a [[Iraq]]ê ya ku [[misilman]]ên [[sinî]] yên [[ereb]] lê [[jîn|dijîn]] (ta niha ne navek fermî ye).
#* {{jêder|ku|Nefel.com, 9/2007|jêgirtin=Hillary Clintona senatora ji lîsteya Demokratan jî piştgiriya pêşniyara Joseph Bidenî dike û heger serokê Emerîkayê George Bush guhê xwe bide wê pêşniyarê divêt Iraq bibe sê herêmên konfederal ko ji Şîistan, '''Sinistan''' û Kurdistanê pêk têt.}}
# [['''sinîstan''']]: her [[dever]]a ku [[misilman]]ên [[sinî]] lê [[piranî]] ne
==== Tewandin ====
{{ku-tewîn-nav|mê}}
==== Formên alternatîv ====
* [[Sunîstan]]
==== Jê ====
* [[sinîstanî]]
* [[sinîstanîtî]]
==== Etîmolojî ====
{{etîmon|ku|sinî|-istan<cuda:-stan>|metn=++|dar=1}}
==== Bide ber ====
* [[Kurdistan]]
* [[Şîistan]]
hy7cm2rbp8gmrj3tdt6q3piy1nvc1pk
6532551
6532545
2026-09-19T08:53:03Z
Wikihez
7344
Kurmancî/Navdêr: beşa «Etîmolojî» hate nûkirin (DefSideBoxes)
6532551
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku|z=m}}
# [[herêm|Herêm]]a [[Iraq]]ê ya ku [[misilman]]ên [[sinî]] yên [[ereb]] lê [[jîn|dijîn]] (ta niha ne navek fermî ye).
#* {{jêder|ku|Nefel.com, 9/2007|jêgirtin=Hillary Clintona senatora ji lîsteya Demokratan jî piştgiriya pêşniyara Joseph Bidenî dike û heger serokê Emerîkayê George Bush guhê xwe bide wê pêşniyarê divêt Iraq bibe sê herêmên konfederal ko ji Şîistan, '''Sinistan''' û Kurdistanê pêk têt.}}
# [['''sinîstan''']]: her [[dever]]a ku [[misilman]]ên [[sinî]] lê [[piranî]] ne
==== Tewandin ====
{{ku-tewîn-nav|mê}}
==== Formên alternatîv ====
* [[Sunîstan]]
==== Jê ====
* [[sinîstanî]]
* [[sinîstanîtî]]
==== Etîmolojî ====
{{etîmon|ku|:qf|sinî|-istan<cuda:-stan>|metn=++|dar=1}}
==== Bide ber ====
* [[Kurdistan]]
* [[Şîistan]]
imttdphd77ca291gvjkv1ltuyzfo1i5
6533044
6532551
2026-09-19T10:12:06Z
Balyozbot
7867
Bot: Paqijiyên kozmetîk (Lînk paqij kir, --Valahiyên nehewce.)
6533044
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku|z=m}}
# [[herêm|Herêma]] [[Iraq]]ê ya ku [[misilman]]ên [[sinî]] yên [[ereb]] lê [[jîn|dijîn]] (ta niha ne navek fermî ye).
#* {{jêder|ku|Nefel.com, 9/2007|jêgirtin=Hillary Clintona senatora ji lîsteya Demokratan jî piştgiriya pêşniyara Joseph Bidenî dike û heger serokê Emerîkayê George Bush guhê xwe bide wê pêşniyarê divêt Iraq bibe sê herêmên konfederal ko ji Şîistan, '''Sinistan''' û Kurdistanê pêk têt.}}
# [['''sinîstan''']]: her [[dever]]a ku [[misilman]]ên [[sinî]] lê [[piranî]] ne
==== Tewandin ====
{{ku-tewîn-nav|mê}}
==== Formên alternatîv ====
* [[Sunîstan]]
==== Jê ====
* [[sinîstanî]]
* [[sinîstanîtî]]
==== Etîmolojî ====
{{etîmon|ku|:qf|sinî|-istan<cuda:-stan>|metn=++|dar=1}}
==== Bide ber ====
* [[Kurdistan]]
* [[Şîistan]]
lqny3ty51f8i15zgrshk5wnrt3cscq0
malava
0
60450
6532023
6245603
2026-09-18T15:39:45Z
Wikihez
7344
Kurmancî/Baneşan: beşa «Etîmolojî» hate nûkirin (DefSideBoxes)
6532023
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Baneşan ===
{{baneşan|ku}}
# [[spas]], [[memnûn]], [[şikir]], [[teşekur]], [[Xwedê ji te razî be]], <br>[[peyv]]ek e bo wî kesî têt gotin yê ku [[qencî|qenciyek]] kiriye
# [[bi xatirê te]], [[bi xatirê we]]
# [[oxir be]], [[wexera xêrê be]]
# [[dijmane]]ya "[[malxirab]], [[malwêran]], [[malkembax]]"
==== Formên alternatîv ====
* {{g|ku|mal ava}}
==== Etîmolojî ====
{{etîmon|ku|:qertaf|mal<id:xanî>|ava|dar=1|metn=++}}
==== Jê ====
{{kol3|ku
|malava kirin<pos:lêker>
|malavakirin<pos:navdêr>
|malavahî
|malavatî
|malavayî
}}
==== Werger ====
{{werger-ser}}
* {{Z|de}}: {{W|de|Dank|m}}, {{W|de|Abschied|m}}
* {{Z|fa}}: {{W|fa|تحسین}}, {{W|fa|ندای}}
* {{Z|en}}: {{W|en|acknowledgment}}, {{W|en|prosperous}}, {{W|en|thankfulness|guman=erê}}
* {{Z|tr}}: {{W|tr|yahu}}
{{werger-bin}}
dirbe32mtg2dx40h9r3cylpwmitgl9k
6532024
6532023
2026-09-18T15:41:06Z
Wikihez
7344
Kurmancî/Baneşan: mane, hevmane hatin guhartin (DefSideBoxes)
6532024
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Baneşan ===
{{baneşan|ku}}
# {{înm|[[peyv|Peyv]]ek e bo wî kesî tê gotin yê ku [[qencî|qenciyek]] kiriye.}}
#: {{hevmane|ku|spas|memnûn|şikir|teşekur|Xwedê ji te razî be}}
# [[bi xatirê te]], [[bi xatirê we]]
# [[oxir be]], [[wexera xêrê be]]
# [[dijmane]]ya "[[malxirab]], [[malwêran]], [[malkembax]]"
==== Formên alternatîv ====
* {{g|ku|mal ava}}
==== Etîmolojî ====
{{etîmon|ku|:qertaf|mal<id:xanî>|ava|dar=1|metn=++}}
==== Jê ====
{{kol3|ku
|malava kirin<pos:lêker>
|malavakirin<pos:navdêr>
|malavahî
|malavatî
|malavayî
}}
==== Werger ====
{{werger-ser}}
* {{Z|de}}: {{W|de|Dank|m}}, {{W|de|Abschied|m}}
* {{Z|fa}}: {{W|fa|تحسین}}, {{W|fa|ندای}}
* {{Z|en}}: {{W|en|acknowledgment}}, {{W|en|prosperous}}, {{W|en|thankfulness|guman=erê}}
* {{Z|tr}}: {{W|tr|yahu}}
{{werger-bin}}
b7wvz258eoeqc8hcvgr1domrsuwoi4a
6532025
6532024
2026-09-18T15:41:07Z
Balyozbot
7867
[[Special:PermanentLink/6298023|Bot]]: rêzkirina beşan
6532025
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Baneşan ===
{{baneşan|ku}}
# {{înm|[[peyv|Peyv]]ek e bo wî kesî tê gotin yê ku [[qencî|qenciyek]] kiriye.}}
#: {{hevmane|ku|spas|memnûn|şikir|teşekur|Xwedê ji te razî be}}
# [[bi xatirê te]], [[bi xatirê we]]
# [[oxir be]], [[wexera xêrê be]]
# [[dijmane]]ya "[[malxirab]], [[malwêran]], [[malkembax]]"
==== Formên alternatîv ====
* {{g|ku|mal ava}}
==== Jê ====
{{kol3|ku
|malava kirin<pos:lêker>
|malavakirin<pos:navdêr>
|malavahî
|malavatî
|malavayî
}}
==== Etîmolojî ====
{{etîmon|ku|:qertaf|mal<id:xanî>|ava|dar=1|metn=++}}
==== Werger ====
{{werger-ser}}
* {{Z|de}}: {{W|de|Dank|m}}, {{W|de|Abschied|m}}
* {{Z|fa}}: {{W|fa|تحسین}}, {{W|fa|ندای}}
* {{Z|en}}: {{W|en|acknowledgment}}, {{W|en|prosperous}}, {{W|en|thankfulness|guman=erê}}
* {{Z|tr}}: {{W|tr|yahu}}
{{werger-bin}}
gktpcfzevnk94ih2khcfacdf6vqwno7
6532049
6532025
2026-09-18T17:12:10Z
Balyozbot
7867
Bot: Paqijiyên kozmetîk (Lînk paqij kir.)
6532049
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Baneşan ===
{{baneşan|ku}}
# {{înm|[[peyv|Peyvek]] e bo wî kesî tê gotin yê ku [[qencî|qenciyek]] kiriye.}}
#: {{hevmane|ku|spas|memnûn|şikir|teşekur|Xwedê ji te razî be}}
# [[bi xatirê te]], [[bi xatirê we]]
# [[oxir be]], [[wexera xêrê be]]
# [[dijmane]]ya "[[malxirab]], [[malwêran]], [[malkembax]]"
==== Formên alternatîv ====
* {{g|ku|mal ava}}
==== Jê ====
{{kol3|ku
|malava kirin<pos:lêker>
|malavakirin<pos:navdêr>
|malavahî
|malavatî
|malavayî
}}
==== Etîmolojî ====
{{etîmon|ku|:qertaf|mal<id:xanî>|ava|dar=1|metn=++}}
==== Werger ====
{{werger-ser}}
* {{Z|de}}: {{W|de|Dank|m}}, {{W|de|Abschied|m}}
* {{Z|fa}}: {{W|fa|تحسین}}, {{W|fa|ندای}}
* {{Z|en}}: {{W|en|acknowledgment}}, {{W|en|prosperous}}, {{W|en|thankfulness|guman=erê}}
* {{Z|tr}}: {{W|tr|yahu}}
{{werger-bin}}
klqq8fireywagrre938u72d2h43o9yq
vac
0
62171
6532054
6288889
2026-09-18T17:18:41Z
Avestaboy
5833
6532054
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku}}
# [[mantiq]], [[jenk]], [[lojîk]], [[beraqilî]], [[jîrbêjî]] li gor hiş û aqilî, ne keyfî
==== Formên alternatîv ====
ji derveyî vacê, bêvac, bivac
==== Etîmolojî ====
{{bêetîmolojî|ku}}
==== Bi zaravayên din ====
* Soranî: [[jîrbêjî]]
==== Werger ====
{{werger-ser}}
* {{Z|tr}}: {{W+|tr|mantık}}
{{werger-bin}}
72831sh09lck1ac3znzgx1kcdoit5ur
mantiq
0
63786
6532045
6311635
2026-09-18T17:07:30Z
Avestaboy
5833
6532045
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku|z=m}}
#[[jenk]] [[lojîk]], [[hişmendî]], [[aqilmendî]], [[aqil]], [[zihndarî]], [[zihniyet]]
==== Tewandin ====
{{ku-tewîn-nav/nû|mê}}
==== Bi alfabeyên din ====
* {{ku-ar|مانتق}}
==== Formên alternatîv ====
* [[mentiq]]
* [[mantix]]
==== Jê ====
* [[bêmantiq]]
* [[bêmantiqî]]
* [[bimantiq]]
* [[mantiqdar]]
* [[mantiqdarî]]
* [[mantiqî]]
==== Etîmolojî ====
Ji {{ji|ar|ku|منطق|tr=menṭiq}} ji {{g|ar|نطق|tr=nuṭq|w=[[peyv]], [[axivîn]], [[gotin]]}} ji lêker {{g|ku|نطق|tr=neṭeqe|w=[[axivîn]]}}, wergerra yekser ya peyva yûnanî [[λογική]] (logikê: mentiq, [[lojîk]]) ku ji peyva [[λόγος]] (logos: [[peyv]]; [[hiş]]) hatiye çêkirin.
==== Werger ====
{{werger-ser}}
* {{Z|sq}}: {{W+|sq|logjikë|m}}
* {{Z|de}}: {{W+|de|Logik|m}}
* {{Z|az}}: {{W+|az|məntiq}}
* {{Z|eu}}: {{W+|eu|logika}}
* {{Z|bn}}: {{W+|bn|মন্তেক}}
* {{Z|bg}}: {{W+|bg|ло́гика|m}}
* {{Z|cs}}: {{W+|cs|logika|m}}
* {{Z|zh}}:
*: {{Z|cmn}}: {{W+|cmn|邏輯|tr=luóji}}, {{W+|cmn|論理|tr=lùnlǐ}}
* {{Z|id}}: {{W+|id|logika}}, {{W+|id|mantik}}
* {{Z|ar}}: {{W-|ar|مَنْطِق|n}}
* {{Z|hy}}: {{W+|hy|տրամաբանություն}}
* {{Z|eo}}: {{W-|eo|logiko}}
* {{Z|fa}}: {{W+|fa|منطق|tr=manteq}}
* {{Z|fi}}: {{W+|fi|logiikka}}
* {{Z|fr}}: {{W+|fr|logique|m}}
* {{Z|gl}}: {{W+|gl|lóxica|m}}
* {{Z|hi}}: {{W+|hi|तर्क}}
* {{Z|nl}}: {{W+|nl|logica|m}}
* {{Z|he}}: {{W+|he|הגיון|tr=higayon}}
* {{Z|ang}}: {{W-|ang|flitcræft|n}}
* {{Z|en}}: {{W+|en|logic}}
* {{Z|ga}}: {{W-|ga|loighic|m}}
* {{Z|it}}: {{W+|it|logica|m}}, {{W+|it|logica matematica|m}}
* {{Z|is}}: {{W-|is|rökfræði|m}}
* {{Z|ja}}: {{W+|ja|論理|tr=ろんり, ronri}}
* {{Z|ca}}: {{W+|ca|lògica|m}}
* {{Z|ko}}: {{W+|ko|논리}}
* {{Z|la}}: {{W-|la|dialectica|m}}
* {{Z|lv}}: {{W-|lv|loģika|m}}
* {{Z|mk}}: {{W-|mk|ло́гика|m}}
* {{Z|hu}}: {{W+|hu|logika}}
* {{Z|no}}: {{W-|no|logikk|n}}
* {{Z|ug}}: {{W-|ug|مەنتىق}}
* {{Z|pl}}: {{W+|pl|logika|m}}
* {{Z|pt}}: {{W+|pt|lógica|m}}
* {{Z|ro}}: {{W+|ro|logică|m}}
* {{Z|ru}}: {{W+|ru|ло́гика|m}}
* {{Z|sa}}: {{W-|sa|न्यायम्}}
* {{Z|sh}}: {{W+|sh|lògika|m}}
* {{Z|sk}}: {{W-|sk|logika|m}}
* {{Z|sl}}: {{W+|sl|logika|m}}
* {{Z|es}}: {{W+|es|lógica|m}}
* {{Z|sw}}: {{W+|sw|mantiki}}
* {{Z|sv}}: {{W+|sv|logik|g}}
* {{Z|tl}}: {{W-|tl|matwiran}}
* {{Z|th}}: {{W+|th|ตรรกะ}}
* {{Z|te}}: {{W+|te|తర్కము}}
* {{Z|tr}}: {{W+|tr|mantık}}
* {{Z|tpi}}: {{W-|tpi|lajik}}
* {{Z|ur}}: {{W-|ur|ترک|tr=tark}}
* {{Z|uk}}: {{W+|uk|ло́гіка|m}}
* {{Z|vi}}: {{W+|vi|logic}}, {{W-|vi|lô-gíc}}, {{W+|vi|luận lý}}
* {{Z|cy}}: {{W+|cy|rhesymeg|m}}
* {{Z|km}}: {{W+|km|តក្ក|sc=Khmr|tr=takka}}
* {{Z|xh}}: {{W-|xh|i-logic}}
* {{Z|yi}}: {{W-|yi|לאָגיק|m}}
* {{Z|el}}: {{W+|el|λογική|m}}
{{werger-bin}}
:{{werger çavkanî|en|logic|beş=Ev qismê Wergerê|oldid=75874211}}
8euqf9klfe3c1c0z7vybvi8mglvzqam
6532046
6532045
2026-09-18T17:07:40Z
Avestaboy
5833
6532046
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku|z=m}}
#[[jenk]], [[lojîk]], [[hişmendî]], [[aqilmendî]], [[aqil]], [[zihndarî]], [[zihniyet]]
==== Tewandin ====
{{ku-tewîn-nav/nû|mê}}
==== Bi alfabeyên din ====
* {{ku-ar|مانتق}}
==== Formên alternatîv ====
* [[mentiq]]
* [[mantix]]
==== Jê ====
* [[bêmantiq]]
* [[bêmantiqî]]
* [[bimantiq]]
* [[mantiqdar]]
* [[mantiqdarî]]
* [[mantiqî]]
==== Etîmolojî ====
Ji {{ji|ar|ku|منطق|tr=menṭiq}} ji {{g|ar|نطق|tr=nuṭq|w=[[peyv]], [[axivîn]], [[gotin]]}} ji lêker {{g|ku|نطق|tr=neṭeqe|w=[[axivîn]]}}, wergerra yekser ya peyva yûnanî [[λογική]] (logikê: mentiq, [[lojîk]]) ku ji peyva [[λόγος]] (logos: [[peyv]]; [[hiş]]) hatiye çêkirin.
==== Werger ====
{{werger-ser}}
* {{Z|sq}}: {{W+|sq|logjikë|m}}
* {{Z|de}}: {{W+|de|Logik|m}}
* {{Z|az}}: {{W+|az|məntiq}}
* {{Z|eu}}: {{W+|eu|logika}}
* {{Z|bn}}: {{W+|bn|মন্তেক}}
* {{Z|bg}}: {{W+|bg|ло́гика|m}}
* {{Z|cs}}: {{W+|cs|logika|m}}
* {{Z|zh}}:
*: {{Z|cmn}}: {{W+|cmn|邏輯|tr=luóji}}, {{W+|cmn|論理|tr=lùnlǐ}}
* {{Z|id}}: {{W+|id|logika}}, {{W+|id|mantik}}
* {{Z|ar}}: {{W-|ar|مَنْطِق|n}}
* {{Z|hy}}: {{W+|hy|տրամաբանություն}}
* {{Z|eo}}: {{W-|eo|logiko}}
* {{Z|fa}}: {{W+|fa|منطق|tr=manteq}}
* {{Z|fi}}: {{W+|fi|logiikka}}
* {{Z|fr}}: {{W+|fr|logique|m}}
* {{Z|gl}}: {{W+|gl|lóxica|m}}
* {{Z|hi}}: {{W+|hi|तर्क}}
* {{Z|nl}}: {{W+|nl|logica|m}}
* {{Z|he}}: {{W+|he|הגיון|tr=higayon}}
* {{Z|ang}}: {{W-|ang|flitcræft|n}}
* {{Z|en}}: {{W+|en|logic}}
* {{Z|ga}}: {{W-|ga|loighic|m}}
* {{Z|it}}: {{W+|it|logica|m}}, {{W+|it|logica matematica|m}}
* {{Z|is}}: {{W-|is|rökfræði|m}}
* {{Z|ja}}: {{W+|ja|論理|tr=ろんり, ronri}}
* {{Z|ca}}: {{W+|ca|lògica|m}}
* {{Z|ko}}: {{W+|ko|논리}}
* {{Z|la}}: {{W-|la|dialectica|m}}
* {{Z|lv}}: {{W-|lv|loģika|m}}
* {{Z|mk}}: {{W-|mk|ло́гика|m}}
* {{Z|hu}}: {{W+|hu|logika}}
* {{Z|no}}: {{W-|no|logikk|n}}
* {{Z|ug}}: {{W-|ug|مەنتىق}}
* {{Z|pl}}: {{W+|pl|logika|m}}
* {{Z|pt}}: {{W+|pt|lógica|m}}
* {{Z|ro}}: {{W+|ro|logică|m}}
* {{Z|ru}}: {{W+|ru|ло́гика|m}}
* {{Z|sa}}: {{W-|sa|न्यायम्}}
* {{Z|sh}}: {{W+|sh|lògika|m}}
* {{Z|sk}}: {{W-|sk|logika|m}}
* {{Z|sl}}: {{W+|sl|logika|m}}
* {{Z|es}}: {{W+|es|lógica|m}}
* {{Z|sw}}: {{W+|sw|mantiki}}
* {{Z|sv}}: {{W+|sv|logik|g}}
* {{Z|tl}}: {{W-|tl|matwiran}}
* {{Z|th}}: {{W+|th|ตรรกะ}}
* {{Z|te}}: {{W+|te|తర్కము}}
* {{Z|tr}}: {{W+|tr|mantık}}
* {{Z|tpi}}: {{W-|tpi|lajik}}
* {{Z|ur}}: {{W-|ur|ترک|tr=tark}}
* {{Z|uk}}: {{W+|uk|ло́гіка|m}}
* {{Z|vi}}: {{W+|vi|logic}}, {{W-|vi|lô-gíc}}, {{W+|vi|luận lý}}
* {{Z|cy}}: {{W+|cy|rhesymeg|m}}
* {{Z|km}}: {{W+|km|តក្ក|sc=Khmr|tr=takka}}
* {{Z|xh}}: {{W-|xh|i-logic}}
* {{Z|yi}}: {{W-|yi|לאָגיק|m}}
* {{Z|el}}: {{W+|el|λογική|m}}
{{werger-bin}}
:{{werger çavkanî|en|logic|beş=Ev qismê Wergerê|oldid=75874211}}
k2fovph8bauw01qpiumm6o657tpcemp
6532071
6532046
2026-09-18T18:12:07Z
Balyozbot
7867
Bot: Paqijiyên kozmetîk (+Valahiya lîsteyan, --Valahiyên nehewce, {{ku-tewîn-nav/nû}} → {{ku-tewîn-nav}}.)
6532071
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku|z=m}}
# [[jenk]], [[lojîk]], [[hişmendî]], [[aqilmendî]], [[aqil]], [[zihndarî]], [[zihniyet]]
==== Tewandin ====
{{ku-tewîn-nav|mê}}
==== Bi alfabeyên din ====
* {{ku-ar|مانتق}}
==== Formên alternatîv ====
* [[mentiq]]
* [[mantix]]
==== Jê ====
* [[bêmantiq]]
* [[bêmantiqî]]
* [[bimantiq]]
* [[mantiqdar]]
* [[mantiqdarî]]
* [[mantiqî]]
==== Etîmolojî ====
Ji {{ji|ar|ku|منطق|tr=menṭiq}} ji {{g|ar|نطق|tr=nuṭq|w=[[peyv]], [[axivîn]], [[gotin]]}} ji lêker {{g|ku|نطق|tr=neṭeqe|w=[[axivîn]]}}, wergerra yekser ya peyva yûnanî [[λογική]] (logikê: mentiq, [[lojîk]]) ku ji peyva [[λόγος]] (logos: [[peyv]]; [[hiş]]) hatiye çêkirin.
==== Werger ====
{{werger-ser}}
* {{Z|sq}}: {{W+|sq|logjikë|m}}
* {{Z|de}}: {{W+|de|Logik|m}}
* {{Z|az}}: {{W+|az|məntiq}}
* {{Z|eu}}: {{W+|eu|logika}}
* {{Z|bn}}: {{W+|bn|মন্তেক}}
* {{Z|bg}}: {{W+|bg|ло́гика|m}}
* {{Z|cs}}: {{W+|cs|logika|m}}
* {{Z|zh}}:
*: {{Z|cmn}}: {{W+|cmn|邏輯|tr=luóji}}, {{W+|cmn|論理|tr=lùnlǐ}}
* {{Z|id}}: {{W+|id|logika}}, {{W+|id|mantik}}
* {{Z|ar}}: {{W-|ar|مَنْطِق|n}}
* {{Z|hy}}: {{W+|hy|տրամաբանություն}}
* {{Z|eo}}: {{W-|eo|logiko}}
* {{Z|fa}}: {{W+|fa|منطق|tr=manteq}}
* {{Z|fi}}: {{W+|fi|logiikka}}
* {{Z|fr}}: {{W+|fr|logique|m}}
* {{Z|gl}}: {{W+|gl|lóxica|m}}
* {{Z|hi}}: {{W+|hi|तर्क}}
* {{Z|nl}}: {{W+|nl|logica|m}}
* {{Z|he}}: {{W+|he|הגיון|tr=higayon}}
* {{Z|ang}}: {{W-|ang|flitcræft|n}}
* {{Z|en}}: {{W+|en|logic}}
* {{Z|ga}}: {{W-|ga|loighic|m}}
* {{Z|it}}: {{W+|it|logica|m}}, {{W+|it|logica matematica|m}}
* {{Z|is}}: {{W-|is|rökfræði|m}}
* {{Z|ja}}: {{W+|ja|論理|tr=ろんり, ronri}}
* {{Z|ca}}: {{W+|ca|lògica|m}}
* {{Z|ko}}: {{W+|ko|논리}}
* {{Z|la}}: {{W-|la|dialectica|m}}
* {{Z|lv}}: {{W-|lv|loģika|m}}
* {{Z|mk}}: {{W-|mk|ло́гика|m}}
* {{Z|hu}}: {{W+|hu|logika}}
* {{Z|no}}: {{W-|no|logikk|n}}
* {{Z|ug}}: {{W-|ug|مەنتىق}}
* {{Z|pl}}: {{W+|pl|logika|m}}
* {{Z|pt}}: {{W+|pt|lógica|m}}
* {{Z|ro}}: {{W+|ro|logică|m}}
* {{Z|ru}}: {{W+|ru|ло́гика|m}}
* {{Z|sa}}: {{W-|sa|न्यायम्}}
* {{Z|sh}}: {{W+|sh|lògika|m}}
* {{Z|sk}}: {{W-|sk|logika|m}}
* {{Z|sl}}: {{W+|sl|logika|m}}
* {{Z|es}}: {{W+|es|lógica|m}}
* {{Z|sw}}: {{W+|sw|mantiki}}
* {{Z|sv}}: {{W+|sv|logik|g}}
* {{Z|tl}}: {{W-|tl|matwiran}}
* {{Z|th}}: {{W+|th|ตรรกะ}}
* {{Z|te}}: {{W+|te|తర్కము}}
* {{Z|tr}}: {{W+|tr|mantık}}
* {{Z|tpi}}: {{W-|tpi|lajik}}
* {{Z|ur}}: {{W-|ur|ترک|tr=tark}}
* {{Z|uk}}: {{W+|uk|ло́гіка|m}}
* {{Z|vi}}: {{W+|vi|logic}}, {{W-|vi|lô-gíc}}, {{W+|vi|luận lý}}
* {{Z|cy}}: {{W+|cy|rhesymeg|m}}
* {{Z|km}}: {{W+|km|តក្ក|sc=Khmr|tr=takka}}
* {{Z|xh}}: {{W-|xh|i-logic}}
* {{Z|yi}}: {{W-|yi|לאָגיק|m}}
* {{Z|el}}: {{W+|el|λογική|m}}
{{werger-bin}}
:{{werger çavkanî|en|logic|beş=Ev qismê Wergerê|oldid=75874211}}
exetyf8arbn28a8fzau9sdbwqyhy9z5
MediaWiki:Gadgets-definition
8
118586
6533056
6531726
2026-09-19T10:13:21Z
Wikihez
7344
wikt.cite: add wikt.cite/etimon.js to the package (the {{etîmon}} builder)
6533056
wikitext
text/x-wiki
Binêre [[Taybet:Gadgets]] ji bo belgekirina amûrên li jêr.
* LegacyScripts[ResourceLoader|default|dependencies=site,mediawiki.util,mediawiki.cookie,ext.gadget.LegacyScriptsNewNode,ext.gadget.StorageUtils|type=general]|legacy.js
==Rû==
* LiveClock[ResourceLoader|dependencies=mediawiki.util]|LiveClock.js
* charinsert-styles[ResourceLoader|hidden|type=styles]|charinsert-styles.css
* LanguagesAndScripts[ResourceLoader|default]|LanguagesAndScripts.css
* jeder[ResourceLoader|dependencies=ext.gadget.VisibilityToggles|default]|jeder.css|jeder.js
* CodeLinks[ResourceLoader|default|dependencies=site,mediawiki.util]|CodeLinks.js
* Tabset[ResourceLoader|default]|Tabset.js|Tabset.css
* kuTewandin[ResourceLoader|default]|kuTewandin.js
* wikt.showids[ResourceLoader|package|namespaces=0,2,4,108|actions=view|dependencies=mediawiki.util]|wikt.showids.js|wikt.showids.css
* EtytreeZoom[ResourceLoader|default|dependencies=mediawiki.util]|EtytreeZoom.js
* PagePreviews[ResourceLoader|default|dependencies=site,mediawiki.api,mediawiki.util,mediawiki.Title|skins=vector,vector-2022,monobook,timeless,modern,cologneblue]|PagePreviews.js
* AutoRedirect[ResourceLoader|default|dependencies=user,mediawiki.util|actions=view|namespaces=0]|AutoRedirect.js
* TreeDescs[ResourceLoader|default|namespaces=0,108|peers=TreeDescs-pagestyles]|TreeDescs.js
==AmûrênGuhartinê==
* wikEd[ResourceLoader]|wikEd.js
* charinsert[ResourceLoader|default|peers=charinsert-styles]|charinsert.js
* translation_editor[ResourceLoader|default|dependencies=mediawiki.notification|type=general]|silent_fail_storage.js|editor.js|translation_editor.js|translation_editor.css
* QQ[ResourceLoader|dependencies=mediawiki.util,oojs-ui-core,oojs-ui-widgets|type=general]|QQ.js|QQ.css
* WiktAccFormCreation[ResourceLoader|dependencies=mediawiki.util]|WiktAccFormCreation.js
* AjaxEdit[ResourceLoader|dependencies=mediawiki.util,mediawiki.user,mediawiki.api]|AjaxEdit.js
* EditHere[ResourceLoader|dependencies=mediawiki.api,oojs-ui-core,oojs-ui-widgets]|EditHere.js
* clearer-edit-summary[ResourceLoader|default|actions=view]|clearer-edit-summary.js
* DeluxeHistory[ResourceLoader|dependencies=user,mediawiki.util]|DeluxeHistory.js|DeluxeHistory.css
* JumpToError[ResourceLoader|dependencies=mediawiki.notification]|JumpToError.js
* aWa[ResourceLoader|rights=autoconfirmed|dependencies=mediawiki.util,mediawiki.api,mediawiki.user,user.options,mediawiki.Title|type=general]|aWa.js|aWa.css
* purgetab[ResourceLoader|dependencies=mediawiki.api,mediawiki.util]|purgetab.js
* start[ResourceLoader|default|package|namespaces=0,2,4,108|dependencies=mediawiki.util,ext.gadget.wikt.core]|start.js
* wikt.dsb[ResourceLoader|default|package|namespaces=0,2,4,108|actions=view|dependencies=mediawiki.util,ext.gadget.wikt.core]|wikt.dsb.js|wikt.dsb.css
* linkify-toolbar[ResourceLoader|default|actions=edit,submit|dependencies=ext.gadget.linkify,jquery.textSelection,ext.wikiEditor]|linkify-toolbar.js
==Kategorî==
* HotCat[ResourceLoader]|HotCat.js
* Cat-a-lot[ResourceLoader|rights=autoconfirmed]|Cat-a-lot.css|Cat-a-lot.js
==AmûrênVeşartî==
* LegacyScriptsNewNode[ResourceLoader|hidden|targets=desktop,mobile]|LegacyScriptsNewNode.js
* StorageUtils[ResourceLoader|hidden|dependencies=mediawiki.cookie,mediawiki.storage]|StorageUtils.js
* charinsert-core[ResourceLoader|hidden|dependencies=jquery.textSelection,user,mediawiki.storage]|charinsert-core.js
* VisibilityToggles[ResourceLoader|hidden|targets=desktop,mobile|dependencies=user,mediawiki.cookie]|VisibilityToggles.js
* defaultVisibilityToggles[ResourceLoader|hidden|default|targets=desktop,mobile|dependencies=ext.gadget.VisibilityToggles]|defaultVisibilityToggles.js
* Site[ResourceLoader|hidden|default]|Site.css
* catfix[ResourceLoader|hidden|default|dependencies=mediawiki.Title|categories=Pages using catfix]|catfix.js
* Palette[ResourceLoader|hidden|default]|Palette.css
* test[ResourceLoader|rights=autoconfirmed]|test.js
* citoid-helper[ResourceLoader|hidden|dependencies=mediawiki.util]|citoid-helper.js
* wikt.core[ResourceLoader|hidden|package|dependencies=mediawiki.util,mediawiki.storage]|wikt.core.js|wikt.core/sections.js|wikt.core/prefs.js|wikt.core/data-sections.json|wikt.core.css
* wikt.edit[ResourceLoader|hidden|package|dependencies=mediawiki.util,mediawiki.api,ext.gadget.wikt.core]|wikt.edit.js|wikt.edit/util.js|wikt.edit/wikitext.js|wikt.edit/langs.js|wikt.edit/labels.js|wikt.edit/posparams.js|wikt.edit/data-main.json|wikt.edit/ziman-core.json|wikt.edit.css
* wikt.cite[ResourceLoader|hidden|package|dependencies=mediawiki.api,oojs-ui-core,oojs-ui-widgets,oojs-ui-windows,ext.gadget.citoid-helper,ext.gadget.wikt.edit]|wikt.cite.js|wikt.cite/etimon.js|wikt.cite.css
* wikt.dsb-panels[ResourceLoader|hidden|package|dependencies=mediawiki.util,mediawiki.api,ext.gadget.wikt.core,ext.gadget.wikt.edit,ext.gadget.wikt.cite,ext.gadget.wikt.add-examples,oojs-ui-core,oojs-ui-widgets,oojs-ui-windows]|wikt.dsb-panels.js|wikt.dsb-panels.css
* wikt.start-wizard[ResourceLoader|hidden|package|dependencies=mediawiki.util,mediawiki.api,ext.gadget.wikt.core,ext.gadget.wikt.edit,ext.gadget.wikt.cite,ext.gadget.StorageUtils,ext.gadget.citoid-helper,oojs-ui-core,oojs-ui-widgets,oojs-ui-windows]|wikt.start-wizard.js|wikt.start-wizard.css
* wikt.add-examples[ResourceLoader|hidden|package|dependencies=oojs,oojs-ui,ext.gadget.citoid-helper,ext.gadget.StorageUtils,ext.gadget.wikt.core,ext.gadget.wikt.edit,ext.gadget.wikt.cite]|wikt.add-examples.js|wikt.add-examples.css
* linkify[ResourceLoader|hidden|dependencies=mediawiki.api]|linkify.js
* TreeDescs-pagestyles[hidden|type=styles]|TreeDescs-pagestyles.css
1qs0k02rwfpe6vs96pyfnr35zlfhl0i
remiz
0
160337
6532014
6531832
2026-09-18T14:00:00Z
Wikihez
7344
([[m:Special:MyLanguage/User:Jon Harald Søby/diffedit|diffedit]])
6532014
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku|z=m}}
# [[sembol]], [[dawer]], [[nîşan]], [[totem]], [[nimûne]], [[mînak]], [[îşaret]]
#* {{jêder|ku|Melayê Cizîrî|jg=Bi '''remza''' qabê qewseyni, ji wan birhan xeberdar în<br>Fe atil qewse biarîha ela ya ramiyel qewseyn}}
==== Tewandin ====
{{ku-tewîn-nav|mê}}
==== Jê ====
{{kol3|ku
|remzî
}}
==== Etîmolojî ====
Ji {{ji|ar|ku|رمز|tr=remz}}, hevreha {{hv|arc|ܪܡܙܐ}} (remza), {{hv|he|רמז}} (rêmez)
==== Werger ====
{{werger-ser}}
* {{Z|de}}: {{W+|de|Symbol|n}}
* {{Z|zh}}: {{W+|zh|符号}}
* {{Z|fa}}: {{W+|fa|نشانه}}
* {{Z|fi}}: {{W+|fi|symboli}}
* {{Z|fr}}: {{W+|fr|symbole|m}}, {{W+|fr|sigle|m}}
* {{Z|nl}}: {{W+|nl|symbool}}
* {{Z|io}}: {{W+|io|simbolo}}
* {{Z|en}}: {{W+|en|symbol}}, {{W+|en|trademark}}
* {{Z|it}}: {{W+|it|simbolo|m}}
* {{Z|lt}}: {{W+|lt|simbolis|m}}
* {{Z|sh}}: {{W+|sh|simbol}}, [[znak]]; [[oznaka]]
* {{Z|sh}}:
*: Kirîlî: [[симбол]], [[знак]] {{mê}}; [[ознака]] {{mê}}
*: Latînî: {{W-|la|simbol}}, [[znak]]; [[oznaka]]
* {{Z|sv}}: {{W+|sv|symbol}}, {{W+|sv|tecken|n}}
* {{Z|tr}}: {{W-|tr|sembol#Tirkî}}, {{W+|tr|remiz}}, {{W+|tr|rumuz}}, {{W+|tr|simge}}, {{W+|tr|taklit}}
{{werger-bin}}
{{mijar|ku|zimannasî}}
==== Anagram ====
* {{anagram|ku|a=eimrz|zimre}}
== {{ziman|tr}} ==
=== Navdêr ===
{{navdêr|tr}}
# [[remz]], [[sembol]]
89w24out49eqz9zi4ectpyllef6o3r5
çendemîn
0
180184
6532307
6279386
2026-09-19T08:13:32Z
Şêr
1103
ne lêker e!
6532307
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Cînav ===
{{cînav|ku|c=}}
# [[çendem]]
# a çendan
# [[kîjan]]
==== Etîmolojî ====
{{bêetîmolojî|ku}}
==== Werger ====
{{werger-ser}}
* {{Z|fa}}: {{W-|fa|چندمین}}
* {{Z|tr}}: {{W+|tr|kaçıncı}}
{{werger-bin}}
91znvvarzpamv539p7ogi1ql7gmp1hl
پنج
0
256436
6532047
5143161
2026-09-18T17:10:00Z
Wikihez
7344
[[Bikarhêner:Wikihez/templateScript2.js|TS]]: Ji [[en:پنج|en.wikt]]
6532047
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Navdêr ===
{{navdêr|ckb}}
# [[reh]]
#: {{hevmane|ckb|ڕەگ|ڕیشە}}
== {{ziman|fa}} ==
=== Bilêvkirin ===
: {{ku-tîp|penc}}
=== Navdêr ===
{{navdêr|fa|tr=}}
# [[pênc]]
==== Têkildar ====
* {{g|fa|شمار|tr=şomar}}
==== Etîmolojî ====
{{etymon|fa|id=pênc|:mîr|pal:<tr:pnc><ts:panǰ><etimon:mîr<ira-pro:*pánča<id:pênc>>>|dar=1|metn=++}}
Bide ber {{hv|ku|pênc}}, {{hv|os|фондз}}, {{hv|ps|پنځه|tr=pindzə}}, {{hv|ae|𐬞𐬀𐬧𐬗𐬀}}, {{hv|sa|पञ्च|tr=páñca}}, {{hv|srh|pundz}}.
1hbf0neiiq0vq5vwd8l7y3t8oyxiu3o
پنجه
0
256437
6532043
5272587
2026-09-18T17:01:49Z
Wikihez
7344
/* Farisî */ [[Bikarhêner:Wikihez/templateScript2.js|TS]]: Ji [[en:پنجه|en.wikt]]
6532043
wikitext
text/x-wiki
== {{ziman|fa}} ==
=== Bilêvkirin ===
{{fa-IPA|pan`ja}}
=== Navdêr ===
{{navdêr|fa|tr=pence|p=پنجهها}}
# [[pence]]
# {{e|fa|axlebî|_|Darî|Tacîkî}} [[çetel]]
==== Etîmolojî ====
{{ety|fa|id=pence|:qertaf|پَنْج<tr:penc><t:pênc>|ـَه<id:paşgir><tr:-e>|tree=1|metn=1}}
==== Dûnde ====
{{stûn|
* {{dû|hy|փանջա|deyn=1}}
* {{dû|az|pəncə|deyn=1}}
* {{dû|bn|পাঞ্জা|deyn=1}}
* {{dû|crh|panca|deyn=1}}
* {{dû|inc-hnd|-|deyn=1}}
*: {{dû|hi|पंजा}}
*: {{dû|ur|پَن٘جَہ}}
* {{dû|te|పంజా}}
* {{dardû|ota|پنچه|deyn=1}}
* {{dû|tk|penje|deyn=1}}
}}
== {{ziman|ps}} ==
=== Navdêr ===
{{navdêr|ps|tr=panǰá}}
# {{f|ps|aman}} {{g|ku|çetel}}
bcg9o51ebh9bs0pgqtsk7o96u6mlxoh
بەدبەخت
0
268389
6532125
5863854
2026-09-19T07:43:11Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin (Test)
6532125
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bedbext
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bextreş]], [[bêsiûd]], [[bênesîb]]
qh36a5mtemlrp197cy62k1ucfhiys4u
بەدرەقە
0
268390
6532126
5863856
2026-09-19T07:44:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532126
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bedreqe
=== Navdêr ===
{{navdêr|ckb}}
# [[rêber]], [[raber]]
6741ilb66owhqdiczlrhzwobxi2g4dz
بەفر
0
268391
6532127
6433221
2026-09-19T07:44:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532127
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:befir
=== Navdêr ===
{{navdêr|ckb}}
# [[berf]], [[befir]]
==== Anagram ====
* {{anagram|ckb|a=برفە|بەرف}}
fw75ep5vliw5duqyx4jvx0k4vz4a7v0
بەھا
0
268392
6532128
5863958
2026-09-19T07:44:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532128
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:beha
=== Navdêr ===
{{navdêr|ckb}}
# [[biha]], [[nirx]], [[qîmet]], [[fiyet]]
84e18kyhsepx1r2sqg5xygwp7ta35bw
بەھانە
0
268393
6532129
5863962
2026-09-19T07:44:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532129
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:behane
=== Navdêr ===
{{navdêr|ckb}}
# [[hêcet]], [[hincet]], [[bihane]]
mev6a6llfmxa3ohpw5yqxsjizmv40ok
بەھارات
0
268394
6532130
5863960
2026-09-19T07:44:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532130
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:beharat
=== Navdêr ===
{{navdêr|ckb}}
# [[biharat]]
tslx6owygu1tuu4rs479jrvcbek25ez
بەھەشت
0
268395
6532131
5863968
2026-09-19T07:45:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532131
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:beheşt
=== Navdêr ===
{{navdêr|ckb}}
# [[biheşt]], [[buhuşt]], [[cennet]], [[paradîs]]
367td2gfi4ay2v3zvnvl3ongs49874o
بەھر
0
268396
6532119
5863964
2026-09-19T07:31:39Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532119
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:behr
=== Lêker ===
{{lêker|ckb}}
# [[par]], [[pişk]], [[behr]]
4r424wsv8yddpzybt7qjflgx63rf14a
6532124
6532119
2026-09-19T07:36:39Z
~2026-50522-76
15382
Guhartoya [[Special:Diff/6532119|6532119]] yê [[Special:Contributions/JiyanBot|JiyanBot]] ([[User talk:JiyanBot|gotûbêj]]) şûnde kir
6532124
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:behr
=== Mane ===
{{bêcure|ckb}}
# [[par]], [[pişk]], [[behr]]
lds0nxc9qwpq2vojqbg4p180fmynkba
6532132
6532124
2026-09-19T07:45:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532132
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:behr
=== Navdêr ===
{{navdêr|ckb}}
# [[par]], [[pişk]], [[behr]]
2mj07i2sfgs0xsv99ltete4p8knkhxa
بەحر
0
268397
6532133
5863836
2026-09-19T07:45:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532133
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:beĥr
=== Navdêr ===
{{navdêr|ckb}}
# [[derya]], [[zerya]], [[behr]]
ojerux8mfz5g5ysz839vro16ar3tdp6
بەھرە
0
268398
6532120
5863966
2026-09-19T07:31:49Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532120
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:behre
=== Lêker ===
{{lêker|ckb}}
# [[qabîliyet]], [[tiwana]], [[karîn]], [[jêhatîtî]]
7bvlc210gv30rdvtrsljqsbyrcid7yz
6532123
6532120
2026-09-19T07:36:22Z
~2026-50522-76
15382
Guhartoya [[Special:Diff/6532120|6532120]] yê [[Special:Contributions/JiyanBot|JiyanBot]] ([[User talk:JiyanBot|gotûbêj]]) şûnde kir
6532123
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:behre
=== Mane ===
{{bêcure|ckb}}
# [[qabîliyet]], [[tiwana]], [[karîn]], [[jêhatîtî]]
gv9f0puk3rsd7s3buq395h4hz64ry0l
بەژ
0
268399
6532121
5863900
2026-09-19T07:31:59Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532121
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bej
=== Lêker ===
{{lêker|ckb}}
# [[erd]], [[ax]], [[beyaristan]], [[bej]]
4rsqq13u494q5se6qo9gcx9aqrnrwil
6532122
6532121
2026-09-19T07:34:19Z
Şêr
1103
xeletiya bot
6532122
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bej
=== Navdêr ===
{{navdêr|ckb}}
# [[erd]], [[ax]], [[beyaristan]], [[bej]]
m60ooweo5gjga8yw84jecrhet6eyjaq
بەلایەن
0
268404
6532134
5863930
2026-09-19T07:45:35Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532134
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:belayen
=== Rengdêr ===
{{rengdêr|ckb}}
# [[alîgir]], [[bialî]], ne bêalî
mhpzbkg4456xss57rwgp1xxjao3ekrk
بەلەم
0
268408
6532135
5863942
2026-09-19T07:45:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532135
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:belem
=== Navdêr ===
{{navdêr|ckb}}
# [[beleme]], [[keştîk]], [[qayik]]
svbgcffahfmw1c9he9vcpqgp8f5t66w
بەلەز
0
268409
6532136
5863938
2026-09-19T07:45:55Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532136
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:belez
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bilez]], [[lezgîn]]
a1syw0uinjrp50c99i9vy6djj45nuw9
بەڵەیاندن
0
268410
6532137
5863944
2026-09-19T07:46:05Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532137
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:belleyandin
=== Lêker ===
{{lêker|ckb}}
# [[pesend kirin]], [[pejirandin]], [[beliyandin]], [[qebûl kirin]]
njok88vbem2z9h7uaxjrix971ykvoh4
بەڵگە
0
268412
6532138
5863934
2026-09-19T07:46:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532138
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bellge
=== Navdêr ===
{{navdêr|ckb}}
# [[belge]], [[nîşane]], [[delîl]], [[govahî]]
spe338bh7khu93yh6o4scpfpagbryo0
بەناوبانگ
0
268413
6532139
5863946
2026-09-19T07:46:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532139
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:benawbang
=== Rengdêr ===
{{rengdêr|ckb}}
# [[navdar]], [[binavûdeng]], [[meşhûr]]
58zq187x3057rwq9275q5sf7e9ecntv
بەند
0
268414
6532140
5863948
2026-09-19T07:46:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532140
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bend
=== Navdêr ===
{{navdêr|ckb}}
# [[bend]], [[bend]], [[baraj]]
iimmben5cwqsqi6zao9x4c3pq52rb9t
6532143
6532140
2026-09-19T07:47:05Z
Şêr
1103
6532143
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bend
=== Navdêr ===
{{navdêr|ckb}}
# [[bend]], [[bendav]], [[baraj]]
4k6ttarjtx4x3dkxh9y8agjlck52bsa
بەندە
0
268415
6532141
5863950
2026-09-19T07:46:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532141
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bende
=== Navdêr ===
{{navdêr|ckb}}
# [[xulam]], [[kole]]
ixonuui3dwgh37ttpdial17ix5jq53x
بەندەگی
0
268416
6532142
5863952
2026-09-19T07:46:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532142
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bendegî
=== Navdêr ===
{{navdêr|ckb}}
# [[xulamî]], [[koletî]]
kq9ro9fbjnnsj4kape0c51j55bnx7wy
بەنگ
0
268417
6532144
5863954
2026-09-19T07:47:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532144
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:beng
=== Navdêr ===
{{navdêr|ckb}}
# [[heşîş]], [[tilyak]]
9btwl1olflsogy1np8vihp8x16ae54a
بەق
0
268418
6532145
5863916
2026-09-19T07:47:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532145
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:beq
=== Navdêr ===
{{navdêr|ckb}}
# [[nêrekew]], kewê nêr
4wnvh1p5v765u71pmlhe5erb3sjxzae
بەقال
0
268419
6532146
5863918
2026-09-19T07:47:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532146
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:beqal
=== Navdêr ===
{{navdêr|ckb}}
# [[beqal]], [[firoşkar]], [[bifiroş]]
1jowfxpacbemumochk4c0wsr3kezkjd
بەقلیسۆک
0
268420
6532147
5863920
2026-09-19T07:47:35Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532147
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:beqlîsok
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bêşerm]], [[bênamûs]], [[bêşeref]]
snqnl5cm9skndru765d7wew17wilhnh
بەرایی
0
268421
6532148
5863860
2026-09-19T07:47:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532148
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:berayî
=== Navdêr ===
{{navdêr|ckb}}
# [[destpêk]], [[pêşekî]]
trk44sk5vas2mv6nqs8fneps0zkxkvh
بەردەوک
0
268423
6532149
5863864
2026-09-19T07:47:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532149
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:berdewk
=== Navdêr ===
{{navdêr|ckb}}
# [[xweşheval]], [[dost]], [[birader]]
iw0malluuv2ygm4bbbgtguo8o19qi8h
بەرە
0
268424
6532150
5863888
2026-09-19T07:48:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532150
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bere
=== Navdêr ===
{{navdêr|ckb}}
# [[enî]], [[bere]]: Berey Kurdistanî بەرەی کوردستانی Bereyê Kurdistanî, Eniya Kurdistanî
sa9f3j85l8psvl49x1f8uxe6nqdcp3j
بەرەو
0
268426
6532151
5863892
2026-09-19T07:48:15Z
JiyanBot
3048
Cure Daçek hat lêzêdekirin
6532151
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:berew
=== Daçek ===
{{daçek|ckb}}
# [[ber]], [[ber bi]], [[ber bi]], [[ve]], [[ber bi]], [[de]], [[berev]], ber bi derekê ve: berew ayindeyêkî nadiyar بەرەو ئایندەیێکی نادیار ber bi pêşerojek nediyar
7molp0eldol9k6rru9xzryllblhbai2
بەرەوژێرکە
0
268427
6532152
5863896
2026-09-19T07:48:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532152
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:berewjêrke
=== Navdêr ===
{{navdêr|ckb}}
# [[nişîvî]], [[berejêrk]]
a18esc5sf04stnp06hyobnmaduwt8su
بەرەوژۆرکە
0
268428
6532153
5863894
2026-09-19T07:48:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532153
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:berewjorke
=== Navdêr ===
{{navdêr|ckb}}
# [[evrazî]], [[berejork]]
gul4u8m2xn12f7k04yzxn5rka8eiwrm
بەرەزە
0
268429
6532154
5863890
2026-09-19T07:48:45Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532154
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bereze
=== Rengdêr ===
{{rengdêr|ckb}}
# [[aware]], [[derbider]], [[bêmal]]
5j1fxxbexocd1zl1r36ojhghhjq3tj2
بەرگری
0
268431
6532155
5863878
2026-09-19T07:48:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532155
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bergirî
=== Navdêr ===
{{navdêr|ckb}}
# [[berevanî]]
nb1k0905yvtu63r1vt09jyn0h36mgi7
بەرژەوەندی
0
268433
6532156
5863872
2026-09-19T07:49:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532156
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:berjewendî
=== Navdêr ===
{{navdêr|ckb}}
# [[berjewendî]], [[menfeet]], [[mifa]], [[sûd]], [[kelke]], [[feyde]]
ezq7k7zrrgwnx82qiaxmwjwr45dc0ss
بەرف
0
268434
6532157
6433224
2026-09-19T07:49:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532157
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:berf
=== Navdêr ===
{{navdêr|ckb}}
# [[befir]], [[berf]]
==== Anagram ====
* {{anagram|ckb|a=برفە|بەفر}}
2z9cj7228fak9g2ifjdim75i5xzbg3q
بەرگ
0
268435
6532158
5863876
2026-09-19T07:49:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532158
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:berg
=== Navdêr ===
{{navdêr|ckb}}
# [[berg]], [[cild]], [[rû]]
mag9iqv4xztotnizll55aub6w16rnqc
بەرگەشتە
0
268437
6532159
5863882
2026-09-19T07:49:35Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532159
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bergeşte
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bextreş]], [[bêsiûd]], [[bênesîb]]
kkkwovv2s4r5fnldgu6p56wly8bow6w
بەروودوا
0
268439
6532160
5863886
2026-09-19T07:49:45Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6532160
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:berûdiwa
=== Hoker ===
{{hoker|ckb}}
# [[berûpişt]], [[berevajî]]
qymelx5kougv1mn5tnez0vr3a6a3tth
بەروار
0
268440
6532161
5863884
2026-09-19T07:49:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532161
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:berwar
=== Navdêr ===
{{navdêr|ckb}}
# [[roj]], [[dem]], [[tarîx]], dema dê tiştek bibe yan bêt kirin
thn47wr7130ol0scopjl7yyn1szj73f
بەرز
0
268441
6532162
5863866
2026-09-19T07:50:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532162
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:berz
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bilind]], [[bala]], [[berz]], [[bihagiran]], [[jêhatî]], [[berkeftî]], [[hêja]]
6429rb94bap7qmfyvxjk9pberd4r7ye
بەرزە
0
268442
6532163
5863868
2026-09-19T07:50:15Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532163
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:berze
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hinda]], [[wenda]], [[berze]], [[nediyar]], [[nexwiya]]
2uvydd2vt5hq7hxs8aavon07temr7uw
بەستە
0
268444
6532164
5863904
2026-09-19T07:50:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532164
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:beste
=== Navdêr ===
{{navdêr|ckb}}
# [[pûte]], [[giringî]], [[watedarî]]
nktx98qd8giuc1qh4w7mzy7pdl5y68b
بەش
0
268446
6532165
5863908
2026-09-19T07:50:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532165
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:beş
=== Navdêr ===
{{navdêr|ckb}}
# [[par]], [[behr]], [[pişk]], [[beş]], [[parçe]], ker; babet; biwêj: Beşî naka بەشی ناکا têra nake''
kxklahgetbo1y1jghturu639mmve5m1
بەتڵانە
0
268449
6532166
5863834
2026-09-19T07:50:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532166
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:betllane
=== Navdêr ===
{{navdêr|ckb}}
# [[azane]], [[betlane]], [[tatîl]]
ei7zuy9xo4593iylp5j5c9vsyasxsay
بەو
0
268450
6532167
5863970
2026-09-19T07:50:55Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6532167
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bew
=== Hoker ===
{{hoker|ckb}}
# [[bi wê]], [[bi wî]]
on88u8o2e8vcn7y81747kct8k0pouxr
بەخش
0
268454
6532168
5863846
2026-09-19T07:51:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532168
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bexş
=== Navdêr ===
{{navdêr|ckb}}
# [[diyarî]], [[xelat]], [[efû]]
a9i8ryhm4ouy5tjd0yt7zv3sjh2ovj8
بەخشەندە
0
268456
6532170
5863848
2026-09-19T07:51:15Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532170
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bexşende
=== Rengdêr ===
{{rengdêr|ckb}}
# [[dilovan]], [[mihrevan]], [[camêr]], [[merd]], [[bexşende]]
1hp3mp4ofcq08lkhzwgvfl4jzeyfwds
بەخت
0
268458
6532171
5863838
2026-09-19T07:51:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532171
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bext
=== Navdêr ===
{{navdêr|ckb}}
# [[bext]], [[şans]], [[nesîb]]
228yvw9gii8mps6nn2jk0q9zywk7jog
بەختەوەر
0
268460
6532172
5863844
2026-09-19T07:51:35Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532172
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bextewer
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bextbaş]], [[binesîb]]
qt0wwfaxz33nxdi2ziwzozi1qk3ddlp
بەختیار
0
268461
6532173
5863842
2026-09-19T07:51:45Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532173
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bextiyar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[dilşad]], [[kêfxweş]], [[bextiyar]]
szh810ksfqjybh7rh7enun6pv0rdgf0
بەخترەش
0
268462
6532174
5863840
2026-09-19T07:51:55Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532174
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bextreş
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bextreş]], [[bênesîb]]
0oynetimzxbcqww6cq33efgnpp7035d
بەیانی
0
268464
6532175
5863982
2026-09-19T07:52:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532175
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:beyanî
=== Navdêr ===
{{navdêr|ckb}}
# [[spêde]], [[sibe]], [[serê sibê]], [[sihar]]
1v6mzccfhe7vptwvuztjwh11canj0ij
بەیاننامە
0
268465
6532176
5863980
2026-09-19T07:52:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532176
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:beyanname
=== Navdêr ===
{{navdêr|ckb}}
# [[daxwiyanî]], [[îlan]]
9zimz9kz7p9s9tmgmrttglxadcqcls4
بەیار
0
268466
6532177
5863974
2026-09-19T07:52:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532177
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:beyar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[beyar]], erdê ziha / hişk
j8tb19gfkfctpq1lgg9cr7huj4d1z5o
بەیاز
0
268468
6532178
5863978
2026-09-19T07:52:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532178
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:beyaz
=== Navdêr ===
{{navdêr|ckb}}
# [[destnivîs]], [[dîwan]]
nrpgy4t93ion3f7h36n8sd168qbedc3
بەیچەڵ
0
268469
6532179
5863984
2026-09-19T07:52:45Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532179
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:beyçell
=== Rengdêr ===
{{rengdêr|ckb}}
# [[stewr]], jina zarok nabin
nmo2jfjbkwm53pqyb410lqybrwqec3m
بەیدەست
0
268471
6532180
5863986
2026-09-19T07:52:55Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532180
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:beydest
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bêdest]], [[bêdestûdar]], [[bêdesthilat]], [[bêhêz]]
tavl4ewk5d39j43xoybp08zawi3ax00
بەینەت
0
268472
6532181
5863988
2026-09-19T07:53:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532181
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:beynet
=== Navdêr ===
{{navdêr|ckb}}
# [[pêbawerî]], [[emînî]], [[sadiqî]], [[bawerîpêanîn]]
twi889325ek295h9kluic3kmob4570k
بەینەتدار
0
268473
6532182
5863990
2026-09-19T07:53:15Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532182
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:beynetdar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[pêbawer]], [[sadiq]], [[emîn]]
fqbrcf4kft72d4nfxeghkme06jhgr8s
بەزم
0
268476
6532183
5863898
2026-09-19T07:53:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532183
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bezm
=== Navdêr ===
{{navdêr|ckb}}
# [[şahî]], [[şehyan]], [[kêfxweşî]], [[aheng]]
# [[mijar]], [[babet]]
jag27ix5fotdagry48vwv8giea06bfd
بێگومان
0
268481
6532184
5863668
2026-09-19T07:53:35Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532184
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bêguman
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bêşik]], [[bêguman]], [[bivê-nevê]], [[bêvirde-wirde]], [[bêhirve-wirve]]
iphtopa08hqpdbmeyo5odmng83711aw
بێھیوا
0
268482
6532185
5863814
2026-09-19T07:53:45Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532185
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bêhîwa
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bêhêvî]]
augvwvmxhff1jp6dtttsqbnkvekkh0r
بێژار
0
268483
6532186
5863535
2026-09-19T07:53:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532186
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bêjar
=== Navdêr ===
{{navdêr|ckb}}
# [[pîne]], [[pinî]]
g4qymraldtbq69sqz2gxcpc1mk5by5j
بێلایەن
0
268484
6532187
5863675
2026-09-19T07:54:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532187
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bêlayen
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bêal]], [[bêalî]]
li4kk13ki9nkxynmom2d40qvp6tvess
بێلایەنی
0
268485
6532188
5863677
2026-09-19T07:54:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532188
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bêlayenî
=== Navdêr ===
{{navdêr|ckb}}
# [[bêalîtî]]
7pkmqnzlc1qcdnlhvxghka96oaee289
بێنەوبەرە
0
268486
6532189
5863788
2026-09-19T07:54:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532189
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bênewbere
=== Navdêr ===
{{navdêr|ckb}}
# [[prose]], [[pêvajo]]
eaqsx7rtwjmp6qo8ylcl666iygig5cx
بێسەرووشوێن
0
268487
6532190
5863559
2026-09-19T07:54:35Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532190
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bêserûşiwên
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bêsereder]], [[nediyar]], [[wenda]]
miigp3d5ksp09qf1yzoob2t1oeeu4zg
بێشەڵان
0
268490
6532191
5863578
2026-09-19T07:54:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532191
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bêşellan
=== Navdêr ===
{{navdêr|ckb}}
# [[dalistan]], [[dehlistan]]
gnkri2lsp2a28t6kfy8zyfacr7693vc
بێتار
0
268492
6532192
5863392
2026-09-19T07:54:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532192
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bêtar
=== Navdêr ===
{{navdêr|ckb}}
# [[tengasî]], [[tengije]], [[tengavî]], [[alozî]], [[kosp]]
4r1dm9pzb2z2pr2abjsia2ppbtj9snn
بێخ
0
268497
6532193
5863442
2026-09-19T07:55:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532193
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bêx
=== Navdêr ===
{{navdêr|ckb}}
# [[bingeh]], [[esas]]
a8x9xvdw1e8fhr38e78dn90t8nw67zx
بێخبڕ
0
268498
6532194
5863450
2026-09-19T07:55:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532194
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bêxbirr
=== Navdêr ===
{{navdêr|ckb}}
# [[akam]], [[encam]], [[dawî]]
bcqsc63sipk1ahesp66gnrrq89pi0m3
بێزار
0
268499
6532195
5863523
2026-09-19T07:55:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532195
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bêzar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[betilî]], [[bêzar]], [[tengezar]], [[westayî]]
hapi15jnlxr0bvq865ra6igmpuirhgy
بژاردە
0
268502
6532196
5862588
2026-09-19T07:55:35Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532196
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bijarde
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bijare]]
gscksp36a54x8qf6os6wmqa1mscttbh
بژوولک
0
268504
6532197
5862589
2026-09-19T07:55:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532197
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bijûlk
=== Navdêr ===
{{navdêr|ckb}}
# [[bûjang]], [[mûjang]]
9m92gxm5yqit0fw6utx8qcmcu4bn1uf
بڵند
0
268507
6532198
5862701
2026-09-19T07:55:55Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532198
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:billind
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bilind]], [[berz]], [[bala]]
af533l46m336sxzacw2z2cm6p9qzpk9
6532205
6532198
2026-09-19T07:56:56Z
Wikihez
7344
/* Soranî */ (bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re)
6532205
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Rengdêr ===
{{rengdêr|ckb|tr=billind}}
# [[bilind]], [[berz]], [[bala]]
cocm73mlyifas6194v9uzh94rx161zl
بلیمەت
0
268508
6532199
5862751
2026-09-19T07:56:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532199
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bilîmet
=== Rengdêr ===
{{rengdêr|ckb}}
# [[dahî]], [[bilîmet]]
pqyq7emfkc8jjlv7s80exsqdciux0ag
بناغە
0
268511
6532200
5862772
2026-09-19T07:56:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532200
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:binaghe
=== Navdêr ===
{{navdêr|ckb}}
# [[bingeh]], [[esas]]
m1vmguop0yyja646wcamt5zjqr59vzr
بنچە
0
268512
6532201
5862779
2026-09-19T07:56:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532201
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:binçe
=== Navdêr ===
{{navdêr|ckb}}
# [[nifş]], [[cêl]]
7y97yp1aj74pcs19o9fhkeoukwkerzs
بنچینەیی
0
268514
6532202
5862777
2026-09-19T07:56:35Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532202
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:binçîneyî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bingehîn]], [[esasî]]
jketwr144394u1uqws2uxfnzordinja
بنەما
0
268515
6532203
5862836
2026-09-19T07:56:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532203
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:binema
=== Navdêr ===
{{navdêr|ckb}}
# [[bingeh]], [[esas]]
o2jkloqrbnpi9g4h9rzghh9ev4znzl0
بنەوش
0
268516
6532204
5862838
2026-09-19T07:56:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532204
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:binewş
=== Navdêr ===
{{navdêr|ckb}}
# [[binefş]]
4uwo3jovl168v8bta4gc36n7jjv7hyw
بنکە
0
268519
6532206
5862817
2026-09-19T07:57:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532206
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:binke
=== Navdêr ===
{{navdêr|ckb}}
# [[bingeh]], [[esas]]
iit16kqhkdenzyzrlgc4szrvfvksv6x
بڕێک
0
268521
6532207
5862548
2026-09-19T07:57:15Z
JiyanBot
3048
Cure Cînav hat lêzêdekirin
6532207
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:birrêk
=== Cînav ===
{{cînav|ckb}}
# [[hinek]], [[piçek]]
c1rgyqq4mfyz0ozn58sh0c79rmk29ka
بڕاو
0
268524
6532208
6433251
2026-09-19T07:57:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532208
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:birraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[birrî]], [[qutkirî]], [[veqetandî]]
==== Anagram ====
* {{anagram|ckb|a=ابوڕ|بڕوا}}
q5tkepakiicvmmhvu78mwmadyg7v863
بڕیار
0
268540
6532209
5862528
2026-09-19T07:57:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532209
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:birryar
=== Navdêr ===
{{navdêr|ckb}}
# [[biryar]], [[qerar]]
1ks2409si3lstpqgd8jc47jf7h6n940
بسکە
0
268542
6532210
5862601
2026-09-19T07:57:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532210
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:biske
=== Navdêr ===
{{navdêr|ckb}}
# [[girnij]], [[bişir]]
1po05o92t1n03inxq8v2s6wsu79a8zk
بشێوە
0
268543
6532211
5862615
2026-09-19T07:57:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532211
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bişêwe
=== Navdêr ===
{{navdêr|ckb}}
# [[tevlihevî]], [[alozî]]
bchmlygs7gjso0pyickbrnaigruvhi9
بوێر
0
268545
6532212
5863157
2026-09-19T07:58:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532212
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:biwêr
=== Rengdêr ===
{{rengdêr|ckb}}
# [[wêrek]], [[biste]], [[cesûr]], [[bicesaret]]
r7rpe0zsing2m7ed8paemc85niy3x90
بیانوو
0
268547
6532213
5863371
2026-09-19T07:58:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532213
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:biyanû
=== Navdêr ===
{{navdêr|ckb}}
# [[bihane]], [[hêcet]], [[hincet]]
m1mr2hkdd25674bgadtguaq1r9gi8vg
بزووتنەوە
0
268553
6532214
5862585
2026-09-19T07:58:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532214
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bizûtnewe
=== Navdêr ===
{{navdêr|ckb}}
# [[bizav]], [[tevger]], [[hereke]]
tdbwkqudz0tjlv8xcfrrpfrtb6jd7nz
بیبن
0
268554
6532215
5863377
2026-09-19T07:58:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532215
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bîbin
=== Navdêr ===
{{navdêr|ckb}}
# [[kemer]], [[kember]], [[şal]]
bxgqd62xv7206lqa6kgopab365x2jda
بیجامە
0
268556
6532216
5863410
2026-09-19T07:58:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532216
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bîcame
=== Navdêr ===
{{navdêr|ckb}}
# [[pîjama]], [[bîcame]]
t5jv90fg3zadx4gbx2jb1qwjky74ll9
بیچم
0
268557
6532217
5863426
2026-09-19T07:58:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532217
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bîçm
=== Navdêr ===
{{navdêr|ckb}}
# [[biçm]], [[serûçav]], [[bejnûbal]], [[rû]], [[derdirûv]]
mgbv7p3z0r69dycjlq2mg9dej7tky8k
بیراز
0
268562
6532218
5863474
2026-09-19T07:59:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532218
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bîraz
=== Navdêr ===
{{navdêr|ckb}}
# [[lome]], [[lêdan]]
k0pemrwuvczrz4806f67inhbhzo4mpd
بیرە
0
268563
6532219
5863521
2026-09-19T07:59:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532219
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bîre
=== Navdêr ===
{{navdêr|ckb}}
# [[bîre]], [[bîra]]
r3xfnxh95brhlpwuinu1oaa32amhlga
بیرتەسک
0
268564
6532220
5863478
2026-09-19T07:59:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532220
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bîrtesk
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bênteng]]
5f90vuxb9r9wqvgnouwo4j6mz8yfgqh
بیرووڕا
0
268565
6532221
5863518
2026-09-19T07:59:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532221
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bîrûrra
=== Navdêr ===
{{navdêr|ckb}}
# [[bîrewerî]], dîtin û nerîn, [[bawerî]]
dk1n2y1x6y10bwkrpccwblor0gr46gr
بیستا
0
268566
6532222
6433215
2026-09-19T07:59:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532222
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bîsta
=== Navdêr ===
{{navdêr|ckb}}
# [[guhdar]]
==== Anagram ====
* {{anagram|ckb|a=ابتسی|بایست}}
7uj0u1kanb298bqy6d1ddtwab1cy1k6
بیستەر
0
268567
6532223
5863549
2026-09-19T07:59:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532223
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bîster
=== Navdêr ===
{{navdêr|ckb}}
# [[bihîster]], [[guhdar]]
4fug31w8qiwi3ldkmm9x1weypbv8ie4
بیستن
0
268568
6532224
5863544
2026-09-19T08:00:05Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532224
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bîstin
=== Lêker ===
{{lêker|ckb}}
# [[bihîstin]], [[bîstin]], [[guh lê bûn]]
ms1t7df7l8v84am5w18n24ft41q6a5y
بیستۆک
0
268569
6532225
5863547
2026-09-19T08:00:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532225
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bîstok
=== Navdêr ===
{{navdêr|ckb}}
# [[telefon]], [[bîstok]], [[bihîstok]], [[wergirk]]
emunbt4m1hhlbmr0mw0cf3pwzts4or6
بیستراو
0
268570
6532226
5863539
2026-09-19T08:00:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532226
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bîstraw
=== Navdêr ===
{{navdêr|ckb}}
# [[bihîstî]], ya hatî guhlêbûn
clmritt7n974filzqfo3gvjp8xe0oky
بیڤر
0
268571
6532227
5863632
2026-09-19T08:00:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532227
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bîvir
=== Navdêr ===
{{navdêr|ckb}}
# [[bivir]], [[darbirrk]]
bupycckm3tzzkhvsw05t7y5pqie79aw
بۆچوون
0
268572
6532228
5863159
2026-09-19T08:00:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532228
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:boçûn
=== Navdêr ===
{{navdêr|ckb}}
# dîtin û nerîn, [[helwest]], [[boçûn]], [[bîrewerî]]
kv3dx3rfj224se480awdz33yee7rugr
بۆنە
0
268574
6532229
5863165
2026-09-19T08:00:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532229
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bone
=== Navdêr ===
{{navdêr|ckb}}
# [[sedem]], [[minasibet]], [[bone]]
cj0mv1fx2mzb30ojapd5s92rj17c643
بۆران
0
268575
6532230
5863160
2026-09-19T08:01:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532230
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:boran
=== Navdêr ===
{{navdêr|ckb}}
# [[bahoz]], [[barove]], [[bager]]
ke2fb8105twozj4ej5l935vehlrn2le
بۆردن
0
268578
6532231
5863162
2026-09-19T08:01:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532231
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bordin
=== Navdêr ===
{{navdêr|ckb}}
# [[borîn]], [[buhurîn]], [[bihirîn]]
4v4bwmiehuayjkji53rh8s951hq12mc
بۆق
0
268579
6532232
5863163
2026-09-19T08:01:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532232
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:boq
=== Navdêr ===
{{navdêr|ckb}}
# [[beq]]
pwly653x0jw184t5cvqxvckcduti1mk
بۆینباخ
0
268582
6532233
5863166
2026-09-19T08:01:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532233
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:boyinbax
=== Navdêr ===
{{navdêr|ckb}}
# [[stobend]], [[krawat]]
rk9czt2t7wh9v13oy9w06m6jst9p39o
بووێژ
0
268583
6532234
5863148
2026-09-19T08:01:45Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532234
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:buwêj
=== Rengdêr ===
{{rengdêr|ckb}}
# [[biaxiftin]], [[devbixeber]], [[zêdebêj]]
dmifhbnymxwjlqlpu2veboezdy0g34n
بوخچە
0
268584
6532235
5863131
2026-09-19T08:01:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532235
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:buxçe
=== Navdêr ===
{{navdêr|ckb}}
# [[buxçik]], [[buxçe]]
gfa5fxx4sr1uq1kzw1487qmsurb03nx
بوختان
0
268585
6532236
5863129
2026-09-19T08:02:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532236
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:buxtan
=== Navdêr ===
{{navdêr|ckb}}
# [[newehî]], [[sêf]], [[fesad]], [[buxtan]]
bj5s0i0896a04103dwj41puw2t0kbmu
بوودینە
0
268587
6532237
5863141
2026-09-19T08:02:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532237
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bûdîne
=== Navdêr ===
{{navdêr|ckb}}
# [[nane]]
6ukv36ni9apn4mrx7kbdzr52miszw8x
بووژاندن
0
268589
6532238
5863144
2026-09-19T08:02:25Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532238
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bûjandin
=== Lêker ===
{{lêker|ckb}}
# [[vejandin]], [[vejiyandin]]
b64k8ci2ic6jx80eegm5rwvihrnihop
بووم
0
268590
6532239
5863146
2026-09-19T08:02:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532239
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bûm
=== Navdêr ===
{{navdêr|ckb}}
# [[erd]], [[zevî]], [[ax]], [[xak]]
# [[avanî]], [[sazî]]
5yj6v2lw8mzbvcrj8r4jv1fdyjdx02u
بووسە
0
268594
6532240
5863145
2026-09-19T08:02:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532240
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:bûse
=== Navdêr ===
{{navdêr|ckb}}
# [[xweveşartin]], [[veşartokane]]
1xt5ibtqp691eci4igxu2yza2p9i3e4
چاچی
0
268598
6532241
5866763
2026-09-19T08:02:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532241
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çaçî
=== Navdêr ===
{{navdêr|ckb}}
# [[çayçî]], [[çaygêr]]
oxthjqpef6ltzad1aj3poe64jbaib50
چادرگا
0
268600
6532242
5866781
2026-09-19T08:03:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532242
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çadirga
=== Navdêr ===
{{navdêr|ckb}}
# [[war]], [[wargeh]], [[xîvetgeh]], [[çadirgeh]]
lemwv6ey3erw93005bx3dod8rpcapxr
چاکەت
0
268602
6532243
5866845
2026-09-19T08:03:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532243
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çaket
=== Navdêr ===
{{navdêr|ckb}}
# [[çaket]], [[saqo]], [[qapût]]
7f7tqf2x8f4nvnx2ubvsf002oui9huf
چاڵ
0
268603
6532244
5866847
2026-09-19T08:03:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532244
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çall
=== Navdêr ===
{{navdêr|ckb}}
# [[çal]], [[kend]], [[kosp]], [[kun]]
lrxwawo5rc73kgl0n1wqzth10c3u8fm
چاڵاو
0
268605
6532245
5866857
2026-09-19T08:03:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532245
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çallaw
=== Navdêr ===
{{navdêr|ckb}}
# [[çalav]], [[hewz]], [[gerrik]], [[gom]], [[lîç]]
ngich8oox9a0wbp7d7ht5vepmlbf056
چاڵەچەقیلە
0
268606
6532246
5866863
2026-09-19T08:03:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532246
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çalleçeqîle
=== Navdêr ===
{{navdêr|ckb}}
# [[lale]], [[alale]], [[lele]], [[lehle]]
juz55lyzpgs6bca3k8wni5itdt2kd6n
چاندەمەنی
0
268608
6532247
5866865
2026-09-19T08:03:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532247
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çandemenî
=== Navdêr ===
{{navdêr|ckb}}
# [[dexl]], [[dexlûdan]], [[çandemenî]], berhemê çandinê
njjnzt43zsro2dqfv02qus19s6pxhit
چاپکراو
0
268610
6532248
5866751
2026-09-19T08:04:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532248
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çapkiraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[çapkirî]], [[çapandî]], [[weşandî]], [[tebihkirî]]
b2raf2v7khzfzjnnn3ke6h0l9pxafkp
چاپخانە
0
268611
6532250
5866749
2026-09-19T08:04:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532250
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çapxane
=== Navdêr ===
{{navdêr|ckb}}
# [[çapxane]], [[weşanxane]], [[metbee]]
hcwvcxh01g810xpnnvy137w5ujiwvz2
چاپەز
0
268613
6532251
5866759
2026-09-19T08:04:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532251
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çapez
=== Navdêr ===
{{navdêr|ckb}}
# [[çaydank]], [[qorî]], [[qorîk]], [[çadank]]
no1maz5893fccwfp8bcjky6m1no2yir
چارەنووس
0
268616
6532252
5866803
2026-09-19T08:04:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532252
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çarenûs
=== Navdêr ===
{{navdêr|ckb}}
# [[çarenivîs]], [[qeder]], [[felek]]
j1ra2kpr00d9vb0lx731zzq0tr9wck4
چارەنووسساز
0
268617
6532253
5866805
2026-09-19T08:04:45Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532253
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çarenûssaz
=== Rengdêr ===
{{rengdêr|ckb}}
# [[diyarker]], [[xwiyaker]], [[zelalker]]
ml31hlqljlqw6n3vqnkrvb63h9nolnp
چارەوا
0
268618
6532254
5866807
2026-09-19T08:04:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532254
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çarewa
=== Navdêr ===
{{navdêr|ckb}}
# [[hesp]], [[mehîn]]
axp6vvh4r0ih35tbv7q0d3qoeee98k5
چارشێو
0
268619
6532255
5866789
2026-09-19T08:05:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532255
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çarşêw
=== Navdêr ===
{{navdêr|ckb}}
# [[çarçev]], [[serdoşek]], [[çarçav]]
7crow9nwmxifz7evv3dhju04ja3eyva
چاسر
0
268620
6532256
5866809
2026-09-19T08:05:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532256
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çasir
=== Navdêr ===
{{navdêr|ckb}}
# [[parsek]], [[xwestok]], [[gerok]], [[xwastok]]
bz3qcj04oazomzolzx1laad9kmzsrlf
چاش
0
268621
6532257
5866811
2026-09-19T08:05:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532257
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çaş
=== Rengdêr ===
{{rengdêr|ckb}}
# [[mat]], [[ecêbgirtî]], [[matmayî]], [[matbûyî]]
t78gi4ptm3deyh38ibmp2m75tzxpe5l
چاشنی
0
268622
6532258
5866815
2026-09-19T08:05:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532258
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çaşnî
=== Navdêr ===
{{navdêr|ckb}}
# [[tam]], [[çêj]]
i5464dvci8dzeq0uzvpeqpw4w878vpm
چاشتێنگا
0
268624
6532259
5866813
2026-09-19T08:05:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532259
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çaştênga
=== Navdêr ===
{{navdêr|ckb}}
# [[danê sibê]], [[danê siharê]], berî nîvro
o4821z7q3pxakmfjq00oex6qkpzqq9f
چاوباشقاڵ
0
268627
6532260
5866877
2026-09-19T08:05:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532260
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çawbaşqall
=== Navdêr ===
{{navdêr|ckb}}
# [[flortker]], [[;flortkerî]]
a4uxieej322blkc8bsrtn3az488wiv3
چاوەڕوانکراو
0
268630
6532261
5866883
2026-09-19T08:06:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532261
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çawerrwankiraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[pêşbînîkirî]]
0hkmp0uxlpp10wx7fked9pxa6vgzs88
چاوێشە
0
268631
6532262
5866881
2026-09-19T08:06:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532262
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çawêşe
=== Navdêr ===
{{navdêr|ckb}}
# [[çavêşî]], êşa çavan
24fam6nt929psff9ikljj1wfam006kt
چایەر
0
268634
6532263
5866899
2026-09-19T08:06:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532263
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çayer
=== Navdêr ===
{{navdêr|ckb}}
# [[mêrg]], [[çîmen]], [[çayir]], [[keskistan]], [[şêngeh]], [[lewerr]], [[çerîngeh]]
11m4lddhbqiet8iuugo5iuo3xbtbf7c
چەکووش
0
268636
6532264
5867592
2026-09-19T08:06:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532264
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çekûş
=== Navdêr ===
{{navdêr|ckb}}
# [[çekûç]], [[keçûç]]
rclzramvzlm556q0h7brw64bp3apxmj
چەلاک
0
268637
6532265
5867593
2026-09-19T08:06:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532265
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çelak
=== Navdêr ===
{{navdêr|ckb}}
# [[çelak]], darikek dirêj e bo daweşandina gûz û hin berhemên din yên daran têt bikaranîn
etd63bvlzcg4n1h4570qgkva95nc6rn
چەلاو
0
268639
6532266
6433275
2026-09-19T08:06:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532266
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çelaw
=== Navdêr ===
{{navdêr|ckb}}
# [[serûpêk]], ser û piyên bizinan yan mihan dema tên kelandin yan qelandin
==== Anagram ====
* {{anagram|ckb|a=الوچە|چوالە}}
jams07ipl2irv6wppbh1gh1uvm9e1eo
چەڵەمە
0
268640
6532267
5867597
2026-09-19T08:07:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532267
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çelleme
=== Navdêr ===
{{navdêr|ckb}}
# [[arîşe]], [[kêşe]], [[krîz]], rewşa ne pêdandî û sabit
i0q7lx171niuoepaf4lb27kg88r8quh
چەلیپا
0
268641
6532268
5867596
2026-09-19T08:07:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532268
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çelîpa
=== Navdêr ===
{{navdêr|ckb}}
# [[xaç]], '':r'' xîçûxaç
8tu4r4k7c3ms47h17gr80gz27rf81o4
چەمچە
0
268643
6532269
5867598
2026-09-19T08:07:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532269
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çemçe
=== Navdêr ===
{{navdêr|ckb}}
# [[heskû]], [[mifsik]], kefçiyê mezin yê pê xwarinê ji qazanan dikin sêniyan
fje6g968kv6eti5cdhjamxc2t3694st
چەمەر
0
268644
6532270
5867601
2026-09-19T08:07:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532270
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çemer
=== Navdêr ===
{{navdêr|ckb}}
# [[çemer]], [[çember]], [[xirrxal]], [[bazine]], [[xelek]]
kcllnarzm0esp5tnsreip77mwx20pk1
چەنە
0
268648
6532271
5867606
2026-09-19T08:07:45Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532271
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:Çene / çenage dan
=== Lêker ===
{{lêker|ckb}}
# [[zêde peyivîn]], gelek axiftin, pirr ştexilîn
hdtfv1fuyhhbam3ylacqk9anbymgl8l
چەندەمین
0
268650
6532272
5867605
2026-09-19T08:07:55Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532272
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çendemîn
=== Lêker ===
{{lêker|ckb}}
# [[çendem]], [[çendemîn]], ya çendê / çendan
p29253awljslw6kjs20a1ng02aqukxq
6532276
6532272
2026-09-19T08:08:32Z
Şêr
1103
Guhartoya [[Special:Diff/6532272|6532272]] yê [[Special:Contributions/JiyanBot|JiyanBot]] ([[User talk:JiyanBot|gotûbêj]]) şûnde kir
6532276
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çendemîn
=== Mane ===
{{bêcure|ckb}}
# [[çendem]], [[çendemîn]], ya çendê / çendan
n2pwwbmv417i2mn1w1il8ty2c9eyn7h
چەنەباز
0
268652
6532273
5867607
2026-09-19T08:08:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532273
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çenebaz
=== Rengdêr ===
{{rengdêr|ckb}}
# [[zêdebêj]], [[pirraxiv]]
1e0fmnyss3zqixy24i1h79m4srbd7u6
چەنەبازی
0
268653
6532274
5867608
2026-09-19T08:08:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532274
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çenebazî
=== Navdêr ===
{{navdêr|ckb}}
# [[zêdebêjî]], [[pirraxivî]]
3iihc0rufr4gh590irj1lcjuy8120lk
چەنەچەن
0
268654
6532275
5867609
2026-09-19T08:08:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532275
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çeneçen
=== Navdêr ===
{{navdêr|ckb}}
# [[zimandirêjî]]
15araqkk9k0u6z35dgjqbnjrvhv4mtg
چەنەھەراش
0
268655
6532277
5867610
2026-09-19T08:08:35Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532277
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çeneheraş
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bedmebest]], [[niyetxirab]], yê gotinan bi armanca xirabiyê dike
spg3vh0hxvxlvoi1vrgb6zzsuwxr6ts
چەپاڵ
0
268656
6532278
5867496
2026-09-19T08:08:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532278
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çepall
=== Navdêr ===
{{navdêr|ckb}}
# [[dest]]
nlv2j100mpdegz1osbommmovy1q9c9y
چەپاڵە
0
268657
6532279
5867499
2026-09-19T08:08:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532279
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çepalle
=== Navdêr ===
{{navdêr|ckb}}
# [[pate]], [[patok]], [[parçe]], [[parçok]]
r93dziqciaalyosmmoaldsjkjm8681b
چەپاو
0
268658
6532280
5867501
2026-09-19T08:09:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532280
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çepaw
=== Navdêr ===
{{navdêr|ckb}}
# [[şelandin]], [[talan]], êrişa / pelamara şelandinê / talankirinê
6ufpbbeh5p5sb9aj3edzfce7fk7sxie
چەپەڵۆک
0
268664
6532281
5867523
2026-09-19T08:09:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532281
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çepellok
=== Navdêr ===
{{navdêr|ckb}}
# [[zele]], [[sîle]], [[şeq]], [[şep]], [[şeqam]], [[şîrqam]], [[şîrmaq]], [[zelle]]
c78ayh5e9o8khtlvcw6yhjlj85ss39c
چەپەر
0
268665
6532282
5867521
2026-09-19T08:09:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532282
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çeper
=== Navdêr ===
{{navdêr|ckb}}
# [[çeper]], [[tan]], [[kozik]], [[kotan]]
np4kouamtevzzyrxu4853j78m6u2jtq
چەپکەن
0
268666
6532283
5867509
2026-09-19T08:09:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532283
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çepken
=== Navdêr ===
{{navdêr|ckb}}
# [[nihûn]], [[tunel]], kuna / qula ji herdu aliyan ve vekirî
fe2o6bv6awz80dg6u0sco1yk4wubxz8
چەپۆک
0
268669
6532284
5867515
2026-09-19T08:09:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532284
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çepok
=== Navdêr ===
{{navdêr|ckb}}
# [[zele]], [[sîle]], [[şeq]], [[şep]], [[şeqam]], [[şîrqam]], [[şîrmaq]], [[zelle]]
iqzubif5tlj6vsj50mnh0dzi17jbkqh
چەپڕۆ
0
268670
6532285
5867505
2026-09-19T08:09:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532285
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çeprro
=== Navdêr ===
{{navdêr|ckb}}
# [[çepgir]], [[çepperwer]], [[çepperest]], peyrewê / alîgirê / mirûdê rêzanî û siyaseta çepgiriyê
shqw9o122vt1a6jqao9nnftv0c0i5es
چەپڕۆیی
0
268671
6532286
5867507
2026-09-19T08:10:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532286
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çeprroyî
=== Navdêr ===
{{navdêr|ckb}}
# [[çepgirî]], [[çepperwerî]], [[çepperestî]], di siyasetê de alîgirê rêbaz û rêzaniya çepiyê
9dacgxwgy9c7ztgjvenjhb299h4fwpu
چەپخوون
0
268673
6532287
5867503
2026-09-19T08:10:15Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532287
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çepxûn
=== Rengdêr ===
{{rengdêr|ckb}}
# [[şûm]], [[neqet]], [[venehewayî]], [[destmatî]]
k95pg5oiagxvjufl0hvuowzmpo0jtlv
چەقاڵ
0
268674
6532288
5867585
2026-09-19T08:10:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532288
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çeqall
=== Rengdêr ===
{{rengdêr|ckb}}
# [[sade]], Bi taybetî wek çeqall û beqall tên bikaranîn û wateya wê kesên nemalmezin e, Bi pirranî di wateya biçûkhesibandinê de têt bikaranîn
=== Dijmane ===
*[[malmezin]]
* [[esilzade]]
* [[zanedan]]
j70oy2hk1usbzsgxvtnvj9jdugf1w6q
چەقان
0
268675
6532289
5867586
2026-09-19T08:10:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532289
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çeqan
=== Navdêr ===
{{navdêr|ckb}}
# [[daçûn]], di nav berfê / heriyê re man / daçûn / xetimîn / alizîn / asê bûn / asê man: le qurr çeqan di heriyê re man, di nav heriyê de asê bûn
8l2km54sl3vg988nurdk4v7xoo0kd72
چەقاندن
0
268676
6532290
5867587
2026-09-19T08:10:45Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532290
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çeqandin
=== Lêker ===
{{lêker|ckb}}
# [[pal dan]], [[def dan]], [[han dan]], pal pê radan, pal bi yekî radan
ijk3c0p26bxpluipuvuwtddvcduas7r
چەقۆکێش
0
268682
6532291
5867589
2026-09-19T08:10:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532291
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çeqokêş
=== Navdêr ===
{{navdêr|ckb}}
# [[şerxwaz]], [[belakir]], [[gefxwer]], [[hereşeker]], [[tehdîdker]]
1slw3e4fw6hqc3m82o55w97raoc4elm
چەرداوەروو
0
268685
6532292
5867570
2026-09-19T08:11:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532292
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çerdawerû
=== Rengdêr ===
{{rengdêr|ckb}}
# [[rûqayîm]], [[bêşerm]]
bbdzlomsl93pmu582xw6n0axxh0fcrp
چەرداخ
0
268686
6532293
5867569
2026-09-19T08:11:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532293
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çerdax
=== Navdêr ===
{{navdêr|ckb}}
# [[kepir]], xaniyên havînî yên bêdîwar û serbanê wan ji çilû yan qamûş
ewo9zf3pn1h8ua3r51gyweprn48dwiy
چەردە
0
268687
6532294
5867571
2026-09-19T08:11:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532294
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çerde
=== Navdêr ===
{{navdêr|ckb}}
# [[miqdar]], [[çendanî]], [[gelekî]], [[pirrî]], [[zehfî]]
63tvrvpptpgj37c9i76x7yybihun956
چەڕندە
0
268689
6532295
5867575
2026-09-19T08:11:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532295
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çerrinde
=== Navdêr ===
{{navdêr|ckb}}
# [[çerîngeh]], [[çêrgeh]], cihê heywan lê diçerin
7bpglj1x850ii1r90ysrxl9ns5jomoz
چەڕین
0
268690
6532296
5867576
2026-09-19T08:11:45Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532296
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çerrîn
=== Lêker ===
{{lêker|ckb}}
# [[çerîn]], [[çêrîn]], dema heywan giyayê li mêrg û çîmen û çayiran şên dibe dixwin
advt8kqq3s0phcqqhufiomjqyinkxlm
چەرم
0
268691
6532297
5867573
2026-09-19T08:11:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532297
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çerm
=== Navdêr ===
{{navdêr|ckb}}
# [[çerm]], [[pîst]], [[kevil]], [[post]]
iiio6jd8wwoqneaeg43axynr851nr38
چەرمەسەرێ
0
268692
6532298
5867574
2026-09-19T08:12:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532298
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çermeserê
=== Navdêr ===
{{navdêr|ckb}}
# [[kul]], [[xem]], [[derd]] :Çermeserêm meke Serê min neêşîn, Serê min gêj neke
c1c7gfqgcoyxcg0wv9ykmnbbj0q1lqs
چەرس
0
268693
6532299
5867572
2026-09-19T08:12:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532299
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çers
=== Navdêr ===
{{navdêr|ckb}}
# [[tilyak]], [[beng]], [[heşîş]]
q3rozoi631gpnmcji3ubwh97utp41e9
چەرخاو
0
268695
6532300
5867567
2026-09-19T08:12:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532300
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çerxaw
=== Navdêr ===
{{navdêr|ckb}}
# [[çerxav]], [[aşê avê]]
cmd3srh1zarezkp0wopy3tn2l4rfmoj
چەرخەمە
0
268696
6532301
5867568
2026-09-19T08:12:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532301
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çerxeme
=== Navdêr ===
{{navdêr|ckb}}
# [[zembîl]], [[selik]], [[sepet]], [[zembûl]]
7ngnymygw882h7vyocza99ag4a4llfl
چەسپ
0
268698
6532302
5867578
2026-09-19T08:12:45Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532302
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çesp
=== Rengdêr ===
{{rengdêr|ckb}}
# ji hev diçe lê zû-zû ji hev venabe, [[çist]], [[xurt]], [[xwegir]], [[xweragir]], [[qayîm]]
9l70ud9vb0w99jgy5ay3g9cfudj8rei
چەش
0
268701
6532303
5867579
2026-09-19T08:12:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532303
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çeş
=== Navdêr ===
{{navdêr|ckb}}
# [[1]], [[tam]], [[çêj]], tehm 2, [[dav]], [[xefik]], [[tepik]], [[davik]], dav û xefik
elrmxwxat30acgkgijf9slme5xlb0cc
چەشن
0
268702
6532304
5867583
2026-09-19T08:13:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532304
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çeşin
=== Navdêr ===
{{navdêr|ckb}}
# [[bir]], [[cure]], [[reng]], [[awa]], [[çeşn]], [[teşn]], [[şêwe]], [[tewir]], [[tehir]]
kanoom71ytsaerpmpz7zkvw89x41vmv
چەشکە
0
268703
6532305
5867581
2026-09-19T08:13:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532305
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çeşke
=== Navdêr ===
{{navdêr|ckb}}
# [[mifsik]], [[heskû]], [[kefçî]]
dut184hzol2egkugb9ya1lbc80q4acm
چەشمە
0
268704
6532306
6433287
2026-09-19T08:13:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532306
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çeşme
=== Navdêr ===
{{navdêr|ckb}}
# [[kanî]], [[avzêk]], [[çeşme]], cihê av jê dizê
==== Anagram ====
* {{anagram|ckb|a=شمچەە|شەمچە}}
6zvswg0si806jns7zzd3dhvtlx6ksw0
چەشتن
0
268706
6532308
5867580
2026-09-19T08:13:35Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532308
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çeştin
=== Lêker ===
{{lêker|ckb}}
# [[tam kirin]], tama tiştekî seh kirin
atw2m188glews1wqlgexs1hg7gk6jj3
چەتاڵ
0
268708
6532309
5867525
2026-09-19T08:13:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532309
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çetall
=== Navdêr ===
{{navdêr|ckb}}
# [[şen]], [[şeneke]], [[milhêb]] ([[alav]]
# [[şen]], [[şeneke]], [[milhêb]] ([[alav]]a vebijartina dexl û dan)
3ar6lc1js9p1aqvpqhagrmtae8a1jkx
چەتە
0
268709
6532310
5867565
2026-09-19T08:13:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532310
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çete
=== Navdêr ===
{{navdêr|ckb}}
# [[çete]], [[cerdevan]], '':keleş; diz''
fgzyky3hei4tvc1hd9ogd2bh8o0lk2z
چەتیانە
0
268711
6532311
5867564
2026-09-19T08:14:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532311
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çetiyane
=== Navdêr ===
{{navdêr|ckb}}
# şûr (şûr û tîr, [[t]], şûrên xwar), '':; [[şûr]] (t'' yên xwar)
mnxwa6vjntb27pdicbpledemu9e0bcd
چەتڵەمەز
0
268713
6532313
5867563
2026-09-19T08:14:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532313
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çetllemez
=== Navdêr ===
{{navdêr|ckb}}
# [[fêlbaz]], [[hîlebaz]], [[hîleker]], [[fêlker]]
722s0o5vks7dzkyod2wjwplzq4ookmh
چەو
0
268715
6532314
5867611
2026-09-19T08:14:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532314
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çew
=== Rengdêr ===
{{rengdêr|ckb}}
# [[xiş]], [[şuj]], [[zixik]], [[zixruk]], [[xişeber]], [[xîz]], [[hirdû]], kevirên hûrik, [[hûreberik]], [[hûrekevirok]]
a1b9qvysxv3a68nmtuup17ocsjhwwld
چەوتانەوە
0
268724
6532315
5867613
2026-09-19T08:14:35Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532315
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çewtanewe
=== Lêker ===
{{lêker|ckb}}
# [[çemîn]], [[tewîn]], [[çeman]], hatin çemandin / tewandin, [[tewiyan]], [[çemihan]]
qztba3jv1bc12gcl3sy5yrjx0kvwx82
چەوتی
0
268725
6532316
6433296
2026-09-19T08:14:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532316
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çewtî
=== Navdêr ===
{{navdêr|ckb}}
# [[xwarî]], [[xwehrî]], [[xwêlî]], [[şaşî]], [[çewtî]], [[xeletî]], [[heleyî]], [[şaşîtî]]
==== Anagram ====
* {{anagram|ckb|a=توچیە|چەتیو}}
lfqup9wlx75ue28a7mutxumyrb5snmn
چەخماق
0
268726
6532317
5867566
2026-09-19T08:14:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532317
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çexmaq
=== Navdêr ===
{{navdêr|ckb}}
# [[heste]], [[çeqmaq]], alavek e bo vêxistina / agirberdana cigareyan
mhtopb9u6t4du7yo7sjbrsn5szh4lkj
چێژ
0
268727
6532318
5867453
2026-09-19T08:15:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532318
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çêj
=== Navdêr ===
{{navdêr|ckb}}
# [[tam]], [[çêj]], [[tehm]]
1eklfsoi6uqhg9scpwg8ilqfx0lcebg
چێژان
0
268728
6532319
5867456
2026-09-19T08:15:15Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532319
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çêjan
=== Lêker ===
{{lêker|ckb}}
# [[kêşan]], kişandin (t, zehmetî kêşan), [[rezalet dîtin]]
gpbl2ieb4ig2cc0lf5zu6u554ofu8ja
چێر
0
268730
6532320
5867434
2026-09-19T08:15:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532320
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çêr
=== Rengdêr ===
{{rengdêr|ckb}}
# [[zal]], [[serdest]], [[serwer]]
e6cayqvzelvxgvwj0g3gxe0np6epkdh
چێش
0
268731
6532321
5867462
2026-09-19T08:15:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532321
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çêş
=== Navdêr ===
{{navdêr|ckb}}
# [[tam]], [[çêj]], [[tehm]]
d48ejtdmqz460ljdqdt6mix8e6zfs9o
چێشتکەر
0
268734
6532322
5867467
2026-09-19T08:15:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532322
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çêştker
=== Navdêr ===
{{navdêr|ckb}}
# [[xwarinçêker]] ([[t]], yên kar û pîşeyên wan xwarinçêkirin e)
22njhby8t8l8d10wf7dzul18rfq9tid
6532325
6532322
2026-09-19T08:16:15Z
Şêr
1103
t??
6532325
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çêştker
=== Navdêr ===
{{navdêr|ckb}}
# [[xwarinçêker]] ( yên kar û pîşeyên wan xwarinçêkirin e)
p21z5xoj82s7p4bexy2owrju6zwr047
چێشتخانە
0
268735
6532323
5867465
2026-09-19T08:15:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532323
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çêştxane
=== Navdêr ===
{{navdêr|ckb}}
# [[metbex]], [[mitfax]], [[xwarinçêkiringeh]], [[aşxane]]
9ncl54zmaxewf4i9ku5oi9e4h6tf9pf
چێو
0
268736
6532324
5867489
2026-09-19T08:16:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532324
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çêw
=== Navdêr ===
{{navdêr|ckb}}
# [[çîv]], [[şiv]], [[darik]], [[tirrik]], [[gilç]], [[darik]], [[şivtan]], [[şiftan]], [[dar]]
61xdnpoika4ts4dwaxkow1jltyw50vb
چێوین
0
268738
6532326
5867491
2026-09-19T08:16:15Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532326
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çêwîn
=== Rengdêr ===
{{rengdêr|ckb}}
# [[darîn]], [[textîn]], tiştên ji dar hatine çêkirin
8tx1rafja5kidd1d8e1olbk4g8m8oqx
چکان
0
268740
6532327
5867127
2026-09-19T08:16:25Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532327
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çikan
=== Lêker ===
{{lêker|ckb}}
# [[çikîn]], [[miçiqîn]], zuha / ziwa bûn, [[hişk bûn]], av lê neman (bi taybetî çem, rûbar yan co berî ku bigihe deryayê yan avek ji xwe boştir)
j2si9p3669nilacmpd9lg133j6pry04
چکۆک
0
268742
6532328
5867133
2026-09-19T08:16:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532328
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çikok
=== Navdêr ===
{{navdêr|ckb}}
# [[çirke]], [[saniye]]
idr805e7dpufayq3jhgkw1mle2qmhsp
چکۆڵە
0
268743
6532329
6433305
2026-09-19T08:16:45Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532329
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çikolle
=== Rengdêr ===
{{rengdêr|ckb}}
# [[biçkok]], [[hûrkok]], [[biçûkok]], [[hûrik]], pirr biçûk
==== Anagram ====
* {{anagram|ckb|a=چکڵۆە|کچۆڵە}}
qj8sg7zjoh386sx228axgg00g33s64t
چلێس
0
268747
6532330
5867167
2026-09-19T08:16:55Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532330
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çilês
=== Rengdêr ===
{{rengdêr|ckb}}
# [[çavbirsî]], [[hesûd]], [[çavbirçî]]
qcyos36oxhbk0iol153p1uq14chz8yh
چلێسی
0
268748
6532331
5867169
2026-09-19T08:17:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532331
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çilêsî
=== Navdêr ===
{{navdêr|ckb}}
# [[birsîtî]], [[hesûdî]], [[çavbirçîtî]]
j2oy6xtnbk53pwhws92m0ejuacft7og
چڵک
0
268749
6532332
5867155
2026-09-19T08:17:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532332
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çillk
=== Navdêr ===
{{navdêr|ckb}}
# [[qirêjî]], [[pîsatî]], [[nerindî]]
3pgv0lsy1wbw5287lqxo4eemdm08yhy
چڵم
0
268755
6532333
5867159
2026-09-19T08:17:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532333
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çillm
=== Navdêr ===
{{navdêr|ckb}}
# [[kilmûş]], [[çilm]], ava tîr ya ji pozan / difinan / bêvilan têt
i7ismbtk0wpw853vlm9ij8uwtrgokjk
چنگاڵ
0
268757
6532334
5867230
2026-09-19T08:17:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532334
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çingall
=== Navdêr ===
{{navdêr|ckb}}
# [[1]], [[çelak]], çengal 2, [[çetel]], [[çartilk]]
ebqv73p94cudoiwj40j2nkmwwmoi41s
چنۆک
0
268759
6532335
5867243
2026-09-19T08:17:45Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532335
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çinok
=== Rengdêr ===
{{rengdêr|ckb}}
# [[çavbirsî]], [[hesûd]], ya / yê qet têr nabe (bi taybetî ji xwarinê)
l8yen0qvpthzcbgvqybxo5kw38ekr8u
چپک
0
268760
6532336
5866915
2026-09-19T08:17:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532336
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çipik
=== Navdêr ===
{{navdêr|ckb}}
# [[bişkoj]], [[bişkojk]], [[bişkivok]], pelên daran yên hê nû dibişkivin / hê negihane
le7wg9ea4mlunxn8cyzf368r8uhs1l5
چقڵ
0
268761
6532337
5867125
2026-09-19T08:18:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532337
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çiqill
=== Navdêr ===
{{navdêr|ckb}}
# [[çeq]], [[çiq]], [[çiqil]], çeqên daran
bf2nb59l32ipv05fk31e48q5mvmw4i7
چرادان
0
268762
6532338
5866925
2026-09-19T08:18:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532338
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çiradan
=== Navdêr ===
{{navdêr|ckb}}
# [[çiradank]], [[şemaldank]], [[mûmdank]], [[finddank]], tişta find / şemal / mûm / çira tê de têt bicîkirin
eyb1xgu25kbroginuudxgg9jmkh215p
چراکەوان
0
268763
6532339
5866931
2026-09-19T08:18:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532339
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çirakewan
=== Navdêr ===
{{navdêr|ckb}}
# [[tavsork]], [[hengur]], ronahiya rojê berî ku roj ava dibe
d3yurcug7kw9nh1n61nkr1axe5qq2iq
چڕان
0
268764
6532340
5866939
2026-09-19T08:18:35Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532340
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çirran
=== Lêker ===
{{lêker|ckb}}
# [[civîn]], [[kom bûn]], [[berhev bûn]], [[li hev civîn]], [[li hev kom bûn]], '': bi hev re gerrîn, bi hev re meşîn''
dgngb7yqprwqf7db9q3fmp9fees3olu
چراورک
0
268765
6532341
5866943
2026-09-19T08:18:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532341
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çirawirk
=== Navdêr ===
{{navdêr|ckb}}
# [[pêtal]], [[meşal]]
h49wea8ga84cnguqzqqx1729aivgown
چرچ
0
268766
6532342
5866957
2026-09-19T08:18:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532342
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çirç
=== Navdêr ===
{{navdêr|ckb}}
# [[rengjêçûyî]], [[rengavêtî]]
7kkbu6soixs45u6st5lp5uxpphcbehs
چرکاندن
0
268769
6532343
5866987
2026-09-19T08:19:05Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532343
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çirkandin
=== Lêker ===
{{lêker|ckb}}
# [[çirkandin]], dengê "çirk" jê anîn
r7jk5w31vw9ypbtsykvbacuz1ommpnv
چڕنووک
0
268771
6532344
5866997
2026-09-19T08:19:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532344
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çirrnûk
=== Navdêr ===
{{navdêr|ckb}}
# [[pence]], nînokên tûj
lfnx2uv2tp0svchoxlj4q6x7oq6wuws
چڕووچاو
0
268773
6532345
5866999
2026-09-19T08:19:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532345
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çirrûçaw
=== Navdêr ===
{{navdêr|ckb}}
# [[serûçav]], [[devûlêv]], [[rû]], [[biçim]]
527oabtce86i35h22h0xr6svjt1hkpv
چرووسان
0
268775
6532346
5867001
2026-09-19T08:19:35Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532346
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çirûsan
=== Lêker ===
{{lêker|ckb}}
# [[hincirîn]], [[peritîn]], [[pûç bûn]], [[xespal bûn]], [[xerabe bûn]]
itczfqxvanytvomxq9owter2ul71vi8
چرووساندن
0
268776
6532347
5867003
2026-09-19T08:19:45Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532347
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çirûsandin
=== Lêker ===
{{lêker|ckb}}
# [[peritandin]], [[hincirandin]], [[pûç kirin]], [[xespal kirin]], [[xerabe kirin]]
l0ak5g27wjh105ej0qxtkf9sej5uskl
چرووساو
0
268777
6532348
5867005
2026-09-19T08:19:55Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532348
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çirûsaw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hinicirî]], [[peritî]], [[xespal]], [[xerabe]], [[xopan]]
ppbuycx1cj3ngqsxs5rumu92po7obtc
چش
0
268778
6532349
5867043
2026-09-19T08:20:05Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6532349
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çiş
=== Hoker ===
{{hoker|ckb}}
# [[vêca]], vêca çi, ango çi, vêca ango çi, ma çi ye, [[de bila]]: Ew naye, çiş! Ew nayê, de bila qet neyê! Ew nayê, ma xema me ye!
jw48z97yh90rr9s0pgs0d77t54bucaj
چوالە
0
268779
6532350
6433278
2026-09-19T08:20:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532350
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çiwale
=== Navdêr ===
{{navdêr|ckb}}
# [[behîv]], [[bahîv]] (bi taybetî yên kerrik / negihiştî)
==== Anagram ====
* {{anagram|ckb|a=الوچە|چەلاو}}
nnrnf7hn6t4pye5d9s2ayvgpb5iodv7
چوارچێوە
0
268781
6532351
5867311
2026-09-19T08:20:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532351
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çiwarçêwe
=== Navdêr ===
{{navdêr|ckb}}
# [[çarçeve]], [[milbend]]
91g1wk39bt9usstu52l0qz3qigmnod7
چواردەور
0
268783
6532352
5867314
2026-09-19T08:20:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532352
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çiwardewr
=== Navdêr ===
{{navdêr|ckb}}
# [[dorber]], [[derdor]], [[hawirdor]], [[dewrûber]]
4ic9hjz3huows5jkt79z38c32x9i0gz
چوارەک
0
268784
6532353
5867321
2026-09-19T08:20:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532353
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çiwarek
=== Navdêr ===
{{navdêr|ckb}}
# [[çarek]], [[çarêk]], yek ji çarê, [[çarêk]], 15 deqe (ji saetê)
ck2tjnz8pepsqbw88m15xbvcx3mcktr
چیل
0
268789
6532354
5867473
2026-09-19T08:20:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532354
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çîl
=== Navdêr ===
{{navdêr|ckb}}
# [[mêkew]], kewên mê
51s3txzxkaxqe4krbjdbf9igsj65yc3
چیلەک
0
268791
6532355
6433312
2026-09-19T08:21:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532355
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çîlek
=== Navdêr ===
{{navdêr|ckb}}
# [[tûtfiringî]], [[çîlek]]
==== Anagram ====
* {{anagram|ckb|a=لچکیە|چیلکە}}
kfyp0vk9k9uzyd4stwwqtsgsitw6vld
چیم
0
268793
6532356
5867479
2026-09-19T08:21:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532356
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çîm
=== Navdêr ===
{{navdêr|ckb}}
# [[giya]], [[gîha]], [[şênkatî]]
7ke7ol629dplgne56fksfpxdsy3yopy
چیتۆکە
0
268796
6532357
5867426
2026-09-19T08:21:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532357
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çîtoke
=== Navdêr ===
{{navdêr|ckb}}
# [[çîtok]], [[çîtik]], çîtê bêbiha yan kêmnirx
fbji5oen41zmmigma7evc4h9o5x9w8n
چۆڵ
0
268798
6532358
5867415
2026-09-19T08:21:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532358
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:[[çoll]]
=== Navdêr ===
{{navdêr|ckb}}
# [[çol]], (devera) vale / xalî / bêkes / bêtişt
7iq8awjc641vwylf9eyjdeclemys9o1
چۆلاغ
0
268799
6532359
5867417
2026-09-19T08:21:45Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532359
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çolagh
=== Rengdêr ===
{{rengdêr|ckb}}
# [[netebitî]], [[venehewayî]], [[nerehet]] (bi taybetî hespê ne hêmin û aram e)
qpeuco6j197ypixtdj3grti0y4igaiq
چۆلک
0
268800
6532360
5867420
2026-09-19T08:21:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532360
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çolk
=== Navdêr ===
{{navdêr|ckb}}
# [[destavxane]], [[tiwalet]], [[avdestxane]]
k40qhirum7qjmq6lyn6nuvrnpum9f2c
چۆپین
0
268807
6532361
5867402
2026-09-19T08:22:05Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532361
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çopîn
=== Lêker ===
{{lêker|ckb}}
# [[govend kirin]], [[dîlan kirin]], [[dawet kirin]], [[çopîn]], [[dansîn]], [[reqîsîn]]
bp6b8bs2in7brjyqnomlp1r4b7hwhli
چۆق
0
268808
6532362
5867413
2026-09-19T08:22:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532362
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çoq
=== Navdêr ===
{{navdêr|ckb}}
# [[kel]], [[germayî]], pirr germî
7tvodm9qaxxo4kzg31aoqy7y6j94uls
چۆڕان
0
268809
6532363
5867406
2026-09-19T08:22:25Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532363
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çorran
=== Lêker ===
{{lêker|ckb}}
# [[çikîn]], [[miçiqîn]], zuha / ziwa bûn, [[hişk bûn]], av lê neman (bi taybetî çem, rûbar yan co berî ku bigihe deryayê yan avek ji xwe boştir)
n261agmu8hiy5s45k8ys94lvhvdwch3
چۆڕاندن
0
268810
6532364
5867409
2026-09-19T08:22:35Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532364
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çorrandin
=== Lêker ===
{{lêker|ckb}}
# [[çikandin]], [[miçiqandin]], [[hişk kirin]], [[ziwa kirin]], av jê qut kirin
ap9gjvnwp4mj25ugun0z93cduhq2yca
چوست
0
268814
6532365
5867386
2026-09-19T08:22:45Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532365
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çust
=== Rengdêr ===
{{rengdêr|ckb}}
# [[çist]], [[çeleng]], [[zîrek]], [[liserxwe]], [[bidîsîplîn]]
jvldwebt7yhpw25zvngoaic0d204spw
چوختی
0
268815
6532366
5867380
2026-09-19T08:22:55Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532366
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:çuxtî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[rûqayîm]], [[bêşerm]]
sm4m1dni27l97l99j5sb2hw6muxe28s
فافۆن
0
268900
6532367
5872031
2026-09-19T08:23:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532367
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fafon
=== Navdêr ===
{{navdêr|ckb}}
# [[fafon]], [[bafon]], [[aluminyum]]
cyxnq7csajjgbpept71yky7wcatzf1i
فاک
0
268901
6532368
6433319
2026-09-19T08:23:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532368
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fak
=== Navdêr ===
{{navdêr|ckb}}
# [[lêb]], [[lêhb]], [[lihb]], [[fêl]], [[dek]], [[dekûdolab]], [[hîle]]
==== Anagram ====
* {{anagram|ckb|a=افک|کاف}}
3tm4yelaq2ckyac7idyev3iusp8mhn6
فاڵ
0
268902
6532369
5872043
2026-09-19T08:23:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532369
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fall
=== Navdêr ===
{{navdêr|ckb}}
# [[fal]], [[pêşbînîkirin]], diyarkirina bûyerên demên bên, [[telewî]], rewşa mirovekî yan heywanekî ku tê de têkiliya cinsî pirr dixwaze
3rp7tt4yub6793a3cxgku3hin1aul65
فاما
0
268904
6532370
5872057
2026-09-19T08:23:35Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532370
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fama
=== Rengdêr ===
{{rengdêr|ckb}}
# [[fama]], [[têgîştî]], [[fehma]]
t4pu9siyoem7ecptidc08ou1kdyoj1r
فامین
0
268906
6532371
5872067
2026-09-19T08:23:45Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532371
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:famîn
=== Lêker ===
{{lêker|ckb}}
# tê gîştin, [[fam kirin]], [[famîn]]
cpe8mnxypwamr7m3l0xochyrm6tss6r
فانۆس
0
268907
6532372
5872075
2026-09-19T08:23:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532372
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fanos
=== Navdêr ===
{{navdêr|ckb}}
# [[fanos]], [[lampe]], [[çira]]
egl8y211ionsiolfhrukevs04fkj8bg
فاقە
0
268908
6532373
5872035
2026-09-19T08:24:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532373
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:faqe
=== Navdêr ===
{{navdêr|ckb}}
# [[xefik]], [[tepik]], [[faqe]], [[dav]], [[davik]]
2kl7bmo9h9u0mr58n4tuxtvgancppgf
فایل
0
268910
6532374
5872081
2026-09-19T08:24:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532374
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fayl
=== Navdêr ===
{{navdêr|ckb}}
# [[dosye]], [[fayl]], [[belge]]
s9c4n3brd640uuomobhw278p6lao8to
فەکڵە
0
268911
6532375
6433326
2026-09-19T08:24:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532375
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:feklle
=== Navdêr ===
{{navdêr|ckb}}
# [[cênîk]]
==== Anagram ====
* {{anagram|ckb|a=فکڵەە|کەفەڵ}}
0shnc7daaacrupz66t5xp21328k3w5s
فەلە
0
268912
6532376
5872606
2026-09-19T08:24:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532376
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fele
=== Navdêr ===
{{navdêr|ckb}}
# [[file]], [[xrîstiyan]], [[mesîhî]], [[îsawî]], [[asûrî]], [[siryanî]]
8vjnfe5wdgqonlrfowo7eh6dgsikiti
فەلسەفە
0
268913
6532377
5872605
2026-09-19T08:24:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532377
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:felsefe
=== Navdêr ===
{{navdêr|ckb}}
# [[felsefe]], [[fîlozofî]]
nhqj1zyiqt659s88dp9425culk2m9uy
فەقێ
0
268917
6532378
5872602
2026-09-19T08:24:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532378
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:feqê
=== Navdêr ===
{{navdêr|ckb}}
# [[feqe]], [[feqî]], şagirdê dînî (t îslamê)
ea5jtsjcxib3z0glf7wppevoos6aa5m
فەرامۆش
0
268920
6532379
5872564
2026-09-19T08:25:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532379
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:feramoş
=== Rengdêr ===
{{rengdêr|ckb}}
# [[feramoş]], [[nehesibandî]], [[înkarkirî]], [[jibîrkirî]]
nwyjkigtfyg4iquwm39q3atsb5h4lwk
فەرامۆشی
0
268921
6532380
5872566
2026-09-19T08:25:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532380
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:feramoşî
=== Navdêr ===
{{navdêr|ckb}}
# [[sersarî]], [[xemsarî]], '': înkar; [[jibîrkirin]], [[ nehesibandin'']]
8qkskspzwmxqxzsxjd32m85q8rbwvsi
فەڕاقە
0
268922
6532381
5872562
2026-09-19T08:25:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532381
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:ferraqe
=== Navdêr ===
{{navdêr|ckb}}
# [[bend]], [[qeyd]], [[zincîr]] (t yên pî / ling pê tên girêdan)
l5o1kjjjaj9id4mkjp9cmg41zit85sc
فەڕاش
0
268923
6532382
5872560
2026-09-19T08:25:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532382
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:ferraş
=== Navdêr ===
{{navdêr|ckb}}
# [[dergevan]], kesa/ê karûbarên xaniyekî (t yên îdarî) yên mîna malînê dike
egpk6fsjgpo12ybrzvnpghdvsrjro0g
فەڕدار
0
268924
6532383
5872572
2026-09-19T08:25:45Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532383
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:ferrdar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[1]], [[bihagiran]], [[binirx]], [[hêja]], hejî (tiştekî) 2, [[bikêr]], [[biwec]], [[bikêrhatî]]
njpugt4qdpnx3w8axtacwb04733w8ic
فەردە
0
268925
6532384
5872574
2026-09-19T08:25:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532384
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:ferde
=== Navdêr ===
{{navdêr|ckb}}
# [[ferde]], [[kîs]], [[torbe]], [[tûrik]], [[telîs]]
6as1487hlnzyng2c46ku78qkylsb89i
فەریک
0
268929
6532385
5872599
2026-09-19T08:26:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532385
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:ferîk
=== Rengdêr ===
{{rengdêr|ckb}}
# [[1]], [[kerrik]], [[kojik]], [[rizik]], çilmik (fêkiyên / keskiyên / sebzeyên) negihayî / negihiştî 2, [[ -terrk]], -kelî: ferîkeqezwan kezwanterrk, kezwanên terr, ferîkenok kelînok, [[kelînuhk]], nokên terr
lcjwrgqivs1lt7k098kn9qy61hfw3h5
فەرکاندن
0
268930
6532386
5872584
2026-09-19T08:26:15Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532386
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:ferkandin
=== Lêker ===
{{lêker|ckb}}
# [[ferkandin]], li ber nivîsîn, [[ji ber girtin]], [[kopî kirin]], [[lasa kirin]], [[texlîd kirin]]
ltxsfuap5adunybce6fwp2fnoz4sxgy
فەرکانە
0
268931
6532387
5872585
2026-09-19T08:26:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532387
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:ferkane
=== Navdêr ===
{{navdêr|ckb}}
# [[jibergirî]], [[lasayî]], [[texlîd]]
18ayk6pqkkf9kq6i68wicfilyb5m9by
فەرکار
0
268932
6532388
5872582
2026-09-19T08:26:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532388
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:ferkar
=== Navdêr ===
{{navdêr|ckb}}
# [[destnîşanî]], tilnîşanî
# [[şîret]], [[nesîhet]], [[pêşniya]], [[pêşniyar]], [[pêşniyaz]], [[pêşniyad]], [[teklîf]]
nzyv66galrd2bus0tm3sx1kkdwp911v
فەرمان
0
268933
6532389
5872586
2026-09-19T08:26:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532389
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:ferman
=== Navdêr ===
{{navdêr|ckb}}
# [[ferman]], [[emir]], [[emr]]
qnppmw7tnmiz43oudk40zhetcpvfj51
فەرمانبەر
0
268934
6532390
5872587
2026-09-19T08:26:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532390
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fermanber
=== Navdêr ===
{{navdêr|ckb}}
# [[fermanber]], [[karmend]], [[memûr]], kesa/ê di karek fermî / hukumî de dixebite
ja791p5lyy27ag6y74azm7ctbcz9vx9
فەرمانگێڕی
0
268935
6532391
5872590
2026-09-19T08:27:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532391
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fermangêrrî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hukumî]], [[fermî]], [[resmî]], [[fermangêrrî]]
oqsbq40u96nu2oba8kts2m20i3sjv4k
فەرمانی
0
268936
6532392
5872591
2026-09-19T08:27:15Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532392
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fermanî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[fermanî]], [[emrî]], [[împeratîv]]
m0tzn5plpi7bydrfenm82fxmf93nqgy
فەرمانڕەوایی
0
268938
6532393
5872589
2026-09-19T08:27:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532393
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fermanrrewayî
=== Navdêr ===
{{navdêr|ckb}}
# [[rêveberî]], [[ serok(at)î]], [[serwerî]], [[fermanrewayî]], [[administrasyon]]
9tbhbu6t99q1pohit8ak1cvc4b1moyw
فەرمایشت
0
268939
6532394
5872592
2026-09-19T08:27:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532394
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fermayişt
=== Navdêr ===
{{navdêr|ckb}}
# [[kerem]] :Wek Elî fermayişt kirdûwe, Wek Elî kerem kiriye, (Awayek rêzgirtinê ye li şûna "Wek Elî gotiye")
dmufug7a9ar3k1pldb2hs9namrikzsd
فەرموون
0
268941
6532395
5872594
2026-09-19T08:27:45Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532395
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fermûn
=== Lêker ===
{{lêker|ckb}}
# [[1]], [[kerem kirin]], '':kerem bikin 2'' gotin (t dema rêzgirtin û qedir û qîmet hemberî kesa/ê tiştek gotiye têt nîşandan) Xwa le Quran da fermûyetî ke, Xwedê di Quranê de kerem kiriye ku, [[ (]], gotiye ku, ) (Herwa bi tirraneyî / tinazî jî têt bikaranîn:) "Cenabtan" çî defermê? Çi dibêjî, [[ "ezbenî"?]]
kdkuccsxaccy43njhu4eerqapc06weh
فەرق
0
268942
6532396
5872580
2026-09-19T08:27:55Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532396
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:ferq
=== Rengdêr ===
{{rengdêr|ckb}}
# [[ferq]], [[cuda]], [[cihê]]
r78hx9xzv9i63mpr0z5o5x8vdrof2cg
فەرتووت
0
268945
6532397
5872568
2026-09-19T08:28:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532397
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fertût
=== Rengdêr ===
{{rengdêr|ckb}}
#(kesa/ê ji pîriyê / êxtiyariyê) jitaqetketî, [[bêtaqet]], [[neşê]]
bl1exr2gmaeiikomcink4c6ej4q29eb
فەروو
0
268946
6532398
5872598
2026-09-19T08:28:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532398
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:ferû
=== Navdêr ===
{{navdêr|ckb}}
# [[per]], perûpûrtê bi mirîşk û elokan ve
jtwcatz1wkmitt37qgjkcf6p7xmvy7y
فەرز
0
268949
6532399
6433332
2026-09-19T08:28:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532399
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:ferz
=== Rengdêr ===
{{rengdêr|ckb}}
# [[ferz]], [[gerek]], [[pêdivî]], [[pêwîst]], [[hewce]], [[lazim]]
==== Anagram ====
* {{anagram|ckb|a=رزفە|فرەز}}
745wbpju081layhy13vjvtc1t8gpis6
فەرزین
0
268950
6532400
5872578
2026-09-19T08:28:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532400
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:ferzîn
=== Navdêr ===
{{navdêr|ckb}}
# (di şetrencê de) [[wezîr]]
0ztve9bn6djj0nfgvztpu286ncw6m8y
فەسڵ
0
268951
6532401
5872601
2026-09-19T08:28:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532401
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fesll
=== Navdêr ===
{{navdêr|ckb}}
# [[lihevhatin]], [[sulh]], [[rêkeftin]], [[lihevkirin]], dijminatiya di navbera xwe herdu aliyan de nehêlan
7ifzn5ktbe73tsst4s3s4qyvuas38v1
فەتارەت
0
268954
6532402
5872554
2026-09-19T08:28:55Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532402
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fetaret
=== Lêker ===
{{lêker|ckb}}
# [[birihîn]], [[telifîn]], [[neman]], ji holê rabûn, ji navê rabûn
jo8rf3nzxcaro3772qm5zqk7r7s2iwa
فەوتان
0
268956
6532403
5872611
2026-09-19T08:29:05Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532403
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fewtan
=== Lêker ===
{{lêker|ckb}}
# [[pûç bûn]], [[wêran bûn]], [[kembax bûn]], [[ruxîn]], [[hilweşîn]]
dud985jspe97s90241fn90vlolmrjcz
فەوتاندن
0
268957
6532404
5872612
2026-09-19T08:29:15Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532404
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fewtandin
=== Lêker ===
{{lêker|ckb}}
# [[pûç kirin]], [[wêran kirin]], [[kembax kirin]], [[ruxandin]], [[hilweşandin]]
3rfjs7l4iwrmjz49bv1q0w9evr8cg5f
فەوتاو
0
268958
6532405
5872613
2026-09-19T08:29:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532405
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fewtaw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[pûç(bûyî)]], [[ wêran(bûyî)]], [[ kembax(bûyî)]], [[ruxî]], [[hilweşî]]
kpaxfsbasm3a6huavs73rxkt6nw17z9
فەلەسووف
0
268959
6532406
5872607
2026-09-19T08:29:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532406
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:felesûf
=== Navdêr ===
{{navdêr|ckb}}
# [[fîlozof]], [[feylesof]]
6wg5chz57carjljilr5ed64o7qyluj5
فەخفووری
0
268960
6532407
5872558
2026-09-19T08:29:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532407
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fexfûrî
=== Navdêr ===
{{navdêr|ckb}}
# [[ferfûrî]], [[çîn]], [[porselen]]
l3dk53fi7amtol9mzmr1zlqi6zvc82m
فێڵ
0
268963
6532408
5872530
2026-09-19T08:29:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532408
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fêll
=== Navdêr ===
{{navdêr|ckb}}
# [[fêl]], [[lêb]], [[lêhb]], [[hîle]], [[dekûdolab]], [[lîstik]]
1h7gaycq6gsoyidjciuzibebbzffey7
فێڵباز
0
268964
6532409
5872532
2026-09-19T08:30:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532409
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fêllbaz
=== Navdêr ===
{{navdêr|ckb}}
# [[fêlbaz]], [[hîlebaz]], [[lêbker]], [[lêhbker]]
04qra455nevw86z6her9420s63qichu
فێڵووفەرەج
0
268965
6532410
5872544
2026-09-19T08:30:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532410
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fêllûferec
=== Navdêr ===
{{navdêr|ckb}}
# [[dekûdolab]], [[lêb]], [[hîle]], [[fêl]], [[lêhb]], [[xapandin]]
hx4r38m5r2ol8hsrk4nqzx3escpmq5l
فێرگە
0
268971
6532411
5872508
2026-09-19T08:30:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532411
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fêrge
=== Navdêr ===
{{navdêr|ckb}}
# [[fêrge]], [[xwendinge]], [[dibistan]], [[qutabxane]], cihê lêfêrkirinê û lêfêrbûnê
rf8tspyor0rlv5bbrnb1xmh4ier25lf
فێسان
0
268972
6532412
5872514
2026-09-19T08:30:35Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532412
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fêsan
=== Lêker ===
{{lêker|ckb}}
# [[şil bûn]], [[şilîn]], [[şilikîn]]
7oo7d4cresp1zjtfrfhwl9ti3eha1lc
فڵان
0
268974
6532413
5872448
2026-09-19T08:30:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532413
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fillan
=== Navdêr ===
{{navdêr|ckb}}
# [[filan]] :~ car filan car(ê), ~ kes filan kes, ~ şit filan tişt, ~ û fîsar filan-bêvan, [[filan û bêvan]]
bj9ne8m4a7vkwu43ojq9lugwawf3daa
فلیقاندن
0
268975
6532414
5872469
2026-09-19T08:30:55Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532414
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:filîqandin
=== Lêker ===
{{lêker|ckb}}
# [[meriçandin]], [[merçiqandin]], [[perçiqandin]], [[pelçiqandin]]
lbxyyernn6ddl0safsbfxlyqw7eicby
فلیقاو
0
268976
6532415
5872470
2026-09-19T08:31:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532415
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:filîqaw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[merriçî]], [[merçiqî]], [[perçiqî]], [[pelçiqî]], hatî merriçandin / merçiqandin
qfrf5pvur2rbmmo8e863q4fwa6o16z6
فڵیتە
0
268977
6532416
5872468
2026-09-19T08:31:15Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532416
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fillîte
=== Rengdêr ===
{{rengdêr|ckb}}
# [[felîte]], [[tûle]], [[tolaz]], [[pûç]]
nmt3dxtmjxdc1n3uda0b8wvoueswnls
فڵتاندن
0
268980
6532417
5872453
2026-09-19T08:31:25Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532417
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:filltandin
=== Lêker ===
{{lêker|ckb}}
# [[minandin]], [[ mine-min kirin]], bi mine-minkî peyivîn, wa nezelal û dengnizm axivîn ku bi asanî jê neyê famkirin
bxz106ri6godhdc6v3ndwku9pkazznp
فراژان
0
268986
6532418
5872156
2026-09-19T08:31:35Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532418
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firajan
=== Lêker ===
{{lêker|ckb}}
# [[firajîn]], [[peresîn]], [[pêş ketin]], guhertinên wa tê de çêbûn ku ji berê baştir / kêrhatîtir bibe
m58z2njhb1ytfgq895mmtqhsfcj4ytw
فراژاندن
0
268987
6532419
5872158
2026-09-19T08:31:45Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532419
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firajandin
=== Lêker ===
{{lêker|ckb}}
# [[firajandin]], [[peresandin]], [[pêş xistin]], [[pêşve birin]], guhertinên wa tê de çêkirin ku ji berê baştir / kêrhatîtir bibe
05ulgty9qsfz5cmh800p721olnlpmwf
فراژیوەر
0
268989
6532420
5872162
2026-09-19T08:31:55Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532420
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firajîwer
=== Rengdêr ===
{{rengdêr|ckb}}
# [[firajîwer]], [[guherbar]], tişta diguhere yan dikare biguhere (t, baştir bibe)
r6qqgz21vu56zm09ibwlzndn4u818in
فرە
0
268992
6532421
5872372
2026-09-19T08:32:05Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6532421
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fire
=== Hoker ===
{{hoker|ckb}}
# [[pirr]], [[gelek]]
ct8i9poqlc73s8w6y65340by6x2z9vh
فرەبێژ
0
268994
6532422
5872374
2026-09-19T08:32:15Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532422
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firebêj
=== Rengdêr ===
{{rengdêr|ckb}}
# [[pirbêj]], [[zêdeaxiv]]
f4432elk6l9j7jzkcco2j5icao9ber9
فرەھزبایی
0
268996
6532423
5872377
2026-09-19T08:32:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532423
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firehizbayî
=== Navdêr ===
{{navdêr|ckb}}
# [[pirrpartîtî]], [[pluralîzm]]
7z78bn4fdsdea9tfqp08tv2p81fonyw
فرەیی
0
268997
6532424
5872379
2026-09-19T08:32:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532424
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fireyî
=== Navdêr ===
{{navdêr|ckb}}
# [[pirrî]], [[gelekî]], [[zêdeyî]], [[mişeyî]], [[zafî]]
qa9y8f13o8kzalysfar0mmcooduvk37
فرەز
0
268998
6532425
6433335
2026-09-19T08:32:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532425
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firez
=== Navdêr ===
{{navdêr|ckb}}
# [[qedîfe]]
==== Anagram ====
* {{anagram|ckb|a=رزفە|فەرز}}
rh1lntyvrt9zct0704rhq6kijaffjiq
فرەنەتەوەیی
0
268999
6532426
5872376
2026-09-19T08:32:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532426
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fireneteweyî
=== Navdêr ===
{{navdêr|ckb}}
# [[pirneteweyî]], [[multînasyonal]]
blieriwaoxs8nxeot22vjr06rb2edly
فڕێ
0
269000
6532427
5872354
2026-09-19T08:33:05Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532427
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firrê
=== Lêker ===
{{lêker|ckb}}
# [[avêtin]], [[virr kirin]]
pdi4yszwc7meo5129h9eh0uisib984a
فڕێدراو
0
269001
6532428
5872364
2026-09-19T08:33:15Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532428
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firrêdiraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[avêtî]], [[virrkirrî]], [[bêxwedî(hiştî)]], [[bêxudan(hêlayî)]]
akuovieyjm1axt1sdpzxmv7o3upndby
فڕفینگ
0
269004
6532429
5872272
2026-09-19T08:33:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532429
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firrfîng
=== Navdêr ===
{{navdêr|ckb}}
# [[persîv]], êşa sarmayê
ajp70wa26zpzqxt3ai338itunhtkkfq
فڕگە
0
269005
6532430
5872284
2026-09-19T08:33:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532430
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firrge
=== Navdêr ===
{{navdêr|ckb}}
# [[firrgeh]], cihê firrîna balafiran
nv5u8n4nn0pv6171vee18gcu92g2kt2
فڕن
0
269006
6532431
5872316
2026-09-19T08:33:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532431
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firrin
=== Navdêr ===
{{navdêr|ckb}}
# [[firin]], [[tenûr]]
mpzrape9maad224ttrqc1m783znqnup
فڕیشتە
0
269010
6532432
5872366
2026-09-19T08:33:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532432
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firîşte
=== Navdêr ===
{{navdêr|ckb}}
# [[firîşte]], [[melek]], [[melaîket]]
bhq6wk4lt3acykuop5s6vwc6bxqf561
فریو
0
269011
6532433
5872368
2026-09-19T08:34:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532433
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firîw
=== Navdêr ===
{{navdêr|ckb}}
# [[xap]], [[hîle]], [[lêb]], [[lêhb]], [[fêl]], [[dekûdolab]]
r3q1gsq4y6akbtzmb7ovli5tfyy3eue
فریواندن
0
269012
6532434
5872369
2026-09-19T08:34:15Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532434
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firîwandin
=== Lêker ===
{{lêker|ckb}}
# [[xapandin]], [[hîle lê kirin]], dekûdolab lê kirin
nmsv8u09sowtn03jrsvwz9sn3z1p2ib
فریز
0
269015
6532435
5872365
2026-09-19T08:34:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532435
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firîz
=== Navdêr ===
{{navdêr|ckb}}
# [[firîz]], giyayek e li mêrg û çîmenan şên dibe
fr9e7a6a1czkec3fsrjp495aknwi4sd
فڕکان
0
269016
6532436
5872280
2026-09-19T08:34:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532436
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firrkan
=== Navdêr ===
{{navdêr|ckb}}
# [[bîsk]], [[kêlîk]], [[gav]] :Be firrkanêk gerrayewe Di gavekê de vegerî
efwhvupld46thjs8tntrv5srrb762jv
فڕۆکەنەھێڵ
0
269019
6532437
5872352
2026-09-19T08:34:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532437
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firrokenehêll
=== Navdêr ===
{{navdêr|ckb}}
# [[dij-firoke]], [[ dij-balafir]], çekên dijî firokeyan tên bikaranîn
0btrj6ny2ld9ubtyajdbwcp8w0fgpzb
فڕۆکەوان
0
269020
6532438
6342848
2026-09-19T08:34:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532438
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firrokewan
=== Navdêr ===
{{navdêr|ckb}}
# [[firokevan]], [[pîlot]], kesa/ê firokeyan difirîne
3322nj40ra0fuo3wr1p9ddl0p83y19e
فرستادە
0
269021
6532439
5872230
2026-09-19T08:35:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532439
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firstade
=== Navdêr ===
{{navdêr|ckb}}
# [[peyamber]], [[qasid]]
0ux5z3r96qi6bny5gjbuh29mm6d080f
فرۆشراو
0
269022
6532440
5872351
2026-09-19T08:35:15Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532440
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firoşraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[firotî]], hatî firotin
gcjz7o96vv5hgsgelmu05l5i7ulbjx9
فرشتەنگ
0
269026
6532441
5872246
2026-09-19T08:35:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532441
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firşteng
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bênteng]], [[bênçik]]
=== Dijmane ===
* [[bênfire]]
mti382y0ge9v8qwjkp1hk390n6a9arj
فرتەنە
0
269027
6532442
5872194
2026-09-19T08:35:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532442
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firtene
=== Navdêr ===
{{navdêr|ckb}}
# [[firtone]], [[bahoz]], [[barove]], [[tûfan]]
6oigb1cf3ykqt45zzkaqrd7wotbzyd0
فڕووفێڵ
0
269030
6532443
5872348
2026-09-19T08:35:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532443
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firrûfêll
=== Navdêr ===
{{navdêr|ckb}}
# [[dekûdolab]], [[hîle]], [[fenûfêl]]
ktq1p7tryczofogp1mfr6noy7qoe1iz
فڕوون
0
269031
6532444
5872349
2026-09-19T08:35:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532444
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:firrûn
=== Navdêr ===
{{navdêr|ckb}}
# [[firin]], [[tenûr]]
hzug7oafrcezntfe2whhlz6ykdo4ovw
فس
0
269033
6532445
5872382
2026-09-19T08:36:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532445
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fis
=== Navdêr ===
{{navdêr|ckb}}
# [[fis]], [[fisîn]], [[fisikîn]], dengê fisefisê
7qlymqu6ynl4sudt2ukhye31atsxj78
فسکەفسک
0
269035
6532446
5872390
2026-09-19T08:36:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532446
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fiskefisk
=== Navdêr ===
{{navdêr|ckb}}
# [[pistepist]], peyivîna bi dengek pirr nizm (t li ber guhê kesekî)
joqput2e7r84t3fojevdwlzn6td97hm
فشەگاڵتە
0
269037
6532447
5872402
2026-09-19T08:36:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532447
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fişegallte
=== Navdêr ===
{{navdêr|ckb}}
# [[tirrane]], [[tinazî]], [[qerf]], [[henek]], [[yarî]], [[galte]]
g7c83yktl34650emnjgdz2x9sppgrlz
فشقیات
0
269039
6532448
5872400
2026-09-19T08:36:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532448
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fişqiyat
=== Navdêr ===
{{navdêr|ckb}}
# [[qerf]], [[henek]], [[tirrane]], [[galte]], [[yarî]], [[tinazî]]
ffeyo6xgwrcth2plq5tr59cc4g52nq5
فتیلە
0
269040
6532449
5872097
2026-09-19T08:36:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532449
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fitîle
=== Navdêr ===
{{navdêr|ckb}}
# [[fitîl]], fitîlk (wek ya fanosê)
h2tmxivb3d7cu3v9k0gne13sc04d3pl
فترە
0
269041
6532450
5872083
2026-09-19T08:36:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532450
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fitre
=== Navdêr ===
{{navdêr|ckb}}
# [[fitre]], [[fitir]]
ohzdy1jfkjv72pgxy70m1v8j4k7zzza
فتوا
0
269042
6532451
5872091
2026-09-19T08:37:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532451
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fitwa
=== Navdêr ===
{{navdêr|ckb}}
# [[fitwa]]
30squilmv5ndyptrqn5brkj7ip9vw0e
فیچقە
0
269044
6532452
5872498
2026-09-19T08:37:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532452
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fîçqe
=== Navdêr ===
{{navdêr|ckb}}
# [[derzî]], [[kutank]], [[şirînqe]], [[enjeksiyon]]
jg75cezi0sgbes932rjzgpknekdz010
فیک
0
269047
6532453
6433344
2026-09-19T08:37:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532453
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fîk
=== Navdêr ===
{{navdêr|ckb}}
# [[fît]], [[fîrr]], [[fîtvedan]], dengê fîtefît
==== Anagram ====
* {{anagram|ckb|a=فکی|کیف}}
a7kdc8j36h8zptjjas8kcy717xoq2uz
فیکە
0
269048
6532454
6433352
2026-09-19T08:37:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532454
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fîke
=== Navdêr ===
{{navdêr|ckb}}
# [[fîtik]], [[dudik]], [[fîrrfîrrk]], [[fîtok]], [[firîzok]], alava pêfîtînê / pêfîtvedanê
==== Anagram ====
* {{anagram|ckb|a=فکیە|کەیف}}
di2fwyednj0uib0ftzu32723dqz13of
فیرست
0
269052
6532455
5872506
2026-09-19T08:37:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532455
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fîrist
=== Navdêr ===
{{navdêr|ckb}}
# [[îndeks]], [[fîrist]], [[fihrist]]
q0mi7rptgg8ynmfy8m5x8yhsixfnp1c
فیڕکە
0
269053
6532456
5872507
2026-09-19T08:37:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532456
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fîrrke
=== Navdêr ===
{{navdêr|ckb}}
# [[fîrrik]], [[fîşik]], [[hinavçûn]], [[zikçûn]], [[îshal]]
ml4n1wisurhtaspmepm6ztwaki53971
فیڕۆ
0
269054
6532457
5872509
2026-09-19T08:38:05Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532457
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fîrro
=== Lêker ===
{{lêker|ckb}}
# (maliyet) [[pûç kirin]], zêde mesref kirin
gio6ho5zngmmr7go6t4is27xjp7a8cu
فیسان
0
269055
6532458
5872515
2026-09-19T08:38:15Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532458
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fîsan
=== Lêker ===
{{lêker|ckb}}
# [[şil bûn]], [[şilîn]], [[şilikîn]]
033nylh749f70wli9cwiiov8wvo0p09
فیسەڵ
0
269057
6532459
5872516
2026-09-19T08:38:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532459
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fîsell
=== Rengdêr ===
{{rengdêr|ckb}}
# [[ziwa]], [[hişk]]
==== Hevmane ====
* {{g|ckb|وشک}}
l8jae81zbo58fjhvrh75xeqz1yi5xwb
فیز
0
269063
6532460
5872510
2026-09-19T08:38:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532460
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fîz
=== Navdêr ===
{{navdêr|ckb}}
# [[qurretî]], [[pozbilindî]]
m81nep1j7qd8syq5bbtkq9h2hveu49x
فیزار
0
269064
6532461
5872511
2026-09-19T08:38:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532461
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fîzar
=== Navdêr ===
{{navdêr|ckb}}
# [[nalîn]], [[gilî]], [[gazin]], [[xem]], [[derd]], kul û kovan
0w4xfp8o21mzu3f3zd7c9l56t0e2xyd
فیزن
0
269065
6532462
5872512
2026-09-19T08:38:55Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532462
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fîzin
=== Rengdêr ===
{{rengdêr|ckb}}
# [[qure]], [[pozbilind]]
dzz11y0ik0ahfzi5q19i6xwmzdsv4x2
فوودراو
0
269067
6532463
5872495
2026-09-19T08:39:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532463
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fûdiraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[pifdayî]], [[perçivandî]], tijî hewa kirî
51p8rsrnpncu9y7qqz7qqpuzpzdbq1t
فوورھە
0
269068
6532464
5872496
2026-09-19T08:39:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532464
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:fûrhe
=== Navdêr ===
{{navdêr|ckb}}
# [[sûlavok]], [[sûlav]] (t biçûk), cihê ava çem / rûbar lê ji bilindayiyekê dikeve erdek nizm
r9ic4w7x73u2hrcklbxdjsot9z7xl9l
گاگۆڵکێ
0
269073
6532465
5874833
2026-09-19T08:39:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532465
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gagollkê
=== Navdêr ===
{{navdêr|ckb}}
# [[çarlepk]], meşîna li ser herdu destan û herdu piyan
dfoa957t10mhbrm4ayijv7tc7m46rta
گاکێوی
0
269074
6532466
5874831
2026-09-19T08:39:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532466
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gakêwî
=== Navdêr ===
{{navdêr|ckb}}
# [[gakûvî]], gayên kûvî
bn4ogg5u46w9u8k0uhhcko726j4adbq
گاڵە
0
269076
6532467
6433359
2026-09-19T08:39:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532467
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:galle
=== Navdêr ===
{{navdêr|ckb}}
# [[qîrrî]], [[qêrrî]], [[qîjî]], [[qêjî]], giriyê bi dengek bilind
==== Anagram ====
* {{anagram|ckb|a=اگڵە|گەڵا}}
hc68uw64spkg148uufmr7k2hywhvech
گاڵەکوت
0
269077
6532468
5874859
2026-09-19T08:39:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532468
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gallekut
=== Navdêr ===
{{navdêr|ckb}}
# [[galegot]], [[galgal]], gotinên bêbingeh
hz389dgnvlkp8xkhu4r7svpjpcgmiml
گالیسکە
0
269078
6532469
5874855
2026-09-19T08:40:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532469
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:galîske
=== Navdêr ===
{{navdêr|ckb}}
# [[erebe]], [[erebane]] (ya hesp li dû xwe dikêşin)
mqmyy5cfop9c8zvxcnf47x3h4f8ym77
گاڵۆک
0
269079
6532470
5874853
2026-09-19T08:40:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532470
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gallok
=== Navdêr ===
{{navdêr|ckb}}
# [[gopal]], [[kaşok]] (t yên gavanan)
4ynjczm7l8bfhlsesx873jwlyl15akf
گاڵتە
0
269080
6532471
5874841
2026-09-19T08:40:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532471
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gallte
=== Navdêr ===
{{navdêr|ckb}}
# [[qerf]], [[henek]], [[tinaz]], [[tirrane]], [[galte]], [[yarî]], [[şoxî]], [[tinazî]]
jhp6u7slc3fmf6vn2mlbb3g98m9dgca
گاڵتەبێژ
0
269081
6532472
5874843
2026-09-19T08:40:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532472
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:galltebêj
=== Navdêr ===
{{navdêr|ckb}}
# [[henekbêj]], [[qerfbêj]], [[tinazbêj]], [[tirraneker]], [[galtebêj]], [[tinazîker]], kesa/ê henekan dike / dibêje
ash5c8n7qd3m0wsgt2j7ckduvio6c7l
گاڵتەجاڕ
0
269082
6532473
5874845
2026-09-19T08:40:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532473
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:galltecarr
=== Navdêr ===
{{navdêr|ckb}}
# [[qerfok]], [[pêkenok]], [[qeşmer]]
9sw1b6xguyt66imgfmfx75txfhpl9f4
گاڵتەچی
0
269083
6532474
5874847
2026-09-19T08:40:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532474
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gallteçî
=== Navdêr ===
{{navdêr|ckb}}
# [[henekbêj]], [[tirraneker]], [[tinazîbêj]]
6v7agq5kp588bo4qd8qtdy9ef7v3g0j
گامەڵاس
0
269085
6532475
5874865
2026-09-19T08:41:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532475
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gamellas
=== Navdêr ===
{{navdêr|ckb}}
# [[serhişkî]], [[dijberî]]
g3graiunwrotady3u5izyyyf826v514
گامێش
0
269086
6532476
5874863
2026-09-19T08:41:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532476
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gamêş
=== Navdêr ===
{{navdêr|ckb}}
# [[gamêş]], [[ga]]
ts6hlxxew52s1i8mdysdawr0ozmwv9x
گاناوی
0
269088
6532477
6433365
2026-09-19T08:41:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532477
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:ganawî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[seksî]], [[ganawî]]
==== Anagram ====
* {{anagram|ckb|a=اانوگی|گاوانی}}
9jvkba2e4wii4bw3e2fz4ob6nvlrzvq
گارەگار
0
269091
6532478
5874809
2026-09-19T08:41:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532478
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:garegar
=== Navdêr ===
{{navdêr|ckb}}
# [[qidqid]] (dengê mirîşkan)
2s1yopsm79em3mhnmwd8o7oj2xc0alh
گاڕس
0
269092
6532479
5874805
2026-09-19T08:41:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532479
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:garris
=== Navdêr ===
{{navdêr|ckb}}
# [[garis]]
mh4d5d75xgaysbkwzua47puo06s7sx0
گاسن
0
269093
6532480
5874827
2026-09-19T08:41:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532480
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gasin
=== Navdêr ===
{{navdêr|ckb}}
# [[gasin]], [[gêsin]]
82ypa35ldrxnji2nh2rydx49zllvpq7
گاووگۆتاڵ
0
269095
6532481
5874903
2026-09-19T08:42:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532481
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gaûgotall
=== Navdêr ===
{{navdêr|ckb}}
# [[garan]], koma çêl û gayan
e17ojx11hq42lhwjfmhfs2krgig5gc5
گاوارە
0
269099
6532482
5874887
2026-09-19T08:42:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532482
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gaware
=== Navdêr ===
{{navdêr|ckb}}
# [[dergûş]], [[landik]], cihê lêçêbûna yan jêdestpêkirina tiştekî
a398bw6o2r3fuer9eq7gq5mbbtbf4aa
گاووس
0
269100
6532483
5874901
2026-09-19T08:42:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532483
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gawus
=== Navdêr ===
{{navdêr|ckb}}
# [[meşk]]
iekiyekwnnd1mp3q6lb4sg9rpepb4gc
گایلکە
0
269101
6532484
5874905
2026-09-19T08:42:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532484
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gayilke
=== Navdêr ===
{{navdêr|ckb}}
# [[hêstir]], [[qantir]]
glzk3hcy4iw36qavkubjw225x3q93yy
گایی
0
269102
6532485
6433368
2026-09-19T08:42:45Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6532485
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gayî
=== Hoker ===
{{hoker|ckb}}
# [[geyî]], [[ car-carî]], [[carinan]], hin car
==== Anagram ====
* {{anagram|ckb|a=اگیی|گییا}}
8pv46zgi6xlbz13tc8f0a19mhlb62ag
گازەرا
0
269103
6532486
5874825
2026-09-19T08:42:55Z
JiyanBot
3048
Cure Daçek hat lêzêdekirin
6532486
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gazera
=== Daçek ===
{{daçek|ckb}}
# [[nav]], [[nêv]], [[nîv]], nava / nêva / nîva tiştekî / derekê
ic4bbwfqxvi015sshp3psv9a6k5v5sx
گازندە
0
269104
6532487
5874821
2026-09-19T08:43:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532487
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gazinde
=== Navdêr ===
{{navdêr|ckb}}
# [[gazin]], [[gazind]], [[gazinc]], [[gazinde]], gilî û gazin, [[nalîn]], kul û kovan
kj8hgejr9e7j90xqsxldhkk7owvfm66
گازر
0
269106
6532488
5874815
2026-09-19T08:43:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532488
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gazir
=== Navdêr ===
{{navdêr|ckb}}
# [[spîkirin]]
k4bfln2p9v8g6iooid3snll5wjjxq5t
گەچ
0
269107
6532489
5875552
2026-09-19T08:43:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532489
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:geç
=== Rengdêr ===
{{rengdêr|ckb}}
# [[gêç]], [[cis]], [[ces]]
fwss3ghb9llvki8p4y7mf5eqb38sn4l
گەدا
0
269108
6532490
5875553
2026-09-19T08:43:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532490
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:geda
=== Navdêr ===
{{navdêr|ckb}}
# [[geda]], [[parsek]], [[xwestok]], [[ xwazo(k)]]
bkj08qnz80o7ovsbw0dji14rwy7uepo
گەدایی
0
269109
6532491
5875554
2026-09-19T08:43:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532491
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gedayî
=== Navdêr ===
{{navdêr|ckb}}
# [[gedatî]], [[parsekî]], [[xwestokî]], [[xwazokî]]
6k6c5t822f68x4ni1tuncohh8q6azca
گەدە
0
269110
6532492
5875555
2026-09-19T08:43:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532492
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gede
=== Navdêr ===
{{navdêr|ckb}}
# [[zik]], ûr bn sik
15uyfdd9tazva1vhb47cship2p8novo
گەف
0
269111
6532493
5875615
2026-09-19T08:44:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532493
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gef
=== Navdêr ===
{{navdêr|ckb}}
# [[gef]], [[hereşe]], [[tehdîd]], [[rey]], [[rew]], hew (dengê se û kûçikan)
ja6l5n8k3o9lobybrygp2fe0l2l8m4e
گەفین
0
269112
6532494
5875617
2026-09-19T08:44:15Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532494
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gefîn
=== Lêker ===
{{lêker|ckb}}
# [[reyîn]], [[rewîn]], [[hewtîn]] (dengê se û kûçikan)
426it1yjr9pklw23r5ci5f7yur9zwwq
گەفووگوڕ
0
269113
6532495
5875616
2026-09-19T08:44:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532495
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gefûgurr
=== Navdêr ===
{{navdêr|ckb}}
# [[gef]], [[tehdîd]], [[hereşe]]
9qx9ark6vlvcmjbhu1446r8d1mahqb6
گەل
0
269114
6532496
5875618
2026-09-19T08:44:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532496
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gel
=== Navdêr ===
{{navdêr|ckb}}
# [[gel]], [[milet]], [[xelk]], [[mirov]], [[netewe]]
dzhq2khmhu1xkmq4dmanj6hbhix88in
گەڵادار
0
269116
6532497
5875619
2026-09-19T08:44:45Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532497
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gelladar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[peldar]], [[bipel]], [[belgîn]]
2bxtijdravir0xz2t1pkvq6y4iv3uyy
گەڵاکوتک
0
269119
6532498
5875622
2026-09-19T08:44:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532498
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gellakutk
=== Navdêr ===
{{navdêr|ckb}}
# [[şûnik]], darek pan e cil û xalîçe pê tên qutan dema tên şûştin daku baş paqij bibin
2k3eh0tjb4gx59p2kx8uxikhtktzmr1
گەلال
0
269120
6532499
5875623
2026-09-19T08:45:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532499
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gelal
=== Navdêr ===
{{navdêr|ckb}}
# [[celal]], [[meyav]], [[rûbarok]], [[rûbar]]
5ya5iqhk8719yxrfkbsc75xve94ko4o
گەڵاڵە
0
269121
6532500
5875624
2026-09-19T08:45:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532500
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gellalle
=== Navdêr ===
{{navdêr|ckb}}
# [[pêşnima]], [[miswede]]
l94pjaawm08s9b0fq8e705vyq7tjffv
گەلھۆ
0
269128
6532501
5875628
2026-09-19T08:45:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532501
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gelho
=== Rengdêr ===
{{rengdêr|ckb}}
# [[famkor]], [[mejîreş]]
sh1z8gmqx2kkog1w0xy1lhyhf3u2atv
گەلۆر
0
269130
6532502
5875629
2026-09-19T08:45:35Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532502
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gelor
=== Rengdêr ===
{{rengdêr|ckb}}
# [[peledîn]], [[aqilsivik]], [[mejîreş]], [[famkor]], [[xwelîser]], [[delodîn]], [[tirredîn]], [[hepledîn]], [[hepletiraş]]
9uyaqqzynzsgv5nxiwuk5ykuzpy20da
گەمارۆ
0
269132
6532503
5875633
2026-09-19T08:45:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532503
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gemaro
=== Navdêr ===
{{navdêr|ckb}}
# [[dorpêç]], [[dorgirtin]], [[ambargo]]
610iq424uqgqrrje3wqm935264rmzlj
گەموورە
0
269134
6532504
5875635
2026-09-19T08:45:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532504
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gemûre
=== Navdêr ===
{{navdêr|ckb}}
# [[gilîz]], [[tif]], [[bilxem]]
f011nh764ld84frdnkwsryy2jp1zl1c
گەناندن
0
269135
6532505
5875636
2026-09-19T08:46:05Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532505
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:genandin
=== Lêker ===
{{lêker|ckb}}
# [[genandin]], [[genî kirin]], [[rizandin]]
7djk46f39dzz5a66w02vhg43bkg4fv5
گەندووگوو
0
269139
6532506
5875637
2026-09-19T08:46:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532506
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gendûgû
=== Navdêr ===
{{navdêr|ckb}}
# [[pîsî]], [[qirêjî]], bîna pîs
8a090ko1p6c2yc490h7p6o2op7pe2h4
گەنمە
0
269141
6532507
5875640
2026-09-19T08:46:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532507
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:genime
=== Navdêr ===
{{navdêr|ckb}}
# [[balûk]]
iq6zxzxom0q5n5qjciii9uo4olrxu28
گەنیو
0
269145
6532508
5875643
2026-09-19T08:46:35Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532508
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:genîw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[genî]], [[genîbûyî]], [[rizî]], [[riziyayî]]
p6aln3j49pvj4xm5o3qobyfhn67778n
گەپەگەپ
0
269146
6532509
5875551
2026-09-19T08:46:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532509
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gepegep
=== Navdêr ===
{{navdêr|ckb}}
# [[devjenkî]], [[suhbet]], [[galgal]], [[galegot]], ''gotinên bêbingeh''
708odr7kzara7x9ni493ho5qhq662qn
گەر
0
269147
6532510
5875556
2026-09-19T08:46:55Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6532510
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:ger
=== Hoker ===
{{hoker|ckb}}
# [[ger]], [[eger]], [[heke]], [[heger]], [[heku]]
nazygkkyescn3irgbvi98e9r0izis7z
گەڕان
0
269149
6532511
5875557
2026-09-19T08:47:05Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532511
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:geran
=== Lêker ===
{{lêker|ckb}}
# [[gerîn]], [[geriyan]], [[gerihan]], [[hatin û çûn]]
h8vykr2h7rqm7rhax4t228m81h4k2kx
گەڕانەوە
0
269152
6532512
5875560
2026-09-19T08:47:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532512
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gerranewe
=== Navdêr ===
{{navdêr|ckb}}
# [[vegerrîn]], [[vehatin]], hatin ve
g636y61ymb6bmfmmkbd2gydr425bf7l
گەردانە
0
269155
6532513
5875562
2026-09-19T08:47:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532513
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gerdane
=== Navdêr ===
{{navdêr|ckb}}
# [[gerdenî]], ristika gerdenê
6iimk3bqik8a1v2tjhro2g1ageni9x6
گەرداو
0
269156
6532514
5875563
2026-09-19T08:47:35Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532514
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gerdaw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[1]], [[tevlihev]], serobin 2, [[zivirok]]
5i20tjmjemx3qn3thjl9ez9y4gqas8j
گەردنکەچ
0
269159
6532515
5875565
2026-09-19T08:47:45Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532515
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gerdinkeç
=== Rengdêr ===
{{rengdêr|ckb}}
# [[nefsbiçûk]]
ppr1hhr5jh7x47wtjswj9tik85wykv2
گەردنکەش
0
269160
6532516
5875566
2026-09-19T08:47:55Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532516
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gerdinkeş
=== Rengdêr ===
{{rengdêr|ckb}}
# [[dijraber]], [[serhildêr]], [[xweragir]], [[mukum]]
ia9pqzjday8w8l1vg3rmkvo01krnd1a
گەردنکێل
0
269161
6532517
5875564
2026-09-19T08:48:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532517
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gerdinkêl
=== Rengdêr ===
{{rengdêr|ckb}}
# [[biînat]], [[înato]]
qlicct78a1rd8nhe8crxosrlq4dkcci
گەردەش
0
269162
6532518
5875570
2026-09-19T08:48:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532518
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gerdeş
=== Navdêr ===
{{navdêr|ckb}}
# [[pevçûn]], [[şerenîx]], [[ajawe]], [[şoreş]]
m1g44ikytfjygnuwmfqv7bcg4ae3vde
گەردووگەڵا
0
269164
6532519
5875568
2026-09-19T08:48:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532519
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gerdûgella
=== Navdêr ===
{{navdêr|ckb}}
# [[elind]], [[berspêde]], [[gizing]], [[berbeyanî]]
5b0sp8z0mv0sjtf0frvdyb5v3ylo2aj
گەردوون
0
269165
6532520
5875569
2026-09-19T08:48:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532520
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gerdûn
=== Navdêr ===
{{navdêr|ckb}}
# [[gerdûn]], [[kaînat]], erd û esman, [[felek]]
q04n361wh4pyvrzh3e60jp5t7skki0k
گەردووخول
0
269166
6532521
5875567
2026-09-19T08:48:45Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532521
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gerdûxul
=== Rengdêr ===
{{rengdêr|ckb}}
# [[zivirok]], [[çerxok]]
bwzrqqi05nxnjpq5j5gn6lohqfkgqxu
گەرەکی
0
269168
6532522
5875592
2026-09-19T08:48:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532522
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gerekî
=== Navdêr ===
{{navdêr|ckb}}
# [[gerekî]], [[lazimî]], [[hewcetî]], [[pêdivîtî]], [[pêwîstî]], [[divêtî]]
7bpdmn326grl2p3w73fwn8m9cnt4pvy
گەڕەلاوژە
0
269170
6532524
5875593
2026-09-19T08:49:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532524
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gerrelawje
=== Navdêr ===
{{navdêr|ckb}}
# [[tevlihevî]], [[serobinî]], [[bêahengî]]
bma7xjyvugznm7afflvxbfwxayj2phi
گەڕی
0
269171
6532525
5875590
2026-09-19T08:49:15Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532525
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gerrî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[gerrewî]], [[girrewî]], [[gurî]], [[pîs]], [[lewitî]]
lb009rm1hopek9u8l50b52wydgxj1z3
گەرم
0
269173
6532526
5875571
2026-09-19T08:49:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532526
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:germ
=== Rengdêr ===
{{rengdêr|ckb}}
# [[germ]], '': (dax) kel, [[gurî]]; (şîletên) [[tênşîr]], [[tînşîr]], [[ têhnşîr'']]
hctbkjeu0hp73wjagb29a9rscle6kcb
گەرما
0
269174
6532527
5875572
2026-09-19T08:49:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532527
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:germa
=== Navdêr ===
{{navdêr|ckb}}
# [[germa]], [[germî]] (hewayê germ)
l32u56i3hftzrds21u95zrop58l6433
گەرماپێو
0
269176
6532528
5875573
2026-09-19T08:49:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532528
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:germapêw
=== Navdêr ===
{{navdêr|ckb}}
# [[germapîv]], [[germîpîv]], [[termometre]]
n8uw99j6lxw15wondjnbxudims2lacb
گەرماو
0
269177
6532529
5875575
2026-09-19T08:49:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532529
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:germaw
=== Navdêr ===
{{navdêr|ckb}}
# [[germav]], ava (ji xwe) germ (e û têt bawerkirin ku derman e)
gmg6uyl3nbio81itvfm9hmjvdh68n99
گەرماوگەرم
0
269178
6532530
5875576
2026-09-19T08:50:05Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6532530
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:germawgerm
=== Hoker ===
{{hoker|ckb}}
# [[tavil]], [[di cî de]], [[serdanpê]]
pgwdwg06taf3ilgmipbr15l3az7185i
گەرمایی
0
269179
6532531
5875577
2026-09-19T08:50:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532531
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:germayî
=== Navdêr ===
{{navdêr|ckb}}
# [[germî]], [[germayî]], [[germatî]]
08sdwsznwkihyl3kat6hg8s1xfmjf6m
گەرمبردوو
0
269180
6532532
5875578
2026-09-19T08:50:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532532
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:germbirdû
=== Rengdêr ===
{{rengdêr|ckb}}
# [[germbirî]], tiştê li ber germayê pûç bûye
j7eb0ya5osdy1jzy3yco9eh5ea85g5y
گەرمەگلێ
0
269181
6532533
5875584
2026-09-19T08:50:35Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6532533
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:germegilê
=== Hoker ===
{{hoker|ckb}}
# [[1]], [[bênavbir]], [[bêbênvedan]], bêîstîrehet 2, navê lîstikek goganê / holanê ye
5qlbritmafyuqw6u84tozouk8xgj3pq
گەرمێتی
0
269182
6532534
5875583
2026-09-19T08:50:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532534
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:germêtî
=== Navdêr ===
{{navdêr|ckb}}
# [[germî]], [[germatî]]
5bak163k2nf8l27ql1uqszrl2vkf0ly
گەرمیان
0
269183
6532535
5875580
2026-09-19T08:50:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532535
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:germiyan
=== Navdêr ===
{{navdêr|ckb}}
# [[deşt]], [[nizmistan]], '':herêmek e li Başûrê Kurdistanê; germiyan û kiwêstan deşt û zozan''
974bdowmsbi6bg7pdm7qi5uuom17jxl
گەرمیانی
0
269184
6532536
6433380
2026-09-19T08:51:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532536
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:germiyanî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[deştî]], '':xelkê herêma Germiyan li Başûrê Kurdistanê''
==== Anagram ====
* {{anagram|ckb|a=ارمنگییە|گەرمییان}}
aekfkb6zn6hy1rid3ndgk5zgumsoa9a
گەرمی
0
269185
6532537
5875579
2026-09-19T08:51:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532537
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:germî
=== Navdêr ===
{{navdêr|ckb}}
# [[germî]], [[germatî]]
gv0zz8i6hw9hjupvon3ulntgwaqtern
گەڕۆک
0
269187
6532538
6433389
2026-09-19T08:51:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532538
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gerok
=== Navdêr ===
{{navdêr|ckb}}
# [[gerok]], kesa/ê pirr digere
==== Anagram ====
* {{anagram|ckb|a=ڕکگۆە|کۆڕگە}}
k9gyeug2p7xg9k5dx6dfte94mmr40rz
گەرووێش
0
269190
6532539
5875586
2026-09-19T08:51:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532539
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gerûêş
=== Navdêr ===
{{navdêr|ckb}}
# [[gewrîêş]], [[hefkêş]], [[anjîn]], [[angîna]]
jwuia57ekvpywgh6bzdnjradtaq1it9
گەروانکە
0
269191
6532540
5875585
2026-09-19T08:51:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532540
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gerwanke
=== Navdêr ===
{{navdêr|ckb}}
# [[pakêt]]
73zb8u7o6jlz2aj903pwpds9s6dd062
گەسکە
0
269193
6532541
5875601
2026-09-19T08:51:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532541
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:geske
=== Navdêr ===
{{navdêr|ckb}}
# [[xeleng]], [[gezik]], giyayê gezik jê tên çêkirin
1kf57lbp3m2ntsuijja53f0g9kafnob
گەستن
0
269194
6532542
5875600
2026-09-19T08:52:05Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532542
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gestin
=== Lêker ===
{{lêker|ckb}}
# [[gezandin]], [[dan ber didanan]], [[leq lê dan]], [[gestin]], [[gez kirin]], [[leqandin]], '':(mar) pê vedan''
e1jtpc1gilr2mgq7pnjbtkzn0denpha
گەشایشت
0
269196
6532543
5875603
2026-09-19T08:52:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532543
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:geşayişt
=== Navdêr ===
{{navdêr|ckb}}
# [[geşedan]], [[firajî]], [[pêşketin]], [[pêşveçûn]]
t23muvlecvpltircq670wn516bi1ikz
گەشبین
0
269197
6532544
5875604
2026-09-19T08:52:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532544
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:geşbîn
=== Rengdêr ===
{{rengdêr|ckb}}
# [[geşbîn]], [[xweşbîn]], [[hêvîdar]], [[optimîst]], [[umêdewar]]
sauky5x4faw86g1ycu70b5qxlskvvm8
گەشبینی
0
269198
6532546
5875605
2026-09-19T08:52:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532546
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:geşbînî
=== Navdêr ===
{{navdêr|ckb}}
# [[geşbînî]], [[xweşbînî]], [[hêvîdarî]], [[umêdewarî]], [[optimîzm]]
kpowpzxxsqbwdgjako7ipw6d64ig392
گەشەکردوو
0
269200
6532548
5875614
2026-09-19T08:52:45Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532548
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:geşekirdû
=== Rengdêr ===
{{rengdêr|ckb}}
# [[gihiştî]], [[pêşketî]], [[pêşveçûyî]]
1zffvnddpqb8wc5q9gcapiqetyuiprq
گەشکە
0
269202
6532550
5875611
2026-09-19T08:52:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532550
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:geşke
=== Navdêr ===
{{navdêr|ckb}}
# [[heyranî]], [[şadmanî]], [[mestî]], [[jihalçûn]], [[hîsterî]], [[ekstasî]]
3lgdtkxs9k2ywa6ocryw7donax5eyew
گەشتووگوزار
0
269206
6532552
5875608
2026-09-19T08:53:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532552
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:geştûguzar
=== Navdêr ===
{{navdêr|ckb}}
# [[turîzm]]
6oz0a4onpq3y14ykvz58m6zgu6npysy
گەشتوەر
0
269207
6532553
5875609
2026-09-19T08:53:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532553
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:geştwer
=== Navdêr ===
{{navdêr|ckb}}
# [[gerok]], [[lêger]]
9sc0m5pw9fi0fpnzozph26g2awj5hp9
گەشتیار
0
269208
6532554
5875610
2026-09-19T08:53:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532554
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:geştyar
=== Navdêr ===
{{navdêr|ckb}}
# [[geşyar]], [[turîst]], [[rêving]], [[rêwî]]
14d2s8dy7cpwq40hqgiko8t9ux8d6ab
گەواھ
0
269211
6532555
5875647
2026-09-19T08:53:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532555
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gewah
=== Navdêr ===
{{navdêr|ckb}}
# [[govan]], [[gova]], [[şahid]], kesê bûyerek dîtiye dema qewimiye
drjxi1xf5zhubys0xs1a0ou3c9bsuqn
گەواھی
0
269212
6532556
5875648
2026-09-19T08:53:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532556
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gewahî
=== Navdêr ===
{{navdêr|ckb}}
# [[govanî]], [[govahî]], [[şahidî]], dîtina qewimîna bûyerekê
iynjcxi5b87dsrwm1j31s7a56aprf2x
گەوار
0
269214
6532557
5875645
2026-09-19T08:53:55Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532557
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gewar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kêrhatî]], [[baş]], [[têr]] (a tiştekî dike), [[saxlem]], [[sax]], [[qenc]]
q6p32nkw1enenqtfofxecv4wl6y648e
گەوھەربەند
0
269219
6532558
5875654
2026-09-19T08:54:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532558
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gewherbend
=== Rengdêr ===
{{rengdêr|ckb}}
# [[gewerlê]], [[gewerkirî]], [[bigewer]]
0blvofz85f8eh6ua7zioty1a81t34b6
گەوھەردار
0
269220
6532559
5875655
2026-09-19T08:54:15Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532559
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gewherdar
=== Rengdêr ===
{{rengdêr|ckb}}
# (pirr) [[delal]], [[bedew]], [[rind]], [[xweşik]], [[bingehîn]], [[giring]], [[esasî]]
9yzli6vqcz04ipj3f5m9krvbkk3ehiq
گەوەری
0
269222
6532560
5875659
2026-09-19T08:54:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532560
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gewerî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[gewerî]], ji gewer, '': resen; [[bingehîn]], [[esasî]], [[ giring'']]
bi13cl0cxr16vqsdsytfbw788qsqnos
گەورەیی
0
269225
6532561
5875650
2026-09-19T08:54:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532561
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gewreyî
=== Navdêr ===
{{navdêr|ckb}}
# [[mezinî]], [[mezintî]], [[girî]], [[girsî]], [[zexmî]], [[giringî]]
k8i6tcz4ywj7a5a0cc52m57lssisjb1
گەوون
0
269228
6532562
5875657
2026-09-19T08:54:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532562
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gewun
=== Navdêr ===
{{navdêr|ckb}}
# [[devî]], [[tirraş]], [[kêrat]]
2n7vvk6e07jy4xgrxwt3k10utp8fr32
گەی
0
269231
6532563
5875661
2026-09-19T08:54:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532563
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gey
=== Navdêr ===
{{navdêr|ckb}}
# [[kerb]], [[kîn]], [[qehr]], [[nefret]], [[nifir]]
jlybxy2kdzp7w31ujsow550xuszmk4c
گەیشتگە
0
269235
6532564
5875663
2026-09-19T08:55:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532564
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:geyiştge
=== Rengdêr ===
{{rengdêr|ckb}}
# [[gihiştge(h)]], [[cihê]] (hev)gihiştinê
71j4t13iydv2dg6u6gbgtajt6lmcf3q
گەزەن
0
269239
6532565
6433404
2026-09-19T08:55:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532565
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gezen
=== Navdêr ===
{{navdêr|ckb}}
# [[ziyan]], [[zerer]], [[ezyet]], [[azar]]
==== Anagram ====
* {{anagram|ckb|a=زنگەە|گەزنە}}
suie0c8dk09sabu9p65icvxvy5q5dtp
گەزنە
0
269243
6532566
6433407
2026-09-19T08:55:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532566
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gezne
=== Navdêr ===
{{navdêr|ckb}}
# [[gezgezok]], [[gezgezînk]] (giyayek e)
==== Anagram ====
* {{anagram|ckb|a=زنگەە|گەزەن}}
94ri7zdal4he0ofbdk7r1qpj53jas0i
گێژاو
0
269246
6532567
5875537
2026-09-19T08:55:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532567
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gêjaw
=== Navdêr ===
{{navdêr|ckb}}
# [[1]], [[serzivirok]], çavzivirok 2, [[pirsgirêk]], [[arîşe]]
lwnz89i37kgxoem8g2rxm7dy7oj646o
گێژوووێژ
0
269247
6532568
5875538
2026-09-19T08:55:45Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532568
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gêjûwêj
=== Rengdêr ===
{{rengdêr|ckb}}
# [[gêjelok]], [[mejîreş]], kesa/ê tişt li bîrê namînin û hişên wê / wî ji ser tiştekî diçin yek dî û nikare serdariya hişê xwe bike
rfs7l0zjhtf8m9z425mnlyojxrm0zid
گێلی
0
269249
6532569
5875548
2026-09-19T08:55:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532569
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gêlî
=== Navdêr ===
{{navdêr|ckb}}
# [[peledînî]], [[aqilsivikî]]
dnf8xq9oro3rak8tq8tdrhc5bdus17w
گێپەڕە
0
269251
6532570
5875504
2026-09-19T08:56:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532570
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gêperre
=== Navdêr ===
{{navdêr|ckb}}
# [[hefik]], [[sto]], [[hustu]], [[stu]]
2evf86gh5p79ht41epw0fg7pcqmxey1
گێڕان
0
269252
6532571
5875516
2026-09-19T08:56:15Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532571
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gêrran
=== Lêker ===
{{lêker|ckb}}
# [[1]], [[gerandin]], gêrran 2, (karûbarek) [[meşandin]], [[bi rê ve birin]], '': li dar xistin''
3qnxclk7eyep3ls7gpnzwtealf5a56l
گێرەووکێشە
0
269255
6532572
5875533
2026-09-19T08:56:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532572
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gêreûkêşe
=== Navdêr ===
{{navdêr|ckb}}
# [[şerenîx]], [[xirrenîx]], [[gengeşe]], [[qerqeşe]], [[lihevnekirin]]
k1i3y93999t7c8x01540p3webymrmdx
گێسوو
0
269256
6532573
5875541
2026-09-19T08:56:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532573
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gêsû
=== Navdêr ===
{{navdêr|ckb}}
# [[bisk]], [[kezî]] (pirça / porrê jinan)
2jeuaan0unrv69pa0l628bhifh2lb46
گێزەر
0
269259
6532574
5875536
2026-09-19T08:56:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532574
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gêzer
=== Navdêr ===
{{navdêr|ckb}}
# [[gêzer]], [[gizêr]], [[gêzel]]
cybnsmyr584eu2jodlwzidmsp9vmmoe
گفتووگۆ
0
269261
6532575
5875191
2026-09-19T08:56:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532575
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:giftûgo
=== Navdêr ===
{{navdêr|ckb}}
# [[danûstandin]], [[giftûgo]], [[gotûbêj]], [[mizakere]], '':suhbet; devjenkî''
jap6r9vgb4tokpjpcxsjylef30yzcj6
گلاو
0
269267
6532576
5875227
2026-09-19T08:57:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532576
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gilaw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[pîs]], kesa/ê ne wa paqij e ku bikare nivêjê bike
9basafilb81qw2rq8gtsqs5v12o7pmk
گلەسپی
0
269269
6532577
5875257
2026-09-19T08:57:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532577
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gilespî
=== Navdêr ===
{{navdêr|ckb}}
# [[tebeşîr]]
8gdsujywlcf0aaci3gvd1f0wi0pdri9
گلەخان
0
269270
6532578
5875256
2026-09-19T08:57:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532578
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gilexan
=== Navdêr ===
{{navdêr|ckb}}
# [[mexel]], cihê bênvedana lawiran / ajalan / heywanan
4o6lv032amfarau8hsglz08jajqg4wf
گلەیی
0
269271
6532579
5875258
2026-09-19T08:57:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532579
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gileyî
=== Navdêr ===
{{navdêr|ckb}}
# [[gilî]], [[gazin]], gilî û gazin, [[nalîn]]
gz4l8kbwwxw1l96rot81b8dsiu2d03i
گلێجە
0
269272
6532580
5875251
2026-09-19T08:57:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532580
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gilêce
=== Navdêr ===
{{navdêr|ckb}}
# [[zik]], [[ûr]]
l86dypcxo569fjqtuh8fhfgazeg3ytn
گلێر
0
269274
6532581
5875252
2026-09-19T08:57:55Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532581
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gilêr
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kom]], [[berhev]]
4m0gl78wvcxpatmzm8eg0mjkuxefncl
گلۆفتن
0
269276
6532582
5875248
2026-09-19T08:58:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532582
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:giloftin
=== Navdêr ===
{{navdêr|ckb}}
# (çav) [[perixandin]], [[firikandin]], [[mizdan]]
r18cnuk9cibs4hfrh4jy0uq6r9vqudt
گڵۆپ
0
269278
6532583
5875247
2026-09-19T08:58:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532583
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gillop
=== Navdêr ===
{{navdêr|ckb}}
# [[gulop]], [[şewle]], [[lampe]], [[ronahî]], [[çira]]
gaj6mp6mqcy8lw5hvygjg7wq9rs65x8
گندۆر
0
269279
6532584
5875282
2026-09-19T08:58:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532584
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gindor
=== Navdêr ===
{{navdêr|ckb}}
# [[gundor]], [[petêx]], [[talik]], [[kalik]]
ftgnohg2at71ygx9dxv909ltd2v7egl
گرفتە
0
269280
6532585
5875105
2026-09-19T08:58:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532585
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:girifte
=== Navdêr ===
{{navdêr|ckb}}
# [[pirsgirêk]], [[kêşe]], [[girift]]
mn3hefycioj95mm433zncw87g6pg0lu
گڕاندن
0
269283
6532586
5874957
2026-09-19T08:58:45Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532586
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:girrandin
=== Lêker ===
{{lêker|ckb}}
# [[sujandin]], [[şewitandin]], [[sotandin]], agir berdanê / vêxistin
2a8jz3rppyn47ibg24viid1h83baha3
گردە
0
269285
6532587
6433418
2026-09-19T08:58:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532587
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:girde
=== Navdêr ===
{{navdêr|ckb}}
# [[hevok]], [[tevok]], [[cumle]]
==== Anagram ====
* {{anagram|ckb|a=درگە|گەرد}}
fvw1x57uxl2khtk8j36e0kop7gbhfs3
گردەبا
0
269286
6532588
6433425
2026-09-19T08:59:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532588
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:girdeba
=== Navdêr ===
{{navdêr|ckb}}
# [[babelîsk]], [[bager]]
==== Anagram ====
* {{anagram|ckb|a=ابدرگە|گابەرد}}
mhgwt0p0u93zkvofpgg5z5n61ymsiw1
گردەڵە
0
269287
6532589
5875073
2026-09-19T08:59:15Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532589
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:girdelle
=== Rengdêr ===
{{rengdêr|ckb}}
# [[1]], [[zivirok]], [[dewrok]], [[dorok]], dewra / zivira biçûk 2, [[qelewok]], [[qelew]]
si50tjz2e9rs090hu24gwfdrtjafusg
گردەپیاو
0
269288
6532590
5875071
2026-09-19T08:59:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532590
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:girdepiyaw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[qut]], [[kin]], [[bejnbost]], [[bejnkurt]]
84o5rdmouxi0xm3q17d8im3yn23msda
گردۆکۆ
0
269289
6532592
5875062
2026-09-19T08:59:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532592
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:girdoko
=== Navdêr ===
{{navdêr|ckb}}
# [[berhevok]], tiştek komkirî / berhevkirî
jddroz0c7h6su0cxtf4wgdv780o5nl3
گرەو
0
269291
6532593
6433401
2026-09-19T08:59:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532593
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:girew
=== Navdêr ===
{{navdêr|ckb}}
# [[şertanê]], [[qumar]]
==== Anagram ====
* {{anagram|ckb|a=روگە|گەور}}
4bdkrgy0io9f79glni4jqx70w6srdg5
گرێدراو
0
269293
6532594
5875147
2026-09-19T08:59:55Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532594
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:girêdiraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[girêdayî]]
ba7a972cmkwss4i88j1xp5vf6jnp59i
گڕگر
0
269295
6532596
5875108
2026-09-19T09:00:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532596
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:girrgir
=== Rengdêr ===
{{rengdêr|ckb}}
# [[agirgir]], tiştaagir dikare (bi asanî) berbibiyê / vêbikeve
2juah40nqeoxeqjoba1f7h81n4c7kzm
گڕگرتوو
0
269296
6532597
5875109
2026-09-19T09:00:15Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532597
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:girrgirtû
=== Rengdêr ===
{{rengdêr|ckb}}
# [[agirvêketî]], [[geş]], [[gur]]
8lu723q5iakb2acmyj6of40ibkc3cta
گرنگی
0
269300
6532598
5875121
2026-09-19T09:00:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532598
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:giringî
=== Navdêr ===
{{navdêr|ckb}}
# [[giringî]], [[ferî]], [[muhîmî]], [[watedarî]], [[şandarî]], [[pûte]]
tffuwstlaozepab5qkbaq3ixnhvju4x
گریشمە
0
269303
6532600
5875149
2026-09-19T09:00:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532600
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:girîşme
=== Navdêr ===
{{navdêr|ckb}}
# [[nazdarî]], [[qiştik]], [[tewşik]]
fe676g1xeeqjz3dgpbdxyx0vgbzaosc
گرژی
0
269305
6532601
5875077
2026-09-19T09:00:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532601
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:girjî
=== Navdêr ===
{{navdêr|ckb}}
# [[1]], [[rûtirşî]], buxumîtî 2, [[girmiçîtî]], [[çilmisîtî]]
fefyfk0nhtwpmskaz98klg0jd6lk6nn
گرمەژنە
0
269306
6532602
5875119
2026-09-19T09:00:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532602
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:girmejine
=== Navdêr ===
{{navdêr|ckb}}
# [[gurmij]], agirê gur û geş
h6issrt9qtqizu0ito6ir626w75m52i
گرمۆڵەیی
0
269308
6532603
5875118
2026-09-19T09:01:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532603
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:girmolleyî
=== Navdêr ===
{{navdêr|ckb}}
# [[badokî]], [[badayîtî]]
5ujs5lwqaxywupcylqq9oe03983d0fs
گڕۆز
0
269310
6532604
5875145
2026-09-19T09:01:15Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532604
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:girroz
=== Rengdêr ===
{{rengdêr|ckb}}
# [[gazindo]], [[nerazî]]
ds9uc21dgtzezqtg76m34xkea2jk5b7
گرس
0
269311
6532605
5875079
2026-09-19T09:01:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532605
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:girs
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bor]], [[boş]], [[asê]], di nav hev re
cdcv7dq35f4aihoug4sof8izvp4s0qr
گرتەک
0
269312
6532606
5874973
2026-09-19T09:01:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532606
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:girtek
=== Navdêr ===
{{navdêr|ckb}}
# [[girtek]], [[fatura]], [[kupon]]
jswygexz0rnldiapgrgr9eszla8gknb
گرتوو
0
269315
6532607
5874968
2026-09-19T09:01:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532607
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:girtû
=== Navdêr ===
{{navdêr|ckb}}
# [[girtî]], [[dîl]], [[esîr]], [[êxsîr]]
5z60npvhdugqtg1c6om5u7189or22f0
گرتووخانە
0
269316
6532608
5874970
2026-09-19T09:01:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532608
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:girtûxane
=== Navdêr ===
{{navdêr|ckb}}
# [[girtîxane]], [[zindan]], [[hefs]]
tcabcrpj1m1gch4771hn2gw9tyj4483
گروون
0
269318
6532609
5875141
2026-09-19T09:02:05Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532609
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:girûn
=== Lêker ===
{{lêker|ckb}}
# [[girûn]], çerm / pîst / post ji ser vekirin, ji kevil kirin
dclmpe55v39advw6yvy2fcqpmm6xlru
گڕوێ
0
269319
6532610
5875142
2026-09-19T09:02:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532610
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:girrwê
=== Navdêr ===
{{navdêr|ckb}}
# [[girrewî]], [[qirêjî]], [[pûrtikî]]
1dhq90l1byeud8ltv9hxt31s56mu4yx
گڕوێیی
0
269320
6532611
5875143
2026-09-19T09:02:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532611
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:girrwêyî
=== Navdêr ===
{{navdêr|ckb}}
# [[girrew]], [[qirêjî]], [[pûrtik]]
1ykz3dm4034ahjlgxxsqj7fwqin4b14
گڤی
0
269326
6532613
6433434
2026-09-19T09:02:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532613
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:givî
=== Navdêr ===
{{navdêr|ckb}}
# [[borî]], [[boşî]], [[qijavijî]]
==== Anagram ====
* {{anagram|ckb|a=ڤگی|گیڤ}}
mjdjjb6vpfzf6zv5qofyebdcvtlrsqm
گوێ
0
269328
6532615
5875429
2026-09-19T09:02:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532615
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:giwê
=== Navdêr ===
{{navdêr|ckb}}
# [[1]], guh 2, [[rex]], [[serlêv]], [[berlêv]], [[kenar]], [[qerax]]
bh52g46uzpxp5rpfurjtns6arn2p0pz
گوێبەل
0
269329
6532617
5875432
2026-09-19T09:02:55Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532617
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:giwêbel
=== Rengdêr ===
{{rengdêr|ckb}}
# [[guhbel]]
t81m9cun7cmiimvxl9hriu5unh6yk7o
گوێدێر
0
269330
6532618
5875433
2026-09-19T09:03:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532618
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:giwêdêr
=== Navdêr ===
{{navdêr|ckb}}
# [[guhdêr]], kesa/ê guh dide tiştekî (wek radyo)
lsxnovi6r9vjcj08rg45j4iubflcpp7
گوێگر
0
269332
6532619
5875447
2026-09-19T09:03:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532619
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:giwêgir
=== Navdêr ===
{{navdêr|ckb}}
# [[guhdar]]
6w0c7w4orp74cpe4x8ehyk86uckhud7
گوێگران
0
269333
6532620
5875448
2026-09-19T09:03:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532620
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:giwêgiran
=== Rengdêr ===
{{rengdêr|ckb}}
# [[guhgiran]], kesa/ê xweş nabîze, [[dijw]], [[guhsivik]]
e4fzu8hqcsoyqe4zh7ihtqhod5wtd0c
گوێنی
0
269336
6532621
5875450
2026-09-19T09:03:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532621
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:giwênî
=== Navdêr ===
{{navdêr|ckb}}
# [[tûr]], [[kîs]], [[telîs]], [[tûrik]], [[kîsik]], [[telîsk]]
havndeo3wxtp49ymt0q06ck6h9rp2fm
گوێقوڵاخ
0
269337
6532622
5875445
2026-09-19T09:03:45Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532622
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:giwêqullax
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hişyar]], [[guhlê]], [[bidîqet]], kesa/ê guhê wê/wî lê ye ka dê çi biqewime
edkc8cht6lnv28psd6zga2maiq36ccx
گوێقورس
0
269338
6532623
5875444
2026-09-19T09:03:55Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532623
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:giwêqurs
=== Rengdêr ===
{{rengdêr|ckb}}
# [[guhgiran]], kesa/ê xweş nabîze, [[dijw]], [[guhsivik]]
fd7l2bnqxi2yevrj2u30emhtw9qw8aw
گوێرە
0
269341
6532624
5875434
2026-09-19T09:04:05Z
JiyanBot
3048
Cure Daçek hat lêzêdekirin
6532624
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:giwêre
=== Daçek ===
{{daçek|ckb}}
# [[gor]], [[dû]], [[wek]] :be giwêrey ke dellên li gor ku têt gotin, wek ku tê gotin, angorî gotinê
licn01j871rali31pf7rshsdsb0uoil
گوێرەکە
0
269342
6532625
5875436
2026-09-19T09:04:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532625
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:giwêreke
=== Navdêr ===
{{navdêr|ckb}}
# [[golik]], çêla / gayê biçûk û berşîr
chiwaxeow9jmtq4iz3tbt57fdxpk3qp
گوێڕەپ
0
269343
6532626
5875435
2026-09-19T09:04:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532626
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:giwêrrep
=== Rengdêr ===
{{rengdêr|ckb}}
# [[guhrep]]
i9lduo1o8uc0bi4175gkxoyn6q8gnty
گوێزەر
0
269348
6532627
5875440
2026-09-19T09:04:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532627
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:giwêzer
=== Navdêr ===
{{navdêr|ckb}}
# [[gêzer]]
mvdlcgtxzo5d5z872ee3s6z5kkb4olr
گیایی
0
269359
6532628
5875503
2026-09-19T09:04:45Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532628
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:giyayî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[giyayî]], [[gîhayî]], ji giya / gîha
4a0iwgx9mwzrgogwqtrlpwdt7cigphy
گزیر
0
269362
6532629
6527428
2026-09-19T09:04:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532629
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gizîr
=== Navdêr ===
{{navdêr|ckb}}
# (wezîr û) [[gizîr]], [[serok]], [[rêveber]], [[serperiştkar]]
== {{ziman|fa}} ==
=== Mane ===
{{bêcure|fa}}
# [[felat]]
==== Anagram ====
* {{anagram|fa|a=رزگی|گریز}}
pn28y7q7qjszg0vo7h546dud5f9gw4f
گیرا
0
269364
6532630
6527431
2026-09-19T09:05:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532630
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gîra
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bicîhatî]], bicihhatî (tika / daxwaz / dua)
== {{ziman|fa}} ==
=== Rengdêr ===
{{rengdêr|fa}}
# [[rûfener]]
==== Anagram ====
* {{anagram|fa|a=ارگی|گاری}}
dcyt7hajnzx6v36cm5ovfbl0gwwyqps
گیران
0
269365
6532631
6433410
2026-09-19T09:05:15Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532631
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gîran
=== Lêker ===
{{lêker|ckb}}
# [[hatin girtin]] [[(mang]], xor) xeyirîn, tarî bûn; (şerbet) hatin givaştin (şerbet ji fêkî); (mast) hatin rakirin (sertûk / firû ji ser mast)
==== Anagram ====
* {{anagram|ckb|a=ارنگی|گرانی|گریان}}
95jy9zys1fimqt8dy8a7sztmpt0aupu
گیراو
0
269366
6532632
5875518
2026-09-19T09:05:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532632
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gîraw
=== Navdêr ===
{{navdêr|ckb}}
# [[girtî]], hatî girtin, [[xeyirî]], tarîbûyî; givaştî; rakirî, bn gîran
64yaj3lq9spn0ofpmt87xmwp6v9yh45
گیراوە
0
269367
6532633
5875520
2026-09-19T09:05:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532633
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gîrawe
=== Navdêr ===
{{navdêr|ckb}}
# [[têkilî]], [[tevlihevî]] (ya du maddeyên têkilî hev bibin û maddeyek nû peyda bikin)
cfbh5gl1qh9bwh66l0gurm2yifcwwqd
گیڕەگیڕ
0
269369
6532634
5875532
2026-09-19T09:05:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532634
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gîrregîrr
=== Navdêr ===
{{navdêr|ckb}}
# [[pitpit]], [[gazin]], [[gilî]] (t ne bi zimanek zelal)
pdfhwkr2pzvheh1nx1dyw2cjpuo9bta
گیرۆ
0
269373
6532635
5875528
2026-09-19T09:05:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532635
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gîro
=== Navdêr ===
{{navdêr|ckb}}
# [[girtî]], '': girêdayî; [[rêgirtî]], rêlêgirtî; (bi nesaxiyekê / nexweşiyekê) ketî''
83te4bs5l50bhjowian7gsgmir9k1f4
گیرۆدار
0
269375
6532636
5875530
2026-09-19T09:06:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532636
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gîrodar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[serdest]], [[serwer]]
i7j13dedp66ljoszxnkkuzvbebmo3fs
گیرسانەوە
0
269376
6532637
5875521
2026-09-19T09:06:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532637
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gîrsanewe
=== Navdêr ===
{{navdêr|ckb}}
# [[1]], (li hewa) [[vegirtin]], ne hêlan / hiştin tiştek têt xwarê bikeve erdê 2, [[dadan]], [[nişîn]], [[niştin]], ji hewa hatin û "rûniştin" erdê, bn firroke
rn4f2yv3bu5xh7fr32lbq3e5l5k9zca
گیرووگرفت
0
269377
6532638
5875527
2026-09-19T09:06:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532638
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gîrûgirift
=== Navdêr ===
{{navdêr|ckb}}
# [[asteng]], [[dijwarî]], [[pirsgirêk]], [[zehmetî]], [[gîrûgirift]], [[arîşe]], [[kêşe]], [[astengî]]
390welnz82di35ei4bscz5vu9hj6err
گیشە
0
269379
6532639
6433395
2026-09-19T09:06:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532639
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gîşe
=== Navdêr ===
{{navdêr|ckb}}
# [[gidîş]], giyayê (t genim yan cehê dirûyî) li ser hev hatiye komkirin
==== Anagram ====
* {{anagram|ckb|a=شگیە|گەشی}}
2zer4iz6vso4d6t1wlw7ddpspzoctbi
گیڤ
0
269380
6532640
6433431
2026-09-19T09:06:45Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532640
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gîv
=== Rengdêr ===
{{rengdêr|ckb}}
# [[gij]], [[qij]], pirç / porr / pûrt / mû dema ne rast û rêk û hilû ye
==== Anagram ====
* {{anagram|ckb|a=ڤگی|گڤی}}
ik5ndt22u2avnc9w9rbk7z5ddfe6hop
گۆج
0
269384
6532641
5875455
2026-09-19T09:06:55Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532641
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:goc
=== Rengdêr ===
{{rengdêr|ckb}}
# [[goc]], ji destên xwe şel û seqet yan jî ne jêhatî / zîrek
plknmevyrttufri68j6z1yfj6ovmam0
گۆجی
0
269385
6532642
5875457
2026-09-19T09:07:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532642
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gocî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[gocî]], şelî û seqetiya yan nejêhatiya / nezîrekiya destan
j1tanln1xqyn2qh9mbogjnmyka74oqz
گۆگرد
0
269386
6532643
5875482
2026-09-19T09:07:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532643
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gogird
=== Navdêr ===
{{navdêr|ckb}}
# [[kifrît]], [[nifik]], [[derbik]], [[kirgot]]
0qn1khiswksfowi4gom58bfp7l40jmx
گۆڵە
0
269388
6532644
5875483
2026-09-19T09:07:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532644
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:golle
=== Navdêr ===
{{navdêr|ckb}}
# [[cax]], [[şifşe]], [[bist]], [[bistik]], [[şîş]]
qigznkaso15d034q5va10kokvi4lci7
گۆنە
0
269391
6532645
5875487
2026-09-19T09:07:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532645
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gone
=== Navdêr ===
{{navdêr|ckb}}
# [[awa]], [[şêwe]], [[reng]]
gwph4md2idqgbip4f9e3gf07g1026m4
گۆنیە
0
269392
6532648
5875486
2026-09-19T09:07:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532648
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gonye
=== Navdêr ===
{{navdêr|ckb}}
# [[tûr]], [[kîs]], [[telîs]], [[tûrik]], [[kîsik]], [[telîsk]]
hbhqolve740zedqrgb72c2fxl7t7a8a
گۆڕستان
0
269394
6532649
5875465
2026-09-19T09:07:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532649
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gorristan
=== Navdêr ===
{{navdêr|ckb}}
# [[goristan]], cihê goran
bk9n7d0rlyqur38z9fj7m9i6edeeart
گۆڕان
0
269396
6532650
5875460
2026-09-19T09:08:05Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532650
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gorran
=== Lêker ===
{{lêker|ckb}}
# [[guherîn]], [[guhorrîn]], hatin guherandin / guhartin, [[bedil bûn]], [[têvel bûn]], wek xwe / berê neman
n3r9o6dhe7cm8yepca85qbcjo69nch6
گۆڕاندن
0
269397
6532651
5875461
2026-09-19T09:08:15Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532651
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gorrandin
=== Lêker ===
{{lêker|ckb}}
# [[guherandin]], [[guhorrandin]], [[guhartin]], [[bedil kirin]], [[têvel kirin]], wek xwe / berê nehêlan
jm21f33i6zxadl4g65dxhzx4gtwwyew
گۆڕانکار
0
269399
6532652
5875463
2026-09-19T09:08:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532652
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gorrankar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[guherbar]], [[guhorrbar]], tişta diguhere yan dikare biguhere
d39jcmlnmi0vg0cs0k6q8r853v0xals
گۆڕین
0
269404
6532655
5875467
2026-09-19T09:08:35Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532655
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gorrîn
=== Lêker ===
{{lêker|ckb}}
# [[guherandin]], [[guhartin]], [[guhorrandin]], [[bedil kirin]], [[têvel kirin]], wek xwe / berê nehêlan
b5ivvf7ycdnxuv2t6gw1i14bu0gb6oj
گۆساڵە
0
269406
6532656
5875472
2026-09-19T09:08:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532656
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gosalle
=== Navdêr ===
{{navdêr|ckb}}
# [[golik]], têjika çêlan
55s2rip8672yvr1kyvm4hahcrvqwnip
گۆشەنیگا
0
269410
6532657
5875480
2026-09-19T09:08:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532657
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:goşenîga
=== Navdêr ===
{{navdêr|ckb}}
# [[goşenîga]], [[ruxsar]], awayê / cihê lênerînê / jêdîtinê
o2yamlzj10afzul1de0zdm6rvmibpta
گۆشتن
0
269412
6532658
5875476
2026-09-19T09:09:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532658
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:goştin
=== Rengdêr ===
{{rengdêr|ckb}}
# [[zexm]], [[qelew]], [[têrgoşt]]
pi4ny13tmsyhxe0w2k7xyxhsy001xuo
گۆشپارە
0
269413
6532659
5875473
2026-09-19T09:09:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532659
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:goşpare
=== Navdêr ===
{{navdêr|ckb}}
# [[xilmiş]], [[selix]], birîna sivik
tmj9aak3frjbxuejuxkpi5zi6eh4xit
گۆشتخۆر
0
269414
6532660
5875475
2026-09-19T09:09:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532660
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:goştxor
=== Rengdêr ===
{{rengdêr|ckb}}
# [[goştxwer]]
rctp2tzv57r8agfrggakeeghjjum5l7
گۆتن
0
269417
6532661
5875454
2026-09-19T09:09:35Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532661
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gotin
=== Rengdêr ===
{{rengdêr|ckb}}
# [-llê-] gotin, [[bêjîn]], [[bêjan]]
eqofpgbms5uuipl6zrjzu5xkab4egto
گۆزەر
0
269420
6532662
5875470
2026-09-19T09:09:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532662
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gozer
=== Navdêr ===
{{navdêr|ckb}}
# [[cerrçêker]]
qb1vxbo0crsu7qjsznafs5mneb7gb59
گۆزەڵە
0
269421
6532664
5875471
2026-09-19T09:09:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532664
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gozelle
=== Navdêr ===
{{navdêr|ckb}}
# [[cerik]], [[cêrrik]]
tqeydm868zba2jru01ahq41g576u19m
گوژم
0
269423
6532665
5875329
2026-09-19T09:10:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532665
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gujm
=== Navdêr ===
{{navdêr|ckb}}
# [[1]], [[tundî]], [[tûjî]], şidet 2, (bejnûbala xwe) [[hejandin]]
9pu3b64e0f7j5mefxxi2mzlud51qs74
گوڵ
0
269425
6532666
5875366
2026-09-19T09:10:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532666
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gull
=== Navdêr ===
{{navdêr|ckb}}
# [[gul]], [[kulîlk]]
smhl6ite2hmq2rzs9askpf21fwmg6ct
گولاج
0
269426
6532667
5875368
2026-09-19T09:10:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532667
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gulac
=== Navdêr ===
{{navdêr|ckb}}
# [[kapsûl]], [[kîsik]]
5uasnx9a7fgbubyc0pv3xd8i36olod0
گوڵاڵە
0
269427
6532668
5875369
2026-09-19T09:10:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532668
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gullalle
=== Navdêr ===
{{navdêr|ckb}}
# (gula) [[nîsanî]], (gula) bûkûzava
p87tcuiq46mjym4hc6fjhr4skvrspkh
گوڵاو
0
269429
6532669
5875371
2026-09-19T09:10:46Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532669
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gullaw
=== Navdêr ===
{{navdêr|ckb}}
# [[gulav]], ava (ji) gulan
eiqvu7nyflsj7bhdicxi460mozuqonl
گوڵاوی
0
269430
6532670
5875373
2026-09-19T09:10:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532670
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gullawî
=== Navdêr ===
{{navdêr|ckb}}
# [[1]], [[gulavî]], ji ava gulan 2, [[gulavî]], birrek hirmiyan e
9oivxyttrx9tr7n07ob06wos4ttz6qv
گوڵبانگ
0
269432
6532671
5875375
2026-09-19T09:11:05Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532671
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gullbang
=== Navdêr ===
{{navdêr|ckb}}
#(peyva/ banga) bixêrhatin(ê), [[daxwaz]], [[tika]], [[rica]]
889643q3mabzei357ifflotczg03ika
گوڵدان
0
269435
6532672
5875378
2026-09-19T09:11:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532672
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gulldan
=== Navdêr ===
{{navdêr|ckb}}
# [[guldank]], amana gulan dikin tê de yan tê de şên dikin
o27q87h1hhye1xfhvpu0r0tecikkc9z
گوڵدار
0
269436
6532673
5875377
2026-09-19T09:11:25Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532673
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gulldar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[guldar]], dara / giyayê gulan dide
c69ahrkn12466gcb5wv5pz63wavhew8
گوڵەباخ
0
269437
6532674
5875389
2026-09-19T09:11:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532674
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gullebax
=== Navdêr ===
{{navdêr|ckb}}
# [[sorgul]]
rbozr3e7t542bx6vhacv4iifg2amrzp
گوڵەچاوێشە
0
269439
6532675
5875393
2026-09-19T09:11:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532675
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gulleçawêşe
=== Navdêr ===
{{navdêr|ckb}}
# [[beybûn]]
3snxv4y5uq3ugr64dluw3unse6rmla9
گوڵی
0
269441
6532676
5875387
2026-09-19T09:11:55Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532676
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gullî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[gulî]], ji gulan, ji rengê gulan
00powjtq8yo48ple83z750rp0mpy82o
گوڵگوڵی
0
269442
6532677
5875382
2026-09-19T09:12:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532677
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gullgullî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[gulgulî]], cil û bergên wêneyên gulan li ser
rf1arzanz12f2phs9o8dbmj9ai7hi7d
گوڵە
0
269443
6532679
5875388
2026-09-19T09:12:15Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532679
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gulle
=== Navdêr ===
{{navdêr|ckb}}
# [[gulle]], [[berik]], [[fîşek]]
cw1q0er6kekc9pmf71rwcc8yjcg44j5
گوڵەباران
0
269444
6532680
5875390
2026-09-19T09:12:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532680
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gullebaran
=== Navdêr ===
{{navdêr|ckb}}
# [[gullebaran]], [[gullereşan]]
gywzaimgxnxbyul9qnxvfbz53m5ye7v
گوڵمە
0
269446
6532681
5875384
2026-09-19T09:12:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532681
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gullme
=== Navdêr ===
{{navdêr|ckb}}
# [[tibab]], [[parçe]], parçeyek mezin
7g82ve1bcw8ahqm3aqgjef5if61r6h9
گوڵمێخ
0
269447
6532682
5875383
2026-09-19T09:12:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532682
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gullmêx
=== Navdêr ===
{{navdêr|ckb}}
# [[sing]], [[mîx]], [[arêx]], [[spîn]]
q3j185qwx54box7i40s6940uyltxwc2
گولی
0
269452
6532683
5875386
2026-09-19T09:12:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532683
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gulî
=== Navdêr ===
{{navdêr|ckb}}
# [[girrew]], [[girrewîtî]], [[pîsî]], [[herrimîtî]]
mv48gdeqn8o603mhdtvs2n2zfo0b48w
گوم
0
269453
6532684
5875396
2026-09-19T09:13:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532684
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gum
=== Rengdêr ===
{{rengdêr|ckb}}
# [[wenda]], [[hinda]], [[berze]], [[rêwenda]], [[nediyar]], [[jidestdayî]], [[wendakirî]]
iba0fz5ow55igkjjcha32renhh4jduo
گومانبار
0
269454
6532685
5875397
2026-09-19T09:13:15Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532685
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gumanbar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[berşik]], [[gumanbar]], kesa/ê / tişta guman jê tên birin
f2j4tzcuvx9tzhnb577ai0uhcvyipc6
گومرک
0
269457
6532686
5875401
2026-09-19T09:13:25Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532686
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gumirk
=== Navdêr ===
{{navdêr|ckb}}
# [[gumirk]]
ts20gy29nobqltdraodfn2932tudys7
گومی
0
269458
6532687
5875403
2026-09-19T09:13:35Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532687
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gumî
=== Navdêr ===
{{navdêr|ckb}}
# [[wendayî]], [[hindayî]], [[berzeyî]], [[rêwendayî]], [[nediyarî]], [[jidestdan]], [[wendakirin]]
p801zg2spra6lss9r2o8vy9h2zw728h
گومناو
0
269459
6532688
5875402
2026-09-19T09:13:45Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532688
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gumnaw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bênav]], [[nenas]], kesa/ê jêhatîtiyên wê/wî nayên nasîn yan ecibandin
muis41qco3b6yxnl5h06y06hwloelkt
گوناھ
0
269461
6532689
5875406
2026-09-19T09:13:55Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532689
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gunah
=== Navdêr ===
{{navdêr|ckb}}
# [[gune]], [[guneh]], [[xirabî]], [[tawan]]
mj28lxxtsdld18jh1gqi7s7rpovp73u
گوناھبار
0
269462
6532690
5875407
2026-09-19T09:14:05Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532690
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gunahbar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[gune(h)bar]], [[tawanbar]], kesa/ê gunehek yan çend guneh kirine
lldhs6ep55089elx58agplt8rap6kuc
گونجان
0
269463
6532691
5875408
2026-09-19T09:14:15Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532691
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:guncan
=== Lêker ===
{{lêker|ckb}}
# (bi) [[kêr hatin]], [[guncîn]], [[lê hatin]]
rn10cn4t1qx3pmsdhihzqrjb4pueb25
گونجاندن
0
269464
6532692
5875409
2026-09-19T09:14:25Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532692
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:guncandin
=== Lêker ===
{{lêker|ckb}}
# (bi) kêr anîn, [[lê anîn]], [[guncandin]], wa kirin ku (tiştek) kêrî (tiştekî) bêt
96l98adcol2ygxx93plzga66tuhntjx
گونجاو
0
269465
6532693
5875410
2026-09-19T09:14:35Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532693
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:guncaw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bikêr]], [[bikêrhatî]], [[guncav]], [[lêhatî]], [[kêrhatî]], [[minasib]]
m9m3liw0n96t230ve2mf0dhq67jwv5w
گوندۆرە
0
269468
6532694
5875412
2026-09-19T09:14:45Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532694
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gundore
=== Navdêr ===
{{navdêr|ckb}}
# [[gundor]], [[petêx]], [[talik]], [[kalik]]
1g1csi836wvd1xgwzy1496445q0pfsc
گوربز
0
269472
6532695
6433260
2026-09-19T09:14:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532695
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gurbiz
=== Rengdêr ===
{{rengdêr|ckb}}
# [[zexm]], [[qayim]], [[bihêz]]
==== Anagram ====
* {{anagram|ckb|a=برزوگ|بزگور}}
kj44d5g2n0kcslztixixmsh2ixlculu
گوڕە
0
269477
6532696
5875316
2026-09-19T09:15:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532696
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gurre
=== Navdêr ===
{{navdêr|ckb}}
# [[qelebalix]], [[geremol]], [[qerebalix]]
hndta0bq2o7ny8uxze36rnsch6rbntc
گوڕەشە
0
269478
6532697
5875317
2026-09-19T09:15:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532697
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gurreşe
=== Navdêr ===
{{navdêr|ckb}}
# [[lêxurrîn]], [[gef]], [[tehdîd]] :herreşe û gurreşe gef û gurr
30yq0fwbyh2rl2ggocw6us7qo2u1nrj
گوڕەووبڕە
0
269480
6532698
5875319
2026-09-19T09:15:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532698
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gurreûbirre
=== Navdêr ===
{{navdêr|ckb}}
# [[heytûhot]], deng û pêjn, [[qerebalix]], dengê bilind û zêde
qgi9qoysb7xlqpokrlwhv20y7ag0j59
گورگانگاز
0
269483
6532699
5875315
2026-09-19T09:15:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532699
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gurgangaz
=== Navdêr ===
{{navdêr|ckb}}
# [[xayîn]], hevalê dijminan
tpyty2u78towlxd4838q9zxqcciyrf7
گورزە
0
269486
6532700
6433443
2026-09-19T09:15:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532700
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gurze
=== Navdêr ===
{{navdêr|ckb}}
# [[gurze]], [[prîzma]]
==== Anagram ====
* {{anagram|ckb|a=رزوگە|گوزەر}}
0bp3eou97affrh9i3xittn7gfj6lmff
گورزەھۆن
0
269487
6532701
5875314
2026-09-19T09:15:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532701
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gurzehon
=== Navdêr ===
{{navdêr|ckb}}
# [[werîs]], [[bizîng]], [[ben]], [[hebl]]
4dwvjbbxh9m7kot2l7nrhu9hbvz7x3j
گورزەتیشک
0
269488
6532702
5875313
2026-09-19T09:16:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532702
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gurzetîşk
=== Navdêr ===
{{navdêr|ckb}}
# [[tîroj]], [[tîrêj]]
t65qyf0axvnmhah4k6b34c7xm2bc19h
گوستاخی
0
269490
6532703
5875335
2026-09-19T09:16:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532703
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gustaxî
=== Navdêr ===
{{navdêr|ckb}}
# [[wêrekî]], [[bisteyî]], [[bêtirsî]], [[netirsî]], [[mêranî]]
r0tn44b46bgzn47jh4jtfw9wvbe950p
گوشار
0
269491
6532704
5875348
2026-09-19T09:16:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532704
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:guşar
=== Navdêr ===
{{navdêr|ckb}}
# [[givaş]], [[guvaş]], [[şidan]]
6i6r1muo7pur6oqogmku506qqb4xq64
گوشراو
0
269494
6532705
5875359
2026-09-19T09:16:39Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532705
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:guşraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[givaştî]], [[guvaştî]], [[şidandî]], [[givişandî]]
9zp6acozr54uv443cyr19k63yt2id6c
گوشراوە
0
269495
6532706
5875360
2026-09-19T09:16:49Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532706
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:guşrawe
=== Rengdêr ===
{{rengdêr|ckb}}
# [[derkişandî]], [[jêkişandî]], [[jêderanî]]
56rr5gv34ui086ayxkpdfgi29s2xc91
گووان
0
269496
6532707
5875421
2026-09-19T09:16:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532707
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:guwan
=== Navdêr ===
{{navdêr|ckb}}
# [[guhan]] (memikên lawiran)
ls1ejxsrdmy0itnkh0wqfb4i80tjehn
گووارە
0
269498
6532708
5875420
2026-09-19T09:17:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532708
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:guware
=== Navdêr ===
{{navdêr|ckb}}
# [[guhar]], [[guhark]]
ry0lnk7e1vdci7aw9v8p1q1vk0rmwbg
گووێ
0
269500
6532709
5875427
2026-09-19T09:17:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532709
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:guwê
=== Navdêr ===
{{navdêr|ckb}}
# [[guh]]
qny9aaakhovh0gxufjvkr8peb5yx2me
گووێچکە
0
269501
6532710
5875428
2026-09-19T09:17:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532710
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:guwêçke
=== Navdêr ===
{{navdêr|ckb}}
# [[guh]]
24dqikhaqgd72y9eq71rp4egyaf7r2p
گوزارە
0
269502
6532711
5875320
2026-09-19T09:17:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532711
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:guzare
=== Navdêr ===
{{navdêr|ckb}}
# [[giringî]], [[watedarî]], [[pûte]], [[pûtedarî]], [[ferî]], [[muhîmî]]
26pko88oh0tnj8cow516k18tuvhztoj
گوزارەدار
0
269503
6532712
5875321
2026-09-19T09:17:49Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532712
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:guzaredar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[watedar]], [[giring]], [[pûtedar]], [[fer]], [[muhîm]]
4kkyg7fy4qpmlc2a13yqb3he8g99ahu
گوزارەیی
0
269505
6532713
5875322
2026-09-19T09:17:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532713
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:guzareyî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[razber]], [[abstrakt]]
lz5nua1h1xn1jqmnd8bdr8n7ai147qq
گووبۆق
0
269511
6532714
5875422
2026-09-19T09:18:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532714
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gûboq
=== Navdêr ===
{{navdêr|ckb}}
# (qewze) [[kevz]]
ku7yxm06yz9vdk4hmujxtz3tqx0d452
گووپ
0
269512
6532715
5875423
2026-09-19T09:18:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532715
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gûp
=== Navdêr ===
{{navdêr|ckb}}
# [[gep]], [[alek]]
4jbvhtcu4l90j9w2k9zfx47sqj9crw3
گووپن
0
269513
6532716
5875424
2026-09-19T09:18:29Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532716
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gûpin
=== Lêker ===
{{lêker|ckb}}
# [[gepîn]], [[gepqelew]]
jncgdp0e4p2dpnp7rry7zzou7p3jmul
گووران
0
269514
6532717
5875425
2026-09-19T09:18:39Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532717
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gûran
=== Lêker ===
{{lêker|ckb}}
# [[dirûvîn]], [[dirist bûn]], [[şikil girtin]]
0wb8oxxfsk4y0goctxzapv2bdpb9svu
گووواوی
0
269515
6532718
5875426
2026-09-19T09:18:49Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532718
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:gûwawî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[pîs]], [[gûyî]], [[herimî]], [[qirêj]], [[lewitî]]
razv5eo7hbho7p38nvvy25ngmxr9idj
ھاجی
0
269517
6532719
5878061
2026-09-19T09:18:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532719
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hacî
=== Navdêr ===
{{navdêr|ckb}}
# [[hecî]], [[hacî]], kesa/ê heca xwe bi cî aniye
678sienvvkau4zamzrqopdofx9o81gj
ھاجیلەقلەق
0
269520
6532720
5878065
2026-09-19T09:19:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532720
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hacîleqleq
=== Navdêr ===
{{navdêr|ckb}}
# [[hacîleglege]], [[leglege]], [[quling]]
75ym2qphk64e85p8yw8n4hj1gvx1qm3
ھاجیرەش
0
269521
6532721
5878064
2026-09-19T09:19:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532721
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hacîreş
=== Navdêr ===
{{navdêr|ckb}}
# [[hacîreşk]], [[hechecîk]], çivîkek rewş e
ai5ycdq538inec82kqi1qtbccajv3ui
ھاژ
0
269523
6532722
5878084
2026-09-19T09:19:29Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532722
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:haj
=== Rengdêr ===
{{rengdêr|ckb}}
# [[mat]], [[matmayî]], [[ecêbgirtî]], [[sersam]]
qutbld8k0y1lrbyycdphd5oslcszdgy
ھاکا
0
269525
6532723
5878091
2026-09-19T09:19:39Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6532723
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:haka
=== Hoker ===
{{hoker|ckb}}
# [[haha]], [[aniha]], di vê gavê de
4q16n7jhnij24peh43rgw29kfyy3d7t
ھاکم
0
269527
6532724
5878093
2026-09-19T09:19:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532724
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hakim
=== Navdêr ===
{{navdêr|ckb}}
# (fermanrewa) [[hakim]], [[padişah]], [[fermanber]], [[walî]], [[rêveber]], [[mîr]]
# [[(dadgêrr]], serokî dadga) dadgêrr, [[dadger]], [[hakim]], serokê dadgehê
qd0lk7xlvlvqzjq75tzt1zo3cv0vbvz
ھاکمانە
0
269528
6532725
5878094
2026-09-19T09:19:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532725
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hakimane
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hakimane]], wek / mîna hakiman, [[hikûmî]], [[hukumetî]], [[fermî]]
4ikyh24bj3bulbwhqp3ksplnlzv9r1p
ھاکمێتی
0
269529
6532726
5878095
2026-09-19T09:20:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532726
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hakimêtî
=== Navdêr ===
{{navdêr|ckb}}
# [[hakimî]], [[hakimtî]], [[rêveberî]], [[fermanberî]], [[hukim]]
dizprccyyhmswr0l762wva6x8ca06wj
ھاڵ
0
269531
6532727
5878097
2026-09-19T09:20:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532727
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hall
=== Navdêr ===
{{navdêr|ckb}}
# [[hal]], [[rewş]], [[çawanî]]
m2436yd0aww7pb6cnf7q2gjba8xipot
ھاڵی
0
269532
6532728
5878100
2026-09-19T09:20:29Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532728
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hallî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[serwext]], [[fama]], [[têgihiştî]], [[têgihandî]], [[fehma]]
7o53dneazl3hdfqnynf2f4s47zkngey
ھاڵاو
0
269533
6532729
5878099
2026-09-19T09:20:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532729
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hallaw
=== Navdêr ===
{{navdêr|ckb}}
# [[hilm]], [[buxar]], hewayê germ, ava wa germ bûye ku hildikeve hewa
ptn5aqt8prwf2exkziiz25vuglon6us
ھاڵەت
0
269534
6532730
6433449
2026-09-19T09:20:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532730
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hallet
=== Navdêr ===
{{navdêr|ckb}}
# [[rewş]], [[destûdar]], [[hal]]
==== Anagram ====
* {{anagram|ckb|a=اتڵھە|ھەڵات}}
sgh7lndn9tpz9f5e7hghi5ajjpwmz27
ھامار
0
269535
6532731
5878102
2026-09-19T09:20:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532731
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hamar
=== Navdêr ===
{{navdêr|ckb}}
# [[rastgeh]], [[deşt]]
boubr5lovkt72x7n7pe2u3crdu8m126
ھامێز
0
269536
6532732
5878103
2026-09-19T09:21:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532732
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hamêz
=== Navdêr ===
{{navdêr|ckb}}
# [[hemêz]], [[hembêz]], [[koş]], [[dergûş]]
kv6x4wtphasq1y9kqq1n7b3svxn7ybw
ھاندەر
0
269539
6532733
5878107
2026-09-19T09:21:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532733
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hander
=== Navdêr ===
{{navdêr|ckb}}
# [[palder]], [[defder]], [[şarîner]], [[sorker]], [[teşwîqker]]
gxwj9ectemi8ndz2w7l0igtyy0gvdky
ھاندراو
0
269540
6532734
5878106
2026-09-19T09:21:29Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532734
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:handiraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[şarandî]], (li tiştekî) [[sorkirî]], [[teşwîqkirî]], berev (kirina tiştekî) defdayî
pc1zv2no0itu7atmt8nfficfcvlg258
ھار
0
269541
6532735
5878067
2026-09-19T09:21:39Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532735
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:har
=== Rengdêr ===
{{rengdêr|ckb}}
# [[har]], [[dînûhar]], [[dirinde]], [[venehewayî]], [[bêtebat]], [[şûm]], [[neqet]], [[destmatî]]
ferbjp4r6wmyrui1bi9l9oj1cm3x3tz
ھاڕاو
0
269542
6532736
5878070
2026-09-19T09:21:49Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532736
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:harraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hêrayî]], [[hêrandî]], [[destarkirî]], [[ (genimê]], goştê û hwd) hûr-hûrkirî
mqjswsjvvl089h8p1p70qo3g44lpuvx
ھاریکار
0
269546
6532737
5878077
2026-09-19T09:21:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532737
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:harîkar
=== Navdêr ===
{{navdêr|ckb}}
# [[alîkar]], [[arîkar]], [[alîkar]]
04r7wn4861q8vdrzr9nmnnelrrun2ev
ھاریکاری
0
269547
6532738
5878078
2026-09-19T09:22:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532738
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:harîkarî
=== Navdêr ===
{{navdêr|ckb}}
# [[alîkar]], [[arîkar]], [[alîkar]]
6dkcv9epwli1x5ca92fzz3hm5kut1yv
ھاڕین
0
269548
6532739
5878079
2026-09-19T09:22:19Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532739
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:harrîn
=== Lêker ===
{{lêker|ckb}}
# [[hêran]], [[hêrandin]], [[hêrîn]], [[destar kirin]], [[ (genim]], goştê û hwd) hûr-hûr kirin
bce9w7n4zrptvzgtov40jvdm4wdyl3e
ھاروو
0
269549
6532740
5878072
2026-09-19T09:22:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532740
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:harû
=== Navdêr ===
{{navdêr|ckb}}
# [[pidû]], [[pû]], [[alûne]], [[pidî]], goştê ber didanan
t755guglexel3k5ez5hv1vh8qd51nrz
ھارووھوورت
0
269550
6532741
5878073
2026-09-19T09:22:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532741
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:harûhûrt
=== Navdêr ===
{{navdêr|ckb}}
# [[pozbilindî]], [[qurretî]], xwe mezin hesibandin / kirin
n0do6go6t0isecjb0t2c0b9izfonkla
ھاشا
0
269551
6532742
5878086
2026-09-19T09:22:49Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6532742
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:haşa
=== Hoker ===
{{hoker|ckb}}
# [[haşa]], ne wa / wisan / wiha / wilo / hosa, '': ji bilî, [[ji xeynî]], [['']], [[ne tê de]]: haşa huzûr haşa huzûr, ji bilî yên amade / hazir / li hizûrê
6wug79bhj40j8mzyjdnk51ddujqkkg8
ھاشووھووش
0
269552
6532743
5878088
2026-09-19T09:22:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532743
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:haşûhûş
=== Navdêr ===
{{navdêr|ckb}}
# [[dengûdor]], [[qerebalix]], [[qerqeşe]], [[gengeşe]], [[şerenîx]]
88twi8q0cz280564tmmbjhuq5t9q6x1
ھاڤل
0
269556
6532744
5878090
2026-09-19T09:23:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532744
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:havil
=== Navdêr ===
{{navdêr|ckb}}
# [[havil]], [[xebat]], [[berhem]], [[encam]]
pzvdfucq7ymwbg9hw2jxl3rlhmrzssa
ھاواھەنگی
0
269557
6532745
5878110
2026-09-19T09:23:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532745
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawahengî
=== Navdêr ===
{{navdêr|ckb}}
# [[hevahengî]], [[lihevanîn]], [[hevkarî]], ''amadekirina tiştekî bi hev re''
nvdbwm1oqk9bu10fito69b07i26db05
ھاواری
0
269558
6532746
5878109
2026-09-19T09:23:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532746
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawarî
=== Navdêr ===
{{navdêr|ckb}}
# [[hewarî]], [[berbedel]], [[mînek]]
po0af23phhpaj4jy7vj3jvblw8ym442
ھاوارکەر
0
269559
6532747
5878108
2026-09-19T09:23:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532747
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawarker
=== Navdêr ===
{{navdêr|ckb}}
# [[hewarker]], [[gazîker]], [[bangker]], kesa/ê hewarê dike
17ca1xlceza3j546jwq021s1hdppvvo
ھاوبەند
0
269560
6532748
5878113
2026-09-19T09:23:49Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532748
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawbend
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hevbend]], [[hevgir]]
4w05tzboiaub7shogd3p8pltklzvkuy
ھاوبیر
0
269562
6532749
5878111
2026-09-19T09:23:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532749
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawbîr
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hevbîr]], [[hemfikir]], kesên (li ser mijarekê) dîtin û baweriyên wan mîna hev in
dr30lpz5qka7cd4jjhmtf1gmqi1pfpp
ھاوجێ
0
269563
6532750
5878123
2026-09-19T09:24:09Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532750
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawcê
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hevber]], tiştên mîna / beramberî hev in
i2rpt02jlsk93k31v0qs5r8l2uomyor
ھاوجۆت
0
269565
6532751
5878122
2026-09-19T09:24:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532751
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawcot
=== Navdêr ===
{{navdêr|ckb}}
# [[hevcot]], tiştên tam mîna hev, [[hevtov]], ''zarokên cêwî / hevalcêmik yên ku tam dişibin hev''
9xwajgefr1uwxmdfib6thibgor36m6v
ھاوچاوی
0
269567
6532752
5878126
2026-09-19T09:24:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532752
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawçawî
=== Navdêr ===
{{navdêr|ckb}}
# [[hevrikî]], [[dijberî]], [[berberkî]], dijîtiya hemberî hev
l2gklwtqy7siv0yud424bq80i7bqu2y
ھاوچاخ
0
269568
6532753
5878124
2026-09-19T09:24:39Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532753
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawçax
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hevçax]], [[hevserdem]], [[hevdem]], eynî demî, [[nûjen]], [[hevçerx]], [[nihoyî]], [[modern]]
ducjcvoqb00qbd5y76lvwep8wcrfe47
ھاودەرد
0
269572
6532754
5878134
2026-09-19T09:24:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532754
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawderd
=== Navdêr ===
{{navdêr|ckb}}
# [[hevderd]], kesên derd û kulên wan eynî ne
c0vxuj4keyuex6y9dyc3suxnjprbqdl
ھاودین
0
269574
6532755
5878133
2026-09-19T09:24:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532755
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawdîn
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hevdîn]], [[hevol]], kesên dînê wan eynî ye
4tffy8u4ycoatbbshks7fsa0wge0mpu
ھاوەن
0
269575
6532756
6433462
2026-09-19T09:25:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532756
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawen
=== Navdêr ===
{{navdêr|ckb}}
# [[hawin]]
==== Anagram ====
* {{anagram|ckb|a=انوھە|ھەناو}}
j8zh2ycxy1m0rink3gtc044mo1svscg
ھاوینھەوار
0
269578
6532757
5878172
2026-09-19T09:25:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532757
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawînhewar
=== Navdêr ===
{{navdêr|ckb}}
# [[havîngeh]], [[havînwar]], cihê bênvedanê yê havînê
hkilx33dlhmses8y95cl3gpqx1s4ht0
ھاویشتن
0
269579
6532758
5878171
2026-09-19T09:25:29Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532758
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawîştin
=== Lêker ===
{{lêker|ckb}}
# [[avêtin]], [[havêtin]], [[avêştin]]
c26aq46m9jbmwdlgzgcxvv7zo1r9wti
ھاوکار
0
269580
6532759
5878157
2026-09-19T09:25:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532759
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawkar
=== Navdêr ===
{{navdêr|ckb}}
# [[hevkar]], [[hevxebit]], [[hevşol]], kesên / tiştên li gel hev karekî dikin yan dixebitin
1dyntm9xnsgny0vp7spbvbf2cnkjori
ھاوکاری
0
269581
6532760
5878158
2026-09-19T09:25:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532760
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawkarî
=== Navdêr ===
{{navdêr|ckb}}
# [[hevkarî]], [[hevxebat]], [[hevşolî]], karkirina bi hev re, şol kirina li gel hev, xebata pêkve
jfjvlfmlxtcq4zaahr7abnpczcrzqtz
ھاوکات
0
269582
6532761
5878156
2026-09-19T09:25:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532761
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawkat
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hevdem]], bûyerên di eynî demê de diqewimin
n0tsls9n5osvn2u9v02zrwp6xayq846
ھاوکێش
0
269583
6532762
5878159
2026-09-19T09:26:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532762
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawkêş
=== Navdêr ===
{{navdêr|ckb}}
# [[hevkêş]], [[paralel]]
cbf815k97ryxz5qp41e7wiqj0vwlxi4
ھەڤکێشی
0
269585
6532763
5878639
2026-09-19T09:26:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532763
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hevkêşî
=== Navdêr ===
{{navdêr|ckb}}
# [[hevkêşe]], [[paralelî]], [[paralelîzm]]
79ehgfsuzb5qobdmj1cy55jh1og2pgv
ھاولا
0
269586
6532764
5878161
2026-09-19T09:26:29Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532764
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawla
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hevhêl]], [[hevla]], [[hevlayen]], tiştên aliyên wan eynî ne
1jpv53d4mtady3ecyd7l9eku3qfax4s
ھاومل
0
269588
6532765
5878163
2026-09-19T09:26:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532765
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawmil
=== Navdêr ===
{{navdêr|ckb}}
# [[hevnîr]], gayên bi hev re vot pê têt kirin, '':(m) heval, [[hevrê]], [[ hevbar'']]
ho2o67498lkz6obod736eq9dx8tald1
ھاوپا
0
269593
6532766
5878114
2026-09-19T09:26:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532766
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawpa
=== Navdêr ===
{{navdêr|ckb}}
# [[hevtawan]], [[hevguneh]], kesên ziyanek / xirabiyek bi hev re kirine
kt5gxr3e03qlea9g4wvi5uunsz8bhe0
ھاوپایە
0
269594
6532767
5878115
2026-09-19T09:26:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532767
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawpaye
=== Navdêr ===
{{navdêr|ckb}}
# [[hevpaye]], kesên di pileya / dereceya xwe de hindî hev in
j0l9yuy4s2ep1nlqzxfgsvkhpl1gda5
ھاوپرسی
0
269596
6532768
5878116
2026-09-19T09:27:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532768
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawpirsî
=== Navdêr ===
{{navdêr|ckb}}
# [[hevpirsî]], [[suhbet]], pirsîna li halê hev
sdt2b014d8s2samvf0afvadm04eij2v
ھاوپشت
0
269597
6532769
5878117
2026-09-19T09:27:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532769
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawpişt
=== Navdêr ===
{{navdêr|ckb}}
# [[hevpişt]], [[hevpal]], kesên alîkariya hev dikin
3pq51oxzaq21f2v77sdykyay344uhx4
ھاوراز
0
269598
6532770
5878136
2026-09-19T09:27:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532770
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawraz
=== Navdêr ===
{{navdêr|ckb}}
# [[hevraz]], kesên tiştek / tiştên hev yê(n) raz / nepenî / nehînî dizanin
43bakftbjtl6zidii33wl86zlsi09zj
ھاوڕێ
0
269599
6532771
5878137
2026-09-19T09:27:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532771
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawrrê
=== Navdêr ===
{{navdêr|ckb}}
# [[heval]], [[hevrê]], [[hogir]], [[dost]], [[birader]]
0w5omxaea46indntkzepmel421451gi
ھاوڕێتی
0
269600
6532772
5878138
2026-09-19T09:27:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532772
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawrrêtî
=== Navdêr ===
{{navdêr|ckb}}
# [[hevalî]], [[hevaltî]], [[hevalînî]], [[hevrêtî]], [[hogirî]], [[dostî]], [[biraderî]]
3ix94fcjxo7m2wg5nal9eimxkx0togq
ھاوساڵ
0
269601
6532773
5878143
2026-09-19T09:27:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532773
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawsall
=== Navdêr ===
{{navdêr|ckb}}
# [[hevjî]], [[hevtemen]], [[hevsal]], kesên jiyê / temenê wan hindî hev e
6wsfyrp64a82as9rlutjhhcfo6rc904
ھاوسامە
0
269602
6532774
5878144
2026-09-19T09:28:09Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532774
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawsame
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hevbînahî]], [[hevbîr]], [[hemfikir]], kesên baweriya / bînahiya / dinyabîniya wan wek hev e
71v1wflkhidsh6akbk90wveqz7cmmto
ھاوساز
0
269603
6532775
5878142
2026-09-19T09:28:19Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532775
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawsaz
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hevgir]], [[hevsaz]], [[hevkêr]], tiştên kêrî hev tên
mi5jsfgdsw8px4ed8gjy55kdmjm1v1j
ھاوسەنگی
0
269606
6532776
5878151
2026-09-19T09:28:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532776
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawsengî
=== Navdêr ===
{{navdêr|ckb}}
# [[hevsengî]], [[serbiserî]], [[balans]]
fuqqinsjbvpsm0t9d0ou5npgkqjshu1
ھاوسەر
0
269607
6532777
6433470
2026-09-19T09:28:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532777
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawser
=== Navdêr ===
{{navdêr|ckb}}
# [[şû]], [[hevser]], jina yan mêrê kesekê/î
==== Anagram ====
* {{anagram|ckb|a=ارسوھە|ھەوسار}}
g6fuxh5lp0pl3jobxfs907a6vys5sxg
ھاوسنوور
0
269608
6532778
5878145
2026-09-19T09:28:49Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532778
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawsinûr
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hevtixûb]], [[hevsinor]], cihên (t welatên) sinorên wan bi hev re ne
ec5lp9stiradr1ka3n83zxpvfhqq20r
ھاوسوێندی
0
269610
6532779
5878147
2026-09-19T09:28:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532779
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawsiwêndî
=== Navdêr ===
{{navdêr|ckb}}
# [[hevsozî]], [[hevsondî]], [[hevpeymanî]], [[komplo]]
iy1flzzvdm6hpu2t3yapq47ex69vek0
ھاوشان
0
269611
6532780
5878153
2026-09-19T09:29:09Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532780
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawşan
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hevmil]], kesên di pileya / asta / dereceya hev de, [[hevta]], ''kesên hindî hev zîrek / jêhatî''
9a77wpa6y5ajtailpe9ik025qp2e5k5
ھاوشار
0
269612
6532781
5878152
2026-09-19T09:29:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532781
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawşar
=== Navdêr ===
{{navdêr|ckb}}
# [[hevbajar]], [[hevşar]], [[hemşerî]], kesên ji eynî bajarî
rk9vp67ik5ecwc1e2eot9mbyh240o4p
ھاوشیرە
0
269614
6532782
5878154
2026-09-19T09:29:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532782
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawşîre
=== Navdêr ===
{{navdêr|ckb}}
# [[hevşîr]], kesên şîrê eynî dayikê xwarine lê ne ji eynî dayikê ne
gqr36mowk4qquspokc4hixv14xt3w8w
ھاوتا
0
269615
6532783
5878119
2026-09-19T09:29:39Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532783
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawta
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hevta]], kesên hindî hev zîrek / jêhatî / xurt û hwd
n52u5tmii1wh5efjcngk7bn55dmfei5
ھاوتەک
0
269616
6532784
5878120
2026-09-19T09:29:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532784
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawtek
=== Navdêr ===
{{navdêr|ckb}}
# [[pêvek]], [[pêrek]], tiştê(n) bi hinek / yek dî ve / re
o85sbqv9dyprefiedpmm38yh4grf9z1
ھاوتەمەن
0
269617
6532788
5878121
2026-09-19T09:29:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532788
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawtemen
=== Navdêr ===
{{navdêr|ckb}}
# [[hevjî]], [[hevtemen]], kesên jiyê / temenê wan hindî hev e
24rzp4ffim5hfdxooqhwi0addtuyepv
ھاووڵاتی
0
269619
6532789
5878169
2026-09-19T09:30:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532789
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawwillatî
=== Navdêr ===
{{navdêr|ckb}}
# [[hevwelatî]], kesa/ê ji welatekî ye û mafê wê / wî yê asayî wek ya / yê herkesa li wî welatî dijî heye
rtmxk20axxubi9fatjyr1ccivmjfcpe
ھاوخاک
0
269620
6532790
5878130
2026-09-19T09:30:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532790
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawxak
=== Navdêr ===
{{navdêr|ckb}}
# [[hevax]], [[cîran]]
8xhjgxmz43dhqfylc6ja4dyhysvo0wf
ھاوزمان
0
269624
6532791
5878140
2026-09-19T09:30:29Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532791
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hawziman
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hevziman]], kesên bi eynî zimanê wan (yê zikmakî) eynî ye
drgk29k1psttedb0srw3gicegyrdv60
ھازر
0
269626
6532792
5878082
2026-09-19T09:30:39Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532792
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hazir
=== Rengdêr ===
{{rengdêr|ckb}}
# [[amade]], [[hazir]]
3c2n4u9xhsc4cwxtfi084zxfsalxgq1
ھازری
0
269627
6532793
5878083
2026-09-19T09:30:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532793
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hazirî
=== Navdêr ===
{{navdêr|ckb}}
# [[hazirî]], [[amadeyî]]
csebggfy44etcvq3cxgpgfub0pi5fbl
ھەب
0
269629
6532794
5878527
2026-09-19T09:30:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532794
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:heb
=== Navdêr ===
{{navdêr|ckb}}
# [[heb]], [[hebik]], [[tablet]], dermanê lib-lib
qqxk6ms7hc589p29ivwkv2rflwp1qhm
ھەد
0
269631
6532795
5878549
2026-09-19T09:31:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532795
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hed
=== Navdêr ===
{{navdêr|ckb}}
# [[hed]], [[sinor]], [[tixûb]], [[rade]], [[ast]]
# [[wêrekî]], [[bistehî]]
qxly9ragykyudm9yvebwdsuwr2d3yjd
ھەدیس
0
269632
6532796
5878550
2026-09-19T09:31:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532796
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hedîs
=== Navdêr ===
{{navdêr|ckb}}
# [[hedîs]], pendên / şîretên / çîrokên têt bawerkirin ji devê Mihemed Pêxember in
5y7gvvbjjrdbeaexp4bef0y5u4fzw75
ھەفتانە
0
269635
6532797
5878634
2026-09-19T09:31:29Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532797
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:heftane
=== Rengdêr ===
{{rengdêr|ckb}}
# [[heftane]], meaşê heft rojan, [[hefteyî]], ''tişta her hefte (carekê) dibe''
sy047dj4iozi2djvl6p19md1ix1mzg5
ھەفتە
0
269636
6532798
5878635
2026-09-19T09:31:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532798
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hefte
=== Navdêr ===
{{navdêr|ckb}}
# [[hefte]], [[heftî]], heft roj, yekîneyek demî ye ji heft rojan pêk têt
ehs7ladwu6mjew76ur8lad5kdg4z0ly
ھەفتەیی
0
269637
6532799
5878636
2026-09-19T09:31:49Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532799
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hefteyî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hefteyî]], tişta her hefte (carekê) dibe
k2cf9p1b6y8o42z5xcdadz4n4ue15vr
ھەژان
0
269638
6532800
5878602
2026-09-19T09:31:59Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532800
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hejan
=== Lêker ===
{{lêker|ckb}}
# [[hejîn]], [[hejiyan]], [[hejihan]], [[hatin hejandin]], [[şilqîn]], [[qeliqîn]], [[livîn]], '':(wurûjan) arîn, [[ariyan]], [[ arihan'']]
akhf81u4c9xb1yhbmn0m10dm1ohlfb2
ھەژاندن
0
269639
6532801
5878603
2026-09-19T09:32:09Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532801
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hejandin
=== Lêker ===
{{lêker|ckb}}
# [[hejandin]], [[şilqandin]], [[qeliqandin]], [[livandin]], '':(wurûjandin) arandin''
3k0mwcp36bx44u31hvomaq528mk8c5g
ھەژاری
0
269641
6532802
5878601
2026-09-19T09:32:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532802
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hejarî
=== Navdêr ===
{{navdêr|ckb}}
# [[hejarî]], [[jarî]], [[belengazî]], [[feqîrî]], [[rebenî]], [[destkurtî]]
kkjg72nfam3t9v0raro4lg30uhbuq2k
ھەژەند
0
269643
6532803
5878607
2026-09-19T09:32:29Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532803
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hejend
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hejok]], [[qeliqok]], [[livok]], [[venehewayî]]
j0m957ytp20w10x32u5ad0mo46jodct
ھەژێنەر
0
269644
6532804
5878606
2026-09-19T09:32:39Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532804
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hejêner
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hejîner]], [[qeliqîner]], [[livîner]], ya / yê dihejîne, [[arîner]], ya / yê diarîne
panxosx6ptmcuk2e5iive8o4hpzu8jp
ھەژگ
0
269645
6532805
5878605
2026-09-19T09:32:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532805
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hejg
=== Navdêr ===
{{navdêr|ckb}}
# [[1]], [[çeq]], [[çiqil]], [[çeqik]], çikilk (yên daran / deviyan / tirraşan) 2, [[zend]], [[dest]], [[pî]], [[ling]]
auuedp5fkbkxml5z3nt4p509wresopf
ھەکیم
0
269646
6532806
5878643
2026-09-19T09:32:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532806
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hekîm
=== Navdêr ===
{{navdêr|ckb}}
# [[hekîm]], [[bijîşk]], [[nojdar]], [[dermanker]], [[luqman]]
l5lfnibiyf9iclfcqpytmvc9njpntht
ھەل
0
269647
6532807
5878645
2026-09-19T09:33:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532807
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hel
=== Navdêr ===
{{navdêr|ckb}}
# [[delîv]], [[derfet]], [[firset]], [[fersend]], [[mecal]], [[keys]], [[car]], [[gav]], [[dem]], [[kêlîk]], [[bîsk]], [[hal]], [[neql]]
kdhoz8xp9c0qjvd6arq2xxt7luxshkk
ھەڵاڵ
0
269649
6532808
5878649
2026-09-19T09:33:19Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532808
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellall
=== Rengdêr ===
{{rengdêr|ckb}}
# [[pûyîn]], [[debax]], [[helal]], [[rewa]], [[durist]], ''tiştê (bi taybetî ji alî dînî ve) destûr heye bêt kirin''
6ssrttvqlbtv50ao46oikznoaxd4589
ھەڵامەت
0
269651
6532809
5878652
2026-09-19T09:33:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532809
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellamet
=== Navdêr ===
{{navdêr|ckb}}
# [[persîv]], [[arsim]], [[harîk]], [[zekem]], [[asrîm]], [[sarma]]
4jhh34s6g8azx48dvgh17pfs9udgqda
ھەڵامسان
0
269653
6532810
5878651
2026-09-19T09:33:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532810
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellamsan
=== Navdêr ===
{{navdêr|ckb}}
# [[enflasyon]], bihabûna tiştan û daketina qîmetê pare
13nj9bbmpz1tcqaofgd70cof0gcn4xl
ھەلانە
0
269654
6532811
5878654
2026-09-19T09:33:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532811
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:helane
=== Navdêr ===
{{navdêr|ckb}}
# [[zembîl]], [[sepet]]
j4sbheljmg3gle81qklud5pab96wy28
ھەلات
0
269655
6532812
5878646
2026-09-19T09:33:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532812
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:helat
=== Navdêr ===
{{navdêr|ckb}}
# [[meth]], [[pesn]] (t yên bêbingeh)
odebt2i7k5anxq7ad7i6euy6zt7w3s3
ھەڵاوێز
0
269658
6532813
5878659
2026-09-19T09:34:09Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532813
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellawêz
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hilawîstî]], [[daliqandî]], (bi dîwar / ristê ve) [[kirî]]
2zebkszr1o7movkwrvw8vcw8tzbgjhd
ھەڵاوردن
0
269660
6532814
5878657
2026-09-19T09:34:19Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532814
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellawirdin
=== Lêker ===
{{lêker|ckb}}
# [[ji hev kirin]], [[ji hev cuda kirin]], [[ji hev veqetandin]]
rjq8j698zmfpg96fm75m9khrez58f3p
ھەڵاوسان
0
269661
6532815
5878658
2026-09-19T09:34:29Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532815
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellawisan
=== Lêker ===
{{lêker|ckb}}
# [[1]], [[werimîn]], perçivîn 2, [[berfire bûn]], [[belav bûn]]
sm3h1v5htevenvkua2fltoem72eckrl
ھەڵبەستە
0
269664
6532816
5878673
2026-09-19T09:34:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532816
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellbeste
=== Navdêr ===
{{navdêr|ckb}}
# [[helbest]], t çîrok yan dersa wek helbestê vehûnandî / lihevînayî
jmk455biqmpi46wjpmi7tg1azbwt04j
ھەڵبەستن
0
269665
6532817
5878672
2026-09-19T09:34:49Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532817
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellbestin
=== Lêker ===
{{lêker|ckb}}
# [[li hev anîn]], [[çêkirin]] (t derek yan tiştek bo xapandin û lêb û hîleyan)
m54z4kvouf6p73tz0klvm8dv7lsehit
ھەڵبەستراو
0
269666
6532818
5878671
2026-09-19T09:34:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532818
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellbestiraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hûnandî]], [[vehûnandî]], [[lihevînayî]]
# [[lihevînayî]], [[çêkirî]], [[çêkirok]], [[xapînok]], [[lêbok]]
ok16lj0l1ih0ge99n24z5fvd2xxqhwp
ھەڵبژێر
0
269669
6532819
5878667
2026-09-19T09:35:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532819
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellbijêr
=== Navdêr ===
{{navdêr|ckb}}
# [[hilbijêr]], ya/yê ku hildibijêre yan jî mafê hilbijartin û dengdanê heye, [[;hilbijêr]], ''ya / yê (hin kesan / tiştan) dibijêre; ya / yê mafê wê / wî yê dengdanê di hilbijartinan de heye''
hpjpz2y8p7lo31cd3yoc8vv086f8ix7
ھەڵبژار
0
269670
6532820
5878664
2026-09-19T09:35:19Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532820
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellbijar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hilbijar]], ya/yê tê yan dikare bê hilbijartin
# [[bijare]], tiştên hêja / berkeftî / hezkirî
gag6wnzf8ztrvvpumiat20mdtkomacu
ھەڵبژاردە
0
269671
6532821
5878666
2026-09-19T09:35:29Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532821
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellbijarde
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bijare]], tiştên hêja / berkeftî / hezkirî, [[hilbijartî]], [[bijartî]], yên ku hatine bijartin
6vdq73tkn0rzwrqcvfu1c00doqoredq
ھەڵبژێڕاو
0
269672
6532822
5878668
2026-09-19T09:35:39Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532822
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellbijêrraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hilbijartî]], ya/yê hatiye hilbijartin
8zzlpy57v45h1utqsoswt7dswz573tr
ھەڵدان
0
269673
6532823
5878720
2026-09-19T09:35:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532823
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:helldan
=== Navdêr ===
{{navdêr|ckb}}
# [[hilavêtin]], [[;hilavêtin]], avêtin hewa; (firrfirrok) hilfirrandin; (çadir, [[kûn]], xîvet) vedan; (zêde) pesnên / methên kesekî / tiştekî kirin; (gotina kesekî) vebirrîn; geş bûn, xemlxweş bûn
818k1ppnxu7duo64r221ovrwglkw5rl
ھەڵبڕین
0
269674
6532824
5878661
2026-09-19T09:35:59Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532824
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellbirrîn
=== Lêker ===
{{lêker|ckb}}
# [[hilketin]], [[rabûn]], [[bilind bûn]]
# (ronahî) [[hilbûn]], [[vêketin]], [[berbûn]], [[geş bûn]], gurr bûn 3) rê lê girtin, bersîng lê gir
# [[rê lê girtin]], bersîng lê girtin (t li êrişên dijmin û nehiştin dijmin bi pêş bikeve)
mnx1i7nu0zhrz79om0t9d240r5cgizc
ھەڵبرواندن
0
269675
6532825
5878660
2026-09-19T09:36:09Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532825
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellbirwandin
=== Lêker ===
{{lêker|ckb}}
# [[meriçandin]], [[merçiqandin]], [[perçiqandin]], [[zirviçandin]]
15idzjojuu7i6gg57tcp0obnnywqcfs
ھەڵچنین
0
269679
6532826
5878708
2026-09-19T09:36:19Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532826
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellçinîn
=== Lêker ===
{{lêker|ckb}}
# [[nijinîn]], [[nijinandin]], [[gidîş kirin]], (li ser hev) kom / berhev kirin, '':dîwar danîn
#(av yan ruhniyek dî) mêtin / mijîn (xwe)''
peskr84q91y0a1gsjor4bp5vrvkt8uf
ھەڵچوون
0
269681
6532827
5878709
2026-09-19T09:36:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532827
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellçûn
=== Navdêr ===
{{navdêr|ckb}}
# [[firûn]] (t şîr dema zêde germ dibe û di ser qazanê / qûşxanê re diavêje)
# [[hilketin]], [[hewa ketin]], berev jor / serî / silal çûn
4itqmbh3fcnw1um30g0gjcnnz9dds07
ھەڵدڕان
0
269684
6532828
5878722
2026-09-19T09:36:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532828
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:helldirran
=== Navdêr ===
{{navdêr|ckb}}
# [[dirîn]], [[çirîn]], [[peritîn]], hatin dirandin / çirandin / peritandin
echvhrvbarel9md5li7m0s2gw8zl8hn
ھەڵدڕین
0
269686
6532829
5878726
2026-09-19T09:36:49Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532829
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:helldirrîn
=== Lêker ===
{{lêker|ckb}}
# [[hildirandin]], [[hilçirandin]], [[dirandin]], [[çirandin]], bi devek tûj (t yê kêrê) dirandin / çirandin
8s0iz3sor86yxpqsjain0mhajut32w9
ھەڵە
0
269689
6532830
5878828
2026-09-19T09:36:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532830
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:helle
=== Navdêr ===
{{navdêr|ckb}}
# [[şaşî]], [[xeletî]], [[çewtî]]
grgev352uwnjim5ijn5hllojxnhtuwe
ھەڵەداوان
0
269690
6532831
5878831
2026-09-19T09:37:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532831
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:helledawan
=== Navdêr ===
{{navdêr|ckb}}
# [[lez]], [[bizav]], [[lezûbizav]], [[ecele]], [[pele]]
594teod07epq4aoeacld9dh8abdljpv
ھەڵەھەڵ
0
269691
6532832
5878838
2026-09-19T09:37:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532832
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellehell
=== Navdêr ===
{{navdêr|ckb}}
# [[qîrîn]], [[qîjîn]], [[dengûdor]]
suxvazhee2e5bj5l4v8wdh8anzfjr30
ھەلھەلە
0
269693
6532833
5878810
2026-09-19T09:37:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532833
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:helhele
=== Navdêr ===
{{navdêr|ckb}}
# [[tilîlî]], dengê kêfxweşiyê di şahiyan de (t jin vedidin)
00tbm2zkhd0253n18qiizs70kangtks
ھەڵەنگووتن
0
269694
6532834
5878837
2026-09-19T09:37:39Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532834
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellengûtin
=== Lêker ===
{{lêker|ckb}}
# [[hilingivîn]], [[hilingiftin]], [[likumîn]], [[terpilîn]]
dmfoe3w0n69t4yw5gfk92mjblyxbnkh
ھەڵەشە
0
269696
6532835
5878832
2026-09-19T09:37:49Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532835
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:helleşe
=== Rengdêr ===
{{rengdêr|ckb}}
# [[lezok]], [[bilez]], [[bizivok]], [[bilezûbizav]], [[bêsexbêr]], [[bêdîqet]]
61jnpv644dg72z5oyzl0hugkzelvnlr
ھەڵەشەیی
0
269697
6532836
5878834
2026-09-19T09:37:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532836
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:helleşeyî
=== Navdêr ===
{{navdêr|ckb}}
# [[lezokî]], [[bizivokî]], [[lez]], [[bizav]], [[bêsexbêrî]]
6ohn22gxbp7iptd7iofez8q8xnrw1w0
ھەڵەت
0
269698
6532837
5878829
2026-09-19T09:38:09Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532837
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellet
=== Rengdêr ===
{{rengdêr|ckb}}
# [[asê]], cihê mirov nikare bi asanî lê bimeşe, [[serhişk]], [[neguhdar]], mirovê serkêşiya wê / wî kirin dijwar e
mhtrbrbkx5eu1mj6eq9fjuemqj2ximi
ھەڵەخەرج
0
269700
6532838
5878830
2026-09-19T09:38:19Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532838
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellexerc
=== Rengdêr ===
{{rengdêr|ckb}}
# [[felîte]], [[destbelav]], kesa/ê malê / pareyê xwe pirr xerc / pûç dike
poiaxl0yde6z3un4qizxu6f2hgdd6kg
ھەڵفلیقان
0
269702
6532839
5878753
2026-09-19T09:38:29Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532839
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellfilîqan
=== Lêker ===
{{lêker|ckb}}
# [[meriçîn]], [[merçiqîn]], [[zirviçîn]], [[perçiqîn]]
jk5iclhcspp5hwl0rl1oemt7ilj7s98
ھەڵفلیقاو
0
269703
6532840
5878755
2026-09-19T09:38:39Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532840
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellfilîqaw
=== Lêker ===
{{lêker|ckb}}
# [[meriçîn]], [[merçiqîn]], [[zirviçîn]], [[perçiqîn]]
6729fmlk3apxkusstbd50car07ujgiq
ھەڵفریواندن
0
269706
6532841
5878752
2026-09-19T09:38:49Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532841
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellfirîwandin
=== Lêker ===
{{lêker|ckb}}
# [[xapandin]], [[lê]] (h)b lê kirin, [[hîle lê kirin]]
caiuq1ntwbmya6862ngcizuf7t8ruda
ھەڵگەڕان
0
269707
6532842
5878784
2026-09-19T09:38:59Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532842
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellgerran
=== Lêker ===
{{lêker|ckb}}
# [[hilgerrîn]], li hindavî / raserî tiştekî gerrîn yan dewr dan, [[hilketin]], [[hewa ketin]], ji derek nizm meşîn derek bilind; berbelav bûn (dar yan giya dema pelên / çeqên xwe belavî derdorî xwe dike); (reng) guherrîn, [[lê bûn]] (rengek): Rengî zerd hellgerra Reng lê zer bûn (ango bûn spîçolkî / zerik)
c4fqiveav6c3y9guhxq2nrjxboe2749
ھەڵگەڕانەوە
0
269708
6532843
5878785
2026-09-19T09:39:09Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532843
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellgerranewe
=== Lêker ===
{{lêker|ckb}}
# [[qulipîn]], [[vequlipîn]], [[serberjêr bûn]], [[berejavî bûn]], [[dijber bûn]]
m2c8ixjzwffn5pmb4ntd58cofsx49q0
ھەڵگڵۆفتن
0
269709
6532844
5878779
2026-09-19T09:39:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532844
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellgilloftin
=== Navdêr ===
{{navdêr|ckb}}
# [[perixandin]], [[mizdan]], destê xwe pêve anîn û birin
ecs1a0k8n1tv2v8ps9l0p7kdnookzla
ھەڵگیرسان
0
269713
6532845
5878782
2026-09-19T09:39:29Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532845
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellgîrsan
=== Lêker ===
{{lêker|ckb}}
# [[hilbûn]], [[vêketin]], [[berbûn]], [[geş bûn]], [[gur bûn]] (agir), [[çêbûn]], [[dest pê bûn]], [[berpê bûn]], [[afirîn]]; berbûn hev, li hev sor bûn
71e33c1fu4aef1n4sla9htw40m3czpw
ھەڵگیرساندن
0
269714
6532846
5878783
2026-09-19T09:39:39Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532846
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellgîrsandin
=== Lêker ===
{{lêker|ckb}}
# [[hilkirin]], [[vêxistin]], [[berdan]], [[geş kirin]], [[gur kirin]] (agir), [[çêkirin]], [[dest pê kirin]], [[berpê kirin]], [[afirandin]]; berdan hev, li hev sor kirin
19ne2kz85wpjw4tvz369n4txus8f25o
ھەڵگوشین
0
269715
6532847
5878780
2026-09-19T09:39:49Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532847
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellguşîn
=== Lêker ===
{{lêker|ckb}}
# [[givaştin]], [[şidandin]], [[guvaştin]], [[jidandin]]
2q05lp1scwefl67saqcmf6xcrxo9d41
ھەڵھێنجان
0
269719
6532848
5878805
2026-09-19T09:39:59Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532848
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellhêncan
=== Lêker ===
{{lêker|ckb}}
#(av ji bîrê) hilkişandin / hilkêşa
# (av ji derekê) [[çikîn]], [[miçikîn]], [[miçiqîn]], çik / hişk / ziwa / zuha bûn, (t ji ber germayê av jê) [[qut bûn]]
i3ihzhwbhv0y2mv1earzvfliwihud3g
ھەڵھێنجراو
0
269720
6532849
5878806
2026-09-19T09:40:09Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532849
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellhênciraw
=== Rengdêr ===
{{rengdêr|ckb}}
#(av ji bîrê) hilkişandî / hilkêşay
# (av ji derekê) [[çikî]], [[miçikî]], [[miçiqî]], çik / hişk / ziwa / zuha bûyî, (t ji ber germayê av jê) [[qutbûyî]]
9gqzrrjdmxxy3esvq76cinggt1cnohq
ھەڵھێنگە
0
269722
6532850
5878808
2026-09-19T09:40:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532850
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellhênge
=== Navdêr ===
{{navdêr|ckb}}
# [[hêlîn]], [[kurkgeh]], cihê mirîşk lê kurk dibe û hêkên xwe dimeriqîne
7qkn24mcgjbeq98esgeqkgfhgzjg8x8
ھەڵیز
0
269724
6532851
6433477
2026-09-19T09:40:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532851
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellîz
=== Navdêr ===
{{navdêr|ckb}}
# [[çerm]], [[pîst]], [[post]] (yên heywanan), [[meşk]]
==== Anagram ====
* {{anagram|ckb|a=زڵھیە|ھیزەڵ}}
bp7lmkf3vt6zwzvmk7yiih42v9l1y52
ھەڵژمار
0
269725
6532852
5878733
2026-09-19T09:40:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532852
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:helljimar
=== Navdêr ===
{{navdêr|ckb}}
# [[hiljimar]], [[statîstîk]], [[jimarko]]
pfi9b6ocnlq0ojo6663rg2eqlk085xn
ھەڵژماردن
0
269726
6532853
5878734
2026-09-19T09:40:49Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532853
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:helljimardin
=== Lêker ===
{{lêker|ckb}}
# [[hejmartin]], [[hiljimartin]], [[hijmartin]], [[jimartin]]
9f055zmh4dfsiyxlo2fpb1nkv7peyi7
ھەڵژمێڕاو
0
269727
6532854
5878735
2026-09-19T09:40:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532854
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:helljimêrraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[jimartî]], [[hejmartî]], [[hijmartî]], [[hiljimartî]]
jyc08uks28nyla99y9q3aoobtrp8jmr
ھەلک
0
269728
6532855
5878759
2026-09-19T09:41:09Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532855
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:helk
=== Rengdêr ===
{{rengdêr|ckb}}
# [[zimanxweş]], [[zimanşirîn]], [[peyvzêrrîn]]
llu21nzm7u2py2f40dfcrx0rbue44gf
ھەڵکەوت
0
269733
6532856
5878777
2026-09-19T09:41:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532856
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellkewt
=== Navdêr ===
{{navdêr|ckb}}
# [[hilkeft]], [[bone]], [[minasebet]]
4aygi6pcs9hdrggw9wf6b5pfc571n9z
ھەڵکێشان
0
269735
6532857
5878772
2026-09-19T09:41:29Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532857
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellkêşan
=== Lêker ===
{{lêker|ckb}}
# [[hilkêşan]], [[hilkişandin]], kêşan / kişandin jor / serî / silal / hewa
7krcvr2eeaqdg3bhjug7xf9mkejaqho
ھەڵکێشراو
0
269736
6532858
5878773
2026-09-19T09:41:39Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532858
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellkêşraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hilkêşayî]], [[hilkişandî]], ya / yê hatiye hilkêşan / hilkişandin
a8umwqaj1bnei4i529n7la8tc03c24p
ھەڵکڕان
0
269737
6532859
5878761
2026-09-19T09:41:49Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532859
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellkirran
=== Lêker ===
{{lêker|ckb}}
# [[selixîn]], [[veçirrîn]], [[verûçîn]], [[verûçikîn]], piçek / pirtek çerm / pîst ji ser vebûn / çûn, bi sivikî birîndar bûn
mg8e9vw1q58u0ndfzs3faiepe5usb7v
ھەڵکڕاندن
0
269738
6532860
5878762
2026-09-19T09:41:59Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532860
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellkirrandin
=== Lêker ===
{{lêker|ckb}}
# [[selixandin]], [[veçirrandin]], [[verûçandin]], [[verûçikandin]], piçek / pirtek çerm / pîst ji ser vekirin / rakirin, bi sivikî birîndar kirin
h967nujh993byy8vy5p4c1jmg4xzcni
ھەڵکشە
0
269743
6532861
5878767
2026-09-19T09:42:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532861
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellkişe
=== Navdêr ===
{{navdêr|ckb}}
# [[rabûn]], [[bilindbûn]] (a seviyeya avê)
oobx64w9tg8nijgnrtqjqi6laz57wjs
ھەڵلا
0
269747
6532862
5878786
2026-09-19T09:42:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532862
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellla
=== Navdêr ===
{{navdêr|ckb}}
# [[şerenîx]], [[xirenîx]], [[dengûdor]], [[dijberî]]
2p8hz195gpams2y8bdmtrwvkb9thhl9
ھەڵلووشین
0
269748
6532863
5878787
2026-09-19T09:42:29Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532863
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:helllûşîn
=== Lêker ===
{{lêker|ckb}}
# [[daûrandin]], [[dabeliandin]], [[dabeliandin]], [[daûrandin]], zû yan bi hesûdî xwarin, [[nîçandin]], [[nîç kirin]], çipek / dilopek ji avê yan vexwirakek dî nehêlan
kqai291jmeove2kofxzc1cfw6vq4xii
ھەڵم
0
269749
6532864
5878788
2026-09-19T09:42:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532864
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellm
=== Navdêr ===
{{navdêr|ckb}}
# [[hilm]], [[bixar]], [[buxar]], [[dû]], [[dûkêl]]
03452684j6tqmk4pickd6wxf4zkukux
ھەڵماڵراو
0
269752
6532865
5878792
2026-09-19T09:42:49Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532865
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellmallraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hildayî]], [[hilmalî]], [[hilmaliştî]], [[hilmaliyayî]]
20rgtnixewa1y57i86p9z8oknfm62mz
ھەڵمەقۆ
0
269756
6532866
5878799
2026-09-19T09:42:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532866
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellmeqo
=== Navdêr ===
{{navdêr|ckb}}
# [[pêncokanê]], lîstikek / yariyek e bi pênc berkokên / kevirokên biçûk têt kirin
ef8jkbb1ioz3am6zmn728xhl1ci67kw
ھەڵمەت
0
269757
6532867
5878797
2026-09-19T09:43:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532867
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellmet
=== Navdêr ===
{{navdêr|ckb}}
# [[êriş]], [[pelamar]], [[lêdan]], [[biserdegirtin]]
obdnk678aa5zgjvxb3meseptoh74v7l
ھەڵمەتجاڕ
0
269758
6532868
5878798
2026-09-19T09:43:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532868
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellmetcarr
=== Navdêr ===
{{navdêr|ckb}}
# [[operasyon]], [[êriş]], [[lêdan]], [[biserdegirtin]]
26chkqx301yxxhp7wis24fsfvxmtb5d
ھەڵمژین
0
269759
6532869
5878795
2026-09-19T09:43:29Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532869
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellmijîn
=== Lêker ===
{{lêker|ckb}}
# [[hilmijandin]], [[hilmêtin]], av bi boriyan hilkişandin, av / hewa kişandin devê xwe, mêtin xwe
putu4ndju9u6imqe68vktm6rdeppcva
ھەڵنان
0
269761
6532870
5878800
2026-09-19T09:43:39Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532870
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellnan
=== Lêker ===
{{lêker|ckb}}
# [[gavîn]], [[gav avêtin]], [[pêngav avêtin]], hewa ketî
#(dav / xefik / feq) venan / danîn
a2tmsgrv3abukhk0d956yqm5zvhzwi3
ھەڵۆڵ
0
269764
6532871
5878826
2026-09-19T09:43:49Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532871
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:helloll
=== Rengdêr ===
{{rengdêr|ckb}}
# [[xilole]], [[xulole]]
c2spunf4swsixa6lrx252vpu824v96r
ھەلۆک
0
269765
6532872
5878825
2026-09-19T09:43:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532872
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:helok
=== Navdêr ===
{{navdêr|ckb}}
# [[kaşok]], [[gopal]], [[dar]]
9jd4yhwtl1fsibun6cvrq519y2e28q9
ھەڵپاچراو
0
269767
6532873
5878674
2026-09-19T09:44:09Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532873
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellpaçraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[qusandî]], '':kurrkirî; cewandî, [[ cewkirî'']]
ltcsp0ugw9nwqxwea9qjirsu159mow9
ھەڵپەنمان
0
269769
6532874
5878695
2026-09-19T09:44:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532874
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellpenman
=== Navdêr ===
{{navdêr|ckb}}
# [[werimîn]], [[perçivîn]]
ih8tkq7871f44oqjtahnbdrkfyzfias
ھەڵپەڕکێ
0
269772
6532875
5878691
2026-09-19T09:44:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532875
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellperrkê
=== Navdêr ===
{{navdêr|ckb}}
# [[govend]], [[dîlan]], [[dawet]], [[reqas]]
incmwew2aukagsd0zexf89zq13y1vok
ھەڵپەساردن
0
269773
6532876
5878694
2026-09-19T09:44:39Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532876
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellpesardin
=== Lêker ===
{{lêker|ckb}}
# [[spartin]], [[pal dan]], [[pişt dan]], pala / pişta tiştekî / xwe dan tiştekî
nrtos8l9hcprsc0tjenu2vljhhy4gky
ھەڵپەساڕاو
0
269774
6532877
5878693
2026-09-19T09:44:49Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532877
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellpesarraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[paldayî]], [[piştdayî]] (tiştekî)
4357fuwmdctr9ml0xj5txlfw3xjip44
ھەڵپێچ
0
269775
6532878
5878686
2026-09-19T09:44:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532878
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellpêç
=== Navdêr ===
{{navdêr|ckb}}
# [[dang]], [[daw]], [[dawên]], [[berdang]]
jqj58rlb1a42rmjd07qoige60bpgjrz
ھەڵپێچان
0
269776
6532879
5878687
2026-09-19T09:45:09Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532879
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellpêçan
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hilpêçan]], [[hilpêçandin]], [[hildan]], [[rakirî]]
# [[gihîn]], [[gihiştin]], ji kulîlk bûn fêkî
bxp167g0vxujayhxu66229bkx2nk7fn
ھەڵپچڕان
0
269778
6532880
5878676
2026-09-19T09:45:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532880
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellpiçrran
=== Navdêr ===
{{navdêr|ckb}}
# [[peritîn]], [[çirîn]], [[dirîn]], hatin çirandin / dirandin
e4i06qvgtwzer5q00jsmaegod7rqfue
ھەڵپژان
0
269781
6532881
5878685
2026-09-19T09:45:29Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532881
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellpijan
=== Lêker ===
{{lêker|ckb}}
#(av û hwd) hilbilqîn, [[vemistin]], [[hilvizîn]], [[hilvizikîn]], di ser re avêtin
6poh48srfqwrckk5457yofiix2r65rn
ھەڵپڕووکان
0
269782
6532882
5878682
2026-09-19T09:45:39Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532882
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellpirrûkan
=== Lêker ===
{{lêker|ckb}}
# [[betilîn]], [[westîn]], [[kerixîn]], [[mandî bûn]]
4cwdz6863pgc4h0x1rdifho1429zpl7
ھەڵپڕووکاندن
0
269783
6532883
5878683
2026-09-19T09:45:49Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532883
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellpirrûkandin
=== Lêker ===
{{lêker|ckb}}
# [[betilandin]], [[westandin]], [[kerixandin]], [[mandî kirin]]
f081mp9srej4jxti3xa6aonkpqwg73c
ھەڵپرووکاو
0
269784
6532884
5878684
2026-09-19T09:45:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532884
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellpirûkaw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[betilî]], [[westî]], [[kerixî]], [[mandîbûyî]]
erh756of6hrqshewg27qhvgr3furfn7
ھەڵپرووزان
0
269785
6532885
5878679
2026-09-19T09:46:09Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532885
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellpirûzan
=== Lêker ===
{{lêker|ckb}}
# [[kizirîn]], [[suşîn]], [[sujîn]], [[şewitîn]], bûn qerqûş(k)
hzytky9pw2hmwid11jz3ahgceej2687
ھەڵپرووزاندن
0
269786
6532886
5878680
2026-09-19T09:46:19Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532886
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellpirûzandin
=== Lêker ===
{{lêker|ckb}}
# [[kizirandin]], [[sotin]], [[sujandin]], [[şewitandin]], kirin qerqûş(k)
cfgjphjgp8ymz3g7yfu0yj2ot9spdv9
ھەڵقوڕاندن
0
269789
6532887
5878757
2026-09-19T09:46:29Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532887
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellqurrandin
=== Lêker ===
{{lêker|ckb}}
# [[qurtandin]], [[qurçandin]], (av û hwd) qurç-qurç / qurt-qurt vexwarin
46qu3bx8priuix69xpqu1p1pi8qmmbk
ھەڵڕشتن
0
269793
6532888
5878730
2026-09-19T09:46:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532888
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellrriştin
=== Navdêr ===
{{navdêr|ckb}}
# [[hilrijandin]], [[hilriştin]], hilrêtin (bn ellrrijan)
kn0hs5wzriz5k8jjehsaz3rt72rhkvu
ھەڵسانەوە
0
269796
6532889
5878739
2026-09-19T09:46:49Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6532889
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellsanewe
=== Hoker ===
{{hoker|ckb}}
# [[verabûn]], [[dîsan rabûn]]
3vzwuufat95zjtobyyh1kiq5oi0g18p
ھەڵساو
0
269797
6532890
5878740
2026-09-19T09:46:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532890
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellsaw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[rabûyî]]
dan1tqnqai1j21469itqbsl3zl6yng9
ھەڵسەنگاندن
0
269798
6532891
5878746
2026-09-19T09:47:09Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532891
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellsengandin
=== Lêker ===
{{lêker|ckb}}
# [[hilsengandin]], [[nirxandin]], [[berisandin]], [[dan ber hev]], li hev pîvan, nirxê / bihayê / giringiya tiştekî texmîn yan hesab kirin, [[kêşandin]], giraniya tiştekî pîvan
t0m2jv0yg3f5gk6dga2yav12c3wuoou
ھەڵسەنگێنەر
0
269799
6532892
5878747
2026-09-19T09:47:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532892
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellsengêner
=== Navdêr ===
{{navdêr|ckb}}
# [[hilsengîner]], [[nirxîner]], kesa/ê dinirxîne / hildisengîne, [[pîvan]], [[krîter]]
qx7w1iaewq99h4ep67xu9od36r4pwgy
ھەڵسووکەوت
0
269800
6532893
5878745
2026-09-19T09:47:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532893
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellsûkewt
=== Navdêr ===
{{navdêr|ckb}}
# [[leptûliv]], [[tevger]], [[ rabûn-û-rûniştin]]
pknxd5sasb1r07283vh89t4f33mdsjs
ھەڵسووڕان
0
269801
6532894
5878741
2026-09-19T09:47:39Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532894
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellsûrran
=== Lêker ===
{{lêker|ckb}}
# [[çêbûn]], [[durist bûn]], [[saz bûn]], [[pêk hatin]], [[afirîn]], [[amade bûn]], [[hatin pê]], [[berpê bûn]]
rhyftig0wqjqtxbydps2ebiy76mpcgq
ھەڵسووڕاندن
0
269802
6532895
5878742
2026-09-19T09:47:49Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532895
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellsûrrandin
=== Lêker ===
{{lêker|ckb}}
# [[çêkirin]], [[durist kirin]], [[saz kirin]], [[pêk anîn]], [[afirandin]], [[amade kirin]], [[anîn pê]], [[berpê kirin]]
jj4tiyqy73zl5s5m528zpqg20yl1che
ھەڵسووڕاو
0
269803
6532896
5878743
2026-09-19T09:47:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532896
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellsûrraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[çêkirî]], [[pêkînayî]], [[ durist(kirî)]], [[sazkirî]], [[afirandî]], [[amadekirî]], [[ berpê(kirî)]]
0uzjtc5pfx3cmrzcsa6kn9tfx555ffe
ھەڵسووڕێنەر
0
269804
6532897
5878744
2026-09-19T09:48:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532897
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellsûrrêner
=== Navdêr ===
{{navdêr|ckb}}
# [[çêker]], [[pêkîner]], [[duristker]], [[sazker]], [[amadeker]], [[afirîner]], [[birêveber]]
96ccnnr76zovhdzem4prleu4mok275j
ھەڵشاخین
0
269805
6532898
5878748
2026-09-19T09:48:19Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532898
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellşaxîn
=== Lêker ===
{{lêker|ckb}}
# (piya) lê xwirrîn, [[gef lê kirin]], enirrî û bi qehr li gel kesekî axivîn
svwk349h0t0idu41hr45u29pljoldch
ھەڵشێلان
0
269806
6532899
5878749
2026-09-19T09:48:29Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532899
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellşêlan
=== Lêker ===
{{lêker|ckb}}
# [[hilşêlandin]], [[şêlandin]], [[têkil kirin]] (t hevîr)
rq6zynlylkz2d9m8dvhdctk1wwtg7dd
ھەڵتڵیشاو
0
269812
6532900
5878700
2026-09-19T09:48:39Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532900
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:helltillîşaw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[peritî]], [[ pirt-pirt(bûyî)]], [[ parçe-parçe(bûyî)]], [[ hûr-hûr(bûyî)]]
9jhb97er1jwl38oolozjj3sf6r1g2ya
ھەڵتڕین
0
269814
6532901
5878697
2026-09-19T09:48:49Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532901
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:helltirrîn
=== Lêker ===
{{lêker|ckb}}
# [[finîn]], [[finihan]], ne li ser xêrê çûn (Wek nifirîn têt bi kar anîn: Helltirre! Bifine! Bifinihe! Here ji ber çavên min!)
lu3q3rhtw5zb9st5bib98uiwg5t6qhj
ھەڵتۆقین
0
269816
6532902
5878702
2026-09-19T09:48:59Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532902
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:helltoqîn
=== Lêker ===
{{lêker|ckb}}
# [[bilqîn]], [[hilbilqîn]], [[bilq dan]], [[derketin]], serê xwe deranîn; pirzik
0689hvz5mc422rudbe9xpnrq2htsf5t
ھەڵووژە
0
269818
6532903
5878815
2026-09-19T09:49:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532903
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellûje
=== Navdêr ===
{{navdêr|ckb}}
# [[hilû]], [[hilûk]], [[încas]], [[hilîk]], [[hulûk]]
ietxzjr5w2cel36lwti6ow3or1ior9i
ھەلوومەرج
0
269820
6532904
5878817
2026-09-19T09:49:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532904
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:helûmerc
=== Navdêr ===
{{navdêr|ckb}}
# [[şertûşirûd]], [[rewş]], [[destûdar]], [[kewdan]], [[barûdox]]
b8txvvj50lq2wkhwci1qvledrh88mfb
ھەڵواسران
0
269822
6532905
5878811
2026-09-19T09:49:29Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532905
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellwasran
=== Lêker ===
{{lêker|ckb}}
# [[hatin hilawîstin]], [[hatin daliqandin]], hatin (bi dar / dîwar ve) kirin
p3oa6ng6khlyav5c144rcngz4aqhvk0
ھەڵواسراو
0
269823
6532906
5878812
2026-09-19T09:49:39Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532906
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellwasraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hilawîstî]], [[daliqandî]], (bi dar / dîwar ve) [[kirî]]
rrcagln4luo5j93lge6kjnm3xs77yn4
ھەڵوەران
0
269824
6532907
5878818
2026-09-19T09:49:49Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532907
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellweran
=== Lêker ===
{{lêker|ckb}}
# [[werîn]], [[weşîn]], [[weriyan]], [[dawerîn]], [[daweşîn]], [[vewerîn]], [[veweşîn]], [[werihan]], pel / dindik / tov jê veqetîn / cuda bûn
fgxo1ewtnkig8f9hq6agkry4ivgf55p
ھەڵوەراندن
0
269825
6532908
5878819
2026-09-19T09:49:59Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532908
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellwerandin
=== Lêker ===
{{lêker|ckb}}
# [[werandin]], [[weşandin]], [[vewerandin]], [[veweşandin]], pel / dindik / tov jê veqetandin / cuda kirin
lgocezfmvj4w2ifz9lf4hadikvevrm6
ھەڵوەشان
0
269826
6532909
5878820
2026-09-19T09:50:09Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532909
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellweşan
=== Lêker ===
{{lêker|ckb}}
# [[hilweşîn]], [[ruxîn]], [[têk çûn]], pûç bû
# [[verûşîn]], [[verûşan]], [[verûşiyan]], [[verûşihan]], (girêk / dirûn) [[vebûn]]
r7tgxwxfgcu1bu9gzcfmy4albpd1jty
ھەڵوەشاو
0
269828
6532910
5878822
2026-09-19T09:50:19Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532910
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellweşaw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hilweşî]], [[hilweşiyayî]], [[ruxî]], [[ruxiyayî]], [[têkçûyî]], [[pûçbûy]]
# [[verûşî]], [[verûşiyayî]]
ng0v79j7xzoxuqyydx9falprt0ax9ta
ھەڵوەشێنراو
0
269829
6532911
5878823
2026-09-19T09:50:29Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532911
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellweşênraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hilweşandî]], [[ruxandî]], [[têkbirî]], [[pûçkir]]
# [[verûşandî]], (girêk / dirûn) [[vekirî]]
crne1x7a22f4xnv2pn2dig6n3pux5f3
ھەڵووتن
0
269830
6532912
5878814
2026-09-19T09:50:39Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532912
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellwutin
=== Lêker ===
{{lêker|ckb}}
# [[pesinandin]], [[pesn dan]], [[metihandin]], [[meth kirin]]
4tg05trbcvthheoj88u00wajgy57bx4
ھەڵخەڵەتاندن
0
269832
6532913
5878717
2026-09-19T09:50:49Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532913
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellxelletandin
=== Lêker ===
{{lêker|ckb}}
# [[xapandin]], [[bi ser de birin]], lêb lê kirin, [[hîle lê kirin]], lêhb lê kirin, [[fêl lê kirin]]
adgosq4f9nw15deccshywn3emyo9qks
ھەڵخەڵەتێو
0
269834
6532914
5878719
2026-09-19T09:50:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532914
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellxelletêw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[xapînok]], [[lêbok]], [[lêhbok]], ya / yê xapan / hîleyan / lêban dike yan dikare bibe sedema wan
6i5uol9vzrc80xrhbnwur3jylbbt2da
ھەڵخلیسکان
0
269835
6532915
5878713
2026-09-19T09:51:09Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532915
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellxilîskan
=== Lêker ===
{{lêker|ckb}}
# [[hilisîn]], [[tehisîn]], [[şemitîn]], [[hulusîn]], [[xwişîn]], [[xijîn]], [[xuşîn]], [[xîj bûn]], [[xwiş bûn]], [[terrişîn]], [[şelipîn]], [[xijikîn]]
ow29hyj26nw6v9ozv0d5pstpj4zcl33
ھەڵخلیسکاندن
0
269836
6532916
5878714
2026-09-19T09:51:19Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532916
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellxilîskandin
=== Lêker ===
{{lêker|ckb}}
# [[hilisandin]], [[tehisandin]], [[şemitandin]], [[hulusandin]], [[xwişandin]], [[xijandin]], [[xuşandin]], [[xîj kirin]], [[xwiş kirin]], [[terrişandin]], [[şelipandin]], [[xijikandin]]
jzap56izrwyin2w3knrte700avvn2mw
ھەڵخستن
0
269838
6532917
5878712
2026-09-19T09:51:29Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532917
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellxistin
=== Lêker ===
{{lêker|ckb}}
# [[raxistin]], [[raêxistin]], (t cil bo ziwabûnê) bi ristê ve kirin, '':bi cî kirin; berdest kirin''
qeiqdbbzmg4uz2cfiz6hpcyh8akix6s
ھەڵزڵەپیو
0
269841
6532918
5878732
2026-09-19T09:51:39Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532918
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hellzillepîw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[pif]], [[pifî]], [[pifbûyî]], [[perçivî]], [[werimî]]
0abj3nay1gxgp6xrqxdkc1t0disnt7v
ھەماڵ
0
269843
6532919
5878841
2026-09-19T09:51:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532919
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hemall
=== Navdêr ===
{{navdêr|ckb}}
# [[hemal]], [[hilgir]], [[xizmetkar]], [[kedka]]
# [[karîte]], darên banên xaniyan xwe li ser digirin
dp17npdlhnuhwxaidu4blymhg9kmsk0
ھەمام
0
269844
6532920
5878842
2026-09-19T09:51:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532920
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hemam
=== Navdêr ===
{{navdêr|ckb}}
# [[hemam]], [[serşok]], [[germav]]
pi9dhy6xvtjeriicfrmvdq0c2stxvb6
ھەمایەڵ
0
269846
6532921
5878845
2026-09-19T09:52:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532921
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hemayell
=== Navdêr ===
{{navdêr|ckb}}
# [[nivişte]], [[niviştok]], [[hemaîlk]]
9yhxldwaj9noh2bfasllwggidggnx90
ھەمەلایەنە
0
269848
6532923
5878854
2026-09-19T09:52:19Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532923
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hemelayene
=== Rengdêr ===
{{rengdêr|ckb}}
# [[tevalî]], [[hemealî]], [[pirralî]], [[gelekalî]]
hiojv9tfe4ohznag0770c2qboolrfsc
ھەمیشە
0
269849
6532924
5878852
2026-09-19T09:52:29Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6532924
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hemîşe
=== Hoker ===
{{hoker|ckb}}
# [[herdem]], [[hergav]], [[hercar]], [[tim]], [[hertim]]
fhs00i46hbqqpgagyyl3bzfglgm3j7m
ھەمشین
0
269851
6532925
5878846
2026-09-19T09:52:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532925
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hemşîn
=== Navdêr ===
{{navdêr|ckb}}
# [[mijmije]], [[mişmiş]], [[qeysî]]
edwcy77r5d8iox4841z2loze2mttomh
ھەمووپرسی
0
269853
6532926
5878849
2026-09-19T09:52:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532926
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hemûpirsî
=== Navdêr ===
{{navdêr|ckb}}
# [[gelpirsî]], [[hemûpirsî]], [[referendum]]
iet40bf9dht9ybi23v4eeyeeuqgloxg
ھەموووانی
0
269854
6532927
5878850
2026-09-19T09:52:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532927
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hemûwanî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[gelemperî]], [[giştî]], tiştê / karê / malê hemûyan
s1du9qhosnckw79v5209u2x7rgo950m
ھەنار
0
269858
6532928
5878856
2026-09-19T09:53:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532928
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:henar
=== Navdêr ===
{{navdêr|ckb}}
# [[hinar]] (fêkiyek e)
6stvvkwinwwqqlzsio16iqinkcxhn48
ھەناردە
0
269859
6532929
5878857
2026-09-19T09:53:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532929
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:henarde
=== Navdêr ===
{{navdêr|ckb}}
# [[hinarde]], [[îxracat]], bo bazirganî eşya / mal ji welatekî birinek yek dî
iaijj7l47dsdrpfgml83aozp005zfzy
ھەناسەسارد
0
269862
6532930
5878859
2026-09-19T09:53:29Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532930
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:henasesard
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bextreş]], [[bêsiûd]], [[bênesîb]]
efhkv9lvrga3fhn0qptevsqzav4n8lx
ھەناسەوواری
0
269864
6532931
5878861
2026-09-19T09:53:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532931
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:henasewiwarî
=== Navdêr ===
{{navdêr|ckb}}
# [[bênçikî]], [[êlpikî]], [[astma]]
l1iau8gew57pc574n6wq1h8pbpqjrav
ھەند
0
269867
6532932
5878863
2026-09-19T09:53:49Z
JiyanBot
3048
Cure Cînav hat lêzêdekirin
6532932
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hend
=== Cînav ===
{{cînav|ckb}}
# [[hin]], [[hinek]], [[hindek]], [[çend]] (lib / heb û hwd)
jjgmmk2n5ynonuxh399qw5uhvkxpu0o
ھەنداز
0
269868
6532933
5878864
2026-09-19T09:53:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532933
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hendaz
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hendaz]], [[birêk]], [[birêkûpêk]], [[rêzkirî]], [[birêz]], [[sererast]], [[sîstematîk]]
snipq9o8sj55vfjb5xp1dfd3deu7ygy
ھەندە
0
269869
6532934
5878865
2026-09-19T09:54:09Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6532934
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hende
=== Hoker ===
{{hoker|ckb}}
# [[hindî]], [[bi qasî]], [[temetî]], bi temet
cjw9p1anmcsc22klckxbmshmso4ovs2
ھەندەر
0
269870
6532935
5878866
2026-09-19T09:54:19Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6532935
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hender
=== Hoker ===
{{hoker|ckb}}
# [[der]], [[derve]]
=== Dijmane ===
* [[hindir]]
7fk3yv649qc22m2dh0s6k7afizqe6gy
ھەندەران
0
269871
6532936
5878867
2026-09-19T09:54:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532936
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:henderan
=== Navdêr ===
{{navdêr|ckb}}
# derveyî welat, [[biyanistan]], [[dûrî]], [[xerîbî]]
hfd39mdreblbfk3r0g4l5xdunbg1qis
ھەندەرھۆ
0
269872
6532937
5878868
2026-09-19T09:54:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532937
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:henderho
=== Navdêr ===
{{navdêr|ckb}}
# [[hêsk]], [[colank]]
82ls24bs28hn255ovb6nfc6oc1tcet5
ھەنەزا
0
269873
6532938
5878881
2026-09-19T09:54:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532938
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:heneza
=== Navdêr ===
{{navdêr|ckb}}
# [[nevis]], zarokên mêrê / jina yekî yên ji jinek / mêrek dî
fplgst2ikz3h94hjfo8mv5pmj2lmf92
ھەنگامە
0
269875
6532939
5878872
2026-09-19T09:54:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532939
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hengame
=== Navdêr ===
{{navdêr|ckb}}
# [[tevlihevî]], [[serobinî]]
1no55w43vhiv03jkgmcegwjrc9utfqz
ھەنگاو
0
269876
6532940
5878873
2026-09-19T09:55:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532940
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hengaw
=== Navdêr ===
{{navdêr|ckb}}
# [[gav]], pêngav
# [[dem]], [[gav]], [[wext]], [[heyam]]
n359592zplx7rt5i5bvpyswi8luuxnf
ھەنگڵ
0
269879
6532941
5878876
2026-09-19T09:55:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532941
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hengill
=== Navdêr ===
{{navdêr|ckb}}
# [[ran]], [[qalçe]], [[newq]], [[hengil]]
sx8oh90crj4szo8a0v0yxlr7ptsjd69
ھەنوون
0
269883
6532942
5878880
2026-09-19T09:55:29Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532942
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:henûn
=== Lêker ===
{{lêker|ckb}}
# [[sûn]], [[hesûn]], [[hilû kirin]]
rkzhd2vdh0n44ougl338yeplxr4gyo2
ھەپەساندن
0
269885
6532943
5878534
2026-09-19T09:55:39Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6532943
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hepesandin
=== Lêker ===
{{lêker|ckb}}
# [[heyirandin]], [[mat kirin]], [[ecêbgirtî kirin]], [[hêbitandin]]
rdd17w5wzzen29p6bezzxkoktwbm60w
ھەپەساو
0
269886
6532944
5878535
2026-09-19T09:55:49Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532944
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hepesaw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[heyirî]], [[mat]], [[matmayî]], [[ecêbgirtî]], [[hêbitî]]
b71zf7z7yxe5gysyhsalmt1mptyvjn7
ھەپین
0
269887
6532945
5878532
2026-09-19T09:55:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532945
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hepîn
=== Navdêr ===
{{navdêr|ckb}}
# [[hewîn]], [[rewîn]], [[reyîn]] (dengkirina se / kûçik yan wek wan)
9znjiwtnc2engooqs8dsm9tbmcofn2w
ھەپس
0
269889
6532946
5878529
2026-09-19T09:56:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532946
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:heps
=== Navdêr ===
{{navdêr|ckb}}
# [[hefs]], [[zindan]], [[dîlî]], [[êsîrî]], [[êxsîrî]], [[heps]]
lbnxg2cfidcej61upnb75ut2o3q7eqf
ھەپسخانە
0
269890
6532947
5878530
2026-09-19T09:56:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532947
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hepsxane
=== Navdêr ===
{{navdêr|ckb}}
# [[hefsxane]], [[zindan]], [[girtîxane]], [[girtîgeh]], [[dîlxane]], [[êsîrxane]]
oyec9aew0s6kjvseqfhnvsc2ot9uzeq
ھەقانی
0
269892
6532948
5878640
2026-09-19T09:56:29Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532948
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:heqanî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[adil]], [[dadperwer]], [[rastgo]]
nar25e7knayjtxsdydsn6husv7qyq7a
ھەقایەت
0
269893
6532949
5878641
2026-09-19T09:56:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532949
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:heqayet
=== Navdêr ===
{{navdêr|ckb}}
# [[çîrok]], [[heqayet]]
toldgd42t6mritm087h1lpc4974p3j2
ھەگبە
0
269894
6532950
5878644
2026-09-19T09:56:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532950
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hegbe
=== Navdêr ===
{{navdêr|ckb}}
# [[tûr]], [[kîs]], [[çante]], [[tûrik]], [[telîs]], [[torbe]], [[çewal]]
lxfbf92028txp64jcdbpkc6r8ucxph6
ھەقدەست
0
269895
6532951
5878642
2026-09-19T09:56:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532951
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:heqdest
=== Navdêr ===
{{navdêr|ckb}}
# [[heqdest]], [[destmiz]], [[meaş]]
4cnul13z7ja667nsfwxdyedccmddhhn
ھەڕا
0
269896
6532952
6433459
2026-09-19T09:57:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532952
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:herra
=== Navdêr ===
{{navdêr|ckb}}
# [[rev]], [[bazdan]], [[bez]]
==== Anagram ====
* {{anagram|ckb|a=اڕھە|ھاڕە}}
0oh4tobfe2s4u6ilbtz3wm7mlx20tr7
ھەراج
0
269897
6532953
5878552
2026-09-19T09:57:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532953
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:herac
=== Navdêr ===
{{navdêr|ckb}}
# [[herac]], [[mezat]], [[mazat]], bazara pitirandinê ya tê de mal dikeve destê kesa/ê herî zêde pare pê bide
clrm0kql7bt0i3scit3owv8qj4kilo0
ھەرام
0
269898
6532954
5878555
2026-09-19T09:57:29Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532954
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:heram
=== Rengdêr ===
{{rengdêr|ckb}}
# [[heram]], [[qedexe]], [[yasax]], tişta nabe bêt kirin (t ya ji alî dînî ve hatiye qedexekirin)
5tmnnrfy955qe6nkgxtudxpg5pspjuk
ھەرامە
0
269899
6532955
5878557
2026-09-19T09:57:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532955
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:herame
=== Navdêr ===
{{navdêr|ckb}}
# [[ewk]], [[ewka]], [[ewkê]], [[ ew-a-dî]], [[ ew-ê-dî]], [[çîk]], [[çîkê]], [[çîka]]
7ulll0kqf1hl3gj4igrbsafa289d5mf
ھەرامخۆر
0
269900
6532956
5878556
2026-09-19T09:57:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532956
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:heramxor
=== Navdêr ===
{{navdêr|ckb}}
# [[heramxwer]], [[bertîlxwer]], [[rantxwer]], kesa/ê malê ne yê wê / wî bi xwe ye dixwe / bi kar tîne bêyî destûr hebe, '':kesa/ê tiştên dîn heram kirine dixwe (bo nimûne: misilmanên goştê beraz bixwin)''
t0m9ajxyxm68cdgiqdril8jensu98g5
ھەراسان
0
269902
6532957
5878554
2026-09-19T09:57:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532957
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:herasan
=== Rengdêr ===
{{rengdêr|ckb}}
# [[tengezar]], [[nerehet]], [[bêçare]], [[bêzar]], [[bînteng]]
2jm26vtsdu4cige0dxjpmo4qsp7t8g0
ھەرجایی
0
269903
6532958
5878558
2026-09-19T09:58:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532958
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hercayî
=== Navdêr ===
{{navdêr|ckb}}
# [[binefş]], [[gulbinefş]]
m5kdg9c2kvz16tabgyij6bp4116ihpj
ھەردوو
0
269907
6532959
6433489
2026-09-19T09:58:19Z
JiyanBot
3048
Cure Cînav hat lêzêdekirin
6532959
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:herdû
=== Cînav ===
{{cînav|ckb}}
# [[herdu]]
==== Anagram ====
* {{anagram|ckb|a=درووھە|ھووردە}}
jvnrh6se0i1r3xo3mmnxl57a5rtvzuo
ھەڕەمە
0
269910
6532960
5878590
2026-09-19T09:58:29Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532960
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:herreme
=== Rengdêr ===
{{rengdêr|ckb}}
# [[tevlihev]], [[têkil]], [[serûbin]], [[bêserûber]]
lymfbs1ukav00ljhglze5xn01gbbiwk
ھەرەس
0
269911
6532961
5878587
2026-09-19T09:58:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532961
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:heres
=== Navdêr ===
{{navdêr|ckb}}
# [[1]], [[aşût]], [[aşît]], [[berfxwişî]], [[axxwişî]], dahatina axê / berfê ji erdek bilind berev yek nizm, [[lehî]], rabûna avê, boşûna avê; şirrebaran, barana boş 2 hilweşîn, [[ruxîn]], [[pûçbûn]]
maaxinxag354bzi61fvoy9foeik7v2q
ھەڕەشە
0
269912
6532962
5878588
2026-09-19T09:58:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532962
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hereşe
=== Navdêr ===
{{navdêr|ckb}}
# [[gef]], [[tehdîd]], [[hereşe]], [[lêxwirrîn]]
c7zd860z79ckvqwifadop3aqw33tau8
ھەرەوەز
0
269913
6532963
5878591
2026-09-19T09:58:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532963
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:herewez
=== Navdêr ===
{{navdêr|ckb}}
# [[hevkar]], [[xizmetkar]]
nzuw244g54mtn2f9mfmsmn7srqdnx2c
ھەرێم
0
269914
6532964
6433499
2026-09-19T09:59:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532964
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:herêm
=== Navdêr ===
{{navdêr|ckb}}
# [[herêm]], [[navçe]], [[dever]], [[cih]], [[war]]
==== Anagram ====
* {{anagram|ckb|a=رمھێە|ھەرمێ}}
0ibaqvkgluihiy0m452bpm6j82efz3f
ھەرێمی
0
269915
6532965
5878585
2026-09-19T09:59:19Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532965
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:herêmî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[herêmî]], [[navçeyî]], [[deverkî]] (ya / yê ne hemû netewe / welat / dinyayê)
favj6kn1j839n25thvdh92aqnq8jea5
ھەرێز
0
269916
6532966
5878582
2026-09-19T09:59:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532966
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:herêz
=== Navdêr ===
{{navdêr|ckb}}
# [[firîz]], [[giya]], [[gîha]] (t yê mêrg û çayir û çîmenan)
6za8ab10xgos8d9hauejllgzmkko7pz
ھەرگینە
0
269918
6532967
5878577
2026-09-19T09:59:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532967
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hergîne
=== Navdêr ===
{{navdêr|ckb}}
# [[cerrûmerr]], [[keramîk]]
slmtaebvzrp5kk93ni7fkelbcs7tlgu
ھەرگیز
0
269919
6532968
5878575
2026-09-19T09:59:49Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6532968
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hergîz
=== Hoker ===
{{hoker|ckb}}
# [[qet]], [[hîç]], [[ti car]], [[çi car]], [[qe]]
ealfbllus8ebjn5kwq9clyywv4hpfwd
ھەرلە
0
269922
6532969
5878578
2026-09-19T09:59:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532969
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:herle
=== Navdêr ===
{{navdêr|ckb}}
# [[kêz]], [[kêzik]]
i2j39n0s28g7r73ktwtrf5c85r28793
ھەرمێپشکوان
0
269923
6532970
5878579
2026-09-19T10:00:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532970
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hermêpişkiwan
=== Navdêr ===
{{navdêr|ckb}}
# [[berbihar]], dema pişkivîna hirmiyan
fls9a6ocvhfrnotwq41su65mg6cul6k
ھەروا
0
269924
6532971
6433512
2026-09-19T10:00:19Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6532971
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:herwa
=== Hoker ===
{{hoker|ckb}}
# [[herwa]], [[herwiha]], [[herwisa]]
==== Anagram ====
* {{anagram|ckb|a=اروھە|ھەوار}}
3njyjewjymrle8b5d3vkyhwokby4oq4
ھەرزاڵە
0
269925
6532972
5878563
2026-09-19T10:00:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532972
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:herzalle
=== Navdêr ===
{{navdêr|ckb}}
# [[bingeh]], [[esas]]
b9rf4u51n3opgs80n7s4s732oybsvqp
ھەرزان
0
269926
6532973
5878564
2026-09-19T10:00:39Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532973
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:herzan
=== Rengdêr ===
{{rengdêr|ckb}}
# [[erzan]], [[negiran]], [[bihakêm]], [[djw]], [[giran]], [[bihadar]], [[bihagiran]]
3tohtz0i3oty9n1mglg3rty38xfs78f
ھەرزانی
0
269927
6532975
5878566
2026-09-19T10:00:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532975
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:herzanî
=== Navdêr ===
{{navdêr|ckb}}
# [[erzanî]], [[negiranî]], [[bihakêmî]]
bkqe49br63kkye2hme42iqcpv6opb55
ھەرزەچەنە
0
269930
6532976
5878569
2026-09-19T10:00:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532976
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:herzeçene
=== Rengdêr ===
{{rengdêr|ckb}}
# [[devjen]], [[lewçe]], [[zêdebêj]]
agm4uz95i0rk9uvcvao5fqnrkyemny6
ھەرزەکارانە
0
269932
6532977
5878571
2026-09-19T10:01:09Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532977
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:herzekarane
=== Rengdêr ===
{{rengdêr|ckb}}
# [[cahilane]], [[ciwanane]], [[xortane]], karê ne mîna kesên gihayî û aqildar, [[tûlane]], [[tolazane]], [[felîtane]], karê kesên pûç û nehêja
6c4zhd8p6vmwk95ociactipgpoz1pmv
ھەرزەیی
0
269934
6532978
5878573
2026-09-19T10:01:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532978
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:herzeyî
=== Navdêr ===
{{navdêr|ckb}}
# [[ciwanî]], [[xortî]], [[gencî]], [[cehêlî]]
2924k89idkyzvamohychyesxndmh27o
ھەسار
0
269936
6532979
6433483
2026-09-19T10:01:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532979
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hesar
=== Navdêr ===
{{navdêr|ckb}}
# [[hesar]], [[kelhe]], [[dîwar]], [[dorbend]]
==== Anagram ====
* {{anagram|ckb|a=ارسھە|ھەراس}}
hl28a904pd665jf8mls8cef1bd9ath1
ھەسیر
0
269938
6532980
5878620
2026-09-19T10:01:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532980
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hesîr
=== Navdêr ===
{{navdêr|ckb}}
# [[hêsîl]], [[mafûr]], [[xalîçe]], [[berik]]
ik3ak2ck3nmisnouvwapackbpktg7ya
ھەستبەر
0
269940
6532981
5878612
2026-09-19T10:01:49Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532981
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hestber
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hestber]], [[bihest]], [[hesas]], [[nazdar]]
lkhbmakc5dmam6tydq0sdxvsap2npkr
ھەستبەری
0
269941
6532982
5878613
2026-09-19T10:01:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532982
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hestberî
=== Navdêr ===
{{navdêr|ckb}}
# [[hestberî]], [[bihestî]], [[hesasî]], [[nazdarî]]
mqmg3v97l913artpnso4b9k5qdwubor
ھەستەوەری
0
269944
6532983
5878619
2026-09-19T10:02:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532983
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hestewerî
=== Navdêr ===
{{navdêr|ckb}}
# [[hestewerî]], [[hesasî]], [[alerjî]]
d2r3vzumsxu25wdcoh9nh1ase6eei3w
ھەستری
0
269945
6532984
5878614
2026-09-19T10:02:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532984
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hestirî
=== Navdêr ===
{{navdêr|ckb}}
# [[strî]], giyayên tûj
t50xm70bnxk17iqkhi6briufodwz0xa
ھەستیار
0
269946
6532985
5878615
2026-09-19T10:02:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532985
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hestyar
=== Navdêr ===
{{navdêr|ckb}}
# [[hestyar]], kesa/ê dikare (bi asanî) hest bi tiştan bike / pê bihese
2soef47dtclkx6tnx2ac6t5xazulf0r
ھەستیاری
0
269947
6532986
5878616
2026-09-19T10:02:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532986
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hestyarî
=== Navdêr ===
{{navdêr|ckb}}
# [[hestyarî]], (bi asanî) hestkirina bi tiştan, [[pêhesîn]]
qezego83edhclah321i2y0afhcwrkuf
ھەشار
0
269949
6532987
5878623
2026-09-19T10:02:49Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532987
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:heşar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[veşarî]], [[veşartin]], [[berşar]]
qv5jv0hqn85q9gvegdlwum1kz9rmgkj
ھەشاردراو
0
269950
6532989
5878624
2026-09-19T10:02:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532989
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:heşardiraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[veşartî]], (li cihekî) wa bicîkirî ku (bi asanî) neyêt dîtin
hcw11y2ukvmamlpq1q8hhopqr963e28
ھەشبەسەر
0
269951
6532990
5878625
2026-09-19T10:03:09Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532990
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:heşbeser
=== Rengdêr ===
{{rengdêr|ckb}}
# [[heşbiser]], [[xwelîbiser]], [[bêsiûd]]
689k0kav1ztqj861of1rll1yulhx15c
ھەشھەش
0
269953
6532991
5878630
2026-09-19T10:03:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532991
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:heşheş
=== Navdêr ===
{{navdêr|ckb}}
# [[pasevan]], [[çavdêr]], [[zêrevan]], [[heres]], [[dergevan]]
35t178vlm7yluy91isdn9nvd48q0kte
ھەشتالوو
0
269956
6532992
5878628
2026-09-19T10:03:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532992
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:heştalû
=== Navdêr ===
{{navdêr|ckb}}
# [[xox]], bn qox
arfxzqtvypp1vnazg8z9q26340phjqm
ھەشتیەک
0
269957
6532993
5878629
2026-09-19T10:03:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532993
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:heştyek
=== Navdêr ===
{{navdêr|ckb}}
# [[heştyek]], [[heştêk]], yek ji heştan, [[ 1/8]]
ge93n6ab7rlvji7rnql2xbdwfwre4zk
ھەتا
0
269958
6532994
5878536
2026-09-19T10:03:49Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6532994
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:heta
=== Hoker ===
{{hoker|ckb}}
# [[1]], [[heta]], [[ta]], [[heya]], heyanî 2, [[daku]], [[bo ku]], [[ji bo ku]], [[da]]: Hatim heta pêt billêm Hatim daku bibêjim te, Hatim ji bo ku ji te re bibêjim 3, [[hê]], [[hêj]], [[hêşta]], hê ku: Zû ke heta nemirdûwît şitêk bike Zû be hê nemirî tiştekî bike
a2pqf0uvcm8kukrnnsdy9jb9eg3ggor
ھەتاو
0
269961
6532995
5878541
2026-09-19T10:03:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532995
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hetaw
=== Navdêr ===
{{navdêr|ckb}}
# [[tav]], [[hetav]], [[roj]]
1tw7w9re2o5dnchlkw0ag5kv69refsp
ھەتھەتۆکە
0
269962
6532996
5878543
2026-09-19T10:04:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532996
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hethetoke
=== Navdêr ===
{{navdêr|ckb}}
# [[niviştok]], hemaîlk (t yên bi stoyê zarokan ve tên kirin)
r26hpax3lycuu44zh2th4dveke8af2m
ھەتیو
0
269963
6532997
5878545
2026-09-19T10:04:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532997
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hetîw
=== Navdêr ===
{{navdêr|ckb}}
# [[sêwî]], [[êtîm]], [[bavmirî]], [[daymirî]], kesa/ê herdu dêbavên wê / wî yan yek ji herduyan mirine, '':(m) xwelîbiser, [[ rezîl'']]
oggn07k7dipkwk8cz8lscelqowq623g
ھەتیوخانە
0
269965
6532998
5878547
2026-09-19T10:04:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6532998
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hetîwxane
=== Navdêr ===
{{navdêr|ckb}}
# [[sêwîxane]], xaniyê / lêgeha sêwiyan / êtîman
3bt3t2x1xj6wbfy5lkmxwomae46vhdq
ھەترە
0
269966
6532999
5878542
2026-09-19T10:04:39Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6532999
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hetre
=== Rengdêr ===
{{rengdêr|ckb}}
# [[pelate]], [[belav]]
py5wy0216zb8aazwmg8eh9432qi1xw4
ھەتوان
0
269967
6533000
5878544
2026-09-19T10:04:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533000
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hetwan
=== Navdêr ===
{{navdêr|ckb}}
# [[melhem]], [[milhem]]
jkb2ocamjn3s1a00toemx5s758p4bgw
ھەڤاڵ
0
269968
6533001
5878637
2026-09-19T10:04:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533001
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hevall
=== Navdêr ===
{{navdêr|ckb}}
# [[heval]], [[hawrrê]]
h9g90zhjvkisvjlgjlakbqo97mbp58i
ھەواڵگوزاری
0
269973
6533002
5878886
2026-09-19T10:05:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533002
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hewallguzarî
=== Navdêr ===
{{navdêr|ckb}}
# [[agastînî]], [[îstîxbarat]]
go9vjiuowh8spcmbkkbxv5gvz25min0
ھەواندنەوە
0
269974
6533003
5878889
2026-09-19T10:05:19Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533003
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hewandinewe
=== Lêker ===
{{lêker|ckb}}
# [[vehewandin]], [[xwedî kirin]], [[xudan kirin]], matî jê kirin, sereguhiya yekî kirin
5u6mi37n4cqyga7f5bwj6ftvg2fii3n
ھەوانەوە
0
269975
6533004
5878890
2026-09-19T10:05:29Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533004
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hewanewe
=== Lêker ===
{{lêker|ckb}}
# [[vehewîn]], [[tebitîn]], [[hedinîn]], [[sekinîn]], [[rehet bûn]], [[rawestîn]], li cihê xwe man
i1gdgxdsqhtheuks03j0i7jtrd1oyjd
ھەوار
0
269976
6533005
6433510
2026-09-19T10:05:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533005
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hewar
=== Navdêr ===
{{navdêr|ckb}}
# [[war]], [[kamp]], [[lêmangeh]], [[havîngeh]], cihê havînan koçer yan seyranî lê dijîn
==== Anagram ====
* {{anagram|ckb|a=اروھە|ھەروا}}
ewey08qtv51lw170f56vz8b61z2gxms
ھەوارگە
0
269977
6533006
5878884
2026-09-19T10:05:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533006
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hewarge
=== Navdêr ===
{{navdêr|ckb}}
# [[wargeh]], [[havîngeh]], [[kamp]], [[aqar]], [[kûngeh]], [[kongeh]]
ipailpos1hfu7mim8scz260acocbmju
ھەواری
0
269978
6533007
5878885
2026-09-19T10:05:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533007
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hewarî
=== Navdêr ===
{{navdêr|ckb}}
# [[kûn]], [[kon]], [[xîvet]], [[çadir]]
84b86frnh2spgi8rx3eelhbbymj83hh
ھەوجاڕ
0
269980
6533008
5878896
2026-09-19T10:06:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533008
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hewcarr
=== Navdêr ===
{{navdêr|ckb}}
# [[hevcar]], [[gasin]]
rb34udnkdip9g3eh5khx6tt6xsoiib7
ھەوجۆش
0
269981
6533009
5878897
2026-09-19T10:06:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533009
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hewcoş
=== Navdêr ===
{{navdêr|ckb}}
# asinê / hesinê heland
# [[mesîn]], [[misînk]]
j6zgiow2y1see5xs22id4gfnemupq3f
ھەودا
0
269982
6533010
5878898
2026-09-19T10:06:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533010
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hewda
=== Navdêr ===
{{navdêr|ckb}}
# [[ben]], [[dezî]], [[benik]], [[rîs]], [[ta]]
1h4l8bi9jyt59g3ls019eh2m78iq4lh
ھەوەڵ
0
269983
6533011
5878913
2026-09-19T10:06:39Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533011
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hewell
=== Rengdêr ===
{{rengdêr|ckb}}
# [[pêşîn]], [[ewil]], [[yekem]]
g2dyimpifypl1k71jp5oddmzf50f78j
ھەوەس
0
269984
6533012
5878912
2026-09-19T10:06:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533012
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hewes
=== Navdêr ===
{{navdêr|ckb}}
# [[hewes]], [[daxwaz]], [[arezû]], [[hêvî]], [[çêj]], [[tam]], xwestina tiştekî pirr / ji dil
i61qzafu1bqi2y7wu68nwoxj8tds5qu
ھەوێن
0
269986
6533013
5878910
2026-09-19T10:06:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533013
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hewên
=== Navdêr ===
{{navdêr|ckb}}
# [[hêvên]], [[haveyn]], dermankek e dikin nav hevîr daku hevîr pê pif bibe û kêrî pehtina nan bêt
hij9eyamyn637456earpgeyhxamtehf
ھەویر
0
269988
6533014
5878909
2026-09-19T10:07:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533014
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hewîr
=== Navdêr ===
{{navdêr|ckb}}
# [[hevîr]], [[hêvîr]], ar û av û hêvênê têkilî hev hatine kirin daku nan jê bêt çêkirin
3r3cis9a7hdxv7a5d9ueil4m2xmmi8f
ھەوراز
0
269990
6533015
5878899
2026-09-19T10:07:19Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6533015
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hewraz
=== Hoker ===
{{hoker|ckb}}
# [[evraz]], [[berjor]]
qlsl03dm1900u3bcy7s5y4tb48x7avq
ھەورەباڵا
0
269991
6533016
5878902
2026-09-19T10:07:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533016
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hewreballa
=== Navdêr ===
{{navdêr|ckb}}
# [[balexane]], avahiyên bilindiya wan digihe ber ewran
pohytyal7ys74721rvt2t4561honber
ھەورەتریشقە
0
269992
6533017
5878903
2026-09-19T10:07:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533017
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hewretirîşqe
=== Navdêr ===
{{navdêr|ckb}}
# [[birûsk]], şirqîna ewran
s5pe44mvjg33y7snjuavqeycrarekg2
ھەوریس
0
269993
6533018
5878901
2026-09-19T10:07:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533018
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hewrîs
=== Navdêr ===
{{navdêr|ckb}}
# (dara) [[qaç]], [[hevriz]], [[hêvriz]], [[merx]], dara kêmê
sqexifs8bqlm05jdx9dhajseken78x5
ھەوسار
0
269994
6533019
6433473
2026-09-19T10:07:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533019
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hewsar
=== Navdêr ===
{{navdêr|ckb}}
# [[hefsar]], [[hevsar]], benê bi serê hespan / keran û hwd tê ve tê girêdan daku pê bên kişandin yan zeft kirin, '':alava serkêşiyê / serkêşîpêkirinê''
==== Anagram ====
* {{anagram|ckb|a=ارسوھە|ھاوسەر}}
lwh1ffus5k5s93voomc33rbj6s9ku1g
ھەوسەڵە
0
269995
6533020
5878907
2026-09-19T10:08:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533020
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hewselle
=== Navdêr ===
{{navdêr|ckb}}
# [[bênfireyî]], [[sebr]], [[taqet]], [[xwegirî]], [[baldirêjî]]
97x2s7ydaxq4c5ijw9jziywkv1tgqnn
ھەوتیر
0
269999
6533021
5878893
2026-09-19T10:08:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533021
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hewtîr
=== Navdêr ===
{{navdêr|ckb}}
# [[demance]] (ya heftlibxwer)
32wfad7glueb66t0lb2hw68fk5e0ff8
ھەوز
0
270000
6533022
5878904
2026-09-19T10:08:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533022
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hewz
=== Navdêr ===
{{navdêr|ckb}}
# [[hewz]], [[birk]], birka avê
o7dkbe04rncas6ttirwnvkq33blqczq
ھەیران
0
270007
6533023
5878917
2026-09-19T10:08:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533023
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:heyran
=== Navdêr ===
{{navdêr|ckb}}
# [[heyran]], [[gorî]], [[qurban]], kesa/ê wa pirr ji tiştekî / kesekî hez dike ku dikare xwe jê re bike gorî / qurba
# [[heyranok]], [[heyran]], birrek stranên kurdî ye
jgp98htgv568qlpwmswc8a0fuky0dlm
ھەیشۆ
0
270010
6533024
5878922
2026-09-19T10:08:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533024
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:heyşo
=== Navdêr ===
{{navdêr|ckb}}
# [[fehêt]], [[fedî]], [[şerm]], [[eyb]]
bt5oiawqu62wjhm6rsndqzxk47mhwjz
ھەیتە
0
270011
6533025
5878916
2026-09-19T10:08:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533025
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:heyte
=== Rengdêr ===
{{rengdêr|ckb}}
# [[nesefandî]], [[venebijart]]
# [[polî]]
# komek leşkerên osmanî
limcrimspcp2pb6u40al9nduj87vjii
ھەیوانان
0
270013
6533026
5878927
2026-09-19T10:09:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533026
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:heywanan
=== Navdêr ===
{{navdêr|ckb}}
# [[havîn]], dema mirov dikare li eywanan binive (ji derengî biharê ta berpayizê)
t01q3xhnn18btqrbftnszg2hmro34yl
ھەیزەران
0
270015
6533027
5878918
2026-09-19T10:09:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533027
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:heyzeran
=== Navdêr ===
{{navdêr|ckb}}
# [[heyzeran]], [[rûl]], [[qamûş]]
hmb8oxy7m4idmilrdhe5pcodpxl60xx
ھەز
0
270016
6533028
5878592
2026-09-19T10:09:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533028
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hez
=== Navdêr ===
{{navdêr|ckb}}
# [[hez]], [[viyan]], [[xwestin]], [[evîn]], [[hêvî]], [[daxwaz]]
p474vmskedlfl5of7y6rgww027aq486
ھەزارە
0
270018
6533029
5878596
2026-09-19T10:09:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533029
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hezare
=== Navdêr ===
{{navdêr|ckb}}
# [[hezarsal]], [[hezare]], [[mîlenyûm]]
0cvir2ta9ct805digea1iytp55xtebo
ھەزبێلە
0
270020
6533030
5878597
2026-09-19T10:09:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533030
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hezbêle
=== Navdêr ===
{{navdêr|ckb}}
# [[giyaderman]], [[davûderman]], giyayên wek derman tên bikaranîn
psdabp6zlhbioyjeeam5lfmru739lnq
ھێدز
0
270024
6533031
5878470
2026-09-19T10:09:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533031
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hêdiz
=== Rengdêr ===
{{rengdêr|ckb}}
# [[aciz]]
co5rsq79ffcb00q5tp756hrgmc21jp0
ھێل
0
270026
6533032
5878491
2026-09-19T10:10:09Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6533032
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hêl
=== Hoker ===
{{hoker|ckb}}
# [[hêl]], [[qaqûle]]
525cvnsuhx64uv02pu9np6hm3kgcjoz
ھێڵان
0
270028
6533033
5878494
2026-09-19T10:10:19Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533033
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hêllan
=== Lêker ===
{{lêker|ckb}}
# [[hêlan]], [[hêliştin]], [[rê dan]], [[hiştin]]
ddtctqmppdyz2qw7xx6oli7l3au9u7q
ھێلانە
0
270029
6533034
5878496
2026-09-19T10:10:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533034
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hêlane
=== Navdêr ===
{{navdêr|ckb}}
# [[hêlîn]], cihê firrinde hêkên xwe tê de diparêzin
pikwgtzimw9pktg2r8nuik31bo2pwc1
ھێلم
0
270030
6533035
5878502
2026-09-19T10:10:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533035
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hêlim
=== Navdêr ===
{{navdêr|ckb}}
# [[zeliqek]], [[çirrek]], [[demûş]], [[debûş]], [[lehîm]], [[girek]]
3bgb6osqnmg4lm6jnyzh4j6hqn8os1q
ھێلز
0
270032
6533036
5878497
2026-09-19T10:10:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533036
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hêliz
=== Navdêr ===
{{navdêr|ckb}}
# [[heliz]] (navê giyayekê ye)
h7yycn71lkhp3jb18w1vs5f5ifnty2s
ھێڵکاری
0
270033
6533037
5878498
2026-09-19T10:10:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533037
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hêllkarî
=== Navdêr ===
{{navdêr|ckb}}
# [[grafîk]], [[xetkarî]], [[hêlkarî]]
p9ybpyngzeuuzar5ux0jww4jr9d8hkf
ھێلکە
0
270034
6533038
5878499
2026-09-19T10:11:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533038
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hêlke
=== Navdêr ===
{{navdêr|ckb}}
# [[hêk]], '': (hî masiyan) xerz, xirz; (gun) [[hêlik]], [[gun]], [[ ritil'']]
7ii1zi8o6ki5bwl5nerhtryxuq2in3i
ھێلکەورۆن
0
270035
6533039
5878500
2026-09-19T10:11:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533039
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hêlkewron
=== Navdêr ===
{{navdêr|ckb}}
# [[hêkrûn]]
rua432kg4yu8998ju9k55jby0frnf30
ھێلکەیی
0
270036
6533040
5878501
2026-09-19T10:11:29Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533040
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hêlkeyî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hêkî]], (tişta dirûvê / şikilê wê) mîna hêkê
dv5zrngag8asl87kmmjwixw2oqv83jq
ھێمن
0
270038
6533041
5878507
2026-09-19T10:11:39Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533041
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hêmin
=== Rengdêr ===
{{rengdêr|ckb}}
# [[aram]], [[rehet]], [[nerm]], [[hêdî]]
avqf7q1flindj434t3melj8u1qn1tzy
ھێمنی
0
270039
6533042
5878508
2026-09-19T10:11:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533042
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hêminî
=== Navdêr ===
{{navdêr|ckb}}
# [[aramî]], [[rehetî]], [[nermî]], [[hêdîkî]]
tq1mlne6confxgpxpoieohd1n477z8j
ھێنان
0
270040
6533043
5878510
2026-09-19T10:11:59Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533043
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hênan
=== Lêker ===
{{lêker|ckb}}
# [[anîn]], [[înan]], [[hînan]]
41hd29d64hlwstftqrz1kk9k4qze5we
ھێرۆ
0
270043
6533046
5878474
2026-09-19T10:12:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533046
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hêro
=== Navdêr ===
{{navdêr|ckb}}
# [[hêro]] (navê gulekê ye)
5gvue0er63e8ndnksdr260wedu6oz8m
ھێوەر
0
270044
6533047
5878520
2026-09-19T10:12:19Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533047
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hêwer
=== Rengdêr ===
{{rengdêr|ckb}}
# [[tî]], birayê mêrê kesekê
6d1s6h825g9ma714yilsc70wcnq6022
ھێشتن
0
270046
6533048
5878487
2026-09-19T10:12:29Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533048
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hêştin
=== Lêker ===
{{lêker|ckb}}
# [[hêlan]], [[hêliştin]], [[rê dan]], [[hiştin]]
6mm8rk70ztymks4nrxn19fulpxzo4ab
ھێشوو
0
270047
6533050
5878489
2026-09-19T10:12:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533050
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hêşû
=== Navdêr ===
{{navdêr|ckb}}
# [[wîşî]], [[guşî]] (yê tirî / xurmeyê)
9y42cnst9uifrha35c8tzvkkjrsv0mk
ھێشخان
0
270048
6533051
5878488
2026-09-19T10:12:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533051
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hêşxan
=== Navdêr ===
{{navdêr|ckb}}
# [[aşxane]], odeya xwiraka malê tê ve têt parastin
r19swq9b6luvoth0zt3g7ecmyxsv1uw
ھێواش
0
270049
6533053
5878514
2026-09-19T10:12:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533053
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hêwaş
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hêdî]] (tişta / mirovê pêdivî bi demek dirêj heye ta ku biqewime / bibe / bike)
# [[ hêdî]], [[rehet]], [[aram]], [[ tena]]
=== Dijmane ===
* [[zû]]
* [[bilez]]
* [[lezgîn]]
* [[pît]]
* [[hêl]]
4n0bx2c0pw73gtba0e38yqrqku9tfaf
ھێواشی
0
270050
6533054
5878516
2026-09-19T10:13:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533054
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hêwaşî
=== Navdêr ===
{{navdêr|ckb}}
# [[hêdîtî]], [[rehetî]], [[tenahî]], [[aramî]]
5ny7dqtzv6fp0qjta8dd58nuy361nq5
ھێواشکار
0
270051
6533055
5878515
2026-09-19T10:13:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533055
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hêwaşkar
=== Navdêr ===
{{navdêr|ckb}}
#(mirova/ê yan tiştê - t dermanê -) hêdîker, [[tenaker]], [[rehetker]], [[aramker]]
peyhunr7e4b6p3rzrrb5g7sx41hifpm
ھێور
0
270054
6533057
5878517
2026-09-19T10:13:29Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533057
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hêwir
=== Rengdêr ===
{{rengdêr|ckb}}
# [[rehet]], [[aram]], [[ten]]
# [[objektîv]], [[hêwir]], dûrî hestên kesînî / şexsî
l930h3phets0v5gh1x7ab5wzxbssqw4
ھێز
0
270057
6533058
5878475
2026-09-19T10:13:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533058
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hêz
=== Navdêr ===
{{navdêr|ckb}}
# [[hêz]], [[quwet]], [[şiyan]], [[xurtî]], [[taqet]]
kxhx0bocgyqrh1at1z7cm0wdedl13za
ھێزم
0
270059
6533060
5878479
2026-09-19T10:13:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533060
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hêzim
=== Navdêr ===
{{navdêr|ckb}}
# [[êzing]], [[tirrik]], darên sotinê / şewitandinê
o2htaz2rasquavqyi68bvmexsyss6ig
ھکوومەت
0
270060
6533062
5878240
2026-09-19T10:13:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533062
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hikûmet
=== Navdêr ===
{{navdêr|ckb}}
# [[hikûmet]], [[hukumet]], civata wezîran (û serokkomar), serokatiya dewletê, rêveberiya dewletê
pqgqxpdicex6qwiaklhdydmi48ubefo
ھسێب
0
270062
6533064
5878222
2026-09-19T10:14:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533064
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hisêb
=== Navdêr ===
{{navdêr|ckb}}
# [[hesab]], [[hisêb]]
2ksie8jq8ln2ipzn323s6pcu0gdsa6l
ھزب
0
270063
6533066
5878215
2026-09-19T10:14:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533066
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hizb
=== Navdêr ===
{{navdêr|ckb}}
# [[partî]], [[hizb]]
8l9i8rochnib8drs5vgtgc74ae0owl9
ھیکمەت
0
270065
6533067
5878490
2026-09-19T10:14:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533067
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hîkmet
=== Navdêr ===
{{navdêr|ckb}}
# [[hikmet]], [[hişmendî]], [[aqildarî]], [[hişyarî]], [[hiş]], [[aqil]]
2x7rtoq9hz7xpa9h3q2h7rc33m73lci
ھیچی
0
270068
6533068
5878466
2026-09-19T10:14:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533068
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hîçî
=== Navdêr ===
{{navdêr|ckb}}
# [[hîçî]], [[tineyî]], [[çineyî]], [[çuneyî]], [[ ne-ti-tiştî]]
23wkh0eik5pih0i2gi20n2hruuzbuhk
ھیدایەت
0
270069
6533070
5878467
2026-09-19T10:14:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533070
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hîdayet
=== Navdêr ===
{{navdêr|ckb}}
# [[rêberî]], [[rênîşandan]], [[hîdayet]]
3r5ddjw3mpjj09u7vuoa2xru661mo26
ھیلاک
0
270070
6533072
5878493
2026-09-19T10:14:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533072
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hîlak
=== Rengdêr ===
{{rengdêr|ckb}}
# [[westayî]], [[mandî]], [[betilî]], [[kerixî]], [[mirin]], [[hîlak]]
e2q6fhj1l89jfiznv4yzfyrekdlvpu8
ھیساب
0
270073
6533074
5878484
2026-09-19T10:15:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533074
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hîsab
=== Navdêr ===
{{navdêr|ckb}}
# [[hesab]], [[matematîk]]
9r0pkd219awvr92b4peskq0x48iaaep
ھیوادار
0
270076
6533076
5878513
2026-09-19T10:15:19Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533076
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hîwadar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hêvîdar]], [[umêdewar]], [[bihêvî]]
6of99wx2yfmlqqzvqhaayjz3bu8k5cw
ھیزە
0
270079
6533077
5878481
2026-09-19T10:15:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533077
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hîze
=== Navdêr ===
{{navdêr|ckb}}
# [[pîst]], [[çerm]], [[post]] (t yê reş bo têdeparastina rûn)
9xbq15yctl48ec60z6uu716awlvr08e
ھیزەڵ
0
270080
6533078
6433480
2026-09-19T10:15:39Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533078
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hîzell
=== Rengdêr ===
{{rengdêr|ckb}}
# [[neşê]], [[nekar]], kesa/ê nikare / neşê tiştekî bike
==== Anagram ====
* {{anagram|ckb|a=زڵھیە|ھەڵیز}}
6whmqc8nuosa3e1gtk94bjvrj9tmh62
ھیزێتی
0
270081
6533079
5878480
2026-09-19T10:15:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533079
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hîzêtî
=== Navdêr ===
{{navdêr|ckb}}
# [[hîzî]], [[hîzîtî]], karê hîzan
r4nvtfzk8zupm5catbtxkrpj4j2tzqt
ھۆدار
0
270082
6533080
5878428
2026-09-19T10:15:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533080
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hodar
=== Navdêr ===
{{navdêr|ckb}}
# [[hîmdar]], [[mantiq]], [[lojîk]], tişta sedema xwe ya asayî yan diyar heye û dikare bêt famkirina ka çima wa ye yan wa dibe
l0k527sntxdeagduuzyghd2wjxrpise
ھۆجەنە
0
270083
6533081
5878427
2026-09-19T10:16:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533081
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hocene
=== Navdêr ===
{{navdêr|ckb}}
# [[niviştî]], [[nivişte]]
j6kzj2meib6ybls9fpu5shkvekfj1bv
ھۆدە
0
270084
6533082
5878429
2026-09-19T10:16:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533082
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hode
=== Navdêr ===
{{navdêr|ckb}}
# [[ode]], [[jore]]
3auikyye9xu57ko2dfnbxzhcd18737s
ھۆگر
0
270085
6533083
5878447
2026-09-19T10:16:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533083
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hogir
=== Navdêr ===
{{navdêr|ckb}}
# [[pêvek]], [[pêrek]] (tişta bi tiştek dî ve ye yan li gel wê ye), [[hogir]], heval û hogir
9uw2y50qg5xa2s3u08m2h833hzq1f65
ھۆکار
0
270086
6533084
5878445
2026-09-19T10:16:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533084
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hokar
=== Navdêr ===
{{navdêr|ckb}}
# [[hîmker]], [[bandorker]], [[sedem]], [[sebeb]]
52mnokpepjvfe2kj30n0l1tui11qj5o
ھۆکڵ
0
270087
6533085
5878446
2026-09-19T10:16:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533085
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hokill
=== Navdêr ===
{{navdêr|ckb}}
# [[xizmetkar]], [[berdestk]], [[xulam]], [[noker]]
oho12e39tj2w2blfvz08wg763b2y0u0
ھۆنەر
0
270090
6533086
5878450
2026-09-19T10:16:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533086
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:honer
=== Navdêr ===
{{navdêr|ckb}}
# [[helbestvan]], [[hozanvan]], [[helbestnivîs]]
gzmvy1zyd1kamk9e4ks50ahljsft8ax
ھۆڕ
0
270091
6533087
5878430
2026-09-19T10:17:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533087
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:horr
=== Navdêr ===
{{navdêr|ckb}}
# [[têrr]], [[çewal]], [[tûrik]], [[kîs]], [[telîs]], [[torbe]]
54iz6zein8pxvdvzuokb9m4x8negeh3
ھۆڕن
0
270092
6533088
5878433
2026-09-19T10:17:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533088
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:horrin
=== Navdêr ===
{{navdêr|ckb}}
# [[horrin]], [[tûtik]], dengê agadarkirinê yê tirimpêlan û hin tiştên dî
81m0vzn0d2b18c1z621j4u7epu4mgsr
ھۆردوو
0
270093
6533089
5878432
2026-09-19T10:17:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533089
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hordû
=== Navdêr ===
{{navdêr|ckb}}
# [[artêş]], [[ordî]], [[leşker]], [[cêş]], [[esker]]
bwhq7gwtitcio4scstx0ckcqsxjmtl4
ھۆرتە
0
270096
6533090
5878431
2026-09-19T10:17:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533090
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:horte
=== Navdêr ===
{{navdêr|ckb}}
# [[edet]], [[banek]], irf û edet, [[tore]]
nhcvn5yp77ckr1npd4uecrojl48ul5n
ھۆشبڕ
0
270097
6533091
5878439
2026-09-19T10:17:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533091
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hoşbirr
=== Navdêr ===
{{navdêr|ckb}}
# [[hişbirr]], [[bêhişker]], [[haybirr]], [[bêhayker]]
h1xwc3j956180r3iugs2akub9jxw6eu
ھۆشمەندی
0
270099
6533092
5878441
2026-09-19T10:17:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533092
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hoşmendî
=== Navdêr ===
{{navdêr|ckb}}
# [[hişmendî]], [[hişyarî]], [[haydarî]], [[aqildarî]], [[biaqilî]], [[têgihiştinî]], [[zanayî]], [[ronakbîrî]], [[rewşenbîrî]]
sbor9ie7lbs2gu3k6nigwef0s9q7a63
ھۆشیار
0
270100
6533093
5878442
2026-09-19T10:18:09Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533093
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hoşyar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hişyar]], [[haydar]], kesa/ê hay ji xwe heye, [[şiyar]], kesa/ê ne di xew e
pvtv6mfjmxv80hks86x1ln1cxyj5fey
ھۆشیاری
0
270102
6533094
5878444
2026-09-19T10:18:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533094
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hoşyarî
=== Navdêr ===
{{navdêr|ckb}}
# [[hişyarî]], [[haydarî]], [[şiyarî]], [[nedixewî]]
4jaoq3efoqhd7agvxtfabd90scgj9ru
ھۆز
0
270104
6533095
5878435
2026-09-19T10:18:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533095
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hoz
=== Navdêr ===
{{navdêr|ckb}}
# [[hoz]], [[êl]], [[eşîr]], [[binemal]], [[ûcax]]
n54ots5a5l2ima1a699bc8zpzb4mj5v
ھۆزانی
0
270107
6533096
5878437
2026-09-19T10:18:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533096
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hozanî
=== Navdêr ===
{{navdêr|ckb}}
# [[hişmendî]], [[hişyarî]], [[aqildarî]], [[zanayî]], [[xwendayî]], [[zanyarî]], [[têgihiştinî]], [[dinyadîtinî]]
5q8o1bjd0qwmlx5grjquyxwu9oi3a8x
ھوجرە
0
270109
6533097
5878387
2026-09-19T10:18:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533097
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hucre
=== Navdêr ===
{{navdêr|ckb}}
# [[hucre]], [[odek]], odeya biçûk
j3e0hmgi5fi1k56kikmknvxoni3w230
ھوکمدار
0
270111
6533098
5878404
2026-09-19T10:18:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533098
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hukimdar
=== Navdêr ===
{{navdêr|ckb}}
# [[fermandar]], [[hukimdar]], [[serok]], [[desthilatdar]]
ib96w7smtt5ff73agsvfp7cyp63fy1p
ھولەسێ
0
270113
6533099
5878408
2026-09-19T10:19:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533099
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hulesê
=== Navdêr ===
{{navdêr|ckb}}
# [[angaşt]], [[îdîa]]
f2y5ftdle0jqyx26k24mtd8vfac3zic
ھولھولی
0
270114
6533101
5878406
2026-09-19T10:19:19Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533101
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hulhulî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[guherok]], [[xweranegir]], [[guherbar]]
d4nbxxslc2rtpx1nrkrxgzrelcb1ujv
ھومەڵخەزا
0
270116
6533102
5878410
2026-09-19T10:19:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533102
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:humellxeza
=== Navdêr ===
{{navdêr|ckb}}
# [[tevlihevî]], [[serobinî]], [[taromarî]]
732g0w4rpe7owd5qlhtaar3ae991wqq
ھونەر
0
270117
6533103
5878411
2026-09-19T10:19:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533103
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:huner
=== Navdêr ===
{{navdêr|ckb}}
# [[1]], [[huner]], [[afirînerî]], efrînerî 2, [[hinêr]], [[hunêrî]], [[şiyan]], [[jêhatin]], [[karîn]], [[kanîn]]
1hbql4426fwpnrxrkszkz3rb9mrf261
ھونەرگا
0
270118
6533104
5878412
2026-09-19T10:19:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533104
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hunerga
=== Navdêr ===
{{navdêr|ckb}}
# [[hunergeh]], cihê huneran
o73dhpixwcavmgwetvu43rza8hj338t
ھونەرمەند
0
270120
6533105
5878413
2026-09-19T10:19:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533105
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hunermend
=== Navdêr ===
{{navdêr|ckb}}
# [[hunermend]], [[afirîner]]
3r91otq2snq8hc0gf432eujlh0kw34h
ھونەروەر
0
270122
6533106
5878415
2026-09-19T10:20:09Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533106
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hunerwer
=== Rengdêr ===
{{rengdêr|ckb}}
# [[1]], bn hunermend 2, [[jêhatî]], [[bihinêr]], [[bişiyan]], [[hinêrwer]]
om6j2w8epx7tvnfqmdt2k5652qexo44
ھورمەت
0
270124
6533107
5878390
2026-09-19T10:20:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533107
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hurmet
=== Navdêr ===
{{navdêr|ckb}}
# [[rêzgirtin]], [[hurmet]], [[qedirgirtin]], [[qîmetgirtin]]
19ol2dt6ldu6jk8971kcc7852jtb4y9
ھوشتر
0
270126
6533108
5878398
2026-09-19T10:20:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533108
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:huştir
=== Navdêr ===
{{navdêr|ckb}}
# [[hêştir]], [[deve]], [[sare]]
sy61mb0we9uotk97y0oy86k48gv4pmc
ھوزەیران
0
270127
6533109
5878393
2026-09-19T10:20:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533109
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:huzeyran
=== Navdêr ===
{{navdêr|ckb}}
# [[pûşber]], [[hezîran]], meha 6em ji salnameya romî, meha piştî gulanê û berî tîrmehê
djg4gkwh1awnrvlyfmkjdcw21pppj6x
ھوو
0
270129
6533110
5878417
2026-09-19T10:20:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533110
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hû
=== Navdêr ===
{{navdêr|ckb}}
# [[sûde]], [[kêr]], [[kelk]], [[mifa]], [[feyde]], [[kar]], [[qezenc]], [[qazanc]]
ckylhonyjhx3zgp6ir85iu932cszx01
ھووھووکەرە
0
270131
6533111
5878425
2026-09-19T10:20:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533111
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hûhûkere
=== Navdêr ===
{{navdêr|ckb}}
# [[kund]], [[bum]], [[bim]]
9xwkju0zj0743bo9t95hc5yi9o8qwx7
ھووڕ
0
270132
6533112
5878419
2026-09-19T10:21:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533112
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hûrr
=== Navdêr ===
{{navdêr|ckb}}
# [[dengûdor]], dengê bilind / nexweş
80rrlizqhidjc6f8ypt6nidb4f4419m
ھووردەبینی
0
270134
6533113
5878421
2026-09-19T10:21:19Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533113
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hûrdebînî
=== Lêker ===
{{lêker|ckb}}
# [[hûrnerî]], [[tûjandin]], [[vekolandin]], [[hûrsehî]], hûr lênerîn / vekolandin / pûnijîn bo diyarkirina rastîniya tiştekî
h9ioat4zs4aos0bec8nmnctcd7iyvc5
ھووشە
0
270135
6533114
5878422
2026-09-19T10:21:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533114
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hûşe
=== Navdêr ===
{{navdêr|ckb}}
# [[meth]], [[pesn]], [[qurretî]], [[pozbilindî]]
0jct7vno6jo1z4l917g7yd7fj468s5g
ھووت
0
270137
6533115
5878418
2026-09-19T10:21:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533115
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:hût
=== Navdêr ===
{{navdêr|ckb}}
# [[avilke]], [[neheng]], [[hût]], [[balîna]], mezintirîn lawirê guhandar yê avî
45kxcqpad0isj2ay5jxw3r9nbuvprbq
ژاژ
0
270154
6533116
5875059
2026-09-19T10:21:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533116
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jaj
=== Navdêr ===
{{navdêr|ckb}}
# [[jaj]], giyayek e têkilî nav penîrê an mastî vexewixandî dikin û jajî jê çêdikin
== {{ziman|fa}} ==
=== Navdêr ===
{{navdêr|fa}}
# [[jaj]]
# ''mecazî'': [[devbelaşî]], [[devleqî]]
hc6mvh4jlxc6ggobiw6z5w05xt9lbqi
ژاژک
0
270155
6533117
5869686
2026-09-19T10:21:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533117
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jajik
=== Navdêr ===
{{navdêr|ckb}}
# [[benîşt]], [[qajik]], [[ilk]], [[jajik]], [[qaçik]], [[cûtek]]
3ulsm5gbwy62qk94c20dkii1a6bj0r8
ژاڵە
0
270159
6533118
5869687
2026-09-19T10:22:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533118
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jalle
=== Navdêr ===
{{navdêr|ckb}}
# [[jale]], [[kerkujk]], darek yan deviyek jehrî ya her-şên e bi gulên geş yên spî yan pembe (pîvazî) yan sor
n5icl3i8mtfo4fcl3la4i3bo77chqe8
ژاندار
0
270161
6533119
5869689
2026-09-19T10:22:19Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533119
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jandar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[jandar]], [[bijan]]
jv3npqklb2v3krt1qe8of8o3yrdy3as
ژانەسەر
0
270162
6533120
5869693
2026-09-19T10:22:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533120
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:janeser
=== Navdêr ===
{{navdêr|ckb}}
# [[janeser]], [[serêşî]], êşîna serî
sva2hl9kxtj0ilan3bvg8y0ts8o821s
ژانەسک
0
270163
6533121
5869692
2026-09-19T10:22:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533121
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:janesik
=== Navdêr ===
{{navdêr|ckb}}
# [[zikêşî]], êşîna zikî
kc403x4agffxkb3g5kh323conwdllrw
ژاراو
0
270165
6533122
5869678
2026-09-19T10:22:49Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533122
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jaraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[jarav]], [[jehrav]], ava jehrî
54y5k58x8oqf1wt9gd2hx5znuh55734
ژاراوی
0
270166
6533123
5869679
2026-09-19T10:22:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533123
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jarawî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[jarawî]], [[jehrawî]], [[bijar]], [[bijehr]], [[jehrkirî]]
nc6f75orb7tfyy3hc85ric7br3jrvt5
ژارووژەنگ
0
270170
6533124
5869683
2026-09-19T10:23:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533124
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jarûjeng
=== Navdêr ===
{{navdêr|ckb}}
# [[rikmane]], [[dijberî]], [[kerb]], [[kîn]]
eumee1xdu14s74ho4mz8e4pxax2ktl3
ژاوەژاو
0
270171
6533125
5869694
2026-09-19T10:23:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533125
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jawejaw
=== Navdêr ===
{{navdêr|ckb}}
# [[dengûdor]], [[qerebalix]], [[geremol]], dengên bilind û tevlihev
j3iko97j17917rls154nrs9dgipym2z
ژەندن
0
270175
6533126
5869757
2026-09-19T10:23:29Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533126
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jendin
=== Rengdêr ===
{{rengdêr|ckb}}
# [[jenandî]]
# [[şilqandî]]
# [[hejandin]], [[qeliqandin]], [[livandin]], [[lebitandin]]
2s4c8mc916w0qvwkvqd168t6efdzfln
ژەقنەبووت
0
270179
6533127
5869754
2026-09-19T10:23:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533127
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jeqnebût
=== Navdêr ===
{{navdêr|ckb}}
# [[ziqnebût]], darek bi fêkiyê jehrewî ye, Herwa wek peyvek tal yan nifrîn yan dijûn têt bikaranîn û wateya wê nêzî "quzilqurt" û "jehremar" e
2en2lp0flj39e7n25z1454i8mli34dl
ژێر
0
270180
6533128
5869722
2026-09-19T10:23:49Z
JiyanBot
3048
Cure Daçek hat lêzêdekirin
6533128
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jêr
=== Daçek ===
{{daçek|ckb}}
# [[bin]], [[jêr]]
4w2772lpj3219ivvvf00d2b71523eef
ژێربەران
0
270181
6533129
5869729
2026-09-19T10:23:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533129
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jêrberan
=== Navdêr ===
{{navdêr|ckb}}
# [[derazînk]], bilindeka li ber deriyan
fyrbjwiokmzt6zacga0r1nv36rm3xd6
ژێرچەپۆکە
0
270182
6533130
5869733
2026-09-19T10:24:09Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533130
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jêrçepoke
=== Rengdêr ===
{{rengdêr|ckb}}
# [[serşor]], [[ruhkole]], [[neazad]], [[neserbilind]]
n3tf3u5f3m5jqddbr91p9on4a6f6a8b
ژێردەست
0
270183
6533131
5869734
2026-09-19T10:24:19Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533131
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jêrdest
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bindest]], [[neazad]], [[neserbixwe]], kesa/ê / welatê û hwd yê di bin destê hinên dî ve
alytze3rkee7bh0eqphyih2ac78vcfm
ژێردەستی
0
270184
6533132
5869735
2026-09-19T10:24:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533132
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jêrdestî
=== Navdêr ===
{{navdêr|ckb}}
# [[bindestî]], rewşa yên bindest tê de dijîn
3pqpfkgpi01hcl8pycpz7ds6w03httf
ژێرکەنارە
0
270187
6533133
5869740
2026-09-19T10:24:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533133
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jêrkenare
=== Navdêr ===
{{navdêr|ckb}}
# [[jêrenot]], [[binnivîsk]], nîşeyên / ravekên / şiroveyên li binê her rûpelî yan li dawiya nivîsarê bi tîpên hûr tên danîn
8cgpfkyws5w85x8ducbwo1ydyxmevd9
ژێرپیاڵە
0
270189
6533134
5869731
2026-09-19T10:24:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533134
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jêrpiyalle
=== Navdêr ===
{{navdêr|ckb}}
# [[binkask]], [[binpiyalok]], sênîkoka piyaleyekê / fincanek datîne tê de daku cihê kefçikê têkvedanê û belkî şekira kabik hebe û belkî ji ber germiya çayê û germbûna piyaleyê baştir e mirov li şûna piyaleyê dest biavêje wê sênîkokê ku jê re binkask tê gotin
dkc7okb21pr3l1hnqr0onfxmxflp55m
ژێرسەر
0
270190
6533135
5869738
2026-09-19T10:24:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533135
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jêrser
=== Navdêr ===
{{navdêr|ckb}}
# [[balguh]], [[balîf]], [[balîfk]], [[binserk]]
ej465i6chm6uhu7bxnyzosrrab23fdw
ژێرتیپ
0
270191
6533136
5869732
2026-09-19T10:25:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533136
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jêrtîp
=== Navdêr ===
{{navdêr|ckb}}
# [[bintîp]], [[kontrol]], [[dîsîplîn]]
bzu2fmdu6s7h43xrjue6dlqwnb8vk8e
ژێرووزەبەر
0
270193
6533137
5869745
2026-09-19T10:25:19Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533137
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jêrûzeber
=== Rengdêr ===
{{rengdêr|ckb}}
# [[serobin]], [[tevlihev]]
lgog0puk3zkjrasywyeboldyzaduxg4
ژێرزەمین
0
270194
6533138
5869736
2026-09-19T10:25:29Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533138
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jêrzemîn
=== Rengdêr ===
{{rengdêr|ckb}}
# [[binerd]], [[binax]]
s58rz1xx45tdu02udfibfyqd6stizwi
ژێرزەمینی
0
270195
6533139
5869737
2026-09-19T10:25:39Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533139
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jêrzemînî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[binerdî]], [[binaxî]]
h1we6jrrd3a7y27uanme326pv8t0ww3
ژلێوە
0
270197
6533140
5869697
2026-09-19T10:25:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533140
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jilêwe
=== Navdêr ===
{{navdêr|ckb}}
# [[kiş]], [[kişkirin]], [[şarandin]], [[lêsorkirin]], [[kişkişandin]]
6gvowu5t122sbza6g1p87wnt3u3h7c4
ژمار
0
270198
6533141
5869698
2026-09-19T10:25:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533141
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jimar
=== Navdêr ===
{{navdêr|ckb}}
# [[jimar]], [[hejmar]], [[hesab]]
6jdbj5mm0e1dmbd8o4fzdgf0dszlrqp
ژماردن
0
270199
6533142
5869699
2026-09-19T10:26:09Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533142
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jimardin
=== Lêker ===
{{lêker|ckb}}
# [[jimartin]], [[hejmartin]], [[hijmartin]]
cl6wmj0kpv3opakdkdvpb7aly8gdk0w
ژمارەگر
0
270201
6533143
5869703
2026-09-19T10:26:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533143
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jimaregir
=== Navdêr ===
{{navdêr|ckb}}
# [[jimaregir]], [[hesabgir]], kesa/ê karê jimartina / hesabkirina lêçûn û dahateyan dike
mg20xddbbp5apq8kkhi0itoagjybjfs
ژمارەگری
0
270202
6533144
5869704
2026-09-19T10:26:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533144
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jimaregirî
=== Navdêr ===
{{navdêr|ckb}}
# [[jimaregirî]], [[hesabgirî]], jimartina / hesabkirina lêçûn û dahateyan
690stnglm9fwj8xh2yj3pnuhmvxu7m4
ژمارکار
0
270204
6533145
5869700
2026-09-19T10:26:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533145
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jimarkar
=== Navdêr ===
{{navdêr|ckb}}
# [[jimarkar]], makîneya hesabkirinê
tjstrxl1euybhyphpe3vf8w3enaj6zz
ژمارکۆ
0
270205
6533146
5869701
2026-09-19T10:26:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533146
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jimarko
=== Navdêr ===
{{navdêr|ckb}}
# [[hiljimar]], [[statîstîk]], [[jimarko]]
grs2wvsyqmmft1g1xtc8p88t8beoby7
ژمێرە
0
270206
6533147
5869706
2026-09-19T10:26:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533147
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jimêre
=== Navdêr ===
{{navdêr|ckb}}
# [[jimêre]], di matematîkê de beşa jimare û jimartina wan
0bk290l92bydhsgfui0nyqahqbfqrxw
ژنانی
0
270209
6533148
5869707
2026-09-19T10:27:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533148
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jinanî
=== Navdêr ===
{{navdêr|ckb}}
# [[jinanî]], [[jinok]], [[serjin]], [[jinik]], [[nemêr]], [[nezelam]]
ivquw7r1ru18pfj18ib1v4n73mm5tav
ژنەشا
0
270210
6533149
5869711
2026-09-19T10:27:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533149
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jineşa
=== Navdêr ===
{{navdêr|ckb}}
# [[şabanû]], jina şah / padişah / qral / melik
r2lsewvll89ze5nyjeblpsdthm4au21
ژنێتی
0
270211
6533150
5869710
2026-09-19T10:27:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533150
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jinêtî
=== Navdêr ===
{{navdêr|ckb}}
# [[jinî]], [[jinîtî]], [[jinbûn]]
dotj565cpsy4r7jb3g60020j436f6zg
ژیانی
0
270216
6533151
5869720
2026-09-19T10:27:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533151
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jiyanî
=== Navdêr ===
{{navdêr|ckb}}
# [[jiyanî]], hindî jiyanê giring
4432ndnr29rg28qkv1b2i8rrfwknlqk
ژیاری
0
270218
6533152
5869719
2026-09-19T10:27:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533152
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jiyarî
=== Navdêr ===
{{navdêr|ckb}}
# [[jiyarî]], debara / îdareya jiyanê
pvd7lztz4em4ax5dfqs3pn24jxjkm55
ژیھاتن
0
270219
6533153
5869752
2026-09-19T10:27:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533153
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jîhatin
=== Navdêr ===
{{navdêr|ckb}}
# [[pêşketin]], [[peresîn]], [[firajî]]
fglpt7e2h8gwu3vtw50t1v174mxxoaj
ژینامە
0
270221
6533154
5869750
2026-09-19T10:28:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533154
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jîname
=== Navdêr ===
{{navdêr|ckb}}
# [[jînname]], [[jiyanname]], [[jînenîgar]], [[bîbliyografî]], [[çîrokjiyan]], çîroka jiyana kesekê/î
8dexaurolo4fy14xhgbjw599y9xpv4y
ژیری
0
270228
6533155
5869746
2026-09-19T10:28:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533155
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jîrî
=== Navdêr ===
{{navdêr|ckb}}
# [[jîrî]], hêza / şiyana têgihîna / famkirinê (t zû yan bi asanî)
jv00if6recrrvmqbvp3s2cffjn7y4ay
ژیرکەلە
0
270229
6533156
5869739
2026-09-19T10:28:29Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533156
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jîrkele
=== Rengdêr ===
{{rengdêr|ckb}}
# [[aşt]], [[tena]], [[rehet]], [[tebitî]], [[vehewayî]] (t zarok dema nagirî)
rl3ersh1q6y3bm1zaukub629qpzf4ea
ژیوار
0
270231
6533157
5869753
2026-09-19T10:28:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533157
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jîwar
=== Navdêr ===
{{navdêr|ckb}}
# [[jîwar]], [[pozîsyon]], rewşa / pileya mirovek di jiyana xwe de tê de
ketste5la3fdhkz50aor2nzhfstyiik
ژووان
0
270232
6533158
5869713
2026-09-19T10:28:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533158
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:juwan
=== Navdêr ===
{{navdêr|ckb}}
# [[jivan]], [[soz]], [[randevû]], [[hevdîtin]], [[dîdar]]
94j4yzn7fsk1hx2gvc81zltprf6gs8k
ژوورۆچکە
0
270236
6533159
5869716
2026-09-19T10:28:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533159
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:jûroçke
=== Navdêr ===
{{navdêr|ckb}}
# [[çavî]], [[hucre]], [[odek]], odeya biçûk
h4y1iwnvmzdofdtv3l1346als8raim1
کابان
0
270238
6533160
5872932
2026-09-19T10:29:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533160
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kaban
=== Navdêr ===
{{navdêr|ckb}}
# [[kabanî]], [[kevanî]], [[jin]], jina bermalî
3ikdtluxdk1odv2l2ugtz9roz0l7wcv
کابینە
0
270240
6533161
5872937
2026-09-19T10:29:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533161
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kabîne
=== Navdêr ===
{{navdêr|ckb}}
# [[kabîne]], [[hukumet]], civata wezîran
ra3ewqrml37m44sdpwre4f3yaykbhv6
کابرا
0
270241
6533162
5872933
2026-09-19T10:29:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533162
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kabra
=== Navdêr ===
{{navdêr|ckb}}
# [[camêr]], [[zelam]], [[mêr]], [[mêrik]], [[peya]], [[kabra]]
qba6exazoqlbtn3667wsf93jhozp2o6
کاچ
0
270242
6533163
6433266
2026-09-19T10:29:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533163
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kaç
=== Navdêr ===
{{navdêr|ckb}}
# (dar) [[kaj]], [[qaç]]
==== Anagram ====
* {{anagram|ckb|a=اچک|چاک}}
lpby5maeze5se7va9rudf3arwfitxve
کادان
0
270244
6533164
5872950
2026-09-19T10:29:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533164
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kadan
=== Navdêr ===
{{navdêr|ckb}}
# [[kadîn]], xaniyê ka tê ve têt parastin
kebz1tptqz1a9qxiy0qhxmxv15h5u35
کاھوو
0
270247
6533165
5873146
2026-09-19T10:29:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533165
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kahû
=== Navdêr ===
{{navdêr|ckb}}
# [[xes]], giyayek e selete jê tê çêkirin
0kk0vdydo973yp5u1imm7j5zaedgvhu
کاژەڵاخ
0
270249
6533166
5873057
2026-09-19T10:30:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533166
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kajellax
=== Navdêr ===
{{navdêr|ckb}}
# [[kulox]], [[ser]]
4s99hwbokggs5ue0xqvnea52dnz03h8
کاک
0
270250
6533167
5873082
2026-09-19T10:30:19Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533167
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kak
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kek]], [[kak]], birayê mezin, [[kek]], [[hêja]], [[birêz]], [[berkeftî]], [[ezîz]], [[bihagiran]]
p9uq0g1f5uchhj5as1ws4n6bj4pbiix
کاکڵ
0
270254
6533168
5873083
2026-09-19T10:30:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533168
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kakill
=== Navdêr ===
{{navdêr|ckb}}
# [[kakil]], nava tiştekî ya girin
# [[pirtik]], [[parçe]], [[pate]], [[paçe]]
1v96n44xlnjd661vlsxyvhlpbzcw5lf
کاکۆ
0
270256
6533169
5873084
2026-09-19T10:30:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533169
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kako
=== Navdêr ===
{{navdêr|ckb}}
# [[gidîş]], koma kayê
57bwsz52l9415enyyw71dv210z1paa6
کاڵا
0
270258
6533170
5873092
2026-09-19T10:30:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533170
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kalla
=== Navdêr ===
{{navdêr|ckb}}
# [[pertal]], [[perok]], [[cil]], [[libas]]
91npl3wytruot17y8nm8jt0uhkzczpn
کالان
0
270259
6533171
5873095
2026-09-19T10:30:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533171
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kalan
=== Navdêr ===
{{navdêr|ckb}}
# [[kevlan]], [[şûrdank]], [[kaloxk]], alava şûr tê de têt danîn dema mirov wî bi xwe re tîne û dibe daku ziyanan negihîne mirov yan daku pîs nebe
ndozr1bwr5b1w5rc4jyrtvknmgujh67
کاڵات
0
270260
6533172
5873093
2026-09-19T10:31:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533172
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kallat
=== Navdêr ===
{{navdêr|ckb}}
# [[talan]], [[şelandin]]
mbe0zai9etpom0a6v4cn10jsbwuijtj
کالە
0
270261
6533173
6433543
2026-09-19T10:31:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533173
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kale
=== Navdêr ===
{{navdêr|ckb}}
# [[pêlav]], [[sol]]
==== Anagram ====
* {{anagram|ckb|a=الکە|کەلا}}
gmo9gb1ytcaq9tb6iwihcspql5fyylv
کاڵەک
0
270262
6533174
5873104
2026-09-19T10:31:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533174
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kallek
=== Navdêr ===
{{navdêr|ckb}}
# [[gundor]], [[petêx]], [[talik]], [[kalik]]
g6sa0bau4ksnb4wkwxkwkqlerw85tcy
کالی
0
270264
6533175
5873099
2026-09-19T10:31:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533175
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kalî
=== Navdêr ===
{{navdêr|ckb}}
# [[kalî]], [[pîrî]], [[dijw]], [[gencî]], [[xortî]], [[ciwanî]]
4zrsyuftwiu0tdf4tv76q52x8bzs0sj
کامار
0
270267
6533176
5873107
2026-09-19T10:31:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533176
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kamar
=== Navdêr ===
{{navdêr|ckb}}
# [[dorber]], [[tixûb]]
pf57bgwacn9d9a979seuy1tqgyy2s1f
کاماخ
0
270268
6533177
5873106
2026-09-19T10:31:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533177
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kamax
=== Navdêr ===
{{navdêr|ckb}}
# [[ran]], [[rehn]], [[qalçe]], [[derqûn]]
tc0az7zeo27f7m107k428iwr17v3e52
کامەرانی
0
270270
6533178
5873120
2026-09-19T10:32:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533178
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kameranî
=== Navdêr ===
{{navdêr|ckb}}
# [[bextiyarî]], [[bextxweşî]], [[kameranî]], [[dilşayî]], [[dilşadî]], [[serkeftinî]]
i6ih6bcw9wixud3ha1kbmr26kt20z3o
کامپ
0
270273
6533179
5873108
2026-09-19T10:32:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533179
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kamp
=== Navdêr ===
{{navdêr|ckb}}
# [[kamp]], [[war]], [[wargeh]]
dz82dt5vlof674etglohewy1b2uktlc
کانوون
0
270282
6533180
5873135
2026-09-19T10:32:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533180
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kanûn
=== Navdêr ===
{{navdêr|ckb}}
# [[kanûn]] :~î yekem kanûna yekê, [[berfanbar]], meha 12 ji salnameya romî, '':~î duwem kanûna duyê, [[rêbendan]], meha 1 ji salnameya romî''
3utbra800fv1wukjw5zetyqv9f85f37
کانزا
0
270283
6533181
5873132
2026-09-19T10:32:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533181
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kanza
=== Navdêr ===
{{navdêr|ckb}}
# [[kanza]], [[maden]], [[metal]]
d7wbltg7rf4oqzv4ksxm1v94uao7c3e
کانزایی
0
270284
6533182
5873133
2026-09-19T10:32:49Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533182
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kanzayî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kanzayî]], [[madenî]], [[metalîk]]
6m5ys4409l3qapn1hdmpf8sv19fhgae
کاپۆڵ
0
270285
6533183
5872940
2026-09-19T10:32:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533183
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kapoll
=== Navdêr ===
{{navdêr|ckb}}
# [[kulox]], [[ser]]
o2cyt66d7npu2z2m20747gvj05qsqxq
کاراسک
0
270288
6533184
5872971
2026-09-19T10:33:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533184
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karask
=== Navdêr ===
{{navdêr|ckb}}
# [[karxezal]], xezalên hê mezin nebûne
hae3g8kgy4dd6jhwimwrhwceernhnat
کاراشنا
0
270289
6533185
5872972
2026-09-19T10:33:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533185
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karaşna
=== Navdêr ===
{{navdêr|ckb}}
# [[şareza]], [[karnas]], [[pispor]], kesa/ê karekî baş dizane / dinase
50b2kzryp0iv73nsy7226nq3uyrb995
کاراشنایی
0
270290
6533186
5872973
2026-09-19T10:33:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533186
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karaşnayî
=== Navdêr ===
{{navdêr|ckb}}
# [[şarezatî]], [[karnasî]], [[pisporî]]
l8yl2rvnrlkh0v3auqgksxt7wlafaam
کاربەدەستی
0
270292
6533187
5872986
2026-09-19T10:33:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533187
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karbedestî
=== Navdêr ===
{{navdêr|ckb}}
# [[karbidestî]], [[rayedarî]], [[desthilatdarî]]
axzzkgovsegbj1htm8bj25j4vjh1csa
کاربرا
0
270294
6533188
5872981
2026-09-19T10:33:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533188
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karbira
=== Navdêr ===
{{navdêr|ckb}}
# [[hevkar]], kesên li gel hev karekî dikin
a2q4hoxpfum65q1kw23hc575i9rw885
کاربرایەتی
0
270295
6533189
5872982
2026-09-19T10:33:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533189
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karbirayetî
=== Navdêr ===
{{navdêr|ckb}}
# [[hevkarî]], kirina karekî li gel hev
1ucw47l3poi4mntuky3dlxhes4iwq31
کاربین
0
270296
6533190
5872984
2026-09-19T10:34:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533190
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karbîn
=== Navdêr ===
{{navdêr|ckb}}
# [[pispor]], [[şareza]], zanaya/ê karekî
k4ptbzktjd2vo0z9bs8egvl4l9lk8j5
کاردانەوە
0
270297
6533191
5872995
2026-09-19T10:34:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533191
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kardanewe
=== Navdêr ===
{{navdêr|ckb}}
# [[bertek]], [[bersiv]], [[reaksiyon]]
4dezcizmj3cdeya5oj61cwwf4eqmemt
کارەبا
0
270299
6533192
5873050
2026-09-19T10:34:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533192
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kareba
=== Navdêr ===
{{navdêr|ckb}}
# [[kareba]], [[kehreba]], [[elektrîk]], [[ceyra]]
# [[zîqok]], [[zîqzîqok]], hin pirtikên gewerî yên biriqin in bi cilên <st1:City><st1:place>jinan</st1:place></st1:City> / keçan ve tên zeliqandin daku xweşik bin
dpolle0s2s8qihpwy54vcj4f76ynq74
کارەکەر
0
270300
6533193
5873055
2026-09-19T10:34:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533193
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kareker
=== Navdêr ===
{{navdêr|ckb}}
# [[xidam]], xizmetkara jin / keç
ku7cn6oerfzc3xxsh34zix5b8ymop73
کارەسات
0
270301
6533194
5873054
2026-09-19T10:34:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533194
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karesat
=== Navdêr ===
{{navdêr|ckb}}
# [[bela]], [[karesat]], [[bextreşî]]
5gm26nl5ugmsd69r6j4mmm6v8ucetek
کارگە
0
270306
6533195
5873027
2026-09-19T10:34:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533195
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karge
=== Navdêr ===
{{navdêr|ckb}}
# [[karge]], [[kargeh]], cihê kar lê têt kirin
s9l670lhac7efhypd50vcf48el3ozml
کارگەر
0
270307
6533196
5873028
2026-09-19T10:35:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533196
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karger
=== Navdêr ===
{{navdêr|ckb}}
# [[sedem]], [[binas]], [[sebeb]], [[ho]], [[faktor]]
t78a3lzy3ikzm6yt16li8gm7xvg3uwn
کارگێڕی
0
270309
6533197
5873026
2026-09-19T10:35:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533197
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kargêrrî
=== Navdêr ===
{{navdêr|ckb}}
# [[kargêrî]], [[birêveberî]], [[serkêşî]]
0bbfc6ivxjo1ea2n30dkpwf9hcpbsiv
کارگوزاری
0
270311
6533198
5873024
2026-09-19T10:35:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533198
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karguzarî
=== Navdêr ===
{{navdêr|ckb}}
# [[kêr]], [[bikêrhatin]], [[bikêrî]], [[xizmet]], [[xizmetkarî]]
toofptdur5w0nhorrgdjz5ocft3igf7
کارھاتوو
0
270312
6533199
5873036
2026-09-19T10:35:39Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533199
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karhatû
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kêrhatî]], [[bikêr]], [[bikêrhatî]]
9q3skg97zv97ujj1915qaizj41mwlne
کارژۆلە
0
270316
6533200
5873006
2026-09-19T10:35:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533200
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karjole
=== Navdêr ===
{{navdêr|ckb}}
# [[karik]], [[kehrik]], kara / kehra sava / nûçêbûyî
pf3x07sctbpltak16x9pojnb2c08vv6
کارکەنار
0
270317
6533201
5873015
2026-09-19T10:35:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533201
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karkenar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[karkinar]], [[zanenşîn]], [[teqawid]]
izsgenu9edwfl9yk0dihoh393jepqmf
کارکەناری
0
270318
6533202
5873016
2026-09-19T10:36:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533202
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karkenarî
=== Navdêr ===
{{navdêr|ckb}}
# [[karkinarî]], [[zanenşînî]], [[teqawidî]]
2lsf6k6qwmrmvbmzgph0r9vnw0uoi2s
کارکەر
0
270319
6533203
5873014
2026-09-19T10:36:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533203
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karker
=== Navdêr ===
{{navdêr|ckb}}
# [[karker]], [[şolker]], [[îşker]], [[şuxlker]], kesa/ê kar / şol / îş / şuxl dike
0na48ujya49lnn4jkr87ibhy3x68ukb
کارکردە
0
270320
6533204
6433566
2026-09-19T10:36:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533204
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karkirde
=== Navdêr ===
{{navdêr|ckb}}
# [[şareza]], [[pispor]], [[karzan]], [[karkirde]]
==== Anagram ====
* {{anagram|ckb|a=ادررککە|کردەکار}}
6lohin3oh96rt7ng9i9uv298e7m460h
کارساز
0
270324
6533205
5873007
2026-09-19T10:36:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533205
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karsaz
=== Navdêr ===
{{navdêr|ckb}}
# [[karsaz]], kesa/ê yan şirketa tiştan çêdik
# [[çêker]], kesa/ê tiştekî çêdike / karekî dike
sd0881nqu1856ot108c8kjnlwbpjhu9
کارووبار
0
270325
6533206
5873044
2026-09-19T10:36:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533206
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karûbar
=== Navdêr ===
{{navdêr|ckb}}
# [[karûbar]], [[kar]], kar û tiştên dî yên pê re
e3k5pp9ljoupkeldrget2nejxj2jomw
کاروانکەر
0
270330
6533207
5873042
2026-09-19T10:36:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533207
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karwanker
=== Navdêr ===
{{navdêr|ckb}}
# [[gerestêr]], [[planet]]
9fyphkjtkn0sgq1ozsy5v1b76iwt2f2
کاروانکوژ
0
270331
6533209
5873041
2026-09-19T10:37:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533209
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karwankuj
=== Navdêr ===
{{navdêr|ckb}}
# stêra spêdeyê, [[karwankuj]]
rlcm4d3kuuhbqlhmcibokvk319w08dv
کارخانە
0
270332
6533210
5872990
2026-09-19T10:37:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533210
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karxane
=== Navdêr ===
{{navdêr|ckb}}
# [[karxane]], [[kargeh]], cihê kar lê têt kirin, [[fabrîqe]]
9ies3ouqswv4og7d0lz5u7jfxts2skx
کارزان
0
270333
6533211
5873004
2026-09-19T10:37:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533211
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karzan
=== Navdêr ===
{{navdêr|ckb}}
# [[karzan]], [[pispor]], [[şareza]], kesa/ê karekî (baş) dizane
092mykifi6qbk4fsa8wsrkwdhvsjtnv
کارزانی
0
270334
6533212
5873005
2026-09-19T10:37:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533212
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:karzanî
=== Navdêr ===
{{navdêr|ckb}}
# [[karzanî]], [[pisporî]], [[şarezayî]]
ngcaos4hx4qnu7mxhj7gy21y4jkl780
کاسب
0
270337
6533213
6433197
2026-09-19T10:37:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533213
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kasib
=== Navdêr ===
{{navdêr|ckb}}
# [[bazirgan]], [[ticar]], [[tacir]], [[dikandar]]
==== Anagram ====
* {{anagram|ckb|a=ابسک|باسک}}
769fa598bkktv3ndh6lr6aqt2cr3fcu
کاسبی
0
270338
6533214
5873059
2026-09-19T10:37:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533214
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kasibî
=== Navdêr ===
{{navdêr|ckb}}
# [[bazirganî]], [[ticaret]], [[dikandarî]]
f04y8pu0co22wjnp1cf2yz95sl3vep0
کاسی
0
270339
6533215
5873068
2026-09-19T10:38:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533215
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kasî
=== Navdêr ===
{{navdêr|ckb}}
# [[gêjî]], [[bêhayî]], [[matî]], [[ecêbgirtinî]], matmanî; mismidî
pij90n4wc98fau5p1m3cb7octpj6n39
کاسپ
0
270340
6533216
5873060
2026-09-19T10:38:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533216
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kasp
=== Navdêr ===
{{navdêr|ckb}}
# [[bazar]], [[bazirganî]], [[ticaret]]
cyqzcgw92kj1xipf7wleel9s3kjtb2e
کاستی
0
270341
6533218
5873061
2026-09-19T10:38:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533218
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kastî
=== Navdêr ===
{{navdêr|ckb}}
# [[kêmasî]], [[kêmûkasî]]
1lmxih6cff14pilbdv1ovybfyp8w65p
کاشانە
0
270343
6533219
5873070
2026-09-19T10:38:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533219
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kaşane
=== Navdêr ===
{{navdêr|ckb}}
# [[koşk]], [[koçk]], [[seray]], [[qesr]], xaniyên mezin û bihagiran
hnx1hmv18e46zfsbx5njglmg8ng8uji
کاشە
0
270344
6533220
5873074
2026-09-19T10:38:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533220
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kaşe
=== Navdêr ===
{{navdêr|ckb}}
# [[kaşe]], tiştê mirov li ser / têde rûdine û xwe li ser berfê dixwişînin
fcqmzs79j8g986p6x2ak46p53c6x781
کاشی
0
270345
6533221
5873073
2026-09-19T10:38:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533221
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kaşî
=== Navdêr ===
{{navdêr|ckb}}
# [[kaş]], [[libin]], [[blok]]
osz2xd0r3idfmetp1d7x0s4dzrbsjpd
کات
0
270346
6533222
5872941
2026-09-19T10:39:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533222
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kat
=== Navdêr ===
{{navdêr|ckb}}
# [[dem]], [[wext]], [[çax]], [[zeman]]
gplm32uu3679dnowphr0p5thx766n70
کاتەوکات
0
270347
6533223
5872944
2026-09-19T10:39:19Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6533223
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:katewkat
=== Hoker ===
{{hoker|ckb}}
# [[carinan]], [[car car]], geh geh
aah7nbl02xb8lhg725jkt0k0ykyznuj
کاتپێو
0
270351
6533224
5872943
2026-09-19T10:39:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533224
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:katpêw
=== Navdêr ===
{{navdêr|ckb}}
# [[dempîvk]], alava pêpîvana / pêdiyarkirina demê
f1955uxaedm1rx36y9zc08dqz83164e
کاو
0
270352
6533225
5873147
2026-09-19T10:39:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533225
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kaw
=== Navdêr ===
{{navdêr|ckb}}
# [[kerb]], [[kîn]], [[nefret]]
hxwotr8wpn0q0ff55fwyod0mn8v7g03
کاوێژ
0
270353
6533226
5873153
2026-09-19T10:39:49Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533226
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kawêj
=== Lêker ===
{{lêker|ckb}}
# [[cûn]], [[cûtin]]
g0xed6b3kwhmczi51dcbvx07ju4bvgt
کاوڕ
0
270355
6533227
5873148
2026-09-19T10:39:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533227
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kawirr
=== Navdêr ===
{{navdêr|ckb}}
# [[kavirr]], mihên di navbera temenê 3 û 6 mehî de
m34qnysp8p6a9c1sjfc33g0qyr9prw6
کاخەز
0
270358
6533228
5872948
2026-09-19T10:40:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533228
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kaxez
=== Navdêr ===
{{navdêr|ckb}}
# [[per]], [[kaxez]], [[kaxiz]], [[pel]], [[name]]
1bjahkayydgry6mt9p4dg3fsla9fcpd
کەباب
0
270361
6533229
5874409
2026-09-19T10:40:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533229
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kebab
=== Navdêr ===
{{navdêr|ckb}}
# [[kebab]], pirtên goşt yên bi şifşeyan ve li ser yan ber agir tên biraştin
qzk7hlx78yubv7n0bf0pyrkrfaet95u
کەچەڵ
0
270366
6533231
5874424
2026-09-19T10:40:29Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533231
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keçell
=== Rengdêr ===
{{rengdêr|ckb}}
# [[keçel]], hewês [h wek heft]
mdsgc1icrahkmnc5sj3x7mscj63iie1
کەفالەت
0
270369
6533232
5874539
2026-09-19T10:40:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533232
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kefalet
=== Navdêr ===
{{navdêr|ckb}}
# [[kefalet]], [[gerew]], [[garantî]], [[misogerî]]
i3qwgnxq2zsvm38n2nh8aw5die8awmw
کەفارەت
0
270370
6533233
5874537
2026-09-19T10:40:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533233
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kefaret
=== Navdêr ===
{{navdêr|ckb}}
# [[filitîn]], [[xilasî]], [[azadî]], [[silametî]]
kdslg0sinnfgbmj509vbo6nkhdcoix7
کەفیل
0
270372
6533234
5874545
2026-09-19T10:40:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533234
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kefîl
=== Navdêr ===
{{navdêr|ckb}}
# [[kefîl]], [[gerewdêr]], [[garantor]], [[misogerker]]
jgk3r67d5ckfzylhd8u8ozypcrl7ulr
کەفووکۆڵ
0
270373
6533235
5874543
2026-09-19T10:41:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533235
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kefûkoll
=== Navdêr ===
{{navdêr|ckb}}
# [[bilq]], kefa bi ser tiştekî dikele dikeve
19d67pdc1hejf0uk2snbj2m3svajfn8
کەژاوە
0
270376
6533236
5874474
2026-09-19T10:41:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533236
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kejawe
=== Navdêr ===
{{navdêr|ckb}}
# [[şixre]], darqetkên / darbestên wek baran li hespan / hêstiran tên barkirin
ebx2vm3413xqogceyykts50bzteiswb
کەلا
0
270379
6533237
6433540
2026-09-19T10:41:29Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533237
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kela
=== Rengdêr ===
{{rengdêr|ckb}}
# [[varê]], [[avarê]], dûrî rê / navendê, [[dûr]]
==== Anagram ====
* {{anagram|ckb|a=الکە|کالە}}
ttytvo9fo432k2shmkv4ogf9dmoy29a
کەڵان
0
270382
6533238
5874555
2026-09-19T10:41:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533238
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kellan
=== Navdêr ===
{{navdêr|ckb}}
# [[serek]], [[serok]], [[mezin]]
2kb0ocwh9and05wqtacbvhuykn1pzbd
کەلار
0
270383
6533239
5874549
2026-09-19T10:41:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533239
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kelar
=== Navdêr ===
{{navdêr|ckb}}
# [[gidîş]], koma giyayê dirûyî û li ser hev civand
# navê bajarokekî ye li Başûrê Kurdistanê
r1are8vzm9qgfwhp7ifhkqzdvktkyyp
کەلارە
0
270384
6533240
5874551
2026-09-19T10:41:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533240
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kelare
=== Navdêr ===
{{navdêr|ckb}}
# [[kum]], [[kulav]], [[şewqe]], [[şepqe]]
4jrc16kpzntulcc2e71o3wvmszpb8q5
کەڵب
0
270385
6533241
5874557
2026-09-19T10:42:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533241
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kellb
=== Navdêr ===
{{navdêr|ckb}}
# [[gumtil]], [[gumtilk]], [[komik]]
trxf4chbweqcnrzk15xu96eg0pys3c4
کەڵەگەت
0
270388
6533242
5874599
2026-09-19T10:42:19Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533242
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kelleget
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bejndirêj]], [[dirêj]]
fa3y0nwlqe4gmsnmnkakc1r0n7h3sax
کەلەکوچ
0
270390
6533243
5874597
2026-09-19T10:42:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533243
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kelekuç
=== Navdêr ===
{{navdêr|ckb}}
# [[perasû]], [[parsû]]
0vaosbqm7lhrylb99cf5ri7xm453mf0
کەلەلا
0
270391
6533244
5874601
2026-09-19T10:42:39Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533244
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kelela
=== Rengdêr ===
{{rengdêr|ckb}}
# [[seqet]], bêdest yan bêpî, [[birîndar]], [[kirêtkirî]]
boapj635kmf3oaqui2ir074c3b1mk0j
کەلەم
0
270392
6533245
5874603
2026-09-19T10:42:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533245
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kelem
=== Navdêr ===
{{navdêr|ckb}}
# [[kelemî]], [[kelem]]
gx82o35zv6tl1xfvrlg5uy7sx3guovj
کەڵەس
0
270397
6533246
5874587
2026-09-19T10:42:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533246
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kelles
=== Navdêr ===
{{navdêr|ckb}}
# [[bizîng]], [[werîs]]
3f130e4f1gqk78mtr26gpn0x13bbw54
کەلەشەق
0
270398
6533247
5874589
2026-09-19T10:43:09Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533247
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keleşeq
=== Rengdêr ===
{{rengdêr|ckb}}
# [[serhişk]], [[înato]], [[biînat]]
46oulp6n3zv5jgxwp8kswn8vfp1s7ja
کەلتوور
0
270405
6533248
5874559
2026-09-19T10:43:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533248
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keltûr
=== Navdêr ===
{{navdêr|ckb}}
# [[çande]], [[tore]], [[kultûr]]
3zo1rg1ccajrpbiggdy2o80br0gpsad
کەلووکۆم
0
270406
6533249
5874569
2026-09-19T10:43:29Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533249
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kelûkom
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bêserûber]]
3vkwca51bdjj7hqkd9na8i3hzwh4twl
کەلووپەل
0
270407
6533250
5874565
2026-09-19T10:43:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533250
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kelûpel
=== Navdêr ===
{{navdêr|ckb}}
# [[kerûper]], [[pirtûmirt]], [[hûrûmûr]]
edwhppxzw1zkzixo7q9u8r85n52bole
کەلواز
0
270409
6533251
6433598
2026-09-19T10:43:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533251
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kelwaz
=== Navdêr ===
{{navdêr|ckb}}
# [[sirrûseqem]], [[sirrûsarma]]
==== Anagram ====
* {{anagram|ckb|a=ازلوکە|زەلکاو}}
nvoue28mjg2oop00wetyai2nhqrr1yc
کەلخانە
0
270410
6533252
5874561
2026-09-19T10:43:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533252
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kelxane
=== Navdêr ===
{{navdêr|ckb}}
# [[kelxane]], dikana çek-/ tivengçêkeran
byn3ncydx7qya4ch5x4nlwg1atb5hko
کەماڵ
0
270412
6533253
6433583
2026-09-19T10:44:09Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533253
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kemall
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kemal]], [[kamil]], [[tam]], [[temam]], [[bêkêmasî]], [[têrûtijî]]
==== Anagram ====
* {{anagram|ckb|a=امکڵە|کەڵام}}
be7wkdfyvws035b97yux24jg9h0t5e0
کەمان
0
270413
6533254
5874612
2026-09-19T10:44:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533254
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keman
=== Navdêr ===
{{navdêr|ckb}}
# [[keman]], alavek jendar ya muzîkê ye
icloo1pmxs6jth6lhrb94pvj4hz4pc5
کەمایەتی
0
270417
6533255
5874616
2026-09-19T10:44:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533255
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kemayetî
=== Navdêr ===
{{navdêr|ckb}}
# [[kêmayetî]], [[mînorîte]], [[kêmanî]]
1jx3100ge2x7q8xwixkn6rg3i9jkgpe
کەمچیکڵدانە
0
270419
6533256
5874628
2026-09-19T10:44:39Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533256
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kemçîkilldane
=== Rengdêr ===
{{rengdêr|ckb}}
# [[venehewayî]], [[bêsebr]], [[balkurt]], [[dw]], [[baldirêj]], [[bisebr]]
lgjm8ulior5o5155mqca58t0rf8clsx
کەمە
0
270422
6533257
5874661
2026-09-19T10:44:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533257
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keme
=== Navdêr ===
{{navdêr|ckb}}
# [[rex]], [[kinar]], [[qirax]], [[tenişt]], [[serlêvî]], [[sersinorî]]
dnsctryzpaaopcsxhifdmng0fun2x36
کەمەکێک
0
270423
6533258
5874677
2026-09-19T10:44:59Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6533258
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kemekêk
=== Hoker ===
{{hoker|ckb}}
# [[piçekê]], [[kêmekê]], [[hinekî]]
421kgpqowbj3b2shkg5kkx4dqiucfub
کەمەبەند
0
270424
6533259
5874663
2026-09-19T10:45:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533259
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kemebend
=== Navdêr ===
{{navdêr|ckb}}
# [[kemerbend]], kemerek pan e
2qlr3zixk3t24yiwk2m90k7zjud5ddm
کەمەربەستی
0
270425
6533260
5874667
2026-09-19T10:45:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533260
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kemerbestî
=== Navdêr ===
{{navdêr|ckb}}
# [[îmmûnîte]], [[parastinî]]
rq2macxeq7f86498arjmr34kelbbw3m
کەمەرچین
0
270426
6533261
5874669
2026-09-19T10:45:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533261
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kemerçîn
=== Navdêr ===
{{navdêr|ckb}}
# [[çarşev]], [[mêzer]]
m1866rkfzy6tfykh0bpvwyd2cx51sdl
کەمەردار
0
270427
6533262
5874671
2026-09-19T10:45:39Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533262
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kemerdar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kemerdar]], [[kemerkirî]], [[bikemer]]
c90u6r79v2y11gi99sbw6rw3z0go0x9
کەمەرەیی
0
270428
6533263
5874675
2026-09-19T10:45:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533263
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kemereyî
=== Navdêr ===
{{navdêr|ckb}}
# [[kemerî]], [[ekwatoriyal]]
7q19kinwjt3eekif16mbkd4h67l5ozp
کەمەیی
0
270429
6533264
5874679
2026-09-19T10:45:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533264
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kemeyî
=== Navdêr ===
{{navdêr|ckb}}
# [[rexî]], [[kinarî]], [[qiraxî]], [[teniştî]], [[serlêv]], [[sersinor]]
3e1u6hmnld8oyghwr5rg2jxzu2bl7dx
کەمناو
0
270432
6533265
5874640
2026-09-19T10:46:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533265
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kemnaw
=== Navdêr ===
{{navdêr|ckb}}
# [[kêmnas]], kesa/ê yan tişta/ê kêm tê nasîn
bjn1grvivsklk5wfmsbwmxdcknpfkie
کەمۆ
0
270433
6533266
5874645
2026-09-19T10:46:19Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533266
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kemo
=== Rengdêr ===
{{rengdêr|ckb}}
# [[jîr]], [[zîrek]], [[jêhatî]], [[hişyar]]
9h4kxzib15371a3p254cghpp3s8cqca
کەمۆکاری
0
270435
6533267
5874650
2026-09-19T10:46:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533267
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kemokarî
=== Navdêr ===
{{navdêr|ckb}}
# [[manîpulasyon]]
rldx1plav2c8snesepor4ksvyejv7so
کەمۆیار
0
270436
6533268
5874653
2026-09-19T10:46:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533268
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kemoyar
=== Navdêr ===
{{navdêr|ckb}}
# [[jêhatî]], [[dîplomat]]
sa9yiy3kus2r7qxjtzx4vi63drz5f9w
کەمۆیاری
0
270437
6533269
5874655
2026-09-19T10:46:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533269
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kemoyarî
=== Navdêr ===
{{navdêr|ckb}}
# [[jêhatinî]], [[dîplomasî]]
8sqxcz4gf3ji7r5ewzd25sr7l19z1ye
کەمڕوو
0
270438
6533270
5874634
2026-09-19T10:46:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533270
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kemrrû
=== Rengdêr ===
{{rengdêr|ckb}}
# [[şermîn]], [[fedîker]], kesa/ê şerm / fedî / fihêt dike
eksawcllx4dcx01qqstd70sm7t4aiyt
کەمتەرخەمی
0
270442
6533271
5874626
2026-09-19T10:47:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533271
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kemterxemî
=== Navdêr ===
{{navdêr|ckb}}
# [[xemsarî]], [[sersarî]]
cq8a0olqyyh9h46kp3y6bqejogil6il
کەمووکووڕی
0
270445
6533272
5874643
2026-09-19T10:47:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533272
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kemûkûrrî
=== Navdêr ===
{{navdêr|ckb}}
# [[kêmasî]], [[kêmûkasî]], [[netemamî]]
5g2uaeo7dlcu8digm15g34ircq5t83m
کەند
0
270451
6533273
6433600
2026-09-19T10:47:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533273
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kend
=== Navdêr ===
{{navdêr|ckb}}
# [[kend]], [[çal]], [[xendek]], [[newal]], [[nihal]]
==== Anagram ====
* {{anagram|ckb|a=دنکە|دەنک}}
0yzvpg2qkndhqy896nz53jaxxbumolo
کەنداڵ
0
270452
6533274
5874698
2026-09-19T10:47:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533274
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kendall
=== Navdêr ===
{{navdêr|ckb}}
# [[kendal]], cihê av yan ax tê de datêt
55ens5e8st0l2kcl4vlgke76yj0y1ql
کەنداو
0
270453
6533275
5874701
2026-09-19T10:47:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533275
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kendaw
=== Navdêr ===
{{navdêr|ckb}}
# [[kendav]], [[xelîc]], cihê ava deryayekê lê dike navber du bejayiyan (Agadarî: Ger av li van bejayiyan bisekine, jê re kendav (ing, gulf) tê gotin, Ger di wê navbeyna du bejayiyan re bibore û dîsan bigihe ser avek berfire, jê re tengav (ing, straits) tê gotin
h83pj8ls7vp7enixjlnljintsndgarx
کەندەک
0
270454
6533276
5874705
2026-09-19T10:48:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533276
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kendek
=== Navdêr ===
{{navdêr|ckb}}
# [[xendek]], [[kendek]], [[kend]]
np6ffwl3v45xs0yv7bv2qbc4ayhj3bu
کەندەکار
0
270455
6533277
5874707
2026-09-19T10:48:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533277
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kendekar
=== Navdêr ===
{{navdêr|ckb}}
# [[kolîner]], [[kolînkar]], kesa/ê dikole
g2c281xv0ekw0c2o11wtwiedl0uvqqj
کەندەڵان
0
270456
6533278
5874710
2026-09-19T10:48:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533278
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kendellan
=== Navdêr ===
{{navdêr|ckb}}
# [[kend]], [[şeq]], [[kun]], [[tîk]], [[çal]]
eeij0tpkq0fkhya2lhx40k3bwovno0t
کەنەفت
0
270458
6533279
5874720
2026-09-19T10:48:29Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533279
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keneft
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hewce]], [[lazim]], [[neçar]], [[mecbûr]], [[pêdivî]], [[pêwîst]]
kubgro9d0b3t6t0v5x5s0mcghd68ocx
کەنەفتی
0
270459
6533280
5874722
2026-09-19T10:48:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533280
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keneftî
=== Navdêr ===
{{navdêr|ckb}}
# [[hewcetî]], [[lazimî]], [[neçarî]], [[mecbûrî]], [[pêdivîtî]], [[pêwîstî]]
cm6xkree3q6g51s97o616zjgqx1fumd
کەنیلێ
0
270462
6533281
5874716
2026-09-19T10:48:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533281
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kenîlê
=== Navdêr ===
{{navdêr|ckb}}
# [[keçik]], [[qîzik]], keça / qîza biçû
# [[zerî]], [[canik]], bernavê rêzgirtinê bo keçan (li şûna camêr bo zelaman û xanim bo jinan)
a86ivh7i8ciueycie6mmp5crjkf4cnn
کەنزەک
0
270464
6533282
5874712
2026-09-19T10:48:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533282
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kenzek
=== Navdêr ===
{{navdêr|ckb}}
# [[yar]], hevala keç, [[destgirt]]
# [[xidam]], [[bermalî]], keçika karûbarên navmalî yên malbatek biyanî dike
5o9x0me1q75t3vcp8gehaqq6rd3vlho
کەپەنەک
0
270466
6533283
5874414
2026-09-19T10:49:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533283
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kepenek
=== Navdêr ===
{{navdêr|ckb}}
# [[kepen]], [[kepene]], [[kepenek]], qapûtek / saqoyek / çakêtek dirêj e (t şivan şivan bi ser milê xwe de dikin)
hs7kwk8xx178erx00b5w6nbw555w9l6
کەپرۆکە
0
270467
6533284
5874412
2026-09-19T10:49:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533284
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keproke
=== Navdêr ===
{{navdêr|ckb}}
# [[kepirk]], [[kepirok]], kepirên biçûk
sgl6tp4hfwlz51k3lqh0zcotpk2rjvg
کەرە
0
270474
6533285
5874451
2026-09-19T10:49:29Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533285
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kere
=== Navdêr ===
{{navdêr|ckb}}
# [[nîvişk]], [[rûn]]
ryfkrksxlhzfn78mx13rab9jsul118y
کەرەجی
0
270475
6533286
5874454
2026-09-19T10:49:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533286
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kerecî
=== Navdêr ===
{{navdêr|ckb}}
# [[belem]], [[keştîk]], keştiyên biçûk, amraza raguhezandinê ya seravî
1aq4wg4blyus79wcr4wqjvbrlhkdqd4
کەرەکێوی
0
270477
6533287
5874460
2026-09-19T10:49:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533287
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kerekêwî
=== Navdêr ===
{{navdêr|ckb}}
# [[kerekûvî]], [[zebra]]
7pjtcyki8n16609r43bj0m5tzsm4hat
کەڕەنسۆ
0
270480
6533288
5874464
2026-09-19T10:49:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533288
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kerreniso
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bêxem]], [[sersar]], [[xemsar]], kesa/ê t tişt bo ne xem e
5kk5gau246vepfo30mdnffeq38668yl
کەرەنتوو
0
270481
6533289
5874462
2026-09-19T10:50:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533289
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kerentû
=== Navdêr ===
{{navdêr|ckb}}
# [[kêlendî]], [[şalok]] alava giyadirûnê
4q0blyx9rvpzib8nmxq8jlnsjv7rjqn
کەرەسە
0
270482
6533290
5874456
2026-09-19T10:50:19Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533290
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kerese
=== Navdêr ===
{{navdêr|ckb}}
# [[kerese]], [[materyal]]
m5iyfu5l0e0jr08fdh26fec9gj4edin
کەڕەت
0
270483
6533291
5874452
2026-09-19T10:50:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533291
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kerret
=== Navdêr ===
{{navdêr|ckb}}
# [[car]], [[gav]], [[dem]], [[bîsk]], [[kêlîk]]
3948ldn1q5yue8dv809o07anfj0xi2y
کەڕەتی
0
270484
6533292
5874453
2026-09-19T10:50:39Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6533292
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kerretî
=== Hoker ===
{{hoker|ckb}}
# [[carcarî]], [[carinan]], [[carcar]]
mf4zbrx55do2dw3qdgjyh78n2pbioye
کەرەوز
0
270486
6533293
5874468
2026-09-19T10:50:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533293
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kerewz
=== Navdêr ===
{{navdêr|ckb}}
# [[kerefs]], [[bexdenoz]], [[meydenoz]], navê giyayek xwerbar e
qb8pele04emm6e0lbgrociqqz6fz8ag
کەرگەز
0
270488
6533294
5874442
2026-09-19T10:50:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533294
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kergez
=== Navdêr ===
{{navdêr|ckb}}
# [[xertel]], [[eylo]], [[sîsalk]], [[sêmirr]], [[dalereşk]], [[kergezk]]
57tcnvovxqsrlddbq9abxr35kdzuwgz
کەڕی
0
270490
6533295
5874449
2026-09-19T10:51:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533295
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kerrî
=== Navdêr ===
{{navdêr|ckb}}
# [[kerrî]], nebûna hinêra bîstinê / guhlêbûnê
m96ne87ex2xyxfvbaq9pnfe2yrit4rk
کەرکە
0
270491
6533296
5874441
2026-09-19T10:51:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533296
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kerke
=== Navdêr ===
{{navdêr|ckb}}
# [[nîvgirav]], bn nîmçedorge
4go2rijwq7zv2t982rzi9kncihffrep
کەرۆکە
0
270493
6533297
5874448
2026-09-19T10:51:29Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533297
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keroke
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kerok]], [[kerkok]], [[bêaqilok]], [[peledîn]]
fmiy9d3s5uwyt74dedxufvzttz2jz4t
کەرپەسە
0
270494
6533298
5874432
2026-09-19T10:51:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533298
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kerpese
=== Navdêr ===
{{navdêr|ckb}}
# [[xemegurî]], [[margîsok]], [[marik]], [[marok]]
66a0x6py6q8i7c0s52chfqwdvumbx2o
کەڕووواوی
0
270498
6533299
5874447
2026-09-19T10:51:49Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533299
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kerrûwawî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[pijûkî]], [[kûfîkî]]
j20tca26rupkwk3lw37mttkw5an28kw
کەرت
0
270500
6533300
5874433
2026-09-19T10:52:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533300
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kert
=== Navdêr ===
{{navdêr|ckb}}
# [[ker]], [[pirt]], [k-ya nerm wek kêm], [[pişk]], [[par]], [[parçe]], [[pirtik]]
ai38z8n5t2g6z0rsrg1sz2etxzejgc9
کەرتە
0
270501
6533301
5874437
2026-09-19T10:52:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533301
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kerte
=== Navdêr ===
{{navdêr|ckb}}
# [[kîte]], [[kite]], [[kit]], pirtikên peyvan, Nimûne: peyva "azadî" sê-kîteyî ye: a-za-d
# [[piç]], [[piçek]]
jktjiolro8j24scrkdx5yyds1v78a12
کەرتکراو
0
270503
6533302
5874434
2026-09-19T10:52:20Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533302
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kertkiraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kerkirî]], bn kert
pqxtwswoijc127s30udco28u7z58wpx
کەرتووپەرت
0
270504
6533303
5874435
2026-09-19T10:52:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533303
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kertûpert
=== Navdêr ===
{{navdêr|ckb}}
# [[kerûper]], [[pirtûmirt]], [[kitûmat]], [[hûrûmûr]], bn kert
gqzzgzc4sstp8mc3bfmkdn6iz1zz4jz
کەسانە
0
270508
6533304
5874479
2026-09-19T10:52:40Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533304
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kesane
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kesane]], [[prîvat]], [[şexsî]], [[kesî]]
5a0ejll2w7etvmzkl1eo85f6ewnmnvm
کەسیرە
0
270509
6533305
5874495
2026-09-19T10:52:50Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533305
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kesîre
=== Rengdêr ===
{{rengdêr|ckb}}
# [[qerisî]], [[qefilî]], [[cemidî]], [[tezî]], [[teziyayî]]
fc1rekmbnjhsarx4f6ne0qfo61l7quh
کەسکوون
0
270512
6533306
5874487
2026-09-19T10:52:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533306
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keskûn
=== Rengdêr ===
{{rengdêr|ckb}}
# [[tîj]], xwarina tama wê bihêz
421n4sxjnwf1i5ip0ra3dxjsy278906
کەسکووسۆر
0
270513
6533307
5874485
2026-09-19T10:53:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533307
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keskûsor
=== Navdêr ===
{{navdêr|ckb}}
# [[keskûsor]], [[keskûala]], [[bûka baranê]], bn pelkezêrrîne
42s3hgcai97wpa70i3h29z5r26j5nw5
کەسنەدیو
0
270515
6533308
5874493
2026-09-19T10:53:20Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533308
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kesnedîw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[nedîtî]], [[ kesê-nedîtî]], [[ berê-nedîtî]]
l3tx92yiuomc705tkzck6xihfdhvxii
کەشاکەش
0
270517
6533309
5874499
2026-09-19T10:53:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533309
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keşakeş
=== Navdêr ===
{{navdêr|ckb}}
# [[derd]], [[kul]], [[keder]], [[keser]], [[eger]], [[elem]], [[êş]], [[jan]]
dqz167miv18xi8p6og5zzspld8fbj33
کەشە
0
270518
6533310
5874531
2026-09-19T10:53:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533310
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keşe
=== Navdêr ===
{{navdêr|ckb}}
# [[werz]], [[demsal]], [[car]], [[dem]], [[gav]], [[kêlîk]], [[bîsk]]
f7b6bfhdxn50txn3dvx835s75xfu0cq
کەشەنگ
0
270519
6533311
5874533
2026-09-19T10:53:50Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533311
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keşeng
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kincir]], [[peritî]], [[diriyayî]], [[çiryayî]]
fu0ekg1vhfcfem3t5ew6faqs5zox86z
کەشیش
0
270520
6533312
5874526
2026-09-19T10:54:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533312
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keşîş
=== Navdêr ===
{{navdêr|ckb}}
# [[keşîş]] (di filetiyê de hevberê "feqe" yê misilmanan)
dpi16r1jyhdqj144hajgul02jfvqq33
کەشک
0
270521
6533314
5874513
2026-09-19T10:54:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533314
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keşk
=== Navdêr ===
{{navdêr|ckb}}
# [[keşk]], mastê / şîrê / penîrê hişkkirî
dzkkeol6yjo395r1kuaopmoob5kgruf
کەشکە
0
270522
6533315
5874515
2026-09-19T10:54:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533315
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keşke
=== Navdêr ===
{{navdêr|ckb}}
# [[xwezî]], [[xwezîka]], [[xweziya]], [[xozî]], hêvî dikim ku, baştir e / bû ger
j9tghvtkbqz7dmazi1z26sfi6k22u49
کەشمەکەشم
0
270524
6533316
5874522
2026-09-19T10:54:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533316
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keşmekeşm
=== Navdêr ===
{{navdêr|ckb}}
# [[qerebalix]], [[heytûhot]], [[geremol]]
p41yvsxrw85757ojdyujl2qrsufy8o4
کەشتیگەل
0
270526
6533317
5874501
2026-09-19T10:54:39Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533317
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keştîgel
=== Navdêr ===
{{navdêr|ckb}}
# [[keştîgel]], koma keştiyan, [[fîlo]], [[donenme]]
hd9hmwavudkzy25jrh3z8t4t8vi5cr1
کەشتیوان
0
270527
6533318
5874503
2026-09-19T10:54:49Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533318
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keştîwan
=== Navdêr ===
{{navdêr|ckb}}
# [[keştîvan]], [[keştîgêrr]], kesa/ê karê meşandina keştiyekê dike
064awnsh55mixxdr6olksu99w5ak9fi
کەشتیوانی
0
270528
6533319
5874505
2026-09-19T10:54:59Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533319
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keştîwanî
=== Navdêr ===
{{navdêr|ckb}}
# [[keştîvanî]], [[keştîgêrrî]]
ociikeer5guh06bde6rahdi6g31q6m5
کەشخە
0
270530
6533320
5874507
2026-09-19T10:55:09Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533320
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keşxe
=== Rengdêr ===
{{rengdêr|ckb}}
# [[keşxe]], [[xweşik]], [[delal]], [[spehî]], [[bedew]], [[ciwan]]
ozn3njfz7yiuk4yg2i8quczetaynirg
کەشیە
0
270531
6533321
5874528
2026-09-19T10:55:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533321
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keşye
=== Navdêr ===
{{navdêr|ckb}}
# [[keşye]], [[şaşik]], [[cemedanî]], [[dersok]] (t ya zer ya hecî dikin zerê xwe)
kmo59kabypfatl9ctv3goyg6vf8pyrn
کەشزان
0
270532
6533322
5874509
2026-09-19T10:55:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533322
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keşzan
=== Navdêr ===
{{navdêr|ckb}}
# [[seqanas]], [[hewanas]], kesa/ê bi zanista hewa û seqayê mijûl, [[seqadêr]], [[hewadêr]], kesa/ê di navgînek ragihandinê de (televizyon yan radyo) rewşa seqayê radigihîne
iz6bgtj6m080naay4qi0joienr74a8s
کەشزانی
0
270533
6533323
5874511
2026-09-19T10:55:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533323
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keşzanî
=== Navdêr ===
{{navdêr|ckb}}
# [[seqanasî]], [[hewanasî]]
9mcxqj2myujh98gdeb2p4e193dj9d1y
کەتان
0
270535
6533324
5874416
2026-09-19T10:55:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533324
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:ketan
=== Navdêr ===
{{navdêr|ckb}}
# [[kitan]], [[ketan]], qumaşek e, [[kitan]], [[caw]], [[ketan]]
1m5jn33iqql8dfwpe4eae4cobqffpap
کەتە
0
270538
6533325
5874422
2026-09-19T10:55:59Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533325
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kete
=== Rengdêr ===
{{rengdêr|ckb}}
# [[gir]], [[milpan]], [[mezin]], [[girs]], [[debdebe]], [[gembolan]]
qly0us75csl54ta8yxs1aj5eox9spvu
کەتن
0
270539
6533326
6433626
2026-09-19T10:56:09Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533326
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:ketin
=== Navdêr ===
{{navdêr|ckb}}
# [[lêb]], [[xap]], [[lêhb]], [[hîle]], [[fêl]], [[fen]], [[xapandin]], '':;bn ketin''
==== Anagram ====
* {{anagram|ckb|a=تنکە|تەنک}}
4rvllfp3y3dudqhdtd6zbsho44ab04m
کەتیرە
0
270540
6533327
5874421
2026-09-19T10:56:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533327
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:ketîre
=== Navdêr ===
{{navdêr|ckb}}
# [[gezo]], ava / dewê daran
eumnyeb3wrxyrmu4ulutz6ncmhsirsr
کەوا
0
270542
6533328
5874730
2026-09-19T10:56:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533328
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kewa
=== Navdêr ===
{{navdêr|ckb}}
# [[eba]], hin cûn cilên dirêj
nx55yvikfmlikwgpw2z0ghrwcdg9rob
کەوانکۆشە
0
270544
6533329
5874737
2026-09-19T10:56:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533329
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kewankoşe
=== Navdêr ===
{{navdêr|ckb}}
# [[kevanek]], ev nîşandeka nivîsînê: (, )
t313jz3qest6pqdinepf7wz9xgekb5e
کەوچک
0
270549
6533330
5874751
2026-09-19T10:56:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533330
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kewçik
=== Navdêr ===
{{navdêr|ckb}}
# [[kefçik]], [[kefçî]], [[kevçik]], [[kevçî]], alavek pêxwarinê ye
i4zno6mv38wowjj85ze9jdteqlnz6s7
کەودەن
0
270551
6533331
5874755
2026-09-19T10:57:00Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533331
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kewden
=== Rengdêr ===
{{rengdêr|ckb}}
# [[mejîreş]], kesa/ê ti tiştî fam nake, [[peledîn]], [[tirredîn]], [[hepletiraş]], [[delodîn]], [[bêhiş]]
rmld8wwi6r0n9c4hqk20r93ho89byhh
کەوگیر
0
270555
6533332
5874769
2026-09-19T10:57:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533332
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kewgîr
=== Navdêr ===
{{navdêr|ckb}}
# [[mifsik]], [[heskû]], kefçiyek e di çêkirina xwarinê de bo têkvedanê tê bikaranîn
4t3hlnug4wm4brnochw3ygehgatlijn
کەوژ
0
270558
6533333
5874759
2026-09-19T10:57:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533333
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kewj
=== Navdêr ===
{{navdêr|ckb}}
# [[hez]], [[dilbijî]], [[daxwaz]], [[dildarî]], [[azwerî]], [[arezû]]
cf5x9z2zlodat8n3ivmeepftk40qo2q
کەوژین
0
270559
6533334
5874761
2026-09-19T10:57:30Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533334
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kewjîn
=== Lêker ===
{{lêker|ckb}}
# [[kewjîn]], [[dil bijîn]], [[xwestin]], [[hez kirin]], dil ketin tiştekî
74mlia2yhb11u7kk2imb3rl8lubb7i0
کەوۆت
0
270562
6533335
5874775
2026-09-19T10:57:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533335
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kewot
=== Navdêr ===
{{navdêr|ckb}}
# [[kevot]], [[kevotk]], navê darekê / terraşekê ye
khwbnzvmi71yh9qtan8rb13z99mmiby
کەوتوو
0
270569
6533336
5874749
2026-09-19T10:57:50Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533336
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kewtû
=== Rengdêr ===
{{rengdêr|ckb}}
# [[ketî]], [[keftî]], [[kevtî]]
29ghm7gwdtk2icnpda8rqztl50zil4z
کەی
0
270570
6533337
6433647
2026-09-19T10:58:00Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6533337
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:key
=== Hoker ===
{{hoker|ckb}}
# [[kengî]], [[çi demê]], [[kinga]], [[kingê]], çi wextê, çi çaxê
==== Anagram ====
* {{anagram|ckb|a=کیە|یەک}}
b318aevf0vsz9iwwcawsno6u7bfdy8b
کەیبانوو
0
270571
6533338
5874785
2026-09-19T10:58:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533338
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keybanû
=== Navdêr ===
{{navdêr|ckb}}
# [[kabanî]], [[kevanî]], [[xanim]], [[bermalî]], [[jin]], [[hurmet]]
bsizzfvwpyu2zg8jtticqfwlyl5zfys
کەیل
0
270573
6533339
6433653
2026-09-19T10:58:20Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533339
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keyl
=== Rengdêr ===
{{rengdêr|ckb}}
# [[xemgîr]], [[xemgîn]], [[têrxem]], [[xemba]]
# [[serxweş]], [[mest]], [[sermest]]
==== Anagram ====
* {{anagram|ckb|a=لکیە|لەکی}}
1zhj3gt044qtsvo2xmykanbw8njt8dn
کەیلان
0
270574
6533340
6433558
2026-09-19T10:58:30Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533340
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keylan
=== Rengdêr ===
{{rengdêr|ckb}}
# [[spehî]], [[delal]], [[bedew]], [[şîrîn]], [[şeng]]
==== Anagram ====
* {{anagram|ckb|a=النکیە|کانیلە}}
sipym8cwxusxus8d2zpkwx37dn6jh5c
کەیس
0
270575
6533341
5874787
2026-09-19T10:58:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533341
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:keys
=== Navdêr ===
{{navdêr|ckb}}
# [[delîv]], [[derfet]], [[delîve]], [[keys]], [[şens]]
ob8j6lqihcjb74fc9n0syo7qgssqo2x
کەزی
0
270578
6533342
5874472
2026-09-19T10:58:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533342
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kezî
=== Navdêr ===
{{navdêr|ckb}}
# [[kezî]], pirça / porê hûnandî
8gfiptxy7satipxw6ptxpkboxgfiksu
کێ
0
270579
6533343
5874354
2026-09-19T10:59:00Z
JiyanBot
3048
Cure Cînav hat lêzêdekirin
6533343
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kê
=== Cînav ===
{{cînav|ckb}}
# [[kî]], '':kê: Kê ye? Kî ye? Bo kê ye? Bo kê ye?''
6c2dmj4p4yrrmtc2ny89d7w6k3683vs
کێچ
0
270580
6533344
5874360
2026-09-19T10:59:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533344
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kêç
=== Navdêr ===
{{navdêr|ckb}}
# [[kêç]], [[spih]]
7cnuw210ig2yltx68bpcl6zjnnwwhyf
کێڵراو
0
270584
6533345
5874399
2026-09-19T10:59:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533345
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kêllraw
=== Navdêr ===
{{navdêr|ckb}}
# [[kêlayî]], (ne kûr) [[kolayî]]
lpuh8ya8l2wvlbvetnzd9uwxbv3azr0
کێڕ
0
270586
6533346
5874364
2026-09-19T10:59:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533346
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kêrr
=== Navdêr ===
{{navdêr|ckb}}
# [[xet]], [[rêz]]
o1d0rvcz7qc8yal3tu1lwrvh1l88v5w
کێرزل
0
270588
6533347
5874366
2026-09-19T10:59:40Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533347
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kêrzil
=== Rengdêr ===
{{rengdêr|ckb}}
# [[pozbilind]], [[difinbilind]], kesa/ê xwe pirr mezin dihesibîne
t3l2k2r0blvbpq8gc30cm960u0qdgio
کێرزلی
0
270589
6533348
5874368
2026-09-19T10:59:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533348
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kêrzilî
=== Navdêr ===
{{navdêr|ckb}}
# [[pozbilindî]]
nocpaai7g6w9wenhvyf9xp5b8rd3q44
کێش
0
270590
6533349
5874379
2026-09-19T11:00:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533349
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kêş
=== Navdêr ===
{{navdêr|ckb}}
# [[kêş]], [[kêşandin]], [[kişandin]], [[giranî]], [[qursî]]; [[kêş]], pîvana helbestan
e3oaepa0wvznjpuv00x9wc5x1w2hn8q
کێشانەوە
0
270592
6533350
5874381
2026-09-19T11:00:10Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533350
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kêşanewe
=== Lêker ===
{{lêker|ckb}}
# [[vekişandin]], paşve kişandin / kêşan
eo68lvuxspfgzg1sf5odjzbs9lql4f2
کێشدار
0
270593
6533351
5874382
2026-09-19T11:00:20Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533351
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kêşdar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[dirêjvekêş]], bûyera demek dirêj didome
f7myzae8q7pal33pbk9ztzihkywoy9e
کێشە
0
270594
6533352
5874391
2026-09-19T11:00:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533352
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kêşe
=== Navdêr ===
{{navdêr|ckb}}
# [[pirsgirêk]], [[arîşe]], [[kêşe]], [[problem]], [[girift]], [[dubend]]
# [[ked]], [[rênc]], [[rêncberî]]
qxzppwmfpgolbaogmngy5awlw7h9mnp
کێشمان
0
270596
6533353
5874385
2026-09-19T11:00:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533353
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kêşman
=== Navdêr ===
{{navdêr|ckb}}
# [[kêşman]], dirêjker: gurîsî kêşman werîsê kêşman, werîsê li werîsek din hatiye zêdekirin daku dirêjtir bibe û bigihe ciyekî
6talqzoyt4ln9qxyxbvz00lp1w8oj5v
کێشمەکێش
0
270597
6533354
5874386
2026-09-19T11:00:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533354
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kêşmekêş
=== Navdêr ===
{{navdêr|ckb}}
# [[şerenîx]], [[nîgaş]], [[gengeşe]], [[rikmane]]
hexoqxysjjdm7m9d13tz3zo7180nnpe
کێشراو
0
270599
6533355
5874384
2026-09-19T11:01:00Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533355
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kêşraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kêşayî]], [[kişandî]], [[kêşandî]]
i1g8qnpbg1z4b7njqkn70awtbmzml91
کێویلە
0
270602
6533356
5874408
2026-09-19T11:01:10Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533356
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kêwîle
=== Rengdêr ===
{{rengdêr|ckb}}
# [[dêm]], [[beyar]], giyayê / fêkiyê bi xwe (ne bi avdana bi destê mirovan) çêdibin
fhf5jatjrbab2vxfe64o86zt8ujyhy5
کچەزا
0
270607
6533357
5873209
2026-09-19T11:01:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533357
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kiçeza
=== Navdêr ===
{{navdêr|ckb}}
# [[keçeza]], [[nevî]], zarokên keça kesekî
bb45z2dqe8ymitg8v6s2l2rqyal46tb
کچکۆڵە
0
270609
6533358
5873202
2026-09-19T11:01:30Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533358
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kiçkolle
=== Rengdêr ===
{{rengdêr|ckb}}
# [[biçûk]], [[biçûkok]], [[biçkok]]
n429ek6opcerbipo2hm736ew43k1ibk
کفندڕ
0
270612
6533359
5873547
2026-09-19T11:01:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533359
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kifindirr
=== Navdêr ===
{{navdêr|ckb}}
# [[kifindirrîn]], ya / yê rê lê nikare bêt girtin, [[berxwedêr]]
3qhl9hl0epzawr9l7d08a1h3gg7mno2
کڵاشچن
0
270620
6533360
5873564
2026-09-19T11:01:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533360
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:killaşçin
=== Navdêr ===
{{navdêr|ckb}}
# [[kalikker]], [[kalikçêker]]
c0uh0jr2n545x8e5fxstfvr36wvz1mr
کڵاواسن
0
270622
6533361
5873578
2026-09-19T11:02:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533361
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:killawasin
=== Navdêr ===
{{navdêr|ckb}}
# [[kumzirx]], [[kumasin]], [[kulavasin]], kumê / kulavê madenî / asinî / hesinî
79xh7n8w0qaeuwdnluksoadrdizmgaq
کڵاوقژ
0
270625
6533362
5873580
2026-09-19T11:02:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533362
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:killawqij
=== Navdêr ===
{{navdêr|ckb}}
# [[perûk]], pirça / porrê çêkirok / nerastîn
q4eqpw31avkgwfaplktlse9snd39fzt
کڵاوزرێ
0
270626
6533363
5873579
2026-09-19T11:02:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533363
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:killawzirê
=== Navdêr ===
{{navdêr|ckb}}
# [[kumzirx]], [[kumasin]], kumê / kulavê madenî / asinî / hesinî
543jbh79gv0dlnhucl6syu0ipiwiyik
کلچان
0
270627
6533364
6433668
2026-09-19T11:02:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533364
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kilçan
=== Navdêr ===
{{navdêr|ckb}}
# [[fanos]], [[lampe]]
==== Anagram ====
* {{anagram|ckb|a=النچک|لچکان}}
90ohs4ea8nc0ztui275kkl2r49t32ut
کلدان
0
270629
6533365
5873589
2026-09-19T11:02:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533365
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kildan
=== Navdêr ===
{{navdêr|ckb}}
# [[kilda]]
# [[kildank]], cihê alavên kildanê tê de tên parastin / ragirtin
7wg3llun0tdjgt7pxpzkiggul4gopvr
کلدوومان
0
270630
6533366
5873591
2026-09-19T11:02:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533366
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kildûman
=== Navdêr ===
{{navdêr|ckb}}
# [[mij]], [[moran]], [[dû]], mij û moran
ene7url9135erd7eby4dgdkwdjkqqtp
کلەر
0
270631
6533367
5873627
2026-09-19T11:03:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533367
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kiler
=== Navdêr ===
{{navdêr|ckb}}
# [[embar]], [[depo]]
qw85mhimmbtl7i9rol6wz6o5j03j8gs
کڵێس
0
270632
6533368
5873619
2026-09-19T11:03:10Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533368
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:killês
=== Rengdêr ===
{{rengdêr|ckb}}
# [[birihayî]], [[qelihayî]], [[qir]], [[nemayî]], [[demborî]], [[kevnbûyî]]
ecas2xmadojsxi69p3hix9o82hih0gb
کڵێشە
0
270635
6533369
5873621
2026-09-19T11:03:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533369
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:killêşe
=== Navdêr ===
{{navdêr|ckb}}
# [[kefş]], [[binkefş]], [[gulte]]
kqxaty3s8cweu2x9cwtqsi1rg9q0rwm
کڵفت
0
270636
6533370
5873592
2026-09-19T11:03:30Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533370
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:killift
=== Rengdêr ===
{{rengdêr|ckb}}
# [[stûr]], [[qalind]], [[asê]]
fkzhzew6ojg4czobrstkmgoidfooza6
کلیل
0
270637
6533371
5873623
2026-09-19T11:03:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533371
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kilîl
=== Navdêr ===
{{navdêr|ckb}}
# [[kilîl]], [[kilît]], [[vekerk]], [[enextar]]
dkoa8nh7y7ck06dgwq9g33q78qvno6a
کلیم
0
270638
6533372
5873625
2026-09-19T11:03:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533372
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kilîm
=== Navdêr ===
{{navdêr|ckb}}
# [[kilîm]], [[xalîçe]], [[berik]], [[mehfûr]], [[merş]]
j5a45oxdh92imn4apzbcwr0vdiv3qlv
کڵۆڵ
0
270641
6533373
5873615
2026-09-19T11:04:00Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533373
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:killoll
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bextreş]], [[bêsiûd]]
f083hb76fnj12jwg254rbun7ss8wu3p
کڵۆڵی
0
270642
6533374
5873616
2026-09-19T11:04:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533374
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:killollî
=== Navdêr ===
{{navdêr|ckb}}
# [[bextreşî]], [[bêsiûdî]]
ev12n2cn88vveajga8qiqesn4r229ay
کڵۆر
0
270643
6533375
5873613
2026-09-19T11:04:20Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533375
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:killor
=== Rengdêr ===
{{rengdêr|ckb}}
# [[xulole]], dara jixwe kunek yekderî li qurmê wê heye
ky2ko2yfbhyc6ey35n10pdr444e4uqn
کڵپە
0
270645
6533376
5873583
2026-09-19T11:04:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533376
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:killpe
=== Navdêr ===
{{navdêr|ckb}}
# [[qirç]], [[qirçik]], [[çirûsk]], [[çirîsk]] (yên agirî)
bviba9wr566rjof0c00uac5an2z4qvk
کڵپووھووڕ
0
270646
6533377
5873582
2026-09-19T11:04:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533377
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:killpûhûrr
=== Navdêr ===
{{navdêr|ckb}}
# [[gurmij]], agirê pir gur
eo8o84k82p0kowfayftdan6s2uqzs38
کنە
0
270650
6533378
6433683
2026-09-19T11:04:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533378
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kine
=== Navdêr ===
{{navdêr|ckb}}
# [[lêkolîn]], [[hûrlênerî]], [[ezmûn]], [[ceribandin]], [[vekolîn]]
==== Anagram ====
* {{anagram|ckb|a=نکە|کەن}}
tgzo291jslrb8mmeyfz1ov9wfd1u32e
کنەکار
0
270651
6533379
5873794
2026-09-19T11:05:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533379
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kinekar
=== Navdêr ===
{{navdêr|ckb}}
# [[lêkol]], [[hûrlêner]], [[ezmûnker]], [[cerribîner]], [[vekol]]
7uyg6kmaw4hcfbcm7k6zyhx0zh83r3z
کنگدەر
0
270654
6533380
5873768
2026-09-19T11:05:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533380
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kingder
=== Navdêr ===
{{navdêr|ckb}}
# [[qûnde]], [[qûnder]], kesê qûna xwe dide / difiroşe (herw, [[ mecazî)]]
cskb30612t8k0ptfe3jnjs71oshg1t6
کراس
0
270662
6533381
5873218
2026-09-19T11:05:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533381
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kiras
=== Navdêr ===
{{navdêr|ckb}}
# [[kiras]], [[gumlek]], [[qemûs]]
ru41cxxjmatoy6uxlf08fd7w7dd9ya4
کراو
0
270663
6533382
5873219
2026-09-19T11:05:30Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533382
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kiraw
=== Lêker ===
{{lêker|ckb}}
# [[kirî]], [[hatî kirin]], (ya / yê) hatiye kirin
6qzdc1pr72qul67i47b79x7drw476ps
کرداری
0
270666
6533383
5873238
2026-09-19T11:05:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533383
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kirdarî
=== Navdêr ===
{{navdêr|ckb}}
# [[kirarî]], [[pratîkî]], [[jiyanî]]
27as2f5q61ubtzwkp74o21ap2pp6v41
کردە
0
270667
6533384
5873256
2026-09-19T11:05:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533384
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kirde
=== Navdêr ===
{{navdêr|ckb}}
# [[kar]], [[xebat]] :Kirdey min û birdey ewe Ez dikim û ew dixwe
ih8ooew2wetznbu061tcb8kmcz0brg0
کردەگار
0
270668
6533385
5873260
2026-09-19T11:06:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533385
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:Kirdegar
=== Navdêr ===
{{navdêr|ckb}}
# [[Yezdan]], [[Afirîner]], [[Xwedê]]
st6569eyg32x1b7858wgo613xjh8hp7
کردەکار
0
270669
6533386
6433564
2026-09-19T11:06:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533386
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kirdekar
=== Navdêr ===
{{navdêr|ckb}}
# [[rêveber]], [[çêker]]
==== Anagram ====
* {{anagram|ckb|a=ادررککە|کارکردە}}
0ljb8m8vfmwv5r140n77gllfubrfcok
کڕە
0
270672
6533387
6433689
2026-09-19T11:06:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533387
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kirre
=== Navdêr ===
{{navdêr|ckb}}
# [[conî]], [[cuhnî]], [[destarr]]
==== Anagram ====
* {{anagram|ckb|a=ڕکە|ڕکە|کەڕ}}
ccz0072s4m051p6j15dp447l7imotdm
کڕەک
0
270673
6533388
5873343
2026-09-19T11:06:30Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533388
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kirrek
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bêruh]], [[nejîndar]]
3cz90fr86rk9utn6m5j2x1tirxy3dao
کرێکاری
0
270677
6533389
5873335
2026-09-19T11:06:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533389
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kirêkarî
=== Navdêr ===
{{navdêr|ckb}}
# [[paletî]], [[kedkarî]], [[karkerî]], [[palehî]], [[şolkerî]], [[îşkerî]]
p3id94m3ja5rltor9iqrprxdb2xx42j
کڕێشاوی
0
270680
6533390
5873331
2026-09-19T11:06:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533390
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kirrêşawî
=== Navdêr ===
{{navdêr|ckb}}
# [[keveşkî]], [[kepekî]], [[pabawî]], [[serebêjî]]
pajymcm0jhgqg804b1o67sjm6tvirwf
کرسپ
0
270682
6533391
5873262
2026-09-19T11:07:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533391
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kirisp
=== Navdêr ===
{{navdêr|ckb}}
# [[kerefs]], giyayek xwarber e
f3nh713u06unalzndhungmav3ww29wy
کریڤ
0
270683
6533392
5873333
2026-09-19T11:07:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533392
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kirîv
=== Navdêr ===
{{navdêr|ckb}}
# [[heval]], [[hogir]], [[dost]], [[yar]], [[xizm]], [[lêzim]], [[mirov]], [[eqreba]]
5hjzqdye4hfe6c88q8eodnvnrc1ckh0
کرمدڵ
0
270690
6533393
5873289
2026-09-19T11:07:20Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533393
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kirmdill
=== Rengdêr ===
{{rengdêr|ckb}}
# [[biguman]], [[bişik]], [[kirmdil]]
b130t6aadigsx30ras8f8z27zaglx45
کرتناک
0
270695
6533394
5873225
2026-09-19T11:07:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533394
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kirtnak
=== Navdêr ===
{{navdêr|ckb}}
# [[tîrok]]
po7g9fxe2lml7itlji0tsjt43hcyl6x
کڕووھوڕ
0
270696
6533395
5873309
2026-09-19T11:07:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533395
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kirrûhurr
=== Navdêr ===
{{navdêr|ckb}}
# [[dengûdor]], dengê bilind û berdewam
fnpmtlprz3x98m45gni5s9gqf397np6
کڕووزانەوە
0
270697
6533396
5873304
2026-09-19T11:07:50Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533396
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kirrûzanewe
=== Lêker ===
{{lêker|ckb}}
# [[kizîn]] (girîna zarokan / savayan)
7jvgvfzcms4wghwltlmuegaeseuqldu
کڕووزە
0
270698
6533397
5873306
2026-09-19T11:08:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533397
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kirrûze
=== Navdêr ===
{{navdêr|ckb}}
# [[kiz]], [[kizgirî]], giriyê savayan / zarokan
8y1wvuf1mq71dc6mk5dw1dau2liuuku
کڕیار
0
270699
6533398
5873323
2026-09-19T11:08:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533398
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kiryar
=== Navdêr ===
{{navdêr|ckb}}
# [[bikir]], [[kiryar]], kesa/ê dikirre, [[mişterî]]
kxwn7hkijr4bln1970zs5xapz56kv9t
کسپ
0
270700
6533399
5873377
2026-09-19T11:08:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533399
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kisp
=== Navdêr ===
{{navdêr|ckb}}
# [[kerb]], [[kîn]], [[qehr]]
f629drkleinaifyt5e62zg9nlk2j6e5
کسپووکۆ
0
270701
6533400
5873380
2026-09-19T11:08:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533400
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kispûko
=== Navdêr ===
{{navdêr|ckb}}
# [[kerb]], [[kîn]], [[qehr]], [[kerb û kîn]]
19b1efjlebrheiwy3s8hpf992dlj48r
کشان
0
270703
6533401
5873408
2026-09-19T11:08:40Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533401
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kişan
=== Lêker ===
{{lêker|ckb}}
# [[kişîn]], [[kêşîn]], xwe kişandin / kêşan, '': xwişîn; [[qeliqîn]], [[velivîn]], [[lebitîn]]; (stêr) [[darijîn]], xwiricîn; [[jêk çûn]], ji hev çûn''
890syde98oxr7euw9pi356gimqkchnt
کشت
0
270704
6533402
6527449
2026-09-19T11:08:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533402
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kişt
=== Navdêr ===
{{navdêr|ckb}}
# [[çandin]], [[cotkarî]], [[çandinî]], [[zîraet]]
== {{ziman|fa}} ==
=== Bilêvkirin ===
:kişt
=== Rengdêr ===
{{rengdêr|fa}}
# [[çandin]], [[cotkarî]], [[çandinî]], [[zîraet]]
==== Anagram ====
* {{anagram|fa|a=تشک|تشک}}
7i0zrucckk103n9v5g9v8jorax1i6ob
کشتەک
0
270705
6533403
5873465
2026-09-19T11:09:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533403
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kiştek
=== Navdêr ===
{{navdêr|ckb}}
# [[ben]], [[dezî]], [[rîs]], [[benik]], [[ta]]
3jje1pgv1w06q00f5xdsbnp3ogtwuyf
کشتگەھ
0
270706
6533404
5873423
2026-09-19T11:09:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533404
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kiştgeh
=== Navdêr ===
{{navdêr|ckb}}
# [[cotgeh]], [[çandingeh]], [[zevî]]
rj0d5l5w454jingvzeokwtmd0fhr9sx
کشتکار
0
270707
6533405
5873421
2026-09-19T11:09:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533405
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kiştkar
=== Navdêr ===
{{navdêr|ckb}}
# [[cotkar]], [[cotyar]], [[çîner]]
t7islzcefu85f25p93gvbuajywyziib
کشووماتی
0
270710
6533406
5873489
2026-09-19T11:09:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533406
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kişûmatî
=== Navdêr ===
{{navdêr|ckb}}
# [[mitî]], [[kirî]], [[bêdengî]], [[bêpêjnî]], [[bindestî]], [[ çewisandinî]]
rj7v3ssmf06gcjud88gne9z3ppourhz
کتێبەڤان
0
270713
6533407
5873185
2026-09-19T11:09:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533407
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kitêbevan
=== Navdêr ===
{{navdêr|ckb}}
# [[pirtûkxanevan]], kesa/ê li ber pirtûkxaneyekê kar dike
anm9kizl50m1tmh7ulbancjy6bbpkyv
کتک
0
270716
6533408
5873176
2026-09-19T11:09:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533408
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kitik
=== Navdêr ===
{{navdêr|ckb}}
# [[kitik]], [[pisîk]], [[pişîk]]
== {{ziman|fa}} ==
=== Mane ===
{{bêcure|fa}}
# [[gumisk]], [[hitik]]
mpnwnj83h2zc0h9jiur87i8983c8yt3
کتکنەوتینە
0
270717
6533409
5873179
2026-09-19T11:10:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533409
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kitiknewtîne
=== Navdêr ===
{{navdêr|ckb}}
# [[belakir]], kesa/ê dixwaze her belayan peyda bike
pj0owc42zcc1j08rlfr0rla5m7y1ocj
کتکی
0
270718
6533410
5873180
2026-09-19T11:10:10Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533410
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kitkî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kufîkî]], [[kifîkî]], [[rizî]], [[genî]], [[fistewî]]
1vp8p1e5ylr9a8pgaopepmsjw3amhkv
کوێلە
0
270721
6533411
5874156
2026-09-19T11:10:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533411
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kiwêle
=== Navdêr ===
{{navdêr|ckb}}
# [[kole]], [[xulam]], [[xizmetkar]], [[berdestk]]
57qlvmb4zfulyijfvjba9a0zvrkwjch
کوێلەیی
0
270724
6533412
5874162
2026-09-19T11:10:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533412
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kiwêleyî
=== Navdêr ===
{{navdêr|ckb}}
# [[koleyî]], [[koletî]], rewşa koleyan
34u50l74ixm617xjmvln6axi9l3gh9v
کوێرانە
0
270728
6533413
5874140
2026-09-19T11:10:40Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533413
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kiwêrane
=== Rengdêr ===
{{rengdêr|ckb}}
# [[korane]], mîna koran
s1trt73167eez59dt9qa8el2nnb84no
کوێرەمار
0
270733
6533414
5874148
2026-09-19T11:10:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533414
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kiwêremar
=== Navdêr ===
{{navdêr|ckb}}
# [[koremar]]
mcldsou473ycg325nlebskvp8wok7ky
کوێرەڕێ
0
270735
6533415
5874145
2026-09-19T11:11:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533415
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kiwêrerrê
=== Navdêr ===
{{navdêr|ckb}}
# [[korerê]], rêya dawî lê tê û bi derek din ve naçe, [[tengerê]], rêya teng
113klxrmwd0kl4svhis3gwy1sazlw1w
کوێرەوەری
0
270737
6533416
5874152
2026-09-19T11:11:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533416
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kiwêrewerî
=== Navdêr ===
{{navdêr|ckb}}
# [[tengasî]], [[tengavî]], rewşa dijwar
68zs3nqdamnr4hkark2iv9phm7brbnz
کوێخا
0
270743
6533417
5874137
2026-09-19T11:11:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533417
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kiwêxa
=== Navdêr ===
{{navdêr|ckb}}
# [[axa]], [[muxtar]], serokê / serdarê gundekî / hozekî / êlekî / eşîrekî
k19a63ssg1dw438ekevcfwkyeywbkw2
کوێخایەتی
0
270744
6533418
5874138
2026-09-19T11:11:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533418
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kiwêxayetî
=== Navdêr ===
{{navdêr|ckb}}
# [[axatî]], [[muxtarî]], [[serdarî]]
rab8t6d8osgun60kohrbukjabep2nh5
کخ
0
270745
6533419
5873210
2026-09-19T11:11:40Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6533419
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kix
=== Hoker ===
{{hoker|ckb}}
# [[kix]], pîs e, [[nexwe]], biavêje (bo bangkirina li zarokan)
0h2n5zyholrzq2usagnmnstn0hov8ca
کزر
0
270750
6533420
5873354
2026-09-19T11:11:50Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533420
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kizir
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kizir]], [[nîvziwa]], erda ne herrî û ne jî toz
3mpp26eaxmymrxa0wsum0huzt29p6u2
کزۆڵە
0
270752
6533421
5873356
2026-09-19T11:12:00Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533421
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kizolle
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kizok]], [[bêhêvî]], [[dilsar]]
962lnkn9tzws35n61mxvcbipc2c0ybq
کیسەڵ
0
270756
6533422
5874378
2026-09-19T11:12:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533422
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kîsell
=== Navdêr ===
{{navdêr|ckb}}
# [[kûs]], [[kûsî]], [[kûsele]], [[req]]
hqgty3gdy35jolg7epggjpc8uclvgj4
کیشوەر
0
270757
6533423
5874388
2026-09-19T11:12:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533423
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kîşwer
=== Navdêr ===
{{navdêr|ckb}}
# [[kîşwer]], [[parzemîn]], [[qita]], [[kontînent]]
3rozd2ud5gzbr4dyr9hrejn5nyjporb
کیشوەری
0
270759
6533424
5874390
2026-09-19T11:12:30Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533424
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kîşwerî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kîşwerî]], [[parzemînî]], [[qitayî]], [[kontînental]]
sv11d58icex877edsf5gu86l12nzijz
کیتەڵە
0
270760
6533425
5874358
2026-09-19T11:12:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533425
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kîtelle
=== Navdêr ===
{{navdêr|ckb}}
# [[cerik]], [[cer]]
py1bjt9ygdc4rr395qeuiqah1uaywkt
کۆبوونەوە
0
270764
6533426
5874170
2026-09-19T11:12:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533426
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kobûnewe
=== Navdêr ===
{{navdêr|ckb}}
# [[kombûn]], [[civîn]]
7uhtu3b78se5bwf6gf38u89rfb38gjq
کۆجەڵە
0
270765
6533427
5874186
2026-09-19T11:13:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533427
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kocelle
=== Navdêr ===
{{navdêr|ckb}}
# [[kas]], [[kasik]], [[tirar]], [[tirark]] (amanek / firaxek e)
nddaslkh1thp9tyrvvkze8bsqkvz66e
کۆچ
0
270766
6533428
5874188
2026-09-19T11:13:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533428
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:koç
=== Navdêr ===
{{navdêr|ckb}}
# [[koç]], [[ (mal)barkirin]], ji ciyekî bar kirin cihek dî
n981gucqddvvb4ioj94gxiyt36xa4vz
کۆچاوکۆچ
0
270767
6533429
5874190
2026-09-19T11:13:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533429
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:koçawkoç
=== Navdêr ===
{{navdêr|ckb}}
# [[koçerî]], koçkirina berdewam
qzy93b8bu15xivs4blg1mu42pqfv6sg
کۆچەک
0
270768
6533430
5874202
2026-09-19T11:13:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533430
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:koçek
=== Navdêr ===
{{navdêr|ckb}}
# [[koçek]], [[gerro]]
# [[koçek]] (hin alim û zanayên êzidiyan in)
h5ulto0kgum9gnad7631oqcm6g690dg
کۆچەکە
0
270769
6533431
5874204
2026-09-19T11:13:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533431
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:koçeke
=== Navdêr ===
{{navdêr|ckb}}
# [[kum]], [[kulav]] (t cûnek kulavên bo jinan)
8ya8krxb694ycetpm3eierqk6dpcude
کۆچەرێتی
0
270771
6533432
5874200
2026-09-19T11:13:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533432
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:koçerêtî
=== Navdêr ===
{{navdêr|ckb}}
# [[koçertî]], (awayê) jiyana koçeran
g0aqtj27uk8ikawsel6lj8bdho83ybw
کۆچەری
0
270772
6533433
5874198
2026-09-19T11:14:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533433
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:koçerî
=== Navdêr ===
{{navdêr|ckb}}
# [[koçerî]], mîna koçeran
ldqopifuy348tcwmcpko9y8o6gxrxfv
کۆچی
0
270773
6533434
5874194
2026-09-19T11:14:10Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533434
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:koçî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[koçî]], [[hicrî]], salnameya îslamî
n3bbrboswdat05p5qua5cpzc8um7srz
کۆچکەر
0
270774
6533435
5874192
2026-09-19T11:14:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533435
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:koçker
=== Navdêr ===
{{navdêr|ckb}}
# [[koçker]], [[gerok]], [[geştiyar]]
poqfspd1v0radhri6g1p0byoz9ri0l5
کۆد
0
270775
6533436
5874211
2026-09-19T11:14:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533436
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kod
=== Navdêr ===
{{navdêr|ckb}}
# [[den]], [[dewlik]], [[bîdon]], '':zerik (amanek e şîrî ji bizinan / mihan didoşinê)''
c0ee2op2j29lxcxgak0qvtikew0lmsb
کۆفرۆش
0
270776
6533437
5874247
2026-09-19T11:14:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533437
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kofiroş
=== Navdêr ===
{{navdêr|ckb}}
# [[komfiroş]], kesa/ê yan şirketa tiştan kom bi kom difiroşe
cqil8895jrbxjl3jc35vbxj0ou6g4ab
کۆژە
0
270778
6533438
5874229
2026-09-19T11:14:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533438
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:koje
=== Navdêr ===
{{navdêr|ckb}}
# [[pisto]], [[pistok]], [[berstu]], [[berstuk]], [[yax]], [[girîvan]]
tshezmuhd1mq840d5q3c03jua9x338r
کۆژۆ
0
270779
6533439
5874227
2026-09-19T11:15:00Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533439
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kojo
=== Rengdêr ===
{{rengdêr|ckb}}
# [[xirab]], [[xopan]], [[kembax]]
3a6a6du5bk9sndpd0i3l1ndnrv89oym
کۆکردنەوە
0
270780
6533440
5874253
2026-09-19T11:15:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533440
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kokirdinewe
=== Navdêr ===
{{navdêr|ckb}}
# [[berhevkirin]], [[komkirin]], [[berhevkarî]]
94glhyjvsunkeengzs3inberi82b7to
کۆکەکۆک
0
270782
6533441
5874259
2026-09-19T11:15:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533441
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kokekok
=== Navdêr ===
{{navdêr|ckb}}
# [[kuxekux]], kuxîna berdewam
cgx9jt8wy7tlg45kwnynqqd6zbo1d68
کۆکێتی
0
270783
6533442
5874255
2026-09-19T11:15:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533442
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kokêtî
=== Navdêr ===
{{navdêr|ckb}}
# [[lihevkirin]], [[pêkhatin]], [[sulh]]
ibido4jpigc7pe87w2aer9k8hsqc40h
کۆڵانکوت
0
270787
6533443
5874268
2026-09-19T11:15:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533443
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kollankut
=== Navdêr ===
{{navdêr|ckb}}
# [[kolanî]], [[gerok]], kesa/ê li kolanan dijî (ango ne di xaniyekî ve / ne li mala xwe)
ryy3tj4tdpcnneljw3tfxwi5xl9ji1m
کۆڵارە
0
270788
6533444
5874261
2026-09-19T11:15:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533444
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kollare
=== Navdêr ===
{{navdêr|ckb}}
# (yariyeke) [[firfirok]], pirpirok (navê pêlîstokekê ye ku têt firandin
# (ballendeke) [[kolare]], [[qereqûş]], [[xertel]], [[qertal]] (navê firindeyekî ye)
7uv22cj7v8q9w3tdaikjlh5zzdw44jf
کۆڵەر
0
270790
6533445
5874300
2026-09-19T11:16:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533445
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:koller
=== Navdêr ===
{{navdêr|ckb}}
# [[koler]], kesa/ê tiştekî dikol
# [[vekoler]], [[lêkolîner]], kesa/ê azmûnan li ser tiştan dike
h2fs65c93z4bzs114oashkzu31cwwus
کۆڵھەڵگر
0
270794
6533446
5874286
2026-09-19T11:16:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533446
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kollhellgir
=== Navdêr ===
{{navdêr|ckb}}
# [[piştohilgir]], [[piştîhilgir]], [[hemal]]
rsnl1pb3jw1ra30umqhu2h3u19ycz6t
کۆڵنج
0
270795
6533447
5874278
2026-09-19T11:16:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533447
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kollinc
=== Navdêr ===
{{navdêr|ckb}}
# [[qolinc]], [[milreqî]], êşîna ji ber reqiya navbera <st1:City><st1:place>milan</st1:place></st1:City> û patikê
izhhbekrz4fql2d4nvccopc9q7gtwre
کۆڵنگە
0
270797
6533448
5874282
2026-09-19T11:16:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533448
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kollinge
=== Navdêr ===
{{navdêr|ckb}}
# [[patik]], [[paşstu]], [[pate]], [[stukur]]
h9q2ott037ovww658p7sfqowcl10exi
کۆڵین
0
270798
6533449
5874294
2026-09-19T11:16:40Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533449
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kollîn
=== Lêker ===
{{lêker|ckb}}
# [[kolîn]], [[kolan]], [[kolandin]], [[kêlîn]], [[kêlan]], [[kêlandin]]
dt3ui70l06dipz5wbbt9e3g68emdgpo
کۆڵینەوە
0
270799
6533450
5874296
2026-09-19T11:16:50Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533450
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kollînewe
=== Lêker ===
{{lêker|ckb}}
# [[vekolîn]], [[lê kolîn]]
2pzrhe1aqzi8xrqe7bn7u62bde0eooe
کۆڵیت
0
270801
6533451
5874290
2026-09-19T11:17:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533451
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kollît
=== Navdêr ===
{{navdêr|ckb}}
# [[kolik]], [[xanîk]], [[kox]], [[koxik]], [[stargeh]], [[asêgeh]], [[senger]]
679dzqmqkapv5vrx62nrr1r4lqaz3dg
کۆڵکێش
0
270802
6533452
5874274
2026-09-19T11:17:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533452
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kollkêş
=== Navdêr ===
{{navdêr|ckb}}
# [[piştokêş]], [[piştîhilgir]]
bcbtt022myzfvw0r6s2hj8l69e06x28
کۆڵنەدەر
0
270803
6533453
5874284
2026-09-19T11:17:20Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533453
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kollneder
=== Rengdêr ===
{{rengdêr|ckb}}
# [[xweragir]], [[xurt]], kesa/ê (bi asanî) rê nade ku kesek zora wê / wî bibe
r13aant9azgfpb4sz1z37jclsjj790x
کۆڵراو
0
270804
6533454
5874270
2026-09-19T11:17:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533454
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kollraw
=== Navdêr ===
{{navdêr|ckb}}
# [[kolî]], [[qewartî]], [[kolayî]], tiştên (darên / kevirên) hatine kolandin
nxdmyakymrbbx6msoh3hsj6h9e8xoyb
کۆماری
0
270808
6533455
5874310
2026-09-19T11:17:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533455
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:komarî
=== Navdêr ===
{{navdêr|ckb}}
# [[komarî]], [[cimhûrî]], [[cumhûrî]]
fdoebhu7q5d6t24ps3ebsxxer37tows
کۆماوە
0
270809
6533456
5874312
2026-09-19T11:17:50Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533456
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:komawe
=== Rengdêr ===
{{rengdêr|ckb}}
# [[qozbûyî]], [[kûzbûyî]], [[xûzbûyî]], [[qilûzbûyî]]
j2j3em1tmbtgywmohvqct1hflc2tka6
کۆمەڵزان
0
270816
6533457
5874328
2026-09-19T11:18:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533457
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:komellzan
=== Navdêr ===
{{navdêr|ckb}}
# [[civaknas]], [[sosyolog]]
tcekkzn8tp8n4bnkf5djfiqpd7jicy5
کۆمەڵزانی
0
270817
6533458
5874330
2026-09-19T11:18:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533458
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:komellzanî
=== Navdêr ===
{{navdêr|ckb}}
# [[civaknasî]], [[sosyolojî]]
5852uq8oxrgcg1jpqw73uk5j35hphkl
کۆمفرۆش
0
270818
6533459
5874314
2026-09-19T11:18:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533459
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:komfiroş
=== Navdêr ===
{{navdêr|ckb}}
# [[komfiroş]], kesa/ê yan şirketa eşya li ser hev difiroşe
=== Dijmane ===
* [[kitfiroş]]
haiucyuvt1ncl7yppl8nzo8zov8oygo
کۆمفرۆشی
0
270819
6533460
5874316
2026-09-19T11:18:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533460
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:komfiroşî
=== Navdêr ===
{{navdêr|ckb}}
# [[komfiroş]], firotina eşya li ser hev, [[dijw]], [[kitfiroşî]]
rtpx5z5afl2ebmkh5e5dh8i7wyeh0u7
کۆمی
0
270820
6533461
5874318
2026-09-19T11:18:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533461
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:komî
=== Navdêr ===
{{navdêr|ckb}}
# (pişt) [[qozî]], [[xûzî]], [[kûzî]], [[qilûzî]]
n596xfeggrgfe4c3tylikjxbkta5uvj
کۆنە
0
270822
6533462
5874340
2026-09-19T11:18:50Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533462
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kone
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kincir]], [[kevne]], [[kevnekincir]], tiştên (t cilên) kevn, [[kevnenû]], tiştên (t cilên) hatine bikaranîn lê hê pûç nebûne
czlcuh73x8ttkkyqwfwm37zmlr8tee1
کۆنەفرۆش
0
270824
6533463
5874352
2026-09-19T11:19:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533463
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:konefiroş
=== Navdêr ===
{{navdêr|ckb}}
# [[kevnefiroş]], kesa/ê yan şirketa tiştên kevnenû difiroşe
472oa9nl8fubh3orjuo932v2rj7sy3m
کۆنەپەرستی
0
270826
6533464
5874348
2026-09-19T11:19:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533464
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:koneperistî
=== Navdêr ===
{{navdêr|ckb}}
# [[kevneperestî]], perestina irf û edetên berê û dijberiya nûbûnê
ja4y4ymplff08us1ujwyqfd0sk07ljh
کۆنەپۆش
0
270827
6533465
5874344
2026-09-19T11:19:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533465
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:konepoş
=== Navdêr ===
{{navdêr|ckb}}
# [[kinc]], cil û bergên mêjîn (ne nûjen / modern)
inns73l365wjsam0eyjh4gf8p7jknnv
کۆنەساڵ
0
270828
6533466
5874350
2026-09-19T11:19:30Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533466
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:konesall
=== Rengdêr ===
{{rengdêr|ckb}}
# [[pîr]], [[salmend]]
jkw81rj7bkyafvc9xmm9mw9gn0pjncu
کۆنی
0
270829
6533467
5874336
2026-09-19T11:19:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533467
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:konî
=== Navdêr ===
{{navdêr|ckb}}
# [[kevnî]], [[kevntî]], [[kevnatî]]
fc6rux0okto05yu8h7byfszj0ltd2b7
کۆنینە
0
270830
6533468
5874338
2026-09-19T11:19:50Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533468
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:konîne
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kevnar]], [[kevnare]], [[mêjîn]], [[dêrîn]], [[qedîm]], [[antîk]], (tiştek zemanê) [[berê]]
qf0tqa10lnbo472wbhnq27a0ug4e7ko
کۆپارە
0
270831
6533469
5874174
2026-09-19T11:20:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533469
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kopare
=== Navdêr ===
{{navdêr|ckb}}
# [[kovik]], [[qozik]], [[xûzik]], cihê bilind yê pişta hêştiran
ldukxh2ucomu29blvmhflci27a0k6di
کۆڕگە
0
270833
6533470
6433386
2026-09-19T11:20:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533470
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:korrge
=== Navdêr ===
{{navdêr|ckb}}
# [[civang]], [[encûmen]], [[şûra]]
==== Anagram ====
* {{anagram|ckb|a=ڕکگۆە|گەڕۆک}}
kihfz2fbbgyv2x0g2x9cqkcskyuxsy7
کۆسە
0
270837
6533471
6433701
2026-09-19T11:20:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533471
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kose
=== Navdêr ===
{{navdêr|ckb}}
# [[semasî]], [[sêmasî]], dirrindeyek avî ye (ing, [[shark]], tirkî köpekbaligi)
==== Anagram ====
* {{anagram|ckb|a=سکۆە|سەکۆ}}
hjoy9wqq0f7qxuwbv0mk6xrrt2vrc82
کۆسپ
0
270838
6533472
5874231
2026-09-19T11:20:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533472
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kosp
=== Navdêr ===
{{navdêr|ckb}}
# [[kosp]], [[asteng]], [[kend û kosp]], rêya nexweş
d0jzttxzfa4sj1d7uesrh6jbhfxddst
کۆسپایی
0
270839
6533473
5874233
2026-09-19T11:20:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533473
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kospayî
=== Navdêr ===
{{navdêr|ckb}}
# [[kospayî]], erda nedûz / ne-edil
pdj8wn2xs7tywl7x0j3suknrt0tg3bd
کۆستەوەوی
0
270841
6533474
5977889
2026-09-19T11:20:50Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533474
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kostewewî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[sexte]], [[sixte]], [[ne resen]], [[ne rast]]
ok454y0569491w5pgot0wdvl9pfj70t
کۆشان
0
270843
6533475
5874241
2026-09-19T11:21:00Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533475
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:koşan
=== Lêker ===
{{lêker|ckb}}
# [[koşîn]], [[xebitîn]], [[dan xwe]], [[hewl dan]], [[mihawele kirin]]
0qwuy3tgxqd4865wfdd14blrmp3k69g
کۆشش
0
270844
6533476
5874243
2026-09-19T11:21:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533476
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:koşiş
=== Navdêr ===
{{navdêr|ckb}}
# [[xebat]], [[koşiş]], [[hewl]], [[koşî]]
# [[ra-anîn]], [[rahênan]], [[ders]], [[temrîn]]
3ehp8n9el2ciz29nku5tj4gitfhnqwy
کۆتان
0
270847
6533477
5874178
2026-09-19T11:21:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533477
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kotan
=== Navdêr ===
{{navdêr|ckb}}
# [[kotan]], [[koz]], [[guhêrr]], cihê tankirî / çeperkirî bo têve parastina terş û tewal
eauitpohccn83saln62dti7wlv7he8k
کۆتایی
0
270848
6533478
5874180
2026-09-19T11:21:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533478
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kotayî
=== Navdêr ===
{{navdêr|ckb}}
# [[texsîr]], [[xemsarî]], [[sersarî]]
lg98ztctkxoz435qnhkgz2111h0ta7r
کۆتەرە
0
270849
6533479
5874184
2026-09-19T11:21:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533479
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kotere
=== Navdêr ===
{{navdêr|ckb}}
# [[qurmik]], [[kokik]], '':stûnik; serikê stûnan''
b9yva4zeijya6r0kkn4vaeovz6tki8r
کۆڤان
0
270851
6533480
5874251
2026-09-19T11:21:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533480
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kovan
=== Navdêr ===
{{navdêr|ckb}}
# [[kovan]], [[kul]], [[xem]], [[derd]], [[keser]], [[keder]]
139gqxq47aqex2nc7do5seuxinhdb9v
کۆخوازی
0
270853
6533481
5874209
2026-09-19T11:22:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533481
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:koxwazî
=== Navdêr ===
{{navdêr|ckb}}
# [[lihevkirin]], [[konsensûs]]
bqi4qyiaeyv8m0brj7ez41d63j9vzjf
کوچوولە
0
270859
6533482
5873871
2026-09-19T11:22:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533482
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kuçûle
=== Navdêr ===
{{navdêr|ckb}}
# [[xefik]], [[dav]], [[tepik]]
bnkzakoszze7uzkycf1pgi5romb91ab
کوفار
0
270861
6533483
5874015
2026-09-19T11:22:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533483
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kufar
=== Navdêr ===
{{navdêr|ckb}}
# [[kafir]] (t pirjimar)
plhbgnv2sqvwmk4ift2bxaftme9syjr
کوژاندنەوە
0
270862
6533484
5873995
2026-09-19T11:22:30Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533484
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kujandinewe
=== Lêker ===
{{lêker|ckb}}
# [[temirandin]], [[vemirandin]], [[mirandin]], [[birhandin]], [[nehêlan]]
bvhemp9yawoxw1auuou59bebcu5w2pm
کوژران
0
270864
6533485
5873997
2026-09-19T11:22:40Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533485
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kujran
=== Lêker ===
{{lêker|ckb}}
# [[hatin kuştin]]
30ymoldgpugn1rl9kbhsdz995upb3ly
کوژراو
0
270865
6533486
5873999
2026-09-19T11:22:50Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533486
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kujraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kuştî]], (ya / yê) hatiye kuştin
pxws53i8lie4cws80cv5jezfivdlg1g
کولاف
0
270867
6533487
5874025
2026-09-19T11:23:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533487
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kulaf
=== Navdêr ===
{{navdêr|ckb}}
# [[pencirk]], dest û tilên firindeyan
gwo6nlgjmtptv65wmty999hzrm9jnyo
کوڵەبەس
0
270873
6533488
5874061
2026-09-19T11:23:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533488
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kullebes
=== Navdêr ===
{{navdêr|ckb}}
# [[nevisî]], [[nevis]], zarokên jina kesekî yên ji mêrê wê yê berî yê niha
oby3ecey7o49ozoagv94wzmj0cdq92t
کوڵەبنە
0
270874
6533489
5874059
2026-09-19T11:23:20Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533489
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kullebine
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bejnqut]], [[kin]], [[kurt]], [[bejnbost]], [[qut]], [[qutik]], [[quto]], [[qutê]], [[kinê]], [[kino]]
dkocj72a00nvvq1t5ctlyctilfcj6tb
کولەمەرگی
0
270876
6533490
5874067
2026-09-19T11:23:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533490
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kulemergî
=== Navdêr ===
{{navdêr|ckb}}
# [[astengî]], [[dijwarî]], [[tegasî]], [[tengavî]]
bfcgoxqa62vu8kq11wj9mmnuvfmkyvr
کوڵەنانی
0
270878
6533491
5874072
2026-09-19T11:23:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533491
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kullenanî
=== Navdêr ===
{{navdêr|ckb}}
# [[sêrker]], [[cadûbaz]], [[efsûnkar]], [[sihirbaz]]
rx23918qtte8ym3md3kdt1pqyp4e7ej
کوڵەنجە
0
270879
6533492
5874074
2026-09-19T11:23:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533492
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kullence
=== Navdêr ===
{{navdêr|ckb}}
# [[çoxik]], [[êlek]]
sdfwqhdmdxeotb773pni7ax1ltlp6ma
کولەپاچ
0
270880
6533493
5874063
2026-09-19T11:24:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533493
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kulepaç
=== Navdêr ===
{{navdêr|ckb}}
# [[tevir]]
muclbtiycr4r7g96g17gghoyyc4rebe
کوڵەپێچ
0
270881
6533494
5874065
2026-09-19T11:24:10Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533494
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kullepêç
=== Rengdêr ===
{{rengdêr|ckb}}
# [[neliv]], kesa/ê nikare bilive
13mon4k6v4ixfkpavplqv2rdhozfb84
کولیچە
0
270884
6533495
5874056
2026-09-19T11:24:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533495
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kulîçe
=== Navdêr ===
{{navdêr|ckb}}
# [[kulîçe]], [[kulîparçe]], xwarinek ji nan û gûzan û şekirê / xurmê yê
qm1gz9r4kci57eudrb37f4fwrt1o4uv
کوڵک
0
270886
6533496
5874038
2026-09-19T11:24:30Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533496
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kullk
=== Rengdêr ===
{{rengdêr|ckb}}
# (pirça / porrê) [[qijavij]], ne hil
# (vexwiraka) [[tîr]]
gzahj7jn2ze4ia7xndj634f442fbfi7
کوڵکوڵە
0
270887
6533497
5874040
2026-09-19T11:24:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533497
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kullkulle
=== Navdêr ===
{{navdêr|ckb}}
# [[avreşînk]]
m8tspafnsc79gbdf24imvpm9w3654tv
کوڵۆت
0
270890
6533498
5874053
2026-09-19T11:24:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533498
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kullot
=== Navdêr ===
{{navdêr|ckb}}
# [[kemax]], [[hêt]], [[ran]], [[qorrik]]
jks0mkalwt0byg4cdrqxp4zjs923jpl
کولپ
0
270891
6533499
5874034
2026-09-19T11:25:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533499
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kulp
=== Navdêr ===
{{navdêr|ckb}}
# [[tengasî]], [[tengavî]], rewşa dijwar
ayrxjb7sagvh86xvxb86k0ncbzgv669
کولخان
0
270892
6533500
5874036
2026-09-19T11:25:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533500
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kulxan
=== Navdêr ===
{{navdêr|ckb}}
# [[argûn]], ciyê agir tê ve tê hilkirin li hindirrî xaniyan ve
qugi50ishx7hvr6o2o1wkdwwtbbn25a
کونار
0
270893
6533501
5874086
2026-09-19T11:25:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533501
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kunar
=== Navdêr ===
{{navdêr|ckb}}
# [[kenarî]], navê deviyek / terraşek strîtûj e
fpa7wzhbfcvy1y7pw93e21ej23y9f92
کوناودەر
0
270894
6533502
5874088
2026-09-19T11:25:30Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533502
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kunawder
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kunkirî]], [[qulkirî]]
ebaoc0a4lubjpwotkdql11dj8rs7qoh
کونجی
0
270898
6533503
5874096
2026-09-19T11:25:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533503
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kuncî
=== Navdêr ===
{{navdêr|ckb}}
# [[kuncî]] (Bot, [[ Indicum)]]
np14fwyajr7adq1ycvw1sm2dz5x7b24
کونچک
0
270899
6533504
5874100
2026-09-19T11:25:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533504
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kunçik
=== Navdêr ===
{{navdêr|ckb}}
# [[kunik]], kunên hûr(ik)
rulmq5t34pywu9g0vyobxi8c4vwzsy0
کونەباجە
0
270900
6533505
5874112
2026-09-19T11:26:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533505
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kunebace
=== Navdêr ===
{{navdêr|ckb}}
# [[pixêrîk]], [[pace]], kuna sobeyan, kuna li ban dûkêl tê re derdikeve derî xanî
49e1517nmsr0yuwz3odvvluvz9vw1g2
کونەبەبوو
0
270901
6533506
5874114
2026-09-19T11:26:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533506
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kunebebû
=== Navdêr ===
{{navdêr|ckb}}
# [[kund]], [[bum]], [[pepûk]]
fpxuctctiavn455wzrshquq80jkpgyn
کونیلە
0
270902
6533507
5874108
2026-09-19T11:26:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533507
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kunîle
=== Navdêr ===
{{navdêr|ckb}}
# [[kunik]], kunên hûr(ik)
6lfgesl9iphuzjymnhfcz8ga9hewuzq
کونیلەدار
0
270903
6533508
5874110
2026-09-19T11:26:30Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533508
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kunîledar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kunkunîk]], [[kunkunîşk]], tiştê pirr kunik / kunên hûr lê hene
q3658qkjyi1v6hvthi7qirnjlz69vqs
کونکراو
0
270905
6533509
5874104
2026-09-19T11:26:40Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533509
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kunkiraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kunkirî]], [[qulkirî]]
h0ujeuxln2ocvh1ikeh7rj7hgf9jb7z
کونتیلە
0
270906
6533510
5874092
2026-09-19T11:26:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533510
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kuntîle
=== Navdêr ===
{{navdêr|ckb}}
# [[kuntîle]], [[leqem]], [[tunel]]
iwl7booe05755hlkjgwptyypaut2ico
کونزەین
0
270907
6533511
5874101
2026-09-19T11:27:00Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533511
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kunzeyn
=== Rengdêr ===
{{rengdêr|ckb}}
# [[delodîn]], [[tirredîn]], [[peledîn]], [[netemam]], [[aqilsivik]]
ffvbhxi029n8l0p28c8q0ehkzteho8u
کوڕ
0
270908
6533512
6433719
2026-09-19T11:27:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533512
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kurr
=== Navdêr ===
{{navdêr|ckb}}
# [[kurr]], [[law]], [[pis]], [[xort]], [[gede]], [[sebî]], [[kurrik]], [[lawik]]
=== Dijmane ===
*[[keç]]
* [[dot]]
* [[qîz]]
* [[kiç]]
==== Anagram ====
* {{anagram|ckb|a=وڕک|وڕک}}
jczats30bip6rml2m40kwny3f81fhwt
کوڕانە
0
270909
6533513
5873889
2026-09-19T11:27:20Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533513
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kurrane
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kurrane]], [[lawane]], [[xortane]], [[gedane]], [[sebiyane]], mîna kurran / lawan / gedeyan / sebiyan
qbavf7fdwle9hht5qtel7g7nv0ao34n
کوردانە
0
270911
6533514
5873917
2026-09-19T11:27:30Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533514
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kurdane
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kurdane]], mîna kurdan
t2o0f2v1nl5a5rjzv9ptbzoa9jhv3wa
کوردایەتی
0
270912
6533515
5873919
2026-09-19T11:27:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533515
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kurdayetî
=== Navdêr ===
{{navdêr|ckb}}
# [[kurdayetî]], [[kurdîtî]], [[kurdînî]], hesta neteweperweriya kurdî / kurdistanî, tevgera neteweyî ya kurdan
27fawu9zg0ke871t9so5arkp3pykppm
کوردەواری
0
270913
6533516
5873941
2026-09-19T11:27:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533516
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kurdewarî
=== Navdêr ===
{{navdêr|ckb}}
# [[kurdewarî]], jiyana (mîna ya) kurdan
7t84lvbx4p18va77ronmtajt2rdrvz6
کوردھەز
0
270914
6533517
5873931
2026-09-19T11:28:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533517
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kurdhez
=== Navdêr ===
{{navdêr|ckb}}
# [[kurdhez]], [[kurdvîn]], kesa/ê ji kurdan hez dike
kbmkzid7nt9aungr4xr577dnpfeogua
کوردستانی
0
270916
6533518
5873923
2026-09-19T11:28:10Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533518
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kurdistanî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kurdistanî]], kesa/ê yan tişta/ê ji Kurdistanê, '':kurd û gelên dî yên li Kurdistanê dijîn; welatiyên Kurdistanê; ku''
m3v49aijw8v4nnx5l54i0tgrkrkuzxj
کوردیزانی
0
270919
6533519
5873937
2026-09-19T11:28:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533519
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kurdîzanî
=== Navdêr ===
{{navdêr|ckb}}
# [[kurdîzanî]], zanîna zimanê kurd
# [[kurdînasî]], pisporiya li ser zimanê kurdî
2dnc6p13kv3iae43hco242cesb727gn
کوردپەروەر
0
270922
6533520
5873921
2026-09-19T11:28:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533520
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kurdperwer
=== Navdêr ===
{{navdêr|ckb}}
# [[kurdperwer|kurdper]]
#
#
# [[kurdperwer|wer]], kesa/ê dilsoza/ê doza kurdan e
1l4cjd0c375zk2qoeghpych0lkpokgp
کوردشناس
0
270923
6533521
5873925
2026-09-19T11:28:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533521
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kurdşinas
=== Navdêr ===
{{navdêr|ckb}}
# [[kurdnas]], [[kurdevan]], [[kurdolog]], kesa/ê lêkolînan li ser (jiyana) kurdan dike, kesa/ê li ser (jiyana) kurdan pispor e
n79mydrsx4it62842wr8j7t1xqr6c7q
کوردناسی
0
270924
6533522
5998718
2026-09-19T11:28:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533522
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kurdşinasî
=== Navdêr ===
{{navdêr|ckb}}
# [[kurdnasî]], [[kurdevanî]], [[kurdolojî]], karê lêkolînan li ser (jiyana) kurdan
6ymadeqeirnb7ot4bxxyl74h3zidvzw
کوڕگەل
0
270925
6533523
5873955
2026-09-19T11:29:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533523
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kurrgel
=== Navdêr ===
{{navdêr|ckb}}
# [[xort]], [[kurrgel]], komek kurran / lawan
fcoagexul02xjpngjl5leqbtjgc5gjs
کوڕەزا
0
270928
6533524
5873976
2026-09-19T11:29:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533524
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kurreza
=== Navdêr ===
{{navdêr|ckb}}
# [[kurreza]], [[lawza]], zaroyên kurrê kesekî, [[nevî]]
90wbgcrtjh7ctvarej3vez9s6goh127
کوڕەزازا
0
270929
6533525
5873978
2026-09-19T11:29:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533525
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kurrezaza
=== Navdêr ===
{{navdêr|ckb}}
# [[kurrezaza]], [[lawzaza]], zaroyên zaroyên kurrê kesekî, [[nevîçirrk]]
ean1jce2yozedbjiaf2bjtvghefvod1
کوڕێتی
0
270930
6533526
5873972
2026-09-19T11:29:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533526
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kurrêtî
=== Navdêr ===
{{navdêr|ckb}}
# [[kurrtî]], [[kurrîtî]], [[xortanî]], [[xortî]], [[lawanî]], [[lawt]]
# [[tolazî]], [[tûlet]]
# [[kurrgerrî]], karê keç dibin pey kurran
2lujcifu7m1cw8n5bgqz8nyvz0byw4g
کوڕکوڕە
0
270933
6533527
5873954
2026-09-19T11:29:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533527
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kurrkurre
=== Navdêr ===
{{navdêr|ckb}}
# [[kolare]], [[qereqûş]], [[xertel]], [[qertel]], [[qertal]], navê firrindeyekî ye (zool, [[ Milvus)]]
jw3wby02ok2qpjejfm4z8pxcyg95ypz
کورتان
0
270937
6533528
5873891
2026-09-19T11:29:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533528
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kurtan
=== Navdêr ===
{{navdêr|ckb}}
# [[kurtan]], [[palik]], [[hawid]]
tc18sllp6f4ud40a6lcnt88jxxyl5zp
کورتبڕ
0
270939
6533529
5873895
2026-09-19T11:30:00Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6533529
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kurtbirr
=== Hoker ===
{{hoker|ckb}}
# [[kurtbirr]], [[kurt û kurmancî]], [[bi kurtî]]
lazmz44yi6mgz9sfsisd9pwp935hp7d
کورتە
0
270943
6533530
5873909
2026-09-19T11:30:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533530
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kurte
=== Navdêr ===
{{navdêr|ckb}}
# [[kurte]], [[kurtebêje]]
ga94w940hpz0mfuu5a1euk2408x2lnw
کورتەباڵا
0
270944
6533531
5873911
2026-09-19T11:30:20Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533531
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kurteballa
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bejnkurt]], [[bejnbost]]
3r33z6hegzo6vge0un8af6i5ig4i70t
کورتی
0
270948
6533532
5873905
2026-09-19T11:30:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533532
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kurtî
=== Navdêr ===
{{navdêr|ckb}}
# [[kurtî]], [[kinî]], [[qutî]], [[gurcî]]
9lganejv4lb476hphmq4ksg2w2cffil
کوشتار
0
270951
6533533
5874001
2026-09-19T11:30:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533533
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kuştar
=== Navdêr ===
{{navdêr|ckb}}
# [[kuştar]], [[kujî]], karê kuştinê
1p02bxf0bbsco9uxj0l8o3q5yi2ef22
کوشتبەندان
0
270952
6533534
5874003
2026-09-19T11:30:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533534
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kuştbendan
=== Navdêr ===
{{navdêr|ckb}}
# [[komkujî]], kuştina gelekan bi carekê
9hujczwubdapmxn55s0ctpfod0niz5f
کوشتەرا
0
270953
6533535
5874007
2026-09-19T11:31:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533535
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kuştera
=== Navdêr ===
{{navdêr|ckb}}
# [[rende]], [[planya]]
5xf4rpmg5v5l3658dgjnmn9r6uh1a7f
کوشتن
0
270954
6533536
5874005
2026-09-19T11:31:10Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533536
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kuştin
=== Lêker ===
{{lêker|ckb}}
# [[kuştin]], [[mirandin]], [[telaftin]], [[telifandin]], [[birhandin]], [[qetl kirin]]
m5t6e8oeep1d8simtq0ymkn8051tl1z
کوتان
0
270957
6533537
5873824
2026-09-19T11:31:20Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533537
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kutan
=== Lêker ===
{{lêker|ckb}}
# [[qutan]], [[kutan]] :a) lê dan, [[ lê xistin b) hûr kirin]], hûr-hûr kirin c) derzî lê dan, şirînqe kirî
#(~ be zewî da) avêtin erdê, li erdê dan
rkoh82ftwoc14r6gbjk2zloaxia0ond
کوتووپڕ
0
270959
6533538
5873848
2026-09-19T11:31:30Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6533538
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kutûpirr
=== Hoker ===
{{hoker|ckb}}
# [[tavilê]], [[di cî de]], [[bi lez]]
hoqbzxryzhwuxwn71mgnmykin7bf6pp
کوزان
0
270961
6533539
5873982
2026-09-19T11:31:40Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533539
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kuzan
=== Lêker ===
{{lêker|ckb}}
# [[kuzirîn]], [[kuzîn]], [[suşîn]], [[şewitîn]], [[sotin]], [[kuziryan]]
ejufsmvyodgcrnqb0sp598hwbra7wna
کوو
0
270962
6533540
5874125
2026-09-19T11:31:50Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6533540
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kû
=== Hoker ===
{{hoker|ckb}}
# [[kusan]], [[çilo]], [[çawa]], [[kusa]], bi çi awayî
qjlwphcdza39taljq73qalsqqbzvbcs
کووکەلە
0
270964
6533541
5874135
2026-09-19T11:32:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533541
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kûkele
=== Navdêr ===
{{navdêr|ckb}}
# [[kulind]], [[kundir]]
deubklsybb2f1lndfngaa2i5sfhaj0r
کووکووکەرە
0
270966
6533542
5874134
2026-09-19T11:32:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533542
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kûkûkere
=== Navdêr ===
{{navdêr|ckb}}
# [[pepûk]], [[kund]], [[bum]], [[kûkûk]]
jlu381873n4gcflrwulcfkzw413wc3u
کووپە
0
270969
6533543
6433614
2026-09-19T11:32:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533543
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kûpe
=== Navdêr ===
{{navdêr|ckb}}
# [[kûp]], [[kûpe]], [[tas]], [[tirar]] (amanek e)
==== Anagram ====
* {{anagram|ckb|a=ووپکە|کەپوو}}
5t3w26679od82igcqbu3k0u2c0zaq14
کووپەڵە
0
270970
6533544
5874128
2026-09-19T11:32:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533544
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kûpelle
=== Navdêr ===
{{navdêr|ckb}}
# [[kûpik]], [[tirarok]], [[tasik]], kûpê biçûk
ruv737d4ejipzibxpwkccp7qf5cuk6f
کوور
0
270971
6533545
5874130
2026-09-19T11:32:40Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533545
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kûr
=== Rengdêr ===
{{rengdêr|ckb}}
# kûr [k-ya nerm], nêriyê xort ku êdî ne gîsk e lê hê nebûye nêriyê temam (Ji yên mê re bi kurmancî "tiştûr / tiştîr / teştîr / tuştîr" û bi soranî "tiştîr / çiştîr" tê gotin, ), [[kor]]
m0in18ebjfmsejdgzk7juvxkaibbbcn
کوورە
0
270973
6533546
5874131
2026-09-19T11:32:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533546
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kûre
=== Navdêr ===
{{navdêr|ckb}}
# [[agirdank]], ciyê agir: argûn, di mal ve ciyê agir tê de tê hilkirin, [[kuçik]], li derî xanî ciyê agir lê tê hilkirin
52j2skxy1oakswu1iwwsvfleqs2zwta
کووز
0
270974
6533547
5874132
2026-09-19T11:33:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533547
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:kûz
=== Navdêr ===
{{navdêr|ckb}}
# [[ker]], [[parçe]], [[pirt]], [[par]] (t ji hin fêkiyan mîna sêv / pirteqal)
k83zgfpynvhh85i5m8fkafnm9jj4lg9
لاجانگ
0
270980
6533548
5875683
2026-09-19T11:33:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533548
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lacang
=== Navdêr ===
{{navdêr|ckb}}
# [[cênîk]]
de77wcxikoz0wirjnyo748dmnxrgtib
لاجیوەرد
0
270981
6533549
5875684
2026-09-19T11:33:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533549
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lacîwerd
=== Navdêr ===
{{navdêr|ckb}}
# [[lacîwerd]], şînî zelal
96h7bb53bol3ehzd6wzd80yp5nftzt2
لاچوو
0
270982
6533550
5875685
2026-09-19T11:33:30Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533550
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:laçû
=== Rengdêr ===
{{rengdêr|ckb}}
# [[demkî]], [[berdemî]]
=== Dijmane ===
* [[berdewam]], [[herdemî]]
mot6b0ucwla8b86atw8wymycyu5b70f
لادێیی
0
270984
6533551
5875686
2026-09-19T11:33:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533551
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:ladêyî
=== Navdêr ===
{{navdêr|ckb}}
# [[gundî]], [[derbajarî]]
iff3x7z9gquhr1ts0hmyhearlsxzfnl
لاگیر
0
270988
6533552
5875725
2026-09-19T11:33:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533552
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lagîr
=== Navdêr ===
{{navdêr|ckb}}
# [[alîgir]], [[piştevan]]
otbnd8y1s18ihm2u32qxzi6wx5ondl5
لاگیری
0
270989
6533553
5875726
2026-09-19T11:34:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533553
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lagîrî
=== Navdêr ===
{{navdêr|ckb}}
# [[alîgirî]], [[piştevanî]]
4lpsqon8o59dces4bi6lbjw4qstz8cv
لاژگی
0
270991
6533554
5875695
2026-09-19T11:34:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533554
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lajigî
=== Navdêr ===
{{navdêr|ckb}}
# [[nezanî]], [[bêhayî]], [[bêagayî]]
99cu926uj7uruimo6ls1hq23my7qs7k
لاک
0
270992
6533555
6433534
2026-09-19T11:34:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533555
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lak
=== Navdêr ===
{{navdêr|ckb}}
# [[kelex]], [[term]] (t yê lawirên sekitî / mirî)
==== Anagram ====
* {{anagram|ckb|a=الک|کال}}
2q4wtw1ffzerh8nk96vdv225grlwrso
لاکێش
0
270994
6533556
5875723
2026-09-19T11:34:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533556
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lakêş
=== Navdêr ===
{{navdêr|ckb}}
# [[kêmkêş]], kesa/ê carinan cigareyan dikêşe
21xispaf94gdcic7wmx329qh16keaqw
لاڵانەوە
0
270998
6533557
5875729
2026-09-19T11:34:40Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533557
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lallanewe
=== Lêker ===
{{lêker|ckb}}
# lava / dia / dua kirin, [[hêvî kirin]], tika / rica kirin, [[xwestin]]
8g5h5co3hmkm2xm0lyt1wjdlmwujf5z
لاڵە
0
271000
6533558
5875736
2026-09-19T11:34:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533558
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lalle
=== Navdêr ===
{{navdêr|ckb}}
# [[tika]], [[rica]], [[hêvî]], [[daxwaz]], [[dua]], [[lava]]
fm0rs4136wfe3rrbzg99jsug4t16r7z
لالەنگی
0
271001
6533559
5875738
2026-09-19T11:35:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533559
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lalengî
=== Navdêr ===
{{navdêr|ckb}}
# [[lalengî]], [[tangerîn]] (navê fêkiyekî ye)
j4l2vaucyx9ldgj3gwwq5hkngrwjtkh
لاڵوپاڵ
0
271005
6533560
5875732
2026-09-19T11:35:10Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533560
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lallupall
=== Rengdêr ===
{{rengdêr|ckb}}
# [[pelate]], [[pijale]], [[belawela]]
r7ievikv4qjy22zbfy1339pdu389o4n
لامل
0
271007
6533561
5875739
2026-09-19T11:35:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533561
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lamil
=== Navdêr ===
{{navdêr|ckb}}
# [[stu]], [[patik]], [[paşstu]]
3uo0tl2nlvko5uk5ud5ekp0zatfzbyo
لانەوازی
0
271009
6533562
5875753
2026-09-19T11:35:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533562
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lanewazî
=== Navdêr ===
{{navdêr|ckb}}
# [[derbiderî]], [[mişextî]], [[awareyî]], [[bêmalî]], [[penaberî]]
cf3t9oafn0d4445kumokcvfner47j65
لاپچین
0
271012
6533563
5875676
2026-09-19T11:35:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533563
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lapçîn
=== Navdêr ===
{{navdêr|ckb}}
# [[lapçîn]], [[lafçîn]], [[gezme]], [[pêlav]], [[sol]]
mm5g7muyv9g0amuqhi9ey0zdoux9k5e
لاقردی
0
271014
6533564
5875715
2026-09-19T11:35:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533564
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:laqirdî
=== Navdêr ===
{{navdêr|ckb}}
# [[qerf]], [[henek]], [[tirrane]], [[galte]], [[yarî]]
5c7ucumih1snsbk4506c1lz49mkiuit
لاڕەو
0
271017
6533565
5875689
2026-09-19T11:36:00Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533565
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:larrew
=== Rengdêr ===
{{rengdêr|ckb}}
# [[varê]], [[avarê]], aliyekî rê, derî rê, rexî rê, ne li ser rê
m31vnbqapb80cnxzprolnmrpdttr49o
لارەولار
0
271018
6533566
5875690
2026-09-19T11:36:10Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533566
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:larewlar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[xwarûvîç]], [[çepûçûr]]
pw03reolvqn1u8wonbvcrduslybhzs1
لاساری
0
271023
6533567
5875696
2026-09-19T11:36:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533567
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lasarî
=== Navdêr ===
{{navdêr|ckb}}
# [[serhişkî]], [[înat]]
el0rdyoie7qwrswmneem7i9ghonmrb1
لاساییانە
0
271024
6533568
5875698
2026-09-19T11:36:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533568
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lasayiyane
=== Navdêr ===
{{navdêr|ckb}}
# [[lasayiyane]], [[texlîdane]], [[zarveker]], [[îmîtatîv]]
s89cvinzyrsgnj6livx12pb6y6vbbji
لاساییکەر
0
271026
6533569
5875699
2026-09-19T11:36:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533569
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lasayîker
=== Navdêr ===
{{navdêr|ckb}}
# [[zarveker]], [[çavlêker]], [[texlîdker]], [[lasayîker]]
cvpni4u8whwf9uspjmz2ylu0a7a5r0p
لاسەنگ
0
271027
6533570
5875701
2026-09-19T11:36:50Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533570
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:laseng
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bêseng]], [[alseng]], [[bêbalans]]
0rq2hsy31gli4nejj9uhvm349x0rr5d
لاسک
0
271029
6533571
5875700
2026-09-19T11:37:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533571
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lask
=== Navdêr ===
{{navdêr|ckb}}
# [[destik]]
s7h865czi91ovp02cfm2qsvp9evl3u9
لاشان
0
271032
6533572
5875703
2026-09-19T11:37:10Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533572
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:laşan
=== Rengdêr ===
{{rengdêr|ckb}}
# [[yekal]], rêyên tenê yekalî
qb8hqlani3l48bxvbhq6m2qynaaelgx
لاشەڕ
0
271033
6533573
5875706
2026-09-19T11:37:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533573
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:laşerr
=== Navdêr ===
{{navdêr|ckb}}
# [[şerrnexwaz]], [[aştîxwaz]], [[pasîfîst]]
fmhmgkz7ku2ykjsafelyhezl7nka2mb
لاشەڕی
0
271034
6533574
5875707
2026-09-19T11:37:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533574
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:laşerrî
=== Navdêr ===
{{navdêr|ckb}}
# [[şerrnexwazî]], [[pasîfîzm]], [[aştîxwazî]]
qescproy8fainqvj7jm0lq2phe271tx
لاتەڕاف
0
271036
6533575
5875682
2026-09-19T11:37:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533575
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:laterraf
=== Navdêr ===
{{navdêr|ckb}}
# [[tenişt]], [[rex]], [[teref]], [[alî]]
b3r3e9cjsknngoxg539s31h4tq0282r
لاوانەوە
0
271041
6533576
5875756
2026-09-19T11:37:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533576
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lawanewe
=== Navdêr ===
{{navdêr|ckb}}
# [[lorîk]], stiranên şîniyê li behiyan / taziyan
pki33ebdsk03im13984gndo64m03qzh
لاواز
0
271042
6533577
5875754
2026-09-19T11:38:00Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533577
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lawaz
=== Rengdêr ===
{{rengdêr|ckb}}
# [[lawaz]], [[qels]], [[bêhêz]], [[zeîf]], [[nazik]], [[hejar]], [[lehwaz]], [[dw]], [[xurt]], [[bihêz]]
5zr0gkn8fwqhrqhfxbkf9r63i3l1bdq
لاوازی
0
271043
6533578
5875755
2026-09-19T11:38:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533578
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lawazî
=== Navdêr ===
{{navdêr|ckb}}
# [[lawazî]], [[qelsî]], [[bêhêzî]], [[nazikî]], [[hejarî]], [[zeîfî]], [[dw]], [[xurtî]], [[hêzdarî]], [[bihêzî]]
4mpg6apd56shjars1ov4wrjm010j8b9
لاوێتی
0
271047
6533579
5875763
2026-09-19T11:38:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533579
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lawêtî
=== Navdêr ===
{{navdêr|ckb}}
# [[ciwanî]], [[gencî]], [[xortî]]
od7xdv9h3190w7vbiflpnrwe06gh9mi
لای
0
271052
6533580
5875765
2026-09-19T11:38:30Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6533580
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lay
=== Hoker ===
{{hoker|ckb}}
# [[alî]], [[hêl]]
ixfcumbippo6788pz40hsravw8jr0p4
لایەنگر
0
271054
6533581
5875771
2026-09-19T11:38:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533581
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:layengir
=== Navdêr ===
{{navdêr|ckb}}
# [[alîgir]], [[piştevan]], [[piştgir]]
4zauaabmlw9ierydhuwcg6e7sxm04m6
لایەنگری
0
271055
6533582
5875772
2026-09-19T11:38:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533582
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:layengirî
=== Navdêr ===
{{navdêr|ckb}}
# [[alîgirî]], [[piştevanî]], [[piştgirî]]
76nzrivthubms7r3nov2eslpdr04yli
لە
0
271057
6533583
5876073
2026-09-19T11:39:00Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6533583
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:le
=== Hoker ===
{{hoker|ckb}}
# [[li]], ([[le]], da) di, [[de]], [[tê de]], [[l]]
# ([[le]], ewe) ji
b80y9xicoypkcd8tggsho3ihzsq2g4z
لەبەرچاڤ
0
271059
6533584
5876077
2026-09-19T11:39:10Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533584
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:leberçav
=== Rengdêr ===
{{rengdêr|ckb}}
# [[berçav]], [[diyar]], [[xwiya]], tişta tê dîtin yan dikare (bi asanî) bê dîtin
hzz585e5fqeeaxjdprmh8ekr92fi9ph
لەبلەبی
0
271060
6533585
5876076
2026-09-19T11:39:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533585
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:leblebî
=== Navdêr ===
{{navdêr|ckb}}
# [[leblebî]], nokên qelandî
3poke0d4ml9d1xkxsb78gpa8t4x4mqs
لەبز
0
271061
6533586
5876075
2026-09-19T11:39:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533586
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lebz
=== Navdêr ===
{{navdêr|ckb}}
# (e) [[gotin]], [[qese]], [[peyv]], [[bêje]], [[kelîme]]
4tms5enon3nigh4ycqxr4mlu8xsth8q
لەگەن
0
271065
6533587
5876142
2026-09-19T11:39:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533587
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:legen
=== Navdêr ===
{{navdêr|ckb}}
# [[legen]], amanek mezin yê avê ye
4dy8h6e5zwkixf7prijpejxsuxqudfy
لەفاف
0
271067
6533588
5876128
2026-09-19T11:39:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533588
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lefaf
=== Navdêr ===
{{navdêr|ckb}}
# [[birînpêçk]], [[lifaf]]
q8gjad2aa0zlkfy08flrtgoj493dnze
لەکە
0
271071
6533589
6433589
2026-09-19T11:40:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533589
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:leke
=== Navdêr ===
{{navdêr|ckb}}
# [[lewt]], [[tewz]], [[leke]], [[teqme]], pîsatiya li ser tiştekî
==== Anagram ====
* {{anagram|ckb|a=لکەە|کەلە}}
1k56kiffpkn24s5pv46mtjfgbwmy91e
لەکەدار
0
271072
6533590
5876139
2026-09-19T11:40:10Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533590
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lekedar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[lewitî]], [[tewizî]], [[lekedar]]
dhsq41go9xywbj4t067bi02xge3are9
لەکەداری
0
271073
6533591
5876140
2026-09-19T11:40:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533591
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lekedarî
=== Navdêr ===
{{navdêr|ckb}}
# [[lewitînî]], [[tewizînî]], [[lekedarî]], [[herrimînî]]
avmw7494t2pttfrj7p58nre1ttiw9qu
لەکی
0
271074
6533592
6433650
2026-09-19T11:40:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533592
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lekî
=== Navdêr ===
{{navdêr|ckb}}
# [[lekî]], zaravayek zimanê kurdî
==== Anagram ====
* {{anagram|ckb|a=لکیە|کەیل}}
ceuibtd9egi35ade56uy4yq17381bg4
لەل
0
271075
6533593
5876143
2026-09-19T11:40:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533593
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lel
=== Navdêr ===
{{navdêr|ckb}}
# [[kip]], [[kipîn]], [[kipên]], dengek nizm / kurt / biçûk: Nawêrê billê lel Newêre kipênê ji xwe bîne, Newêre ti dengî bike
9nfl0wymgjguiewulzxo3z0tbw4sptd
لەلە
0
271076
6533594
5876144
2026-09-19T11:40:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533594
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lele
=== Navdêr ===
{{navdêr|ckb}}
# [[xulam]], [[evd]], [[xizmetkar]] :Ey min leley tom!? Ma ez xulamê te me!
# [[hînker]], [[fêrker]], [[perwerdeker]]
pin9cv56ayokex86myy3k6vdpih7q69
لەلەیی
0
271077
6533595
5876145
2026-09-19T11:41:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533595
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:leleyî
=== Navdêr ===
{{navdêr|ckb}}
# [[xulamî]], [[evd]], [[xizmetkarî]]
k6a1v567og4cvno5pd0yuo3hczmq0r2
لەمپا
0
271082
6533596
5876151
2026-09-19T11:41:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533596
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lempa
=== Navdêr ===
{{navdêr|ckb}}
# [[lampe]], [[lempe]], [[çira]], [[şewl]], [[gulop]], [[ronahî]]
8o4qcoc78gnz1r59yh2phq663s7d6t4
لەمپەر
0
271083
6533597
5876152
2026-09-19T11:41:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533597
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lemper
=== Navdêr ===
{{navdêr|ckb}}
# [[asteng]], kos lemper, [[baraj]]
al3du4agx2cvsttnupeaoedka93moml
لەنجین
0
271084
6533598
5876154
2026-09-19T11:41:30Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533598
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lencîn
=== Lêker ===
{{lêker|ckb}}
# [[lîtikîn]], lîtik li xwe dan, [[xwe hilavêtin]]
tjv6u9lk6gsgujvbhcuqoxbj2d99jbd
لەعنەت
0
271085
6533599
5876127
2026-09-19T11:41:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533599
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lenet
=== Navdêr ===
{{navdêr|ckb}}
# [[lanet]], [[nalet]], [[lenet]], [[nelet]], [[xezeb]], [[bela]]
njxs7xc84h60sroz22u0mjpr7ww7e0c
لەنگی
0
271090
6533600
5876155
2026-09-19T11:41:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533600
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lengî
=== Navdêr ===
{{navdêr|ckb}}
# [[lengî]], [[kulekî]], [[seqet]]
# [[nelihevî]], [[newekhevî]], [[bêparsengî]], [[bêbalansî]]
eysqxu5tbhlchpcs4fy2hhykqvslx60
لەنگین
0
271091
6533601
5876157
2026-09-19T11:42:00Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533601
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lengîn
=== Lêker ===
{{lêker|ckb}}
# [[lengîn]], [[kulîn]], wek lengan / kulekan / seqetan meşîn / bi rê ve çûn
4t98lsj2s893rtir8b3p1bit8tuomuy
لەپ
0
271092
6533602
6433743
2026-09-19T11:42:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533602
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lep
=== Navdêr ===
{{navdêr|ckb}}
# [[lep]], paniya destan
==== Anagram ====
* {{anagram|ckb|a=لپە|پەل}}
djntozvdop6o0nqdvhp9cihya9axmnf
لەپەوڕوو
0
271095
6533603
5876084
2026-09-19T11:42:20Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6533603
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lepewrrû
=== Hoker ===
{{hoker|ckb}}
# [[devûdev]], [[ rû-û-rû]]
7wheqqls247w9d8bl37mftva2vule2z
لەقاندن
0
271100
6533604
5876130
2026-09-19T11:42:30Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533604
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:leqandin
=== Lêker ===
{{lêker|ckb}}
# [[leqandin]], [[leqleqandin]], [[livlivandin]], [[velivandin]], [[vehejandin]], ji cihê wê / wî hinekî anîn û birî
# [[dalivandin]], [[dahejandin]], [[daçemandin]], [[datewandin]], [[ da-anîn]], [[daînan]], serê xwe bi mebesta "belê / bila" livandin
962imtfd3hxyifb5fi7xztqsqpn9k2k
لەقە
0
271101
6533605
5876132
2026-09-19T11:42:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533605
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:leqe
=== Navdêr ===
{{navdêr|ckb}}
# [[pên]], [[pehîn]], [[pêhn]], derbeyên bi (t binê) piyên mirovan, [[zîtik]], [[zîçik]], derbeyên bi simên dewaran
p1rdtyiqozxhfr9o4idh0289rmgs589
لەقەب
0
271102
6533606
5876133
2026-09-19T11:42:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533606
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:leqeb
=== Navdêr ===
{{navdêr|ckb}}
# [[paşnav]], [[bernav]]
d54hi1v2b0ehk029ap2dmuufwlcsy1d
لەقەکوت
0
271103
6533607
5876134
2026-09-19T11:43:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533607
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:leqekut
=== Navdêr ===
{{navdêr|ckb}}
# [[pêqutk]], [[pêkutk]], çendîn car li dû hev piyên xwe li erdê dan / kutan / qutan
0v4ricsd4ogiu4mxdj4agr3zxdg42jy
لەقەلەق
0
271104
6533608
5876135
2026-09-19T11:43:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533608
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:leqeleq
=== Navdêr ===
{{navdêr|ckb}}
# [[leqleq]], [[leqeleq]], bn leq
3y1ygai2tbnwf4hingt3o4ace2ea4h1
لەقوولۆق
0
271106
6533609
5876131
2026-09-19T11:43:20Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533609
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:leqûloq
=== Rengdêr ===
{{rengdêr|ckb}}
# [[leqleqok]], [[livlivok]], [[hejhejok]]
hwmpl9u28sto0xk1mahicpbki2d0pz9
لەڕ
0
271107
6533610
5876096
2026-09-19T11:43:30Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533610
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lerr
=== Rengdêr ===
{{rengdêr|ckb}}
# [[lawaz]], [[qels]], [[zeîf]], [[qaştîk]], [[çermok]]
d1jz3hpx9o1qhcz27ezltky5jikl22w
لەران
0
271108
6533611
5876098
2026-09-19T11:43:40Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533611
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:leran
=== Lêker ===
{{lêker|ckb}}
# [[lerizîn]], [[recifîn]], [[ricifîn]], [[qeliqîn]], [[livîn]]
94x27wjp3kew0p087y2yioiqtfxiyk1
لەرانەوە
0
271110
6533612
5876100
2026-09-19T11:43:50Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533612
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:leranewe
=== Lêker ===
{{lêker|ckb}}
# [[velerizîn]], [[verecifîn]], [[vericifîn]], [[veqeliqîn]], [[velivîn]]
qwymfefnr172ocrcnjrz194yqnhuh4u
لەڕوویی
0
271113
6533613
5876106
2026-09-19T11:44:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533613
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lerrûyî
=== Navdêr ===
{{navdêr|ckb}}
# [[rastgoyî]], [[rastbêjî]]
3jbhndghsdey7dix4r051635x4q9w93
لەرز
0
271114
6533614
5876101
2026-09-19T11:44:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533614
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lerz
=== Navdêr ===
{{navdêr|ckb}}
# [[lerz]], [[recifk]], livîna leşî ji ber sarmayê yan tirsê
nwkfzpooy0f5zqi8x4uiwe0jg9f06a5
لەرزۆک
0
271117
6533615
5876104
2026-09-19T11:44:20Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533615
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lerzok
=== Rengdêr ===
{{rengdêr|ckb}}
# [[lerizok]], [[recifok]], ya / yê ku dilerize, '': vehejok; [[livlivok]], [[velivok]], [[ veqeliqok'']]
he63rdxn5npka4y1k0hd9jepm05zpft
لەسەرکەرەوە
0
271118
6533616
5876117
2026-09-19T11:44:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533616
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:leserkerewe
=== Navdêr ===
{{navdêr|ckb}}
# [[berevan]], [[parêzvan]], [[berxwedêr]]
fj11bdumreav3zs59g9go6cufki874f
لەسەرخۆ
0
271119
6533617
5876115
2026-09-19T11:44:40Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533617
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:leserxo
=== Rengdêr ===
{{rengdêr|ckb}}
# [[liserxwe]], kesa/ê bi xwe dikare karûbarên xwe bi rê ve bibe, kesa/ê xwedî şiyan / taqe
# [[hêdî]], [[rehet]], [[bêlezûbez]]
f5lcr33j3ge2np477950d3ug4w8nvau
لەش
0
271121
6533618
6433755
2026-09-19T11:44:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533618
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:leş
=== Navdêr ===
{{navdêr|ckb}}
# [[leş]], [[laş]], [[beden]], [[gewde]], [[kelex]]
==== Anagram ====
* {{anagram|ckb|a=شلە|شەل}}
jlbrj5yhh12mmcmwkk57rlq331dfsuw
لەشی
0
271122
6533619
6433764
2026-09-19T11:45:00Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533619
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:leşî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[leşî]], tişta têkildarî leş
==== Anagram ====
* {{anagram|ckb|a=شلیە|شیلە}}
anmkyehje0s77f5jbek94h85f1xepjf
لەشکر
0
271123
6533620
5876121
2026-09-19T11:45:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533620
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:leşkir
=== Navdêr ===
{{navdêr|ckb}}
# [[leşker]], [[leşkir]], [[esker]], [[artêş]], [[ordî]], [[şervan]], [[şerker]], [[ordû]]
3r4eket4vq5wjvjqdxf09f87sg7iqyw
لەشکرگا
0
271124
6533621
5876122
2026-09-19T11:45:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533621
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:leşkirga
=== Navdêr ===
{{navdêr|ckb}}
# [[leşkergeh]], navenda / cihê leşker lê
5xi137wz4762wn92lwk98n5rg22nv8u
لەشقورس
0
271127
6533622
5876120
2026-09-19T11:45:30Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533622
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:leşqurs
=== Rengdêr ===
{{rengdêr|ckb}}
# [[leşgiran]], [[keslan]], [[tembel]]
j3a6r1bo3b7ge7zv404rufrpp4dy5lp
لەشسووک
0
271128
6533623
5876119
2026-09-19T11:45:40Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533623
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:leşsûk
=== Rengdêr ===
{{rengdêr|ckb}}
# [[leşsivik]], [[destsivik]], [[zîrek]], [[çalak]], [[aktîv]]
db9h8i17txr7qqlmtq6krqsi7rn5fyf
لەشوولار
0
271129
6533624
5876125
2026-09-19T11:45:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533624
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:leşûlar
=== Navdêr ===
{{navdêr|ckb}}
# [[bejnûbal]]
7qun8a31fmlppcv4b6su5mmdjswjkca
لەتگەر
0
271130
6533625
5876085
2026-09-19T11:46:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533625
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:letger
=== Navdêr ===
{{navdêr|ckb}}
# [[budje]], hesaba lêçûn û jêhatinan
6rhs23ubvbskrjs5jla1yub491y487u
لەتووپەت
0
271131
6533626
5876086
2026-09-19T11:46:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533626
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:letûpet
=== Navdêr ===
{{navdêr|ckb}}
# [[qedûped]], [[pirtûmirt]], [[ parçe-parçe]]
nyand5jcyv4yoqvf1jl29j574ermzjt
لەوازە
0
271136
6533627
5876164
2026-09-19T11:46:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533627
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lewaze
=== Navdêr ===
{{navdêr|ckb}}
# [[çartilk]], [[çetelk]]
3muqo1bbuvoz5zg2uqdxrshtnsle7g9
لەوچەیی
0
271138
6533628
5876168
2026-09-19T11:46:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533628
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lewçeyî
=== Navdêr ===
{{navdêr|ckb}}
# [[lewçeyî]], [[zêdebêjî]], [[zêdeaxivî]], axivîna / peyivîna / şitexilîna / xeberdana zêde û bêwate, [[rûqayimî]], [[bêşermî]]
e8vy2o21el6s7qozb2dmi815c0cr6n8
لەوەن
0
271139
6533629
5876182
2026-09-19T11:46:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533629
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lewen
=== Navdêr ===
{{navdêr|ckb}}
# [[leven]], [[rûl]], [[qamûş]], [[qamîş]], [[çîq]], giyayek dirêj e ku di avê de yan li ber avê şên dibe
2d1ac248qcidcvwdt9b0mbt7wdwbeec
لەوەڕ
0
271140
6533630
5876180
2026-09-19T11:46:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533630
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lewerr
=== Navdêr ===
{{navdêr|ckb}}
# [[mêrg]], [[çîmen]], [[şayir]], [[şêngeh]], [[çerîngeh]], [[çêregeh]], [[çêrgeh]], [[çêrîngeh]]
lxfh3q6xgeotki22ik91eoc2fgfxx6z
لەوەڕگا
0
271142
6533631
5876181
2026-09-19T11:47:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533631
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lewerrga
=== Navdêr ===
{{navdêr|ckb}}
# [[çerîngeh]], [[çêrgeh]], cihê / meydana çerînê
f2tnxjfxjifr07z8v5jjgycrp6xc461
لەوێ
0
271143
6533632
5876172
2026-09-19T11:47:10Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6533632
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lewê
=== Hoker ===
{{hoker|ckb}}
# [[li wir]], li wê derê, li wêr
# ji wir, ji wê derê, ji wêrê
h69vgq5yjensspnujfad860j314aef2
لەوێچ
0
271144
6533633
5876173
2026-09-19T11:47:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533633
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lewêç
=== Navdêr ===
{{navdêr|ckb}}
# [[mist]], [[kulm]], [[lep]] (tijî / miştî mistekî / kulmekî / lepekî xwê / şekir û hwd)
75erxx0y7bedbm99zr9nnu4qqwgbqxm
لەوس
0
271148
6533634
5876169
2026-09-19T11:47:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533634
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lews
=== Navdêr ===
{{navdêr|ckb}}
# [[lêv]] (t lêva jêrîn ya şorr / dirêj / stûn), bn lêw
l17bded2bph2c4n724hrqxh2w1sb1c7
لەخەمڕەخسیو
0
271151
6533635
5876095
2026-09-19T11:47:40Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533635
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lexemrrexsîw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[serbixwe]], [[serbest]] (zarrokên yan firrindeyên êdî pêwîstiya wan bi dêbavên / makên wan nemaye)
oclj6i1f6qvcgdho9w5prh1sgv5ljbi
لەخشتەبەر
0
271152
6533636
5876089
2026-09-19T11:47:50Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533636
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lexişteber
=== Rengdêr ===
{{rengdêr|ckb}}
# [[xapîner]], [[xirrîner]], [[xapînok]]
pzkzhl5apimh0lbo87r9zdxzwnl3v2v
لەخوانەترس
0
271153
6533637
5876092
2026-09-19T11:48:00Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533637
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lexwanetirs
=== Rengdêr ===
{{rengdêr|ckb}}
# [[jixwedênetirs]], [[xirab]], [[bêîman]], [[nebawer]]
n9k5ciipm6n429rf5vdisko375wbs66
لەخوانەترسی
0
271154
6533638
5876093
2026-09-19T11:48:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533638
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lexwanetirsî
=== Navdêr ===
{{navdêr|ckb}}
# [[jixwedênetirsî]], [[xirabî]], [[bêîmanî]], [[nebawerî]]
nhoaxps1jqo7s3ne2xe20tpuoghkazc
لەخواترسی
0
271156
6533639
5876091
2026-09-19T11:48:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533639
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lexwatirsî
=== Navdêr ===
{{navdêr|ckb}}
# [[jixwedêtirsî]], [[îman]], [[bawerî]], [[qencî]], [[rastî]], [[rêrastî]], [[duristî]], [[heqî]]
1ob3j9ud58rffzqkb7l33ybgk4h2ac5
لەز
0
271157
6533640
6433767
2026-09-19T11:48:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533640
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lez
=== Navdêr ===
{{navdêr|ckb}}
# [[lez]], [[bizav]], [[lezûbez]], [[lezûbizav]], [[zûkahî]], [[pîtî]], [[ecele]]
==== Anagram ====
* {{anagram|ckb|a=زلە|زەل}}
rkpoeo3vm253cp9enzbaljz07rw2cfh
لەزگێڕی
0
271159
6533641
5876112
2026-09-19T11:48:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533641
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lezgêrrî
=== Navdêr ===
{{navdêr|ckb}}
# [[lezgînî]], [[bizav]], [[lezûbez]], [[lezûbizav]], [[pîtî]]
02cnmrcmsftsj4n5k31lmx8vwcr933f
لەزاندن
0
271160
6533642
5876109
2026-09-19T11:48:50Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533642
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lezandin
=== Lêker ===
{{lêker|ckb}}
# [[lezandin]], [[bizivandin]], [[lez lê kirin]]
7gz1z6pda8pe7l1zauu58lpqn17vckk
لەزەت
0
271161
6533643
5876114
2026-09-19T11:49:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533643
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lezet
=== Navdêr ===
{{navdêr|ckb}}
# [[çêj]], [[tam]], [[lezet]]
tezbkv4jijtcu99z41wx2qdtvrhsfvo
لەزین
0
271162
6533644
5876113
2026-09-19T11:49:10Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533644
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lezîn
=== Lêker ===
{{lêker|ckb}}
# [[lezîn]], [[bizivîn]], [[lez kirin]], [[ecele kirin]], [[lezûbez kirin]], [[lezûbizav kirin]], [[pîtîn]]
q94xbgr9he2l9vmzxgnor3znhw0e2v8
لێ
0
271164
6533645
5875980
2026-09-19T11:49:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533645
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lê
=== Navdêr ===
{{navdêr|ckb}}
# [[lê]], li wê / wî / wa
# [[jê]], ji wê / wî / wan
nccvoqcetts1i59yau2iasfep988prl
لێبووردن
0
271166
6533646
5876006
2026-09-19T11:49:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533646
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lêbûrdin
=== Navdêr ===
{{navdêr|ckb}}
# [[lêborîn]], [[lênegirtin]], [[efû]], [[bexşandin]]
rloks2fvp77xtsllkca7srodn9nyhon
لێچوو
0
271168
6533647
5876014
2026-09-19T11:49:40Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6533647
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lêçû
=== Hoker ===
{{hoker|ckb}}
# [[eynî]], [[heman]], [[şibî]]
5vugex065wsmrvq3dpdp40xyfw4cr0l
لێچوونی
0
271169
6533648
5876015
2026-09-19T11:49:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533648
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lêçûnî
=== Navdêr ===
{{navdêr|ckb}}
# [[hevrengî]], [[şibînî]], [[şibîtî]], [[wekhevî]], [[mînahevî]], [[mînayî]], [[nolayî]], [[fenayî]], [[wekîtî]], [[eynîtî]]
fvl4n4jk8kb95jqn5cn779dmqc6q2tz
لێدوو
0
271171
6533649
5876018
2026-09-19T11:50:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533649
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lêdû
=== Navdêr ===
{{navdêr|ckb}}
# [[raveker]], [[şiroveker]]
dzrwryumyq3lrhgqdjn1smsemqj7llw
لێھاتوو
0
271173
6533650
5876064
2026-09-19T11:50:10Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533650
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lêhatû
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kêrhatî]], [[lêhatî]], [[bikêr]]
op9ntsn9q0tlpftnmltp1l2sgw9nn93
لێژاو
0
271175
6533651
5876031
2026-09-19T11:50:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533651
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lêjaw
=== Navdêr ===
{{navdêr|ckb}}
# [[herik]], ava bilez diherike / dimeşe
h7bh8crl9d3lgd3bsj23zb8h4tjgust
لێک
0
271177
6533652
6433773
2026-09-19T11:50:30Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6533652
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lêk
=== Hoker ===
{{hoker|ckb}}
# [[lêk]], li hev(du), [[ lev(du)]], li êk(û)du, li yek(û)d
# [[jêk]], [[ji hev]], [[jev]], ji yek(û)du, ji êk(û)du
==== Anagram ====
* {{anagram|ckb|a=لکێ|کێل}}
3xhf7h339fh5ug4kluxprv3v5orw98e
لێکۆلینەوە
0
271178
6533653
5876048
2026-09-19T11:50:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533653
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lêkolînewe
=== Navdêr ===
{{navdêr|ckb}}
# [[vekolîn]], [[lêkolîn]], [[azmayîş]], [[azmûn]], [[sehkirin]]
p1tm9f9mkqomh9qj7t5hmej3gkyaiyf
لێڵایی
0
271181
6533654
5876050
2026-09-19T11:50:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533654
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lêllayî
=== Navdêr ===
{{navdêr|ckb}}
# [[ewrik]], ewrikê / şêlatiya ser çavan, kêmasiya nezelaldîtinê ya çavan
2pos7yclth617z7v8er8fhgbgeodn2a
لێڵە
0
271182
6533655
5876053
2026-09-19T11:51:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533655
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lêlle
=== Navdêr ===
{{navdêr|ckb}}
# [[tarîgewrik]], [[xumamî]], dema spêdeyan yan êvaran ku dinya ne tarî û ne jî ronahî ye
4ywgtz1hx2o1iloof1vcdrszojgkigq
لێڵی
0
271183
6533656
5876052
2026-09-19T11:51:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533656
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lêllî
=== Navdêr ===
{{navdêr|ckb}}
# [[şêlîtî]], [[nezelalî]], [[mijûmoranî]], [[nexwiyayî]]
0ubxl49gn76fm80s39jlsa0nzqxmqlj
لێر
0
271187
6533657
5876019
2026-09-19T11:51:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533657
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lêr
=== Navdêr ===
{{navdêr|ckb}}
# [[dehl]], [[dehlûdir]], [[daristan]], cihê dar lê şên dibin (t yên pir dar / devî / teraş di nav hev re ne yan li nêzî hev in)
imnn3zvolcah9ed2zsgarylny6euaeh
لێرەوار
0
271188
6533658
5876024
2026-09-19T11:51:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533658
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lêrewar
=== Navdêr ===
{{navdêr|ckb}}
# [[dehlistan]], [[dehlûdir]], daristana asê / bor / boş
ptxe7mllztirqycwp1wzv8vv88xdiha
لێرە
0
271189
6533659
5876021
2026-09-19T11:51:40Z
JiyanBot
3048
Cure Hoker hat lêzêdekirin
6533659
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lêre
=== Hoker ===
{{hoker|ckb}}
# [[vir]], [[vê derê]], [[vira]], [[vêrê]], [[vê dirê]], vî cihî, '':li vir, li vê derê, li vêrê, li vê dirê, li vî cihî; ji vir, ji vê derê, ji vira, ji vêrê, ji vê dirê, ji vî cihî''
1hu02q21a0oi8wvbxrwx4gb9gjhbwk9
لێسە
0
271191
6533660
5876039
2026-09-19T11:51:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533660
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lêse
=== Navdêr ===
{{navdêr|ckb}}
# [[moçik]], [[kefçî]]
k5ww68nl8dqz7jebzag7n2wyeke6sjv
لێواولێو
0
271198
6533661
5876068
2026-09-19T11:52:00Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533661
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lêwawlêw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[bi-lêvan-re]], ta berlêvan dagirtî, [[mişt]], [[tijî]], [[dagirtî]], ta berlêvan dagirtî / tijî / mişt, wisan tijî ku ger piçek din lê bêt zêdekirin dê birije
9uhyxksqnlt83gd1tx4lx196r27oayc
لێوەدار
0
271199
6533662
5876070
2026-09-19T11:52:10Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533662
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lêwedar
=== Rengdêr ===
{{rengdêr|ckb}}
# [[tawî]], [[pejîdar]], kesa/ê ta digire
h8jn8ll226a16s8umsapzi3azq06j28
لێوڕێژ
0
271200
6533663
5876069
2026-09-19T11:52:20Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533663
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lêwrrêj
=== Rengdêr ===
{{rengdêr|ckb}}
# [[lêvrêj]], [[zêde]], ya zêde ku di ser lêvan / berlêvan re dirije
12jrkdoln6zm44xv5pbe6imxnsf70sg
لێخوڕ
0
271201
6533664
5876017
2026-09-19T11:52:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533664
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lêxurr
=== Navdêr ===
{{navdêr|ckb}}
# [[ajo]], [[ajovan]], kesa/ê tiştekî diajo
deo3lqlr0ei3lbdbxhzg5v6ga85yodq
لچوولێو
0
271209
6533665
5875821
2026-09-19T11:52:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533665
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:liçûlêw
=== Navdêr ===
{{navdêr|ckb}}
# [[devûlêv]]
bmtu7u95s1ymvvftsoxs0mrj3v18rd6
لک
0
271210
6533666
5875874
2026-09-19T11:52:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533666
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lik
=== Navdêr ===
{{navdêr|ckb}}
# [[liq]], [[pirt]], [[pişk]], [[parçe]], [[par]], [[beş]]
cgqfok5bi5ba3e3lrydcc3676a861l7
لکاوە
0
271213
6533667
5875876
2026-09-19T11:53:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533667
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:likawe
=== Navdêr ===
{{navdêr|ckb}}
# [[pêvek]], [[servek]], tişta neserekî ya li gel ya serekî
d5s0kuexlriut3aqdwx9ii9sktfi4no
لمین
0
271216
6533668
5875892
2026-09-19T11:53:10Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533668
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:limîn
=== Lêker ===
{{lêker|ckb}}
# [[xîzîn]], [[qûmîn]], [[axî]], tişta/ê ji xîzî / qûmî
2kse4gqzsdho07eq4yygyxn87qw1lm9
لمۆز
0
271217
6533669
5875891
2026-09-19T11:53:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533669
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:limoz
=== Navdêr ===
{{navdêr|ckb}}
# [[poz]], [[difin]], [[kepî]], [[bêvil]] (t ya heywanan)
ji5jpl0mugk4stcpw0590c7al8up0xd
لنگەلەرێ
0
271219
6533670
5875902
2026-09-19T11:53:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533670
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lingelerê
=== Navdêr ===
{{navdêr|ckb}}
# [[lerz]], [[recifîn]]
j1jizlnwskmo39z368t9iokerkzcbsu
لوان
0
271222
6533671
5875913
2026-09-19T11:53:40Z
JiyanBot
3048
Cure Lêker hat lêzêdekirin
6533671
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:liwan
=== Lêker ===
{{lêker|ckb}}
# [[lê hatin]], [[kêr hatin]]
ktud18gu93apsj1d3biqit3ijl25t7u
لواو
0
271224
6533672
5875915
2026-09-19T11:53:50Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533672
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:liwaw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[lêhatî]], [[kêrhatî]], [[aşt]]
iuypo36wl8bmit56j6vb2m9iluzefp8
لیچاڵ
0
271227
6533673
5876013
2026-09-19T11:54:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533673
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lîçall
=== Navdêr ===
{{navdêr|ckb}}
# [[rîçal]], [[reçel]], [[lîçal]]
h1uvpcgh96hnoh6zzebuag4ak05sncn
لیک
0
271230
6533674
6527456
2026-09-19T11:54:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533674
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lîk
=== Navdêr ===
{{navdêr|ckb}}
# [[gilîz]], [[ gilêz]], [[ şorrik]], [[ kefşil]], ava bi devûlêvên mirovan de dê xwarê
== {{ziman|fa}} ==
=== Binihêre ===
{{bnr|لیکن}}
==== Anagram ====
* {{anagram|fa|a=لکی|لکی|کلی}}
3y7ikfeeiyfia9jn0w5p0axk03eyagy
لیمە
0
271232
6533675
5876060
2026-09-19T11:54:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533675
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lîme
=== Navdêr ===
{{navdêr|ckb}}
# [[parçe]], [[ker]], [[qed]], [[pirt]]
b8vfz68xhju6dldjdmz3ucmj1u9x413
لیمۆ
0
271233
6533676
5876057
2026-09-19T11:54:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533676
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lîmo
=== Navdêr ===
{{navdêr|ckb}}
# [[lîmon]], [[leymon]], fêkiyek tirş e
01a8ai6d0ip50qceotktg3yx052jk39
لیمۆنی
0
271234
6533677
5876058
2026-09-19T11:54:40Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533677
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lîmonî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[enirî]], [[esebî]], [[înato]], [[qehrokî]]
lllj07uw0cld2qihfdksb0upcia4sec
لیمۆیی
0
271235
6533678
5876059
2026-09-19T11:54:50Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533678
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lîmoyî
=== Rengdêr ===
{{rengdêr|ckb}}
# [[lîmonî]], ji rengê lîmonê, mîna rengê lîmonê
8juputn39scu23ec4otejsvsz0jr5zx
لینج
0
271236
6533679
5876061
2026-09-19T11:55:00Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533679
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lînc
=== Rengdêr ===
{{rengdêr|ckb}}
# [[çirrîk]], kesa/ê yan tişta bi asanî ji mirovî venabe yan bela xwe ji mirovî venake
6q6o9ujq0r9wvxq1mb5zjenuafhttzt
لیر
0
271240
6533680
5876020
2026-09-19T11:55:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533680
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lîr
=== Navdêr ===
{{navdêr|ckb}}
# [[lîr]], [[pirzik]], [[kulik]]
q08j11667a9v1g7720oz2f7gksiuwz9
لیستە
0
271241
6533681
5876037
2026-09-19T11:55:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533681
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lîste
=== Navdêr ===
{{navdêr|ckb}}
# [[lîste]], [[rêzname]], nameya / kaxeza / perrê navê tiştan / kesan lê hatine rêzkirin / nivîsîn
shag6wj4k2pewax1hjkms6op8ai15jv
لیوا
0
271243
6533682
5876065
2026-09-19T11:55:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533682
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lîwa
=== Navdêr ===
{{navdêr|ckb}}
# [[parêzgeh]], [[wîlaye]]
# [[lîwa]], [[tûgay]] (yekîneyek leşkerî ye)
2uwbvkgb6hyx37pkk1hrseuco4sg4oh
لیخن
0
271244
6533683
5876016
2026-09-19T11:55:40Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533683
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lîxin
=== Rengdêr ===
{{rengdêr|ckb}}
# [[şêlî]], [[şêlû]], (ava) [[nezelal]]
53dmfo046iqjoi803voo4gbwecapvbj
لۆک
0
271245
6533684
5875972
2026-09-19T11:55:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533684
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lok
=== Navdêr ===
{{navdêr|ckb}}
# [[ben]], [[bizîng]], [[werîs]]
86gr62fo2mcaofzwsgaj1x2csdzw8m7
لۆکە
0
271246
6533685
5875974
2026-09-19T11:56:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533685
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:loke
=== Navdêr ===
{{navdêr|ckb}}
# [[pembû]]
oysjjmlibx3x10ism8x1kz6hbfutxcu
لۆککراو
0
271247
6533686
5875973
2026-09-19T11:56:10Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533686
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lokkiraw
=== Rengdêr ===
{{rengdêr|ckb}}
# [[girêdayî]], [[benkirî]], [[bizîngdayî]], [[werîskirî]]
rzd2onih59q5nznasalw58wa2wrbi1y
لۆمە
0
271250
6533687
5875977
2026-09-19T11:56:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533687
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lome
=== Navdêr ===
{{navdêr|ckb}}
# [[lome]], [[gazin]], [[gilî]]
5yl2fq5y6o40zbmdfhej4wp9nrwfohd
لۆنگ
0
271252
6533688
5875978
2026-09-19T11:56:30Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533688
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:long
=== Navdêr ===
{{navdêr|ckb}}
# [[kevînk]], [[dersok]], [[serpoş]], '':desmal; xawlî''
9mdo3rhoq8yrlqnd0drnh3vfzi7cvqp
لۆقە
0
271254
6533689
5875971
2026-09-19T11:56:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533689
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:loqe
=== Navdêr ===
{{navdêr|ckb}}
# [[çargavkî]]
oatcc4mbpdbqwe10ico1m52089cyc0o
لۆر
0
271255
6533690
5875966
2026-09-19T11:56:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533690
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lor
=== Navdêr ===
{{navdêr|ckb}}
# [[rewş]], [[kawdan]], [[hal]], [[barûdox]]
r46nzksgn3jw16w0v6n1h4r338ad4jd
لۆتیێتی
0
271260
6533691
5875963
2026-09-19T11:57:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533691
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lotiyêtî
=== Navdêr ===
{{navdêr|ckb}}
# [[lotiyetî]], [[lotîtî]], hunera mitirbên / meymûnên reqisvan / muzîkjen, [[qeşmerî]]
12b40zwgjecuzu7pbf3v93end71kbsj
لۆتی
0
271261
6533692
5875962
2026-09-19T11:57:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533692
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lotî
=== Navdêr ===
{{navdêr|ckb}}
# [[lotî]], mitirbên / meymûnên reqisvan / muzîkjen, [[qeşmer]]
o8eeiw5oi46vae6zlrptr0e5q9ds2im
لۆخان
0
271264
6533693
5875965
2026-09-19T11:57:20Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533693
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:loxan
=== Navdêr ===
{{navdêr|ckb}}
# [[şahî]], [[festîval]], [[gala]]
jdndmuzmw25qwkvoemt2by3oyo4cslh
لۆزەندەر
0
271265
6533694
5875970
2026-09-19T11:57:30Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533694
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lozender
=== Rengdêr ===
{{rengdêr|ckb}}
# [[gir]], [[bejndirêj]], [[zexm]], [[girs]]
6r2pjd6lg93yzt65r1k74035egymp20
لوڕ
0
271266
6533695
5875923
2026-09-19T11:57:40Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533695
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lurr
=== Navdêr ===
{{navdêr|ckb}}
# [[lor]], nijada / gelê lor, kurdên bi zaravaya lorî dipeyivin
iupipirindfl4qbwfreo59cgeiikgj0
لوودە
0
271270
6533696
5875949
2026-09-19T11:57:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533696
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lûde
=== Navdêr ===
{{navdêr|ckb}}
# [[gidîş]], koma giyayê dirûyî û li ser hev civandî
lypdqw32ock7vpf5zp6flqiz5bvrhkj
لوولاق
0
271272
6533697
5875955
2026-09-19T11:58:00Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533697
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lûlaq
=== Navdêr ===
{{navdêr|ckb}}
# [[ling]], [[çok]], [[lûlaq]]
o0a98znkrpgexmqpt7r56vhlllv191f
لوولە
0
271273
6533698
5875958
2026-09-19T11:58:10Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533698
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lûle
=== Navdêr ===
{{navdêr|ckb}}
# [[lûlî]], [[sîlînder]]
oib00sojzy4texywtpfepdb4zs33le4
لووس
0
271279
6533699
5875951
2026-09-19T11:58:20Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533699
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lûs
=== Rengdêr ===
{{rengdêr|ckb}}
# [[hilû]], [[hilis]], [[nerm]], [[rêk]]
mteedszme82c41ssh8aiwqru914gvkn
لووسکە
0
271280
6533700
5875952
2026-09-19T11:58:30Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533700
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lûske
=== Rengdêr ===
{{rengdêr|ckb}}
# [[kose]], [[bêrih]], kesên rih lê nehatine
6z2en9flq6xv700cz899h17qsw1ud6x
لووتبەرز
0
271283
6533701
5875941
2026-09-19T11:58:40Z
JiyanBot
3048
Cure Rengdêr hat lêzêdekirin
6533701
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lûtberz
=== Rengdêr ===
{{rengdêr|ckb}}
# [[pozbilind]], kesa/ê xwe pirr mezin dihesibîne
emdo97s76dnh0peq0dmzfsxccb15s7l
لووتبەرزی
0
271284
6533702
5875942
2026-09-19T11:58:50Z
JiyanBot
3048
Cure Navdêr hat lêzêdekirin
6533702
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
:lûtberzî
=== Navdêr ===
{{navdêr|ckb}}
# [[pozbilindî]]
8o9kfavhltloxzifvlt51iemddgsr3h
Keltic
0
276401
6532646
6509407
2026-09-19T09:07:38Z
Wikihez
7344
Wikihezî/ê navê [[keltic]] weke [[Keltic]] guhart
6509407
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Rengdêr ===
{{rengdêr|en}}
# (binêr) [[celtic]]
==== Anagram ====
* {{anagram|en|a=ceiklt|Tickle|tickle}}
ed9fa2pttgxrsz3mryxqt664eudw3hy
6532663
6532646
2026-09-19T09:09:45Z
Wikihez
7344
Îngilîzî/Rengdêr: mane, etîket hatin guhartin (DefSideBoxes)
6532663
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Rengdêr ===
{{rengdêr|en}}
# {{e|en|nadir}} {{ad|en|Celtic}}
==== Anagram ====
* {{anagram|en|a=ceiklt|Tickle|tickle}}
1wecg234m684sh70f4tmngnv1mu3v8p
tickle
0
312093
6532654
6509411
2026-09-19T09:08:34Z
Wikihez
7344
6532654
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Bilêvkirin ===
* {{deng|en|en-us-tickle.ogg|dever=DYA}}
=== Lêker ===
{{lêker|en}}
# [[qidqidandin]], [[enitandin]]
==== Anagram ====
* {{anagram|en|a=ceiklt|Keltic}}
cpednw83f1aynzx7ai04bmb944jszp4
çendem
0
341789
6532312
6398063
2026-09-19T08:14:08Z
Şêr
1103
cînav
6532312
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Cînav ===
{{cînav|ku|c=}}
# [[çendemîn]]
==== Anagram ====
* {{anagram|ku|a=çdeemn|neçemd}}
dpgl9tpoyky1f5r0cp8xffug1q5tx4p
ducks and geese
0
627894
6532169
5175786
2026-09-19T07:51:11Z
Wikihez
7344
Îngilîzî/Mane: mane, etîket hatin guhartin, beşa «Etîmolojî» hate rakirin; Îngilîzî: beşa «Mane» bû «Navdêr» (DefSideBoxes)
6532169
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Navdêr ===
{{navdêr|en|j=tp}}
# {{f|en|cotepeyv|kolankî}} [[polîs|polîs]]
tif6d1xyvqcgb0t4zawwxdu0qxrysg6
6532678
6532169
2026-09-19T09:12:07Z
Balyozbot
7867
Bot: Paqijiyên kozmetîk (Lînk paqij kir.)
6532678
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Navdêr ===
{{navdêr|en|j=tp}}
# {{f|en|cotepeyv|kolankî}} [[polîs]]
pzbwqt85evjffd76865ujhfz9t0dgzo
Wîkîferheng:Daxwazên peyitandinê
4
843283
6532787
6405981
2026-09-19T09:29:57Z
Wikihez
7344
[[Bikarhêner:Wikihez/skrîpt/js/şablon-lêke.js|T]]: Daxwaza peyitandinê: +[[jenk]]
6532787
wikitext
text/x-wiki
{{/destpêk}}
= Hezîran 2020 =
== [[romî#Navdêr|romî]] ==
Li Şingalê maneya polîs? --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 08:00, 15 hezîran 2020 (UTC)
= Tîrmeh 2020 =
== [[kêlb#p-mane|kêlb]] ==
--[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:24, 22 tîrmeh 2020 (UTC)
== [[ejî#p-mane|ejî]] ==
--[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:24, 22 tîrmeh 2020 (UTC)
== [[tutirk#peyitandin|tutirk]] ==
--[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 22:02, 22 tîrmeh 2020 (UTC)
:{{r|Guherto}} Niha çawa ye? Bi ya min çavkaniyên ku min dane têrê me dike. --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 22:43, 22 tîrmeh 2020 (UTC)
::{{r|Balyozxane}} Nizanim.. li hin deveran wek tutirk hatîye nivîsandin û li hin jî wek tûtirk. Li hin deveran bi wateya tûşêmî (Rubus) ye, hin deveran jî bi wateya tûerd (Fragaria × ananassa) e û carna jî bi wateya tû (ê spî û reş go li ser daran çê dibin) ye. -- [[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 08:16, 23 tîrmeh 2020 (UTC)
== [[erbane#p-mane|erbane]] ==
Ji bo ''Amûreke tenê tekerekî wê heye ji bo veguhestina tiştan wek: axê, kevir, hwd'' ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]''--[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 22:42, 31 tîrmeh 2020 (UTC)
= Tebax 2020 =
== [[cifta berazan]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 22:57, 9 tebax 2020 (UTC)
== [[tê gerîn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 22:26, 10 tebax 2020 (UTC)
== [[tapor]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 20:30, 22 tebax 2020 (UTC)
:{{r|Mihemed Qers}} -- [[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 22:16, 22 tebax 2020 (UTC)
== [[şimzare]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 19:01, 26 tebax 2020 (UTC)
== [[bîrkok]] ==
Tenê Mehmed Uzun bi kar tîne. Ji bilî kitêbên wî çavkaniyeke din tune. —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 20:38, 28 tebax 2020 (UTC)
== [[hunera axaftinê]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:46, 30 tebax 2020 (UTC)
== [[derrijîn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 07:38, 31 tebax 2020 (UTC)
== [[yekal]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 09:19, 31 tebax 2020 (UTC)
== [[av û agir]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:50, 31 tebax 2020 (UTC)
: Di çavkaniyeke de wek av û agir kirin derbas dibe û ji wergerandinên inglîzî cuda ye lê nêzîk e.<br> {{jêder-pirtûk|ku|jêgirtin=weke gelek hunermendên ko dû re agir bera berhêm xwe didin Xwedê jî ji bilî maltaba Nûh tevayiyê vê berhema xwe '''av û agir dike''', van melekên xwe yên doxînsist dikişîne asîmanan, li wir wan tawanbar dike, mîna ko bibêje: de biçin û weke xwe bikin, bi derew û tevgerên xwe yên qirêj dijminiya min bikin, Xwedê wan ji asimanan de serjêr davêje xwarê.|nivîskar=Hesenê Metê|sernav=Labîrenta cinan|weşanxane=Nefel|sal=2002|rûpel=132}} --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 13:37, 31 tebax 2020 (UTC)
== [[elm#p-mane-notice|elm]] ==
Wateya: ''[[ewlebûn]], sihê pê zanîn, baş pê zanîn''. ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:31, 31 tebax 2020 (UTC)
:{{r|Hakîmo}} Ku çavkanî tunebûn em ê jê bibin. --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:47, 19 îlon 2020 (UTC)
::{{r|Balyozxane}} Mala te neketê... Hingê bixwe here lê bigere. Jixwe ez reşwî me. Ma eve ne çavkanî ye? -- [[Bikarhêner:Hakîmo|Hakîmo]] ([[Gotûbêja bikarhêner:Hakîmo|gotûbêj]]) 14:48, 19 îlon 2020 (UTC)
:::{{r|Hakîmo}} Hinek bixwîne [[Wîkîferheng:Pîvekên tevlîkirinê]]. Jixwe dema ti kesan din çavkanî lê zêde nakin, ez lê digerim û zêde dikim. Na tu ne ti çavkanî yî. Çavkaniyên nivîskî hewce ne. --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:51, 19 îlon 2020 (UTC)
::::{{r|Balyozxane}} Erê, lê ku tine bin em çawa bikinî? Em hema jê bibinî? -- [[Bikarhêner:Hakîmo|Hakîmo]] ([[Gotûbêja bikarhêner:Hakîmo|gotûbêj]]) 14:52, 19 îlon 2020 (UTC)
:::::{{r|Hakîmo}} Erê em jê dibin. Lê peyvên jê hatine birin em li rûpela [[Pêvek:Bêçavkanî]] zêde dikin. bnr. [[:Kategorî:Pêvek bêçavkanî]]. Dîsa jî ez jî ji vê rewşa me aciz im û bi ya min peyvên devokî divê nayên jêbirin. Lê ji ber ku [[Wîkîferheng:Rêbazname]] dibêje divê werin jêbirin, ez jê dibim. Hevalên {{r|Jiju|Guherto|Ghybu}} [https://ku.wiktionary.org/wiki/Got%C3%BBb%C3%AAj:kejm%C3%BBn], [https://ku.wiktionary.org/wiki/Got%C3%BBb%C3%AAja_p%C3%AAvek%C3%AA:B%C3%AA%C3%A7avkan%C3%AE] jî ji vê rewşê aciz in. Lê ti kes gotûbêj nadin destpêkirin. Ku tu li vir [[Gotûbêja Wîkîferhengê:Pîvekên tevlîkirinê]] gotûbêjek bidî destpêkirin, ez ê piştgirî bidime te. --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:58, 19 îlon 2020 (UTC)
::::::Ji kerema xwe min şaş fêm mekin feqet hemû bikarhêner ku tên vira dilpak nînin. Em çito ew peyvan kotrol bikinê? Mixabin, ji bo konrolkirina peyvan di destên me de tenê xwastina çavkaniyan hene amûrek din tine ye... PS: Herwiha me li ser wîkîferhengê Namespace'yên Nimînok ([[Nimînok:Kurdî/serhedî]]?, [[Nimînok:Kurdî/badînî]]?, ..) û Portal ([[Portal:Kurdî]], [[Portal:Frensî]] (mk. [[:fr:Portail:Français]]), ...) jî çêkiriye...--[[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 15:32, 19 îlon 2020 (UTC)
:::::::Nizanim we nivîsa vira xwand, [[Wîkîferheng:Dîwan#Skotî]]. Piraniya peyvên wîkiya skotî çêkirî ne...--[[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 15:47, 19 îlon 2020 (UTC)
::::::::@Ghybu erê min ew xwendibû. Ku em peyvan nepeyitînin, rewşa me jî wek mg.wikt û wikiya skotiyan be. Temam em peyvên devokî jê nebin lê em wan jî nexin werger û rûpelên din heta ku werin peyitandin. Herwiha tu dibêjî amûrek tune ye lê tenê ji bo peyvên devokî û navên heywan/riwekan wisa ye. Gelek caran peyitandin pir hêsan e. Mînak @Hakîmo yan jî hevalên din dikarin blogan binivîsin daku em karibin peyvên wan yên devokî (nepeyitandî) têxin rûpela [[Wîkîferheng:Tomarkirina peyvên ji wêjeya kurdî|Jêgirtinekê tomar bike]] û kengî ew peyv ji hêla nivîskar û blogvanên kurd yên din ve hatine bikaranîn hingê em dikarin li wîkîferhengê jî zêde bikin. --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 16:05, 19 îlon 2020 (UTC)
{{outdent|::::::::}}{{r|Hakîmo|Ghybu}} Xêra dê û bavên we '''[[Gotûbêja_Wîkîferhengê:Pîvekên_tevlîkirinê#Li_ser_peyvên_devokî|li vir]]''' fikrên xwe binivîsin daku kesên din bizanin kesên din jî hene vê fikrê min dipejirînin. --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 06:48, 3 çiriya pêşîn 2020 (UTC)
== [[nîşanbar]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 23:51, 31 tebax 2020 (UTC)
= Îlon 2020 =
== [[besme]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 11:26, 1 îlon 2020 (UTC)
== [[ferengi]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:12, 1 îlon 2020 (UTC)
== [[çelape]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:22, 1 îlon 2020 (UTC)
== [[cesasandin]] ==
Çavkaniyek klasîk heye, yên din heye gelo? —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 09:02, 2 îlon 2020 (UTC)
== [[depan]] ==
Depan guhertoyeke textan an textîn e. Lê li vir çi mane heye min fêm nekir. —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 10:33, 2 îlon 2020 (UTC)
== [[li rûyê dinê xweş mayîn]] ==
Çavkaniyeke klasîk heye —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 20:38, 2 îlon 2020 (UTC)
== [[bêsewî]] ==
klasîk —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 06:34, 4 îlon 2020 (UTC)
== [[merkemoş]] ==
Klasîk —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 06:34, 4 îlon 2020 (UTC)
== [[firfiroka bayî]] ==
{{r|Mamoste Dilovan}} ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:57, 6 îlon 2020 (UTC)
== [[guhê fîlî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:56, 7 îlon 2020 (UTC)
: {{r|Bikarhêner}} Min guh li evê peyvê bû ji kesekî ku xudan xwaringehek û baxçeyekî mezin e.
: Gelek tişt di berbelav in û xelk dizanin, lê di pertûkan de naye dîtin. {{bêîmze|IbrahimKocher Duhok}}
== [[gurovî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:41, 14 îlon 2020 (UTC)
:{{r|Bikarhêner}} Çavkanîyên peyvên ku min nivîsandin mixabin ne nivîskî ne. Ev peyv min ji hin mezinên malbatê bihîstine û min jî gelek caran dîtîne ku hatine bikaranîn. Ji bo ku ev peyv wûnda nebin min hem li ba xwe û hem jî li wîkîferhengê nivîsand. Ji bo peyvên ku çavkanîyên nivîskî tunin, mixabin gotinên devkî tene weke çavkanî dimînin. Pêşnîyara te ji bo pevên bi vî awayî çi ye gelo? Spas{{bêîmze|Xwende}}
::{{r|Xwende}} Pêşî li ser malpera [https://tirsik.net/xerhati.php] dûre jî li ser arsiv.org qeyd bike ku nikarî çavkanî peyda bikî. Herwiha bnr [[Alîkarî:Îmze]] --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 16:00, 15 îlon 2020 (UTC)
== [[şîloyî]] ==
{{r|Xwende}} ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:44, 14 îlon 2020 (UTC)
== [[dever]] ==
Ji bo wateya ''derence, sêlim û merdîwen'' [[Wîkîferheng:Pîvekên tevlîkirinê|çavkanî hewce ye]]. —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:53, 14 îlon 2020 (UTC)
== [[kerrnizî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 15:56, 15 îlon 2020 (UTC)
== [[li dora (yekê) gerîn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:46, 15 îlon 2020 (UTC)
== [[glas]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]. --[[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 12:45, 16 îlon 2020 (UTC)
== [[kejmûn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 16:42, 17 îlon 2020 (UTC)
== [[lirêgerîn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:20, 18 îlon 2020 (UTC)
== [[çavpeqî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 16:23, 23 îlon 2020 (UTC)
:http://www.geocities.ws/mehname2004a/63/pexsan5.html -- [[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 16:58, 23 îlon 2020 (UTC)
== [[çavpeqiyayî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:14, 23 îlon 2020 (UTC)
:{{r|Balyozxane}} Çavpeqî û -iyayî eynî peyv in, heke bo nimûne 2 çavkanî ji bo çavpeqî û 1 ji bo -iyayî werin dîtin ew weke 3 ji bo yek peyv tên jimartin? -- [[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 17:16, 23 îlon 2020 (UTC)
::{{r|Guherto}}. Na, divê yek ji wan peyitandî be daku em karibin yek ji wan wek guherto nîşan bidin. --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:45, 23 îlon 2020 (UTC)
:::Temam naxwe. {{=(}} -- [[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 17:48, 23 îlon 2020 (UTC)
::::Ecêb e peyva çavpeqîn jî tune ye. Divê çavpeqî/çavpeqiyayî jê hatibe lê qet tune. --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:56, 23 îlon 2020 (UTC)
:::::Em çavpeqî ne weke kesekî ku çavê wan peqî ye dibêjin. Siqêfek e. ''Wilo neke, çavpeqî!'' -- [[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 18:10, 23 îlon 2020 (UTC)
== [[olfatûn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:58, 24 îlon 2020 (UTC)
:Du çavkanî hatiye dîtin li hêviya ya sisêyan e. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 13:46, 23 sibat 2025 (UTC)
== [[hekûke]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 16:00, 28 îlon 2020 (UTC)
:Tenê çavkaniyek ji Kovara Kurmancî heye ew jî ji kitêba Gundê Mêrxasan a Eliyê Evdilrehman hatiye girtin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 13:49, 23 sibat 2025 (UTC)
== [[dê bêjî kaya di serî de]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:58, 29 îlon 2020 (UTC)
== [[heçî ne li malekê, nizanit halekê]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:58, 29 îlon 2020 (UTC)
== [[heta nîva destî reş nebit, tama devî xoş nabit]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:58, 29 îlon 2020 (UTC)
== [[kirtop]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Herwiha [[kirtope]]—[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:59, 29 îlon 2020 (UTC)
:
== [[pişkûmişk]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 21:25, 29 îlon 2020 (UTC)
= Çiriya pêşîn 2020 =
== [[ma te şulê pê ye?]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 13:19, 1 çiriya pêşîn 2020 (UTC)
== [[zelam yêt heyn û zelamoşk jî yêt heyn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 13:28, 1 çiriya pêşîn 2020 (UTC)
== [[ezîz î; ji pêrve ne mîzî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:15, 1 çiriya pêşîn 2020 (UTC)
== [[qelpez]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 08:19, 6 çiriya pêşîn 2020 (UTC)
== [[firêzer]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 15:27, 6 çiriya pêşîn 2020 (UTC)
== [[kirmişk]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 09:03, 7 çiriya pêşîn 2020 (UTC)
== [[orijîn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 19:03, 7 çiriya pêşîn 2020 (UTC)
== [[şequdeq]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 08:50, 9 çiriya pêşîn 2020 (UTC)
== [[helizandin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 11:23, 9 çiriya pêşîn 2020 (UTC)
== [[rewastin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 11:48, 9 çiriya pêşîn 2020 (UTC)
== [[xunaftin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:31, 9 çiriya pêşîn 2020 (UTC)
== [[itîmad li ser kirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 16:32, 15 çiriya pêşîn 2020 (UTC)
== [[sengesor]] ==
{{r|Saberabdollahizad}} ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 22:00, 16 çiriya pêşîn 2020 (UTC)
:Navçeya Mirgewerê, Ûrmîye. {{bêîmze|Saberabdollahizad}}
== [[zenek]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 22:03, 16 çiriya pêşîn 2020 (UTC)
:{{r|Saberabdollahizad}} [[zenek]] jî li Ûrmiyê tê bikaranîn? --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 19:53, 18 çiriya pêşîn 2020 (UTC)
== [[pind#p-mane|pind]] ==
Min tenê çavkaniyek dît ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:48, 17 çiriya pêşîn 2020 (UTC)
:Navçeya Mirgewerê, Ûrmîye. {{bêîmze|Saberabdollahizad}}
== [[maqezer]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:53, 18 çiriya pêşîn 2020 (UTC)
:Navçeya Mirgewerê, Ûrmîye. {{bêîmze|Saberabdollahizad}}
== [[pezpezok]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:55, 18 çiriya pêşîn 2020 (UTC)
:Navçeya Mirgewerê, Ûrmîye. {{bêîmze|Saberabdollahizad}}
== [[parapet#p-mane|parapet]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 13:53, 31 çiriya pêşîn 2020 (UTC)
= Çiriya paşîn 2020 =
== [[quloç#p-mane|quloç]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:43, 19 çiriya paşîn 2020 (UTC)
== [[di ber (yekî) de avêtin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 16:57, 20 çiriya paşîn 2020 (UTC)
:https://tirsik.net/index.php?mijarid=18749&iro=on&rupel=1 —[[Bikarhêner:Mamoste Dilovan|Mamoste Dilovan]] ([[Gotûbêja bikarhêner:Mamoste Dilovan|gotûbêj]]) 17:37, 20 çiriya paşîn 2020 (UTC)
:: {{r|Mamoste Dilovan}} [[di ber re avêtin]] heye. lê te wek di ber '''de''' lê zêde kir. Em biguherînin? Gelek çavkanî ji bo di ber re avêtin heye. --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:41, 20 çiriya paşîn 2020 (UTC)
== [[hêvastin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 10:49, 21 çiriya paşîn 2020 (UTC)
== [[lamçîn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 11:28, 22 çiriya paşîn 2020 (UTC)
== [[poz#p-mane|poz]] ==
Ji bo maneya "[[quz]], [[vajîna]]" ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 11:28, 22 çiriya paşîn 2020 (UTC)
== [[sihetbexş]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 16:35, 24 çiriya paşîn 2020 (UTC)
== [[hevjêhatin ji jêhatîbûnê çêtir e]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:14, 25 çiriya paşîn 2020 (UTC)
== [[gerriyan#p-mane|gerriyan]] ==
''Ji bo wateya cereyan (tevger)''. Qasî ku dibînim tenê Cewerî bi kar aniye —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:24, 25 çiriya paşîn 2020 (UTC)
== [[derbend]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:08, 30 çiriya paşîn 2020 (UTC)
= Kanûna paşîn 2021 =
== [[desthelgirtin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:48, 6 kanûna paşîn 2021 (UTC)
== [[êşewî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:52, 7 kanûna paşîn 2021 (UTC)
== [[sexorr]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 20:22, 7 kanûna paşîn 2021 (UTC)
== [[sapût]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:06, 12 kanûna paşîn 2021 (UTC)
= Çiriya pêşîn 2022 =
== [[paşbingeh]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 07:40, 12 çiriya pêşîn 2022 (UTC)
= Kanûna paşîn 2023 =
== [[berê beringa]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:35, 1 kanûna paşîn 2023 (UTC)
== [[mûlûleya xwînê]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 16:36, 6 kanûna paşîn 2023 (UTC)
== [[mirovdostî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 05:38, 12 kanûna paşîn 2023 (UTC)
== [[derîner]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 23:02, 15 kanûna paşîn 2023 (UTC)
== [[neteba]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 00:01, 16 kanûna paşîn 2023 (UTC)
:Maneya "uyruksuz" ji ferhenga Farqînî hatiye kopîkirin wekî din bi giştî bi maneya "nakokî" tê bikaranîn. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 14:33, 26 hezîran 2026 (UTC)
== [[narkotîkfiroş]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 10:59, 16 kanûna paşîn 2023 (UTC)
== [[pirik#p-mane|pirik]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:15, 16 kanûna paşîn 2023 (UTC)
== [[ramyarî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ez dibêjim ev peyv tenê bi maneya "fikrî", wek rengdêr heye. Lê belê di soranî de bi şaşemilandineke wekî "siyasî" bi kar anîne, kurmancên me jî rasterast maneya soranî tevlî çend ferhengên hev-kopîkirî kirine û bi vî awayî belkî hin çavkanî hebin. Lê ez dibêjim divê ew çavkanî jî neyên hesibandin. Hin kes zen dikin ku her tiştê di soranî de ripîrast e. Mesele heqeten eletewş e.
Agahiyeke li ser peyvê: "[https://www.welateme.info/kurdi/modules.php?name=News&file=print&sid=686 Welateme.info]"
Li vir peyv bi maneya "fikrî" hatiye bikaranîn: "[https://xwebun1.org/ziman-sirhelal-e/ Xwebûn]". Qewet be. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:36, 19 kanûna paşîn 2023 (UTC)
== [[dolîwgeh]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:08, 22 kanûna paşîn 2023 (UTC)
= Sibat 2023 =
== [[herebaş]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:13, 11 sibat 2023 (UTC)
== [[balindeyê korare]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].''
Tenê çavkaniyekê tê xuyan, ew jî kitêba "Balindeyên Kurdistanê" yê Îsmaîl Taha Şahîn e (Îsmaîl Taha Şahîn (2006). Balindeyên Kurdistanê, 1-4. Spîrêz, Duhok). Ev kitêb ji ser înternetê wek word jî peyda dibe. Xuya ye ku ji Weşanên Spîrez fîzîken jî çap bûye. Lê wekî çavkanî tenê ev tê xuyan.
—[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:10, 14 sibat 2023 (UTC)
== [[dîbeyt]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 10:13, 18 sibat 2023 (UTC)
== [[çend pat]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:35, 24 sibat 2023 (UTC)
== [[rabînîn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ji bo kurmancî bêçavkanî ye. Ger ji bo soranî çavkanî hebin jî divê ji bo soranî bi herfên aramî were nivîsîn.
An ger halê latînîkirî ya peyveke soranî be, dîsa divê ev hal were eşkerekirin. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:36, 26 sibat 2023 (UTC)
= Adar 2023 =
== [[qirar#p-mane|qirar]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:23, 2 adar 2023 (UTC)
== [[pîşpêkirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Tenê di nivîseke online ya Cemal Nebez de derbas dibe. Dibe ku peyveke başûriyan be. Û di wê nivîsa Cemal Nebezê bi forma "pîş bi ... bikin" jî derbas dibe. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:29, 3 adar 2023 (UTC)
== [[kûcag]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 01:27, 27 adar 2023 (UTC)
== [[destbizavî kirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].''
Xuya ye ku ev peyv tenê di kitêba “''Nameyek Şernexê''” yê Evdirehman Gundikî de derbas bûye. Û ji wir jî Mistefa Aydoganî maneya peyvê di hejmara 61em ya Kovara ''Kurmancî'' de belav kiriye (rûpela 2yem). Lê belê tenê yek çavkaniyekê ne bes e ji bo ku em vê peyvê di vê ferhengê de wekî peyveke çavkanî-temam belav bikin. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:40, 28 adar 2023 (UTC)
== [[germav baş]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:23, 31 adar 2023 (UTC)
== [[germavxweş]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:27, 31 adar 2023 (UTC)
= Gulan 2023 =
== [[kirbend]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 08:34, 5 gulan 2023 (UTC)
: Çêkerê rûpelê wek not nivîsiye ku peyv ji herêma Çewlikê ye. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 06:24, 6 gulan 2023 (UTC)
== [[We are off now]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:13, 22 gulan 2023 (UTC)
== [[baran ji erd û esmana lê diket]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:46, 26 gulan 2023 (UTC)
== [[sîba]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:44, 30 gulan 2023 (UTC)
== [[bîrîner]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:20, 30 gulan 2023 (UTC)
= Hezîran 2023 =
== [[bidestmiz]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:49, 10 hezîran 2023 (UTC)
= Tîrmeh 2023 =
== [[parzeng]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:01, 15 tîrmeh 2023 (UTC)
== [[zerpedest]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:05, 15 tîrmeh 2023 (UTC)
== [[heta destên mirov nebine gû, devê mirov nabite tû]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:27, 19 tîrmeh 2023 (UTC)
== [[çemê mezin tê dibore diçe]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:38, 19 tîrmeh 2023 (UTC)
== [[kevanê nebî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:45, 19 tîrmeh 2023 (UTC)
== [[teybûr]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Tenê li malpera yuksekovahaber.com-ê derbas dibe, li wir jî bi maneya "çare, çareserî"yê hatiye emilandin, ne bi vê maneyê. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:00, 19 tîrmeh 2023 (UTC)
== [[nikêtî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:22, 19 tîrmeh 2023 (UTC)
= Tebax 2023 =
== [[prêze]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 21:19, 15 tebax 2023 (UTC)
== [[qelye]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 15:59, 25 tebax 2023 (UTC)
= Îlon 2023 =
== [[hetwan]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 20:21, 14 îlon 2023 (UTC)
== [[milyonmasî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:06, 21 îlon 2023 (UTC)
== [[tofana mêjî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:20, 21 îlon 2023 (UTC)
== [[îshaf]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 10:57, 23 îlon 2023 (UTC)
== [[odeya karkirinê]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 10:57, 26 îlon 2023 (UTC)
== [[odeya şixulînê]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 11:42, 26 îlon 2023 (UTC)
== [[hîter]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:08, 26 îlon 2023 (UTC)
= Çiriya pêşîn 2023 =
== [[vîtamîn waw]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 20:20, 1 çiriya pêşîn 2023 (UTC)
== [[berhan]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:21, 3 çiriya pêşîn 2023 (UTC)
== [[sêlikdêr]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 19:16, 10 çiriya pêşîn 2023 (UTC)
== [[qewandêr]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 19:20, 10 çiriya pêşîn 2023 (UTC)
== [[darav]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 20:04, 11 çiriya pêşîn 2023 (UTC)
= Çiriya paşîn 2023 =
== [[kansernasî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:54, 14 çiriya paşîn 2023 (UTC)
== [[golgir]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 16:06, 15 çiriya paşîn 2023 (UTC)
== [[ahardar]] ==
Tenê Zana Farqînî —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 10:34, 26 çiriya paşîn 2023 (UTC)
= Kanûna pêşîn 2023 =
== [[Kî mal ezîz bike, can rezîl dike; kî mal rezîl bike, can ezîz dike.]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:55, 2 kanûna pêşîn 2023 (UTC)
== [[porsing]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:22, 2 kanûna pêşîn 2023 (UTC)
== [[newelatî kirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:57, 2 kanûna pêşîn 2023 (UTC)
== [[newelatîkirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:58, 2 kanûna pêşîn 2023 (UTC)
== [[alîkar kirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 18:42, 3 kanûna pêşîn 2023 (UTC)
== [[aramoş kirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]'' -- [[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 18:48, 3 kanûna pêşîn 2023 (UTC)
== [[bêvil kirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 18:56, 4 kanûna pêşîn 2023 (UTC)
== [[dijberiya naverokî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 22:43, 8 kanûna pêşîn 2023 (UTC)
== [[bersivîn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]'', û her wiha ne li gorî qayideyên kurdî (kurmancî) ye. —[[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 22:08, 11 kanûna pêşîn 2023 (UTC)
== [[hevalzewac]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:25, 18 kanûna pêşîn 2023 (UTC)
= Kanûna paşîn 2024 =
== [[raperk]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 13:40, 15 kanûna paşîn 2024 (UTC)
:Bi wê manê nîne. Bi maneke dî heye. [[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 19:26, 6 tebax 2024 (UTC)
= Sibat 2024 =
== [[bi navê lîstin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:02, 3 sibat 2024 (UTC)
: Li ser agahdarkirina çêkerê rûpelê me şablona "dever"ê tevlî kir. Peyv ji herêma Qoser, Mêrdînê ye. Me li qismê "Bikaranîn"ê jî vê yekê dîyar kir. Ji xeynî vê me wê peyvê ji rûpelên din jî bir. Bi vî awayî ev made kare were girtin. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:28, 10 nîsan 2024 (UTC)
== [[preskirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 00:43, 11 sibat 2024 (UTC)
== [[pres kirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 00:43, 11 sibat 2024 (UTC)
== [[Xwedê te têr bike]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:41, 13 sibat 2024 (UTC)
== [[isad]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:09, 22 sibat 2024 (UTC)
== [[razemendîtî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:44, 27 sibat 2024 (UTC)
= Adar 2024 =
== [[zilhêzî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 23:19, 5 adar 2024 (UTC)
== [[hingihîn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:32, 13 adar 2024 (UTC)
== [[xore]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:30, 15 adar 2024 (UTC)
== [[melef]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:55, 19 adar 2024 (UTC)
== [[uğursuz ayak]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 10:11, 23 adar 2024 (UTC)
== [[şepûk]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 10:22, 23 adar 2024 (UTC)
== [[agirberdêrî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 00:04, 26 adar 2024 (UTC)
== [[kîrquz]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 10:00, 26 adar 2024 (UTC)
== [[kîrquzdê]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 10:01, 26 adar 2024 (UTC)
== [[quzgêj]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 10:03, 26 adar 2024 (UTC)
= Nîsan 2024 =
== [[hîkarîkerî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:53, 1 nîsan 2024 (UTC)
== [[hîkarîker]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:54, 1 nîsan 2024 (UTC)
== [[hîkarîdarî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:55, 1 nîsan 2024 (UTC)
== [[hîkarîdar]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:56, 1 nîsan 2024 (UTC)
== [[bihîkarîtî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:57, 1 nîsan 2024 (UTC)
== [[bihîkarî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:58, 1 nîsan 2024 (UTC)
== [[bêhîkarîtî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:58, 1 nîsan 2024 (UTC)
== [[bêhîkarî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:59, 1 nîsan 2024 (UTC)
== [[bêhîkarî bûn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:00, 1 nîsan 2024 (UTC)
== [[bêhîkarî kirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:00, 1 nîsan 2024 (UTC)
== [[bêhîkarîbûn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:01, 1 nîsan 2024 (UTC)
== [[bêhîkarîkirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:01, 1 nîsan 2024 (UTC)
== [[hîkarîkirî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:02, 1 nîsan 2024 (UTC)
== [[hîkarîkirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:03, 1 nîsan 2024 (UTC)
== [[hîkarî kirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:07, 1 nîsan 2024 (UTC)
== [[rayda]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:40, 1 nîsan 2024 (UTC)
== [[bêrayda]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:42, 1 nîsan 2024 (UTC)
== [[bêraydayî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:43, 1 nîsan 2024 (UTC)
== [[bêraydatî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:43, 1 nîsan 2024 (UTC)
== [[bêrayda bûn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:43, 1 nîsan 2024 (UTC)
== [[bêrayda kirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:43, 1 nîsan 2024 (UTC)
== [[bêraydabûn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:44, 1 nîsan 2024 (UTC)
== [[bêraydakirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:44, 1 nîsan 2024 (UTC)
== [[birayda]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:44, 1 nîsan 2024 (UTC)
== [[biwerêç]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:46, 1 nîsan 2024 (UTC)
== [[biwerêçî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:46, 1 nîsan 2024 (UTC)
== [[biwerêçîtî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:47, 1 nîsan 2024 (UTC)
== [[biwerêçtî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:47, 1 nîsan 2024 (UTC)
== [[werêç]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:49, 1 nîsan 2024 (UTC)
== [[werêç kirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:50, 1 nîsan 2024 (UTC)
== [[werêçkirî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:50, 1 nîsan 2024 (UTC)
== [[werêçkirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:51, 1 nîsan 2024 (UTC)
== [[wişto]] ==
@[[Bikarhêner:Zerwanda]] Çavkanî ji bo kurmancî tine ye. Zazakî ye? —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 20:19, 1 nîsan 2024 (UTC)
:ji devera mûşê, aliyê diya min "wişto/wiştik" digotin. [[Bikarhêner:Zerwanda|Zerwanda]] ([[Gotûbêja bikarhêner:Zerwanda|gotûbêj]]) 20:44, 1 nîsan 2024 (UTC)
== [[xewgerî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 10:19, 2 nîsan 2024 (UTC)
== [[xewgerokî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 10:28, 2 nîsan 2024 (UTC)
== [[nimêh]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:51, 2 nîsan 2024 (UTC)
== [[فعال]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' [[Bikarhêner:Ghybu|Gyhbu]] di 2021an de li ser rûpela wî tevlî kirîye. Lê ji ber nebûna vê sîstema me tevlî vir nebûye. Lewma min anî ser vir jî. Wê gavê tenê ji bo maneya "kar" ev şablon hatîye tevlîkirin. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 07:27, 3 nîsan 2024 (UTC)
== [[pêjor]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:46, 6 nîsan 2024 (UTC)
== [[hafil]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:48, 6 nîsan 2024 (UTC)
== [[micemi]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Muhtemelem şiklê rast wek "micemî" ye, lê ew jî bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:52, 9 nîsan 2024 (UTC)
== [[hesaba xwe]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ji xeynî van ev forma wê jî bêçavkanî ne: "[[hisaba xwe]] / [[hesaba xo]] / [[hisaba xo]]". — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:25, 9 nîsan 2024 (UTC)
== [[leşkerma]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 22:53, 24 nîsan 2024 (UTC)
= Gulan 2024 =
== [[serîi]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Wek "serî" belkî li kar be, lê wekî "serîi" çavkanî peyda nabe. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:20, 2 gulan 2024 (UTC)
== [[virgu]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Bêçavkanî tê xuyan. Peyv bi tirkî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:49, 2 gulan 2024 (UTC)
== [[xwerre]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:57, 20 gulan 2024 (UTC)
= Hezîran 2024 =
== [[di nav deryaya peyvan de avjenî dikir]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:34, 4 hezîran 2024 (UTC)
== [[berbixwe]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:03, 10 hezîran 2024 (UTC)
== [[şipyakî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:08, 10 hezîran 2024 (UTC)
:"şipêkî" heye [[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 20:20, 27 tîrmeh 2024 (UTC)
== [[wetalane]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:18, 10 hezîran 2024 (UTC)
== [[wetalî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:19, 10 hezîran 2024 (UTC)
== [[wetalîtî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:20, 10 hezîran 2024 (UTC)
== [[wetaltî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:20, 10 hezîran 2024 (UTC)
== [[se direye karwan dibuhire]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:49, 16 hezîran 2024 (UTC)
== [[se direwît, karwan bi rêka xo diçît]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Formeke bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:53, 16 hezîran 2024 (UTC)
== [[se direwît, karwan diburît]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Formeke bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:54, 16 hezîran 2024 (UTC)
== [[se direyê karwan dibûrê]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Formeke bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:55, 16 hezîran 2024 (UTC)
== [[se direye karvan li riya xwe diçe]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Formeke bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:56, 16 hezîran 2024 (UTC)
== [[se direye û kerwan dibihure]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Formeke bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:00, 16 hezîran 2024 (UTC)
== [[hingê dinya]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:07, 18 hezîran 2024 (UTC)
== [[berdanberdan]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:22, 24 hezîran 2024 (UTC)
== [[nîska mala Barzan]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:05, 25 hezîran 2024 (UTC)
= Tîrmeh 2024 =
== [[avmêwe]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:41, 16 tîrmeh 2024 (UTC)
== [[nihalok]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:53, 24 tîrmeh 2024 (UTC)
== [[nihalk]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:54, 24 tîrmeh 2024 (UTC)
== [[niwalok]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:54, 24 tîrmeh 2024 (UTC)
== [[niwalk]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:55, 24 tîrmeh 2024 (UTC)
== [[niwalik]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:55, 24 tîrmeh 2024 (UTC)
== [[nehalok]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:56, 24 tîrmeh 2024 (UTC)
== [[nehalk]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:56, 24 tîrmeh 2024 (UTC)
== [[nehalik]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:57, 24 tîrmeh 2024 (UTC)
== [[alîkarxwazî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:16, 24 tîrmeh 2024 (UTC)
== [[nihalik]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:19, 24 tîrmeh 2024 (UTC)
== [[zêrîb]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Bi dîtina min, ev form bêçavkanî ye. Dibe ku ji bo forma "zerîb" çavkanî hebe, lê ew form li ser Wîkîferhengê wek made nehatîye çêkirin. Pir kêm be jî ev peyv wek "zerîp" jî li cihekî derbas bûye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:31, 24 tîrmeh 2024 (UTC)
== [[qanat]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ev peyv bi maneya "kanal"ê nîne, xelet e. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 06:59, 25 tîrmeh 2024 (UTC)
== [[qenat]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ev peyv bi maneya "kanal"ê nîne, xelet e. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 06:59, 25 tîrmeh 2024 (UTC)
:Min 1 çavkanî dît, "Ev kes rojê 6-7 qenatên TV ya diğere û diaxive" https://darkamazi.info/archives/1019704 (bi lêgerana "qenatên", ji ber ko lêgeranên dî tijî tiştên dî derdixin)
:Lê mimkun e xelet nivîsîbe. [[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 20:31, 27 tîrmeh 2024 (UTC)
== [[şkaftmend]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 07:08, 25 tîrmeh 2024 (UTC)
:3 çavkanî hene. Lê xuya dike jêdera wan hemû ferhenga tirsik.netê e.
:* Çavkanî 1: https://tirsik.net/ferheng?query=şkaftmend (berî 2014, lê tarîx nîne)
:* Çavkanî 2: https://ku.wikipedia.org/wiki/Deranderî (2011)
:* Çavkanî 3: https://x.com/zerdeceno/status/1155331427510247425 (2019)
:[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 20:28, 27 tîrmeh 2024 (UTC)
== [[dan hev#p-mane|dan hev]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ev mane li ser çavkanîyan peyda nabe. Tenê çêkerê rûpelê vê maneyê nivîsîye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:08, 25 tîrmeh 2024 (UTC)
== [[baristdar]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:47, 25 tîrmeh 2024 (UTC)
== [[baristdarî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:48, 25 tîrmeh 2024 (UTC)
== [[baristdarîtî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:49, 25 tîrmeh 2024 (UTC)
== [[baristdartî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:50, 25 tîrmeh 2024 (UTC)
== [[bibaristî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:51, 25 tîrmeh 2024 (UTC)
== [[bibarist]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:52, 25 tîrmeh 2024 (UTC)
== [[bibaristîtî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:53, 25 tîrmeh 2024 (UTC)
== [[bêbaristî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:54, 25 tîrmeh 2024 (UTC)
== [[bêbarist]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:55, 25 tîrmeh 2024 (UTC)
== [[peydabûnîtî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 20:52, 27 tîrmeh 2024 (UTC)
== [[nexşvan]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 21:05, 27 tîrmeh 2024 (UTC)
== [[nexşvanî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 21:05, 27 tîrmeh 2024 (UTC)
== [[lêvikî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 21:47, 27 tîrmeh 2024 (UTC)
== [[lêvik]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Min zêde nemeyzand. —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 21:48, 27 tîrmeh 2024 (UTC)
== [[şerenîx kirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 21:51, 27 tîrmeh 2024 (UTC)
== [[sala çîn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:09, 29 tîrmeh 2024 (UTC)
== [[berê pêşîn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:57, 30 tîrmeh 2024 (UTC)
== [[berê ewilî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:57, 30 tîrmeh 2024 (UTC)
= Tebax 2024 =
== [[xwîndijmin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:02, 4 tebax 2024 (UTC)
== [[reîsîtî]]/[[reysîtî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 18:17, 6 tebax 2024 (UTC)
== [[soranîaxivî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 18:43, 6 tebax 2024 (UTC)
== [[helîna bildo]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ji 2020a ve şablon li wir e min tenê li vir zêde kir. —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 19:56, 6 tebax 2024 (UTC)
== [[hilbijêrînerî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' "Hilbij" rihê peyvê ye, "-er" jî maneya "kesê dike" dide, qertafa "-îner / -înerî" ya li dawîyê bi eşkereyî xelet e. Û ev peyv bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:45, 7 tebax 2024 (UTC)
== [[îqlîmtî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:43, 10 tebax 2024 (UTC)
== [[jîrbêjî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ev peyv ger di soranî de ji bo wê çavkanîyên têr hebe, tenê wek "Nivîsîna bi herfên latînî ya peyva ..." kare were qeydkirin. Lê nabe ku wek kurmancî be, were qeydkirin. Ji bo kurmancî tenê di meqaleyekê de derbas dibe, ew jî ji alî başûrîyekî ve hatîye nivîsîn. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 19:55, 10 tebax 2024 (UTC)
== [[hîgyen]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Tenê ev form bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 07:40, 12 tebax 2024 (UTC)
== [[kolîner]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:45, 12 tebax 2024 (UTC)
== [[poşmanî kişîn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Tenê di çavkanîyekê de peyda dibe. Ew çavkanîya dayî jî ihtîmal e ku bi tesîra zimanê tirkî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:44, 13 tebax 2024 (UTC)
== [[para hevpar a herî mezin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:09, 14 tebax 2024 (UTC)
== [[cara hevpar a herî biçûk]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:10, 14 tebax 2024 (UTC)
== [[regjimar]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:16, 14 tebax 2024 (UTC)
== [[nîvrengî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 17:33, 18 tebax 2024 (UTC)
== [[nîvdûrgeh]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Wek "guharto" hatiye qeydkirin, lê yek nikare wilo bêje. Ne "guharto" ye, ji ber wê çavkanî hewce ne. —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 17:39, 18 tebax 2024 (UTC)
== [[nîvtewlîsî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 17:44, 18 tebax 2024 (UTC)
== [[nîvrewa]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 17:44, 18 tebax 2024 (UTC)
== [[nîvşehtî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 17:46, 18 tebax 2024 (UTC)
== [[nîvfalincî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 17:46, 18 tebax 2024 (UTC)
== [[nîvgilkarî]] ==
Ferhenga Sa.Sa.
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 17:48, 18 tebax 2024 (UTC)
== [[kesîkirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 20:16, 18 tebax 2024 (UTC)
== [[biryarbirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:38, 24 tebax 2024 (UTC)
= Îlon 2024 =
== [[qîblename]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 15:15, 1 îlon 2024 (UTC)
== [[cihetnima]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].''
Ji [https://bianet.org/yazi/ferhenga-ser-u-amrazen-ser-ji-kovara-ronahiye-2-196299 vir] hatiye —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 15:27, 1 îlon 2024 (UTC)
== [[qûnderîtî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:36, 7 îlon 2024 (UTC)
== [[hevpîşehî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:48, 14 îlon 2024 (UTC)
== [[hevpîşeyî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Wek ''navdêr'' bêçavkanî ye. Wek ''rengdêr'' hebe jî, kêmçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:50, 14 îlon 2024 (UTC)
== [[hempay]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:04, 14 îlon 2024 (UTC)
== [[nîs]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 19:43, 14 îlon 2024 (UTC)
== [[êxbarçî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ji bo ''îxbarçî'' çavkanîyekê peyda dibe, lê kêm e. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 23:06, 14 îlon 2024 (UTC)
== [[muxbîrîtî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 23:38, 14 îlon 2024 (UTC)
== [[ixbarçî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 23:43, 14 îlon 2024 (UTC)
== [[westgeha pasê]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:33, 19 îlon 2024 (UTC)
== [[avikmadk]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:24, 19 îlon 2024 (UTC)
== [[ferwerîn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:18, 20 îlon 2024 (UTC)
== [[bipayderî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:12, 20 îlon 2024 (UTC)
== [[bipayderîtî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:13, 20 îlon 2024 (UTC)
== [[bipaydertî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:13, 20 îlon 2024 (UTC)
== [[bipedalî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:14, 20 îlon 2024 (UTC)
== [[bipedalîtî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:14, 20 îlon 2024 (UTC)
== [[bipedaltî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:14, 20 îlon 2024 (UTC)
== [[pedaldarî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:15, 20 îlon 2024 (UTC)
== [[pedaldarîtî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:15, 20 îlon 2024 (UTC)
== [[pedaldartî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:16, 20 îlon 2024 (UTC)
== [[ciwên]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:11, 22 îlon 2024 (UTC)
== [[belgebirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:31, 23 îlon 2024 (UTC)
== [[avsîn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Dibe ku ev kelîme biçavkanî be, lê pir bêagahî hatîye qeydkirin. Biçavkanî be jî, ji ber qeydkirina bêagahî (li ser madeyê agahî kêm hatine pêşkêşkirin) em rûpelê jê bibin. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:53, 23 îlon 2024 (UTC)
:@[[Bikarhêner:Bikarhêner|Bikarhêner]] Ma ne çêtir e li "Daxwazên zelalkirinê" be naxwe? [[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 13:40, 10 çiriya paşîn 2024 (UTC)
:: {{r|Guherto}} Bi min em karin vê madeyê ji ber bêagahîbûna wî, îlaweyî "Daxwazên jêbirinê" bikin, lê "Daxwazên zelalkirinê" nabe. Wekî din ji ber ku dikeve çarçoveya her du rûpelan jî kîjan be jî dibe, lê madem me li vir da destpêkirin, bila ji vir dewam bike dengdana li ser vê kelîmeyê. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:22, 10 çiriya paşîn 2024 (UTC)
== [[kûvank]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Herçiqas tenê formekê be jî, bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:14, 27 îlon 2024 (UTC)
== [[kikark]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Herçiqas formekê be jî, bêçavkanî dixuye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:40, 27 îlon 2024 (UTC)
== [[kîfkarik]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Herçiqas tenê formekê be jî, bêçavkanî dixuye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:45, 27 îlon 2024 (UTC)
== [[kuvank]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Herçiqas formekê be jî, bêçavkanî dixuye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:53, 27 îlon 2024 (UTC)
== [[kûvarik]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Herçiqas tenê formekê be jî, bêçavkanî dixuye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:01, 27 îlon 2024 (UTC)
= Çiriya pêşîn 2024 =
== [[muhil]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Tenê qismê kurdî bêçavkanî ye, ne ya tirkî. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:00, 9 çiriya pêşîn 2024 (UTC)
== [[muhilk]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:00, 9 çiriya pêşîn 2024 (UTC)
== [[jêrmal]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:59, 15 çiriya pêşîn 2024 (UTC)
= Çiriya paşîn 2024 =
== [[bîrxistiner]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 19:38, 14 çiriya paşîn 2024 (UTC)
== [[wisa gotin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ne ferhengî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 20:13, 15 çiriya paşîn 2024 (UTC)
== [[tenzîlatî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:12, 16 çiriya paşîn 2024 (UTC)
== [[armancparêz]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 13:03, 19 çiriya paşîn 2024 (UTC)
== [[şikaftmend]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 13:06, 19 çiriya paşîn 2024 (UTC)
== [[derander]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 13:08, 19 çiriya paşîn 2024 (UTC)
== [[deranderî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 13:09, 19 çiriya paşîn 2024 (UTC)
== [[derxwenîn]] ==
@[[User:Keyomerd]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 22:38, 19 çiriya paşîn 2024 (UTC)
== [[kiyû]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 23:53, 22 çiriya paşîn 2024 (UTC)
== [[goçavik]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 00:03, 23 çiriya paşîn 2024 (UTC)
== [[hûrhesibaner]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 00:19, 23 çiriya paşîn 2024 (UTC)
== [[heybera zindî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:01, 23 çiriya paşîn 2024 (UTC)
== [[misadereker]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:51, 24 çiriya paşîn 2024 (UTC)
== [[kêmtirkar]] ==
@[[Bikarhêner:Cyrus the virus|Cyrus the virus]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:11, 24 çiriya paşîn 2024 (UTC)
== [[cudagir]] ==
@[[Bikarhêner:Cyrus the virus|Cyrus the virus]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:15, 24 çiriya paşîn 2024 (UTC)
== [[qerwaşgir]] ==
@[[Bikarhêner:Cyrus the virus|Cyrus the virus]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:42, 24 çiriya paşîn 2024 (UTC)
== [[mişkilûr]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:45, 24 çiriya paşîn 2024 (UTC)
== [[agirbiran]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:54, 24 çiriya paşîn 2024 (UTC)
== [[alan]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:55, 24 çiriya paşîn 2024 (UTC)
== [[alêdû]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:56, 24 çiriya paşîn 2024 (UTC)
== [[henaseker]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:37, 25 çiriya paşîn 2024 (UTC)
== [[nial]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ji xeynî vê, maneya 2yem ya di madeya "nihal" de (navdêr 2) jî bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 23:46, 27 çiriya paşîn 2024 (UTC)
== [[gilçim]] ==
@[[Bikarhêner:Roj Rewandiz|Roj Rewandiz]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:28, 29 çiriya paşîn 2024 (UTC)
:Ez ji bajarê Kobaniyê me. Min ev peyv ji ser zimanê dê û dapîra xwe girt. Ez gelekî ji vê peyvê bawer im ji ber ku devoka min e. [[Bikarhêner:Roj Rewandiz|Roj Rewandiz]] ([[Gotûbêja bikarhêner:Roj Rewandiz|gotûbêj]]) 19:14, 23 kanûna pêşîn 2024 (UTC)
::@[[Bikarhêner:Roj Rewandiz|Roj Rewandiz]] Mala te ava. Ji ber ku çavkaniyên nivîskî tine ne em ê vê kelîmeyê wek [[Wîkîferheng:Pîvekên_tevlîkirinê#Peyvên_herêmî|herêmî]] nîşan bidin. [[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:22, 25 kanûna pêşîn 2024 (UTC)
== [[reşeme kirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Li gorî çêkera sayfeyê li Kobaniyê li kar e. Loma dikare wekî herêmî nîşankirin —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:35, 29 çiriya paşîn 2024 (UTC)
:Li Kobaniyê dibêjin: ‘Tizbiyê min li xwe reş û reşeme kir’ Anko Tizbî bir û venegerand Înkar kir. [[Bikarhêner:Roj Rewandiz|Roj Rewandiz]] ([[Gotûbêja bikarhêner:Roj Rewandiz|gotûbêj]]) 23:48, 7 kanûna paşîn 2025 (UTC)
= Kanûna pêşîn 2024 =
== [[çarkunc]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 00:21, 27 kanûna pêşîn 2024 (UTC)
= Kanûna paşîn 2025 =
== [[pevnatî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ev kelîme wek kurtkirina ji "bi hev nehatî" hatîye fikirîn, ihtimal e ku wek sunî hatîye çêkirin û bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:43, 6 kanûna paşîn 2025 (UTC)
== [[lihevnatîbûn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Wek formeke "lihevnehatîbûn"ê hatîye fikirîn, lê bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:49, 6 kanûna paşîn 2025 (UTC)
== [[Binxetê]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Em zanin ku ji ber sînora Tirkîyeyê ku Cizîrê dike du perçe û ji parçeya binî re Binxet tê gotin ku kurd lê dijîn. Feqet min herêma Binxetê seh nekirîye, û bi tedqîqeke neberfireh jî çavkanî peyda nekir ji bo vê peyvê. Lewma bi min mahîyeta vê madeyê û qeydkirina wek "Binxetê" xelet e. Ger ji bo herêma tarîfkirî çavkanî nîn be, em vê madeyê bikin "'''Binxet'''" û tarîfa wê jî bikin "''Navê Rojavayê Kurdistanê ku li binê xeta Tirkîye - Sûrîyeyê dimîne.''" — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 00:22, 24 kanûna paşîn 2025 (UTC)
== [[xirecir çêkirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' "''Çê''" bi maneya "''baş''" e, û "''çêkirin''" ji bo tiştên pozîtîv likar e, li nav milet jî ev wisa ye. Lewma ev xelet e. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 20:00, 24 kanûna paşîn 2025 (UTC)
== [[sîrkxane]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 19:30, 26 kanûna paşîn 2025 (UTC)
== [[anînder]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Di hin çavkanîyan de wek formeke "''der'''''anîn'''"ê hatîye qeydkirin. Lê belê çavkanîyeke eslî (ne ji kitêbên gramerê) peyda nabe ji bo vê kelîmeyê. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 00:24, 27 kanûna paşîn 2025 (UTC)
== [[rastî nîşandan]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:14, 30 kanûna paşîn 2025 (UTC)
= Sibat 2025 =
== [[pir hindik#p-mane|pir hindik]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:31, 3 sibat 2025 (UTC)
== [[anteroz]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 01:19, 15 sibat 2025 (UTC)
== [[veşidandin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:43, 15 sibat 2025 (UTC)
== [[karîwer kirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 02:01, 16 sibat 2025 (UTC)
== [[hil girtin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:06, 17 sibat 2025 (UTC)
== [[wer girtin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:07, 17 sibat 2025 (UTC)
== [[avkûre]] ==
@[[Bikarhêner:Mohajeer|Mohajeer]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:36, 18 sibat 2025 (UTC)
== [[derdek girtin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 23:42, 18 sibat 2025 (UTC)
== [[vekitandin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 19:12, 21 sibat 2025 (UTC)
== [[dînperist]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 01:32, 22 sibat 2025 (UTC)
== [[ayînperist]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 01:33, 22 sibat 2025 (UTC)
== [[ayînperistî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 01:33, 22 sibat 2025 (UTC)
== [[ayînperistane]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 01:33, 22 sibat 2025 (UTC)
== [[piştrastkirinbar]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 01:45, 23 sibat 2025 (UTC)
== [[diyarkirinbar]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 02:08, 23 sibat 2025 (UTC)
== [[hevhatî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 03:52, 1 adar 2025 (UTC)
== [[kerexne]] ==
@[[Bikarhêner:Rojhilat|Rojhilat]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:05, 1 adar 2025 (UTC)
== [[pawan#p-mane|pawan]] ==
Ferhenga Hejar soranî ye, ji bo maneya "cihê qedexekirî, cihê inhisarî" ji xeynî wê çavkanî heye gelo —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:17, 3 adar 2025 (UTC)
== [[taqane]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 02:11, 6 adar 2025 (UTC)
== [[gosirmetî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 23:07, 6 adar 2025 (UTC)
== [[matîjêker]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:08, 14 adar 2025 (UTC)
== [[hilewesan]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:14, 16 adar 2025 (UTC)
== [[peydandin#p-mane|peydandin]] ==
Ji bo maneya [[dûre]], [[paşî]], [[piştî]] wê / wî ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:26, 19 adar 2025 (UTC)
== [[peşar]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:36, 19 adar 2025 (UTC)
== [[nûzaf]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 18:30, 20 adar 2025 (UTC)
== [[deynname]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:08, 20 adar 2025 (UTC)
== [[girtek]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:29, 20 adar 2025 (UTC)
== [[bêşxane]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 00:25, 23 adar 2025 (UTC)
== [[superleheng]] ==
@[[Bikarhêner:Avestaboy|Avestaboy]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:34, 23 adar 2025 (UTC)
== [[goranparêz]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:54, 27 adar 2025 (UTC)
== [[raber#p-mane|raber]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:09, 1 nîsan 2025 (UTC)
== [[morîvanî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 20:06, 1 nîsan 2025 (UTC)
== [[wevde]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 12:17, 3 nîsan 2025 (UTC)
== [[şandêr]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:31, 3 nîsan 2025 (UTC)
== [[giloverî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Tenê li ser Ferhenga Zaravên Teknîkî û hejmara yekem ya kovara Bernamegehê derbas dibe. —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:10, 4 nîsan 2025 (UTC)
== [[xêvjimêr]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 00:00, 12 nîsan 2025 (UTC)
== [[paşekeft]] ==
@[[Bikarhêner:Jiyar Hesen|Jiyar Hesen]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:11, 13 nîsan 2025 (UTC)
== [[paşekeft kirin]] ==
@[[Bikarhêner:Jiyar Hesen|Jiyar Hesen]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:12, 13 nîsan 2025 (UTC)
== [[hawirkanî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:36, 20 nîsan 2025 (UTC)
== [[hawirkan]] ==
@[[Bikarhêner:Ferhengvan|Ferhengvan]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:18, 21 nîsan 2025 (UTC)
: Di çavkanîyeke de "''hawrikan''" (ku wek forma vê kelîmeyê hatîye nîşandayîn û wek "hevrêyan" a kurmancî ye) bi maneya "''friends''"a îngilîzî hatîye emilandin. Wekî din ti çavkanî nîne ji bo vê peyvê. Ger ev "hevrik"a kurmancî be, li vir dîsa xelet e. Bi her awayî divê were jêbirin. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:28, 21 nîsan 2025 (UTC)
== [[hawirkanî]] ==
@[[Bikarhêner:Cyrus the virus|Cyrus the virus]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:18, 21 nîsan 2025 (UTC)
== [[hawirkanvanî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:18, 21 nîsan 2025 (UTC)
== [[riberiz]] ==
@[[Bikarhêner:Ferhengvan|Ferhengvan]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:39, 21 nîsan 2025 (UTC)
:Ez bawer im ku ev hat peyitandin. Min çavkanî di beşa gotûbêjê de dan û şablona bêçavkanîtiyê rakir. [[Bikarhêner:Ferhengvan|Ferhengvan]] ([[Gotûbêja bikarhêner:Ferhengvan|gotûbêj]]) 06:11, 25 nîsan 2025 (UTC)
== [[awam]] ==
@[[User:Ferhengvan|Ferhengvan]] Min ev kelîme di ferhengên din de nedît. Gelo di kurmancî de tê bikaranîn? —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:09, 23 nîsan 2025 (UTC)
:@[[Bikarhêner:Zerwanda|Zerwanda]] tu jî forma [[vam]] ya vê kelîmeyê diemilînî, gelo çavkanî ji bo wê jî heye? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:11, 23 nîsan 2025 (UTC)
::Min jî li vir peyda kir û dest kar anîn kir, hemin ev li guherrên dengî ên Kurmancî dihat (*ebam > *ewam > *wam > vam; wek *ebaj- > {{q|ku|vajî}}). Min gotibû qey di zarawayê kesekî da hebûye û wî bi ser va kiriye û jixwe nepêkan nîn e ku di zimên da hebe îcar rind e, nê min jî serkanî tine ji bonê. [[Bikarhêner:Zerwanda|Zerwanda]] ([[Gotûbêja bikarhêner:Zerwanda|gotûbêj]]) 21:37, 23 nîsan 2025 (UTC)
:::https://bnk.institutkurde.org/images/pdf/4UVB2YMZG3.pdf
:::Di vê kitêbê de bi forma wam derbas dibe 1 Wam : qerz, dên. " dîsa jî gereg 3 çavkanî hebe.
:::Lê di beşa etîmolojiyê de eger em karibin zimanekî yekgirtî biemilînin, dê baştir be. Wekî din "bi vê enflasyona kelîmeyan" em nikarin ti tiştî bidin fêmkirin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:54, 23 nîsan 2025 (UTC)
== [[arvanê hûr]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:48, 27 nîsan 2025 (UTC)
== [[damezrak]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:47, 27 nîsan 2025 (UTC)
== [[mezrak]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:49, 27 nîsan 2025 (UTC)
== [[hevhemetî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 15:25, 6 gulan 2025 (UTC)
== [[navhemetî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 15:25, 6 gulan 2025 (UTC)
== [[entîte]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:08, 17 gulan 2025 (UTC)
== [[agirvekujêner]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 00:35, 21 gulan 2025 (UTC)
== [[progres]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 00:50, 23 gulan 2025 (UTC)
== [[bûncî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:29, 28 gulan 2025 (UTC)
== [[tasît]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:36, 31 gulan 2025 (UTC)
== [[implîcît]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:37, 31 gulan 2025 (UTC)
== [[hewedar]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 19:14, 31 gulan 2025 (UTC)
== [[destajo]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:38, 31 gulan 2025 (UTC)
== [[binhimbank]] ==
@[[Bikarhêner:Ferhengvan|Ferhengvan]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 01:23, 1 hezîran 2025 (UTC)
== [[şîmane]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 23:31, 2 hezîran 2025 (UTC)
== [[materya]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:12, 5 hezîran 2025 (UTC)
== [[bêtî]] ==
@[[Bikarhêner:Ferhengvan|Ferhengvan]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 13:03, 7 hezîran 2025 (UTC)
== [[rîbat]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:21, 9 hezîran 2025 (UTC)
== [[hevtawan]] ==
@[[Bikarhêner:Ferhengvan|Ferhengvan]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 10:26, 12 hezîran 2025 (UTC)
:Pirsek: "Hevwate" kelîmeyên ku maneyan wan hev in. "hevtawan" çawa dibe "şirîkên sûcekê"? Gereg sûcên ku tiştê wan hev bin? Ew tişt çi ye? Çima dibe şirîk? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 10:32, 12 hezîran 2025 (UTC)
::Merheba!
::"Hevtawan" anku "şirîkên heman tawanê, kesên ku heman tawan kiriye/dikin", wek "hevkar = şirîkên heman karî, kesên ku heman karî dikin", "hevjîn = şirîkên heman jiyanê, kesên ku bi hev re dijîn"... [[Bikarhêner:Ferhengvan|Ferhengvan]] ([[Gotûbêja bikarhêner:Ferhengvan|gotûbêj]]) 06:11, 30 hezîran 2025 (UTC)
== [[zanîş]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 12:07, 14 hezîran 2025 (UTC)
== [[zanîşwer]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 12:07, 14 hezîran 2025 (UTC)
== [[zanmend]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 12:09, 14 hezîran 2025 (UTC)
== [[zandar]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:08, 14 hezîran 2025 (UTC)
== [[zayîndar]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:12, 14 hezîran 2025 (UTC)
== [[zayindar]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:12, 14 hezîran 2025 (UTC)
== [[akund]] ==
@[[Bikarhêner:Ferhengvan|Ferhengvan]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 01:16, 16 hezîran 2025 (UTC)
== [[destbikar]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 07:41, 22 hezîran 2025 (UTC)
== [[vekitandin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:DarkAngel2100|DarkAngel2100]] ([[Gotûbêja bikarhêner:DarkAngel2100|gotûbêj]]) 10:45, 2 tîrmeh 2025 (UTC)
Çavkanî: Kurdish-English Dictionary by Baran Rizgar
== [[peşarmend]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:54, 5 tîrmeh 2025 (UTC)
== [[zaîd]] ==
@[[Bikarhêner:Ferhengvan|Ferhengvan]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 06:59, 6 tîrmeh 2025 (UTC)
== [[Xrîst]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 07:13, 10 tîrmeh 2025 (UTC)
== [[hesibanî kirin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:48, 13 tîrmeh 2025 (UTC)
== [[top danîn]] ==
@[[Bikarhêner:Ferhengvan|Ferhengvan]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 10:08, 13 tîrmeh 2025 (UTC)
== [[çûkger]] ==
@[[Bikarhêner:Dûrzan|Dûrzan]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 18:49, 18 tîrmeh 2025 (UTC)
== [[dûneçkar]] ==
@[[Bikarhêner:212.175.166.246|212.175.166.246]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:38, 10 tebax 2025 (UTC)
== [[sermirov]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:22, 13 tebax 2025 (UTC)
== [[nifira Esed]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:00, 19 tebax 2025 (UTC)
== [[dilkrîz]] ==
@[[Bikarhêner:Kurd87612|Kurd87612]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 10:44, 23 tebax 2025 (UTC)
== [[berxa Xwedê]] ==
@[[Bikarhêner:Kurd87612|Kurd87612]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:28, 31 tebax 2025 (UTC)
== [[destmatî]] ==
@[[Bikarhêner:Ferhengvan|Ferhengvan]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:47, 21 îlon 2025 (UTC)
== [[sîbaq]] ==
@[[Bikarhêner:Ferhengvan|Ferhengvan]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 20:33, 27 îlon 2025 (UTC)
== [[mirovê daristanê]] ==
@[[Bikarhêner:Hewarwîkîferheng|Hewarwîkîferheng]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:09, 18 çiriya pêşîn 2025 (UTC)
== [[çavbijîşk]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:30, 24 çiriya pêşîn 2025 (UTC)
== [[makeşar]] ==
@[[Bikarhêner:Avestaboy|Avestaboy]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 06:46, 14 kanûna pêşîn 2025 (UTC)
:Silav @[[Bikarhêner:Bikarhêner|Bikarhêner]] min bi derew peyv çê nekir. Peyva makeşar di sepana O-ferheng û her wiha di ferhenga online ferhengkurdi.org ya '''Enstîtuya Kurdî ya Stenbolê''' tê xwendin.
:https://ferhengkurdi.org/tr/kelime/make%C5%9Far-n [[Bikarhêner:Avestaboy|Avestaboy]] ([[Gotûbêja bikarhêner:Avestaboy|gotûbêj]]) 11:07, 18 kanûna pêşîn 2025 (UTC)
::Krîterên me yên tevlîkirina kelîmeyan heye. Ev made rîayeta wan krîteran nake. Lewma min vê kelîmeyê li vir bicih kir. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 23:28, 18 kanûna pêşîn 2025 (UTC)
== [[bihîstinzanî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 18:30, 23 hezîran 2026 (UTC)
== [[hevdilî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:28, 24 hezîran 2026 (UTC)
== [[kemisandin]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:45, 24 hezîran 2026 (UTC)
== [[kexme]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:53, 24 hezîran 2026 (UTC)
== [[lêpirsyarker]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:32, 24 hezîran 2026 (UTC)
== [[raypirs]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:34, 24 hezîran 2026 (UTC)
== [[helwestpirs]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:34, 24 hezîran 2026 (UTC)
== [[kopirî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' xuyaye maneyeke wekî pir jî heye dikare were zêdekirin —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 17:33, 25 hezîran 2026 (UTC)
== [[merxeme]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:55, 25 hezîran 2026 (UTC)
== [[mohl]] ==
@[[Bikarhêner:Far ati|Far ati]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:14, 25 hezîran 2026 (UTC)
== [[irfandarî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:30, 26 hezîran 2026 (UTC)
== [[axulme]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 00:20, 30 hezîran 2026 (UTC)
== [[şewane]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 14:26, 1 tîrmeh 2026 (UTC)
== [[poezî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 14:27, 1 tîrmeh 2026 (UTC)
== [[sebaxker]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:20, 1 tîrmeh 2026 (UTC)
== [[sebaxfiroş]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:21, 1 tîrmeh 2026 (UTC)
== [[siboxfiroş]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:21, 1 tîrmeh 2026 (UTC)
== [[diyardenasîtî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:26, 1 tîrmeh 2026 (UTC)
== [[dawxane]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 10:41, 3 tîrmeh 2026 (UTC)
== [[pêşajotî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 17:15, 3 tîrmeh 2026 (UTC)
== [[kontînentaltirîn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 17:35, 3 tîrmeh 2026 (UTC)
== [[azmayîşker]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:16, 3 tîrmeh 2026 (UTC)
== [[ateşparêz]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 05:19, 4 tîrmeh 2026 (UTC)
== [[kurtetarîx]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 11:52, 4 tîrmeh 2026 (UTC)
== [[besayetî]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 17:57, 4 tîrmeh 2026 (UTC)
== [[tawbijêr]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:45, 4 tîrmeh 2026 (UTC)
== [[destbir]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 11:30, 5 tîrmeh 2026 (UTC)
== [[nekider]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:56, 5 tîrmeh 2026 (UTC)
== [[niqar]] ==
—[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:39, 5 tîrmeh 2026 (UTC)
== [[parêzîn]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ev form li ti derê peyda nabe. Berî çendîn salan hatîye çêkirin. Bi qenaeta min şaş e, lewma em jê bibin. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 10:29, 6 tîrmeh 2026 (UTC)
== [[stêrfizîk]] ==
. —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:33, 6 tîrmeh 2026 (UTC)
== [[pêçavik]] ==
. Eger ev kelîmeyeke mehelî be, Jkx şablona {{şx|dever|cihê ku lê tê bikaranîn}} li madeyê zêde bike. —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 14:59, 7 tîrmeh 2026 (UTC)
== [[qerqef]] ==
. Eger ev kelîmeyeke mehelî be, Jkx şablona {{şx|dever|cihê ku lê tê bikaranîn}} li madeyê zêde bike. —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 15:17, 7 tîrmeh 2026 (UTC)
== [[rakar]] ==
. Eger ev kelîmeyeke mehelî be, Jkx şablona {{şx|dever|cihê ku lê tê bikaranîn}} li madeyê zêde bike. —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 15:30, 7 tîrmeh 2026 (UTC)
== [[remilîn]] ==
. Eger ev kelîmeyeke mehelî be, Jkx şablona {{şx|dever|cihê ku lê tê bikaranîn}} li madeyê zêde bike. —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 15:36, 7 tîrmeh 2026 (UTC)
== [[segurî]] ==
. —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 15:51, 7 tîrmeh 2026 (UTC)
== [[serdev]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:10, 7 tîrmeh 2026 (UTC)
== [[serziman]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 17:01, 7 tîrmeh 2026 (UTC)
== [[tenîsk]] ==
di Înternetê de gelek netîce derdikevin lê ji bo ku dûre ez kontrol bikim û çavkaniyên sehîh binivîsim li vir îlawe dikim. —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:53, 7 tîrmeh 2026 (UTC)
== [[tertî]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:58, 7 tîrmeh 2026 (UTC)
== [[tirut]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:25, 7 tîrmeh 2026 (UTC)
== [[tizqa]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:28, 7 tîrmeh 2026 (UTC)
== [[têkilîdêr]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:31, 7 tîrmeh 2026 (UTC)
== [[tîtalk]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:33, 7 tîrmeh 2026 (UTC)
== [[vircoq]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:45, 7 tîrmeh 2026 (UTC)
== [[xilêbat]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]]. Li gorî kurteya çêkirina sayfeyê li Qamişlo û Amûdê tê bikaranîn. —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:14, 7 tîrmeh 2026 (UTC)
== [[xin_û_cûc]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:27, 7 tîrmeh 2026 (UTC)
== [[çiteba]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:38, 7 tîrmeh 2026 (UTC)
== [[desttêl]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 08:45, 8 tîrmeh 2026 (UTC)
== [[Mîmedol]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 08:51, 8 tîrmeh 2026 (UTC)
== [[alaf]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 14:01, 8 tîrmeh 2026 (UTC)
== [[aşirme]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 10:13, 10 tîrmeh 2026 (UTC)
== [[geledîmentî]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:54, 13 tîrmeh 2026 (UTC)
== [[çendîmentî]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:54, 13 tîrmeh 2026 (UTC)
== [[rojeng]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:41, 18 tîrmeh 2026 (UTC)
== [[bereyîşk]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 15:47, 19 tîrmeh 2026 (UTC)
== [[wesekname]] ==
''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:08, 22 tîrmeh 2026 (UTC)
== [[cemaetgeh]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:17, 24 tîrmeh 2026 (UTC)
== [[iblîskanî]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:27, 30 tîrmeh 2026 (UTC)
== [[pehnik]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:51, 4 tebax 2026 (UTC)
:# Kamiran bedirxan û H. Muhammed bi maneya guwerte bi kar tînin.
:# Navê Çiyayek e li Hawarê derbas dibe
:# Farqînî tenê dibêje "yassı"
:#* [https://usercontent.one/wp/portal.arsivakurd.org/wp-content/uploads/2021/08/Azadiya-welat_67.pdf?media=1709107483 Azadiya welat hj 67] Roşan Lezgîn kevirên pehnik
:# Ferhenga destî pahnik pehnik dibêje
:# Rojen barnas li vir bi çi mana bi kar tîne?
:#* {{jêder-kitêb|ku|jêgirtin=... '''pehnika''' dirandar tê kişandin û ji nû ve bi mîxên têlkî ve tê girêdan ku firk û sistî nekevê. Piştî ku dirûtina rû bi binpiyê hundirîn ve xelas bû vêca dora binpiyê derva (binî) tê. Binpiyê binî li ser yê hun- dirîn an bitenê bi...|sal=2013|nivîskar=Rojen Barnas, Nûbihar|url=http://books.google.com.tr/books?id=pVDKEAAAQBAJ&pg=PA67&dq=%22wan+pehnikan%22+OR+%22pehnik%C3%AA%22+OR+%22pehnikin%22+OR+%22pehnikek%C3%AA%22+OR+%22pehnika%22+OR+%22w%C3%AA+pehnik%C3%AA%22+OR+%22pehnikino%22+OR+%22pehnikine%22&hl=&cd=4&source=gbs_api|sernav=Sîlvan/ Silîvan / Farqîn|weşanxane=PAK AJANS YAYINCILIK TURİZM VE DIŞ TİCARET LİMİTED ŞİRKETİ|ISBN=9786055402884|rûpel=67}}
:[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:40, 6 tebax 2026 (UTC)
== [[temirîndox]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:56, 6 tebax 2026 (UTC)
== [[kansêrolojî]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:17, 6 tebax 2026 (UTC)
== [[navçeparêzî]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:09, 6 tebax 2026 (UTC)
== [[goganîbûnî]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:23, 15 tebax 2026 (UTC)
== [[zewijandin]] ==
Bêyî çavkaniyan e. --[[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 18:34, 22 tebax 2026 (UTC)
== [[karbes]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 12:42, 29 tebax 2026 (UTC)
== [[biehliyet]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:41, 31 tebax 2026 (UTC)
== [[pofêldang]] ==
Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 07:09, 10 îlon 2026 (UTC)
== [[jenk]] ==
Ji xeynî Farqînî ti çavkanî nîne. Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:29, 19 îlon 2026 (UTC)
8n48hn2nso5aoxw97lxzt35anvxwcle
Gotûbêja bikarhêner:Avestaboy
3
864603
6532785
4037770
2026-09-19T09:29:58Z
Wikihez
7344
[[Bikarhêner:Wikihez/skrîpt/js/şablon-lêke.js|T]]: Agahdarkirin: [[jenk]]
6532785
wikitext
text/x-wiki
{{xêrhatin}}
== Xêrhatin ==
Merheba bikarhênerê me yê hêja: ''Avestaboy'',
Bi xêr hatî ferhenga kurdî-kurdî WÎKÎFERHENGê {{=)}}
Em hêvîdar in ku tu jî di avakirina vê ferhengê de alîkariya me bikî.
Eger pirsên te hebin, xêra xwe ji me re binivîse.
Xebatxweş.
:::::: -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 05:37, 20 tebax 2020 (UTC)
== [[jenk]] ==
Merheba @[[Bikarhêner:Avestaboy|Avestaboy]], di madeya [[jenk]] de 3 çavkanî hewce ne. Ji xeynî Farqînî ti çavkanî nîne. Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:29, 19 îlon 2026 (UTC)
5saz898t9fd7fnfothzo2yc4g6zb34k
Nimînok:Ferhengok
102
874342
6532059
6348072
2026-09-18T17:38:32Z
Wikihez
7344
add the etymology terms Modul:etymon links to: akronîm, belavbûn ji zimanekî din, deynkirina neadaptekirî/ortografîk, elîpsîz, înîtîalîzm, metatez, nomînalîzasyon, redûblîkasyon, translîterasyon, ûnîverbasyon
6532059
wikitext
text/x-wiki
Ferhengokeke terimên di Wîkîferhengê de tên bikaranîn. Ji bo lînkkirina vê rûpelê şablona {{ş|ferhengok}} bi kar bînin.
<div style="float:left;">{{TOC}}</div>
{{bend}}
== A ==
; {{lenger|akronîm}}[[akronîm]], ''[[:en:Appendix:Glossary#acronym|acronym]]''
: Kurtenavê ku ji herfên pêşîn ên çend kelîmeyan çêdibe û wek kelîmeyeke serbixwe tê xwendin. Nimûne ''NATO'', ''UNESCO''. Bide ber: [[#înîtîalîzm]]
; {{lenger|artîkel}}[[artîkel]]{{nobold|, [[veqetandek]], [[zêder]]}}
; {{lenger|analîza şiklî}}[[analîz]]a [[şikl]]î
:Etîmolojiya termekê ye ku li ser temela parçeyên wê yên nasbar ên di şiklê nûjen ê ziman de cih digirin hatiye avakirin; bêyî ku guherîna deng li ber çavan bê girtin, yanî pêkhateya wê ya senkronîk:
:: {{qertaf|en|earth|-en|nocat=1}} ji bo {{q|en|earthen}} (mîrasmayî ji {{navê zimanî|enm}} ji {{navê zimanî|ang}})
:: {{qertaf|en|bio-|-logy|nocat=1}} ji bo {{q|en|biology}} (deyn ji Latîniya nû)
:: {{qertaf|en|circle|-ar|nocat=1}} ji bo {{q|en|circular}} (mîrasmayî ji {{navê zimanî|enm}} ji {{navê zimanî|fro}} û latîniya dereng), bi guherîna {{IPAchar|/əl/}} ber bi {{IPAchar|/jəl/}}
:Analîzên şiklî behsê vê yekê dike ku mirovên ku tarîxa kelîmeyekê nizanin, li xuyanga kelîmeyê ya îro dinêrin û wê li gorî parçeyên ku nas dikin tehlîl û ava dikin.
== B ==
; {{lenger|baneşan}}[[baneşan]], [[#nîda]]
; {{lenger|belavbûn ji zimanekî din}}[[belavbûn]] ji zimanekî din, ''[[:en:Appendix:Glossary#contamination|contamination]]''
: Guherîna şikl an maneya kelîmeyekê di bin tesîra kelîmeyeke din de. Nimûne bi îngilîzî {{q|en|female}} ji fransiya kevn ''femelle'' e, lê şiklê wê di bin tesîra {{q|en|male}} de guheriye.
; {{lenger|binavkirî}}[[binavkirî]]
: Bi-nav-kirî. Formeke navdêrê ye. '''Kevirê''' min. '''Sêva''' te.
; {{lenger|biwêj}}[[biwêj]], [[#tebîr]]
; {{lenger|bireser}}[[bireser]], [[#mefûl]]
: Pêkhateya ku kar lê tê kirin. Nimûne ''Xecê sêv xwar.'' Kelîmeya ''sêv'' di vê cimleyê de bireser e. Bide ber: [[#kirde]]
== C ==
; {{lenger|cînav}}[[cînav]], [[#zemîr]]
; {{lenger|cotreh}}[[cot]][[reh]]
:Kelîmeyên ku ji eynî rehî çêbûne lê belê bi riyên cuda ketine zimanekî. Bi {{navê zimanî|en}} ''[[:en:Appendix:Glossary#doublet|doublet]]''. Bide ber [[#hevreh]]
== Ç ==
== D ==
; {{lenger|daçek}}[[daçek]], [[#edat]]
; {{lenger|dariştî}}[[dariştin]], ''dariştî''
:Çêkirina kelîmeyan bi [[#pêşgir|pêşgir]], [[#navgir|navgir]] û [[#paşgir|paşgir]]an.
; {{lenger|deynkirina neadaptekirî}}[[deynkirin]]a neadaptekirî, ''[[:en:Appendix:Glossary#unadapted borrowing|unadapted borrowing]]''
: Kelîmeya deynkirî ya ku bi şiklê zimanê jê hatiye girtin dimîne û li rêzik û bilêvkirina zimanê wergirtî nayê adaptekirin. Nimûne {{q|ku|laptop}}.
; {{lenger|deynkirina ortografîk}}[[deynkirin]]a ortografîk, ''[[:en:Appendix:Glossary#orthographic borrowing|orthographic borrowing]]''
: Kelîmeya ku bi şiklê xwe yê nivîsandinê ji zimanekî din tê deynkirin, lê li gorî herfên wê tê xwendin, ne li gorî bilêvkirina zimanê ku jê hatiye girtin.
; {{lenger|dijmane}}[[dijmane]], [[#dijwate]]
: Kelîmeyên ku maneyan wan zidî hev in yanî %100 cuda ye. Nimûne [[mezin]] û [[biçûk]] dijmaneyên hev in.
; {{lenger|dijwate}}[[dijwate]], [[#dijmane]]
: Kelîmeyên ku maneyan wan %100 cuda ye. Nimûne [[mezin]] û [[biçûk]] dijwateyên hev in.
== E ==
; {{lenger|edat}}[[edat]], [[#daçek]]
; {{lenger|elîpsîz}}[[elîpsîz]], ''[[:en:Appendix:Glossary#ellipsis|ellipsis]]''
: Avêtina kelîmeyekê ji tebîrekê, ku mana tebîra temam li kelîmeya mayî bar dibe. Nimûne {{q|en|private}} ji ''private soldier''.
; {{lenger|emilandinên_xelet}}[[emilandina]] [[xelet]], '''emilandinên xelet'''
Kelîmeyên ku ji aliyê çavkaniyên preskrîptîv ve xelet tên qebûlkirin û dibêjin divê neyên emilandin. Bide ber {{navê zimanî|en}} ''[[:en:Appendix:Glossary#proscribed|proscribed]]''.
== Ê ==
== F ==
; {{lenger|fail}}[[fail]], [[#kirde]]
: Unsira ku di cimleyekê de karî dike. Nimûne ''Xecê sêv xwar.'' Kelîmeya ''Xecê'' di vê cimleyê de fail e. Bide ber: [[#mefûl]]
; {{lenger|fiîl}}[[fiîl]], [[#lêker]]
: Kelîmeyên ku nîşanê kirinê an bûyînê dikin. Nimûne: ''Min sêv xwar.'' Li vir "xwarin" fiîl e ji ber ku karê xwarinê îfade dike.
== G ==
; {{lenger|girêdek}}[[girêdek]]
; {{lenger|gerguhêz}}{{lenger|gh}}[[gerguhêz]], ''gh''
: [[#Fiîl|Fiîl]]a ku [[#mefûl|mefûlê]] werdigire. Nimûne: ''Min sêv xwar.'' Li vir "xwarin" gerguhêz e ji ber ku dikare bi "sêv" were bikaranîn.
== H ==
; {{lenger|hevmane}}[[hevmane]], [[#hevwate]]
: Kelîmeyên ku maneya wan eynî ne. Nimûne {{q|ku|ciwan}} û {{q|ku|xweşik}}
; {{lenger|hevdeng}}[[hevdeng]]
: Kelîmeyên ku wekî kelîmeyeke din tên bilêvkirin lê nivîsîn, mane an jî rehê wan ji hev cuda ne.
; {{lenger|hevreh}}[[hevreh]]
:Kelîmeyên ku ji heman kelîmeyê çêbûne.
; {{lenger|hevwate}}[[hevwate]], [[#hevmane]]
: Kelîmeyên ku wateya wan eynî ne. Nimûne {{q|ku|ciwan}} û {{q|ku|xweşik}}
; {{lenger|hoker}}[[hoker]], [[#zerf]]
== I ==
== Î ==
; {{lenger|înîtîalîzm}}[[înîtîalîzm]], ''[[:en:Appendix:Glossary#initialism|initialism]]''
: Kurtenavê ku herfên wê yek bi yek tên xwendin. Nimûne ''BBC''. Bide ber: [[#akronîm]]
== J ==
== K ==
; {{lenger|kirde}}[[kirde]], [[#fail]]
: Unsira ku di cimleyekê de karî dike. Nimûne ''Xecê sêv xwar.'' Kelîmeya ''Xecê'' di vê cimleyê de kirde ye. Bide ber: [[#bireser]]
; {{lenger|keysa herfê}} [[keys]]a [[herf]]ê
: Halê [[hûrdek]] an [[girdek]] ya peyvê.
== L ==
; {{lenger|lêker}}[[lêker]], [[#fiîl]]
: Kelîmeyên ku nîşanê kirinê an bûyînê dikin. Nimûne: ''Min sêv xwar.'' Li vir "xwarin" lêker e ji ber ku karê xwarinê îfade dike.
== M ==
; {{lenger|mefûl}}[[mefûl]], [[#bireser]]
: Unsira ku kar lê tê kirin. Nimûne ''Xecê sêv xwar.'' Kelîmeya ''sêv'' di vê cimleyê de mefûl e. Bide ber: [[#fail|fail]]
; {{lenger|metatez}}[[metatez]], ''[[:en:Appendix:Glossary#metathesis|metathesis]]''
: Guherîna cihê dengên nav kelîmeyekê. Nimûne di kurmancî de ''berf'' û ''befr''.
; {{lenger|mê}}{{lenger|m}}[[mê]], ''m''
: [[#navdêr|Navdêrên]] ku [[#zayend|zayenda]] wan li gorî mê ditewe. Herwiha bnr. [[#mn|mn]], [[#nêr|nêr]].
; {{lenger|mê û nêr}}{{lenger|mn}}mê û nêr, ''mn''
: [[#navdêr|Navdêrên]] ku [[#zayend|zayenda]] wan li gorî hem mê hem nêr ditewe. Herwiha bnr. [[#mê|mê]], [[#nêr|nêr]].
== N ==
; {{lenger|navdêr}}[[navdêr]]
: Navên tişt (''sêv, heywan, qedeh'') yan mefhûman (''dilşadî, bextiyarî'' hwd.) di rêzimanê de.
; {{lenger|navgir}}[[navgir]]
; {{lenger|navmiletî}}[[navmiletî]]
: Kelîmeyeke deynkirî ya ku di çend zimanan de bi mane û etîmolojiyeke eynî an jî nêzîkî hev derbas dibe, bi gelemperî ji ber peydabûna çend deynkirinên hevdem û/an zincîreyeke deynkirinên li pey hev ku zû diqewimin çêdibin. Di netîceyê de dibe ku peydakirina eslê rast a etîmolojîk a terimekê zimanekî zor an ne mimkûn be. Wek nimûne doktor, otêl, înternet, taksî, an televîzyon.
; {{lenger|nebinavkirî}}[[nebinavkirî]]
; {{lenger|negerguhêz}}{{lenger|ngh}}[[negerguhêz]], ''ngh''
: [[#lêker|Lêker]]a ku [[#bireser|bireserê]] wernagire. Nimûne: "Ez diçim mektebê" li vir çûn negerguhêz e.
; {{lenger|neqiyasbar}}[[neqiyasbar]]
: [[#rengdêr|Rengdêrên]] ku formên wan yên bi ''-tir'', ''-tirîn'' an ''herî'' tune.
; {{lenger|n}}{{lenger|nêr}}[[nêr]], ''n''
: [[#navdêr|Navdêrên]] ku [[#zayend|zayenda]] wan li gorî nêr ditewe. Herwiha bnr. [[#mê|mê]], [[#mn|mn]].
; {{lenger|nêtar}}{{lenger|nt}}[[nêtar]], ''nt''
: [[#navdêr|Navdêrên]] ku [[#zayend|zayenda]] wan ne [[#nêr|nêr]] û ne jî [[#mê|mê]] ye.
; {{lenger|nêzîkî}}[[nêzîkî]] ~
: Îşareta ~ (tîlde), wextê tê pêşiya salekê, tê maneyê ku ev sal tam ne belî ye.
; {{lenger|nîda}}[[nîda]] [[#baneşan|baneşan]]
; {{lenger|nomînalîzasyon}}[[nomînalîzasyon]], ''[[:en:Appendix:Glossary#nominalization|nominalization]]''
: Çêkirina îsmekê ji kelîmeyeke cureyeke din, bi taybetî ji fiîlekê an sifetekê. Nimûne ''[[xwendin]]'' ku hem fiîl e hem îsm.
== O ==
== P ==
; {{lenger|paşgir}}[[paşgir]]
; {{lenger|paşvesazî}}[[paşvesazî]]
: Çêkirina peyvên nû bi kurtkirina peyvên heyî. Nimûne ''[[ajo]]'' ji ''[[ajotin]]''.
; {{lenger|pêk}}{{lenger|pêkhatî}}[[pêkhatî]], ''pêk''
: Çêkirina peyvên nû bi lihevanîna du an zêdetir peyvan.
; {{lenger|pêşgir}}[[pêşgir]]
; {{lenger|pirjimar}}[[pirjimar]]
; {{lenger|pirtik}}[[pirtik]]
; {{lenger|purîzm}}[[purîzm]]
: Kelîmeyên ku bi armanca [[:w:purîzma zimanî|purîzma zimanî]] ji bo terikandina kelîmeyên qedîm û yên deynkirî tên bikaranîn.
== Q ==
; {{lenger|qusandin}}[[qusandin]]
: Kurtkirina peyvekê bi avêtina çend herfan e û maneya peyvê naguherîne. Nimûne ''[[Miho]]'' ji ''[[Mihemmed]]''.
== R ==
; {{lenger|redûblîkasyon}}[[redûblîkasyon]], ''[[:en:Appendix:Glossary#reduplication|reduplication]]''
: Çêkirina kelîmeyekê bi dubarekirina kelîmeyekê an parçeyekî wê. Nimûne ''hêdî hêdî''.
; {{lenger|rengdêr}}[[rengdêr]]
== S ==
; {{lenger|serenav}}[[serenav]]
: Cureyekî navdêran e ku îşaretê peyvên yekane mîna ''[[Iqlîdes]]'', ''[[Mihemed]]'' dike. Serenav di kurmancî de bi herfên [[girek]] tên nivîsîn.
; {{lenger|sic}}[[sic]]
: Hokereke latînî ku tê maneya "lewma". Bi edetê di nav {{kod|<nowiki>[</nowiki>}} de tê nivîsin û mirov dixwaze bibêje ku ew peyv ne xeletiya kesa ku nivîsekê kopî dike ye, nivîs ji orîjînalê bêyî guhartinê hatiye wergirtin.
; {{lenger|sormancî}}[[sormancî]]
: Tevlihevkirina soranî û kurmancî di zimanê nivîskî de, xisusen bikaranîna kelîmeyên soranî di kurmancî de yan jî yên kurmancî di soranî de ku xelkê kurmancîziman û soranîziman nizanin.
== Ş ==
== T ==
; {{lenger|tebîr}}[[tebîr]], [[#biwêj|biwêj]]
; {{lenger|tewandin}}[[tewandin]]
; {{lenger|tewîn}}[[tewîn]]
; {{lenger|têkilkirin}}[[têkilkirin]]
: Çêkirina peyvekê bi riya tevlîkirina du peyvan. Nimûne ''[[tirkmancî]]'' ji ''[[tirkî]] + [[kurmancî]]''.
; {{lenger|translîterasyon}}[[translîterasyon]], ''[[:en:Appendix:Glossary#transliteration|transliteration]]''
: Veguhastina kelîmeyekê ji alfabeyekê bo alfabeyeke din, herf bi herf. Nimûne {{q|fa|خانه}} → ''xane''.
== U ==
== Û ==
; {{lenger|ûnîverbasyon}}[[ûnîverbasyon]], ''[[:en:Appendix:Glossary#univerbation|univerbation]]''
: Çêbûna çend kelîmeyên ku pir caran li pey hev tên wek kelîmeyeke yekane. Nimûne ''[[îro]]'' ji ''ev ro'', ''[[îsal]]'' ji ''ev sal''.
== V ==
== W ==
; {{lenger|wergirtin}}[[Wîkîferheng:Etîmolojî#Wergirtina wateyê|wergirtina wateyê]], ''wergirtin''
: Berfirehtirkirina wateya peyveke heyî bi riya wergerandina ji zimanekî din.
== X ==
; {{lenger|xweşbêjî}}[[xweşbêjî]] an {{mj|[[edeb]]î [[kelam]]}}
: Peyv û derbirînên li şûna peyveke din ji bo veşartina maneya nexweş an bişerm tên bikaranîn.
== Y ==
; {{lenger|yekser}}[[wergerandina yekser]], ''yekser''
:Çêkirina peyveke nû bi riya wergerandina ji zimanekî din.
== Z ==
; {{lenger|zayend}}[[zayend]]
: Awayekî sinifandina [[#navdêr|navdêran]] di zimanê kurdî û hin zimanên din de ye. Sê cure zayend ''[[#mê|mê]], [[#nêr|nêr]] û [[#mê û nêr|mê û nêr]]'' di zimanê kurdî de hene. Zayenda [[#nêtar|nêtar]] di hin zimanên din hene lê di kurdî de tune.
; {{lenger|zemîr}}[[zemîr]], [[#cînav|cînav]]
; {{lenger|zerf}}[[zerf]], [[#hoker]]
1p3c7qo6uca7p86db7pijyxytpp1udv
6532060
6532059
2026-09-18T17:39:07Z
Wikihez
7344
blank line before the next heading
6532060
wikitext
text/x-wiki
Ferhengokeke terimên di Wîkîferhengê de tên bikaranîn. Ji bo lînkkirina vê rûpelê şablona {{ş|ferhengok}} bi kar bînin.
<div style="float:left;">{{TOC}}</div>
{{bend}}
== A ==
; {{lenger|akronîm}}[[akronîm]], ''[[:en:Appendix:Glossary#acronym|acronym]]''
: Kurtenavê ku ji herfên pêşîn ên çend kelîmeyan çêdibe û wek kelîmeyeke serbixwe tê xwendin. Nimûne ''NATO'', ''UNESCO''. Bide ber: [[#înîtîalîzm]]
; {{lenger|artîkel}}[[artîkel]]{{nobold|, [[veqetandek]], [[zêder]]}}
; {{lenger|analîza şiklî}}[[analîz]]a [[şikl]]î
:Etîmolojiya termekê ye ku li ser temela parçeyên wê yên nasbar ên di şiklê nûjen ê ziman de cih digirin hatiye avakirin; bêyî ku guherîna deng li ber çavan bê girtin, yanî pêkhateya wê ya senkronîk:
:: {{qertaf|en|earth|-en|nocat=1}} ji bo {{q|en|earthen}} (mîrasmayî ji {{navê zimanî|enm}} ji {{navê zimanî|ang}})
:: {{qertaf|en|bio-|-logy|nocat=1}} ji bo {{q|en|biology}} (deyn ji Latîniya nû)
:: {{qertaf|en|circle|-ar|nocat=1}} ji bo {{q|en|circular}} (mîrasmayî ji {{navê zimanî|enm}} ji {{navê zimanî|fro}} û latîniya dereng), bi guherîna {{IPAchar|/əl/}} ber bi {{IPAchar|/jəl/}}
:Analîzên şiklî behsê vê yekê dike ku mirovên ku tarîxa kelîmeyekê nizanin, li xuyanga kelîmeyê ya îro dinêrin û wê li gorî parçeyên ku nas dikin tehlîl û ava dikin.
== B ==
; {{lenger|baneşan}}[[baneşan]], [[#nîda]]
; {{lenger|belavbûn ji zimanekî din}}[[belavbûn]] ji zimanekî din, ''[[:en:Appendix:Glossary#contamination|contamination]]''
: Guherîna şikl an maneya kelîmeyekê di bin tesîra kelîmeyeke din de. Nimûne bi îngilîzî {{q|en|female}} ji fransiya kevn ''femelle'' e, lê şiklê wê di bin tesîra {{q|en|male}} de guheriye.
; {{lenger|binavkirî}}[[binavkirî]]
: Bi-nav-kirî. Formeke navdêrê ye. '''Kevirê''' min. '''Sêva''' te.
; {{lenger|biwêj}}[[biwêj]], [[#tebîr]]
; {{lenger|bireser}}[[bireser]], [[#mefûl]]
: Pêkhateya ku kar lê tê kirin. Nimûne ''Xecê sêv xwar.'' Kelîmeya ''sêv'' di vê cimleyê de bireser e. Bide ber: [[#kirde]]
== C ==
; {{lenger|cînav}}[[cînav]], [[#zemîr]]
; {{lenger|cotreh}}[[cot]][[reh]]
:Kelîmeyên ku ji eynî rehî çêbûne lê belê bi riyên cuda ketine zimanekî. Bi {{navê zimanî|en}} ''[[:en:Appendix:Glossary#doublet|doublet]]''. Bide ber [[#hevreh]]
== Ç ==
== D ==
; {{lenger|daçek}}[[daçek]], [[#edat]]
; {{lenger|dariştî}}[[dariştin]], ''dariştî''
:Çêkirina kelîmeyan bi [[#pêşgir|pêşgir]], [[#navgir|navgir]] û [[#paşgir|paşgir]]an.
; {{lenger|deynkirina neadaptekirî}}[[deynkirin]]a neadaptekirî, ''[[:en:Appendix:Glossary#unadapted borrowing|unadapted borrowing]]''
: Kelîmeya deynkirî ya ku bi şiklê zimanê jê hatiye girtin dimîne û li rêzik û bilêvkirina zimanê wergirtî nayê adaptekirin. Nimûne {{q|ku|laptop}}.
; {{lenger|deynkirina ortografîk}}[[deynkirin]]a ortografîk, ''[[:en:Appendix:Glossary#orthographic borrowing|orthographic borrowing]]''
: Kelîmeya ku bi şiklê xwe yê nivîsandinê ji zimanekî din tê deynkirin, lê li gorî herfên wê tê xwendin, ne li gorî bilêvkirina zimanê ku jê hatiye girtin.
; {{lenger|dijmane}}[[dijmane]], [[#dijwate]]
: Kelîmeyên ku maneyan wan zidî hev in yanî %100 cuda ye. Nimûne [[mezin]] û [[biçûk]] dijmaneyên hev in.
; {{lenger|dijwate}}[[dijwate]], [[#dijmane]]
: Kelîmeyên ku maneyan wan %100 cuda ye. Nimûne [[mezin]] û [[biçûk]] dijwateyên hev in.
== E ==
; {{lenger|edat}}[[edat]], [[#daçek]]
; {{lenger|elîpsîz}}[[elîpsîz]], ''[[:en:Appendix:Glossary#ellipsis|ellipsis]]''
: Avêtina kelîmeyekê ji tebîrekê, ku mana tebîra temam li kelîmeya mayî bar dibe. Nimûne {{q|en|private}} ji ''private soldier''.
; {{lenger|emilandinên_xelet}}[[emilandina]] [[xelet]], '''emilandinên xelet'''
Kelîmeyên ku ji aliyê çavkaniyên preskrîptîv ve xelet tên qebûlkirin û dibêjin divê neyên emilandin. Bide ber {{navê zimanî|en}} ''[[:en:Appendix:Glossary#proscribed|proscribed]]''.
== Ê ==
== F ==
; {{lenger|fail}}[[fail]], [[#kirde]]
: Unsira ku di cimleyekê de karî dike. Nimûne ''Xecê sêv xwar.'' Kelîmeya ''Xecê'' di vê cimleyê de fail e. Bide ber: [[#mefûl]]
; {{lenger|fiîl}}[[fiîl]], [[#lêker]]
: Kelîmeyên ku nîşanê kirinê an bûyînê dikin. Nimûne: ''Min sêv xwar.'' Li vir "xwarin" fiîl e ji ber ku karê xwarinê îfade dike.
== G ==
; {{lenger|girêdek}}[[girêdek]]
; {{lenger|gerguhêz}}{{lenger|gh}}[[gerguhêz]], ''gh''
: [[#Fiîl|Fiîl]]a ku [[#mefûl|mefûlê]] werdigire. Nimûne: ''Min sêv xwar.'' Li vir "xwarin" gerguhêz e ji ber ku dikare bi "sêv" were bikaranîn.
== H ==
; {{lenger|hevmane}}[[hevmane]], [[#hevwate]]
: Kelîmeyên ku maneya wan eynî ne. Nimûne {{q|ku|ciwan}} û {{q|ku|xweşik}}
; {{lenger|hevdeng}}[[hevdeng]]
: Kelîmeyên ku wekî kelîmeyeke din tên bilêvkirin lê nivîsîn, mane an jî rehê wan ji hev cuda ne.
; {{lenger|hevreh}}[[hevreh]]
:Kelîmeyên ku ji heman kelîmeyê çêbûne.
; {{lenger|hevwate}}[[hevwate]], [[#hevmane]]
: Kelîmeyên ku wateya wan eynî ne. Nimûne {{q|ku|ciwan}} û {{q|ku|xweşik}}
; {{lenger|hoker}}[[hoker]], [[#zerf]]
== I ==
== Î ==
; {{lenger|înîtîalîzm}}[[înîtîalîzm]], ''[[:en:Appendix:Glossary#initialism|initialism]]''
: Kurtenavê ku herfên wê yek bi yek tên xwendin. Nimûne ''BBC''. Bide ber: [[#akronîm]]
== J ==
== K ==
; {{lenger|kirde}}[[kirde]], [[#fail]]
: Unsira ku di cimleyekê de karî dike. Nimûne ''Xecê sêv xwar.'' Kelîmeya ''Xecê'' di vê cimleyê de kirde ye. Bide ber: [[#bireser]]
; {{lenger|keysa herfê}} [[keys]]a [[herf]]ê
: Halê [[hûrdek]] an [[girdek]] ya peyvê.
== L ==
; {{lenger|lêker}}[[lêker]], [[#fiîl]]
: Kelîmeyên ku nîşanê kirinê an bûyînê dikin. Nimûne: ''Min sêv xwar.'' Li vir "xwarin" lêker e ji ber ku karê xwarinê îfade dike.
== M ==
; {{lenger|mefûl}}[[mefûl]], [[#bireser]]
: Unsira ku kar lê tê kirin. Nimûne ''Xecê sêv xwar.'' Kelîmeya ''sêv'' di vê cimleyê de mefûl e. Bide ber: [[#fail|fail]]
; {{lenger|metatez}}[[metatez]], ''[[:en:Appendix:Glossary#metathesis|metathesis]]''
: Guherîna cihê dengên nav kelîmeyekê. Nimûne di kurmancî de ''berf'' û ''befr''.
; {{lenger|mê}}{{lenger|m}}[[mê]], ''m''
: [[#navdêr|Navdêrên]] ku [[#zayend|zayenda]] wan li gorî mê ditewe. Herwiha bnr. [[#mn|mn]], [[#nêr|nêr]].
; {{lenger|mê û nêr}}{{lenger|mn}}mê û nêr, ''mn''
: [[#navdêr|Navdêrên]] ku [[#zayend|zayenda]] wan li gorî hem mê hem nêr ditewe. Herwiha bnr. [[#mê|mê]], [[#nêr|nêr]].
== N ==
; {{lenger|navdêr}}[[navdêr]]
: Navên tişt (''sêv, heywan, qedeh'') yan mefhûman (''dilşadî, bextiyarî'' hwd.) di rêzimanê de.
; {{lenger|navgir}}[[navgir]]
; {{lenger|navmiletî}}[[navmiletî]]
: Kelîmeyeke deynkirî ya ku di çend zimanan de bi mane û etîmolojiyeke eynî an jî nêzîkî hev derbas dibe, bi gelemperî ji ber peydabûna çend deynkirinên hevdem û/an zincîreyeke deynkirinên li pey hev ku zû diqewimin çêdibin. Di netîceyê de dibe ku peydakirina eslê rast a etîmolojîk a terimekê zimanekî zor an ne mimkûn be. Wek nimûne doktor, otêl, înternet, taksî, an televîzyon.
; {{lenger|nebinavkirî}}[[nebinavkirî]]
; {{lenger|negerguhêz}}{{lenger|ngh}}[[negerguhêz]], ''ngh''
: [[#lêker|Lêker]]a ku [[#bireser|bireserê]] wernagire. Nimûne: "Ez diçim mektebê" li vir çûn negerguhêz e.
; {{lenger|neqiyasbar}}[[neqiyasbar]]
: [[#rengdêr|Rengdêrên]] ku formên wan yên bi ''-tir'', ''-tirîn'' an ''herî'' tune.
; {{lenger|n}}{{lenger|nêr}}[[nêr]], ''n''
: [[#navdêr|Navdêrên]] ku [[#zayend|zayenda]] wan li gorî nêr ditewe. Herwiha bnr. [[#mê|mê]], [[#mn|mn]].
; {{lenger|nêtar}}{{lenger|nt}}[[nêtar]], ''nt''
: [[#navdêr|Navdêrên]] ku [[#zayend|zayenda]] wan ne [[#nêr|nêr]] û ne jî [[#mê|mê]] ye.
; {{lenger|nêzîkî}}[[nêzîkî]] ~
: Îşareta ~ (tîlde), wextê tê pêşiya salekê, tê maneyê ku ev sal tam ne belî ye.
; {{lenger|nîda}}[[nîda]] [[#baneşan|baneşan]]
; {{lenger|nomînalîzasyon}}[[nomînalîzasyon]], ''[[:en:Appendix:Glossary#nominalization|nominalization]]''
: Çêkirina îsmekê ji kelîmeyeke cureyeke din, bi taybetî ji fiîlekê an sifetekê. Nimûne ''[[xwendin]]'' ku hem fiîl e hem îsm.
== O ==
== P ==
; {{lenger|paşgir}}[[paşgir]]
; {{lenger|paşvesazî}}[[paşvesazî]]
: Çêkirina peyvên nû bi kurtkirina peyvên heyî. Nimûne ''[[ajo]]'' ji ''[[ajotin]]''.
; {{lenger|pêk}}{{lenger|pêkhatî}}[[pêkhatî]], ''pêk''
: Çêkirina peyvên nû bi lihevanîna du an zêdetir peyvan.
; {{lenger|pêşgir}}[[pêşgir]]
; {{lenger|pirjimar}}[[pirjimar]]
; {{lenger|pirtik}}[[pirtik]]
; {{lenger|purîzm}}[[purîzm]]
: Kelîmeyên ku bi armanca [[:w:purîzma zimanî|purîzma zimanî]] ji bo terikandina kelîmeyên qedîm û yên deynkirî tên bikaranîn.
== Q ==
; {{lenger|qusandin}}[[qusandin]]
: Kurtkirina peyvekê bi avêtina çend herfan e û maneya peyvê naguherîne. Nimûne ''[[Miho]]'' ji ''[[Mihemmed]]''.
== R ==
; {{lenger|redûblîkasyon}}[[redûblîkasyon]], ''[[:en:Appendix:Glossary#reduplication|reduplication]]''
: Çêkirina kelîmeyekê bi dubarekirina kelîmeyekê an parçeyekî wê. Nimûne ''hêdî hêdî''.
; {{lenger|rengdêr}}[[rengdêr]]
== S ==
; {{lenger|serenav}}[[serenav]]
: Cureyekî navdêran e ku îşaretê peyvên yekane mîna ''[[Iqlîdes]]'', ''[[Mihemed]]'' dike. Serenav di kurmancî de bi herfên [[girek]] tên nivîsîn.
; {{lenger|sic}}[[sic]]
: Hokereke latînî ku tê maneya "lewma". Bi edetê di nav {{kod|<nowiki>[</nowiki>}} de tê nivîsin û mirov dixwaze bibêje ku ew peyv ne xeletiya kesa ku nivîsekê kopî dike ye, nivîs ji orîjînalê bêyî guhartinê hatiye wergirtin.
; {{lenger|sormancî}}[[sormancî]]
: Tevlihevkirina soranî û kurmancî di zimanê nivîskî de, xisusen bikaranîna kelîmeyên soranî di kurmancî de yan jî yên kurmancî di soranî de ku xelkê kurmancîziman û soranîziman nizanin.
== Ş ==
== T ==
; {{lenger|tebîr}}[[tebîr]], [[#biwêj|biwêj]]
; {{lenger|tewandin}}[[tewandin]]
; {{lenger|tewîn}}[[tewîn]]
; {{lenger|têkilkirin}}[[têkilkirin]]
: Çêkirina peyvekê bi riya tevlîkirina du peyvan. Nimûne ''[[tirkmancî]]'' ji ''[[tirkî]] + [[kurmancî]]''.
; {{lenger|translîterasyon}}[[translîterasyon]], ''[[:en:Appendix:Glossary#transliteration|transliteration]]''
: Veguhastina kelîmeyekê ji alfabeyekê bo alfabeyeke din, herf bi herf. Nimûne {{q|fa|خانه}} → ''xane''.
== U ==
== Û ==
; {{lenger|ûnîverbasyon}}[[ûnîverbasyon]], ''[[:en:Appendix:Glossary#univerbation|univerbation]]''
: Çêbûna çend kelîmeyên ku pir caran li pey hev tên wek kelîmeyeke yekane. Nimûne ''[[îro]]'' ji ''ev ro'', ''[[îsal]]'' ji ''ev sal''.
== V ==
== W ==
; {{lenger|wergirtin}}[[Wîkîferheng:Etîmolojî#Wergirtina wateyê|wergirtina wateyê]], ''wergirtin''
: Berfirehtirkirina wateya peyveke heyî bi riya wergerandina ji zimanekî din.
== X ==
; {{lenger|xweşbêjî}}[[xweşbêjî]] an {{mj|[[edeb]]î [[kelam]]}}
: Peyv û derbirînên li şûna peyveke din ji bo veşartina maneya nexweş an bişerm tên bikaranîn.
== Y ==
; {{lenger|yekser}}[[wergerandina yekser]], ''yekser''
:Çêkirina peyveke nû bi riya wergerandina ji zimanekî din.
== Z ==
; {{lenger|zayend}}[[zayend]]
: Awayekî sinifandina [[#navdêr|navdêran]] di zimanê kurdî û hin zimanên din de ye. Sê cure zayend ''[[#mê|mê]], [[#nêr|nêr]] û [[#mê û nêr|mê û nêr]]'' di zimanê kurdî de hene. Zayenda [[#nêtar|nêtar]] di hin zimanên din hene lê di kurdî de tune.
; {{lenger|zemîr}}[[zemîr]], [[#cînav|cînav]]
; {{lenger|zerf}}[[zerf]], [[#hoker]]
gz3pge6vxcui1x4o3cw43a8lzo70y43
Tickle
0
905187
6532653
6509413
2026-09-19T09:08:29Z
Wikihez
7344
6532653
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Serenav ===
{{serenav|en}}
# {{paşnav|en}}
==== Anagram ====
* {{anagram|en|a=ceiklt|Keltic}}
st2vwptu25a6m2zgat4upqmlzukrap8
Modul:parameters/data
828
1324875
6532083
6531698
2026-09-18T19:07:55Z
Wikihez
7344
Kurdish names for the parameters (tarîxa-etîm, niqtena, niqte, katna/nekat, darna) and for the modifiers (hrf, crztip, grdk, anlz, metn)
6532083
Scribunto
text/plain
local list_to_set = require("Module:table").listToSet
local function process_set_param(param)
param.set = list_to_set(param.set)
param.converted_set = true
return param
end
local boolean = {type = "boolean"}
local empty_list = {}
local list = {list = true}
local list_allow_holes_separate_no_index = {list = true, allow_holes = true, separate_no_index = true}
local required = {required = true}
local required_default_ = {required = true, default = ""}
local required_lang_default_und = {required = true, type = "language", default = "und"}
local m = {}
-- [[Module:anchors]]
m["anchor"] = {
[1] = {required = true, list = true, disallow_holes = true},
}
m["senseid"] = {
[1] = required_lang_default_und,
[2] = required_default_,
tag = process_set_param{set = {"li", "p"}, default = "li"},
}
m["etymid"] = {
[1] = required_lang_default_und,
[2] = required_default_
}
-- [[Module:etymon]]
m["etymon"] = {
[1] = required_lang_default_und,
[2] = {list = true, disallow_holes = true},
id = true,
title = true,
tree = boolean,
text = true,
-- Kurdish names for the same two parameters.
dar = {alias_of = "tree"},
metn = {alias_of = "text"},
exnihilo = boolean,
etydate = true,
doublet = {sublist = "comma without whitespace"},
-- Kurdish name for the same parameter, cf. Şablon:cotreh.
cotreh = {alias_of = "doublet"},
rfe = true,
etystub = true,
nl = boolean,
pos = true,
-- Kurdish name for the same parameter; Modul:etymon maps its Kurdish values (reh, kelîme, ...).
crz = {alias_of = "pos"},
notree = {default = false, type = "boolean"},
nocat = {default = false, type = "boolean"},
nodot = {default = false, type = "boolean"},
dot = true,
-- Kurdish names for the same parameters.
["tarîxa-etîm"] = {alias_of = "etydate"},
darna = {alias_of = "notree"},
katna = {alias_of = "nocat"},
nekat = {alias_of = "nocat"},
niqtena = {alias_of = "nodot"},
niqte = {alias_of = "dot"},
json = {default = false, type = "boolean"},
}
-- [[Module:translations]]
m["translation"] = {
[1] = required_lang_default_und,
[2] = true,
[3] = list,
["alt"] = true,
["id"] = true,
["sc"] = {type = "script"},
["tr"] = true,
["ts"] = true,
["lit"] = true,
}
m["t-needed"] = {
[1] = required_lang_default_und,
[2] = process_set_param{set = {"usex", "quote"}},
["nocat"] = boolean,
["sort"] = true,
}
m["trans-top"] = {
[1] = true,
["id"] = true,
["column-width"] = true,
}
m["trans-top-also"] = {
[1] = required,
[2] = list,
["id"] = list_allow_holes_separate_no_index,
["column-width"] = true,
}
m["checktrans-top"] = {
[1] = true,
["column-width"] = true,
}
m["trans-bottom"] = empty_list
m["trans-see"] = {
[1] = required,
[2] = list,
["id"] = list_allow_holes_separate_no_index,
}
m["translation subpage"] = empty_list
m["no equivalent translation"] = {
[1] = required_lang_default_und,
["noend"] = boolean,
}
m["no attested translation"] = {
[1] = required_lang_default_und,
["noend"] = boolean,
["sort"] = true,
}
m["not used"] = {
[1] = required_lang_default_und,
[2] = true,
}
return m
338lyfowsqvo2n7ky43h9frxqyo5oz6
Modul:etymon
828
1326097
6532061
6531695
2026-09-18T17:44:04Z
Wikihez
7344
language and family names link to their category instead of Wikipedia; a family now reads "zimanên îranî"; glossary links point at Nimînok:Ferhengok (tree keeps a full "Rûpel#lenger" target); Kurdish names, shorthands and tree labels for nomînalîzasyon, ûnîverbasyon, translîterasyon, redûblîkasyon, elîpsîz, akronîm, înîtîalîzm, deynort, deynne
6532061
Scribunto
text/plain
--[=[
This module implements the {{etymon}} template for structured etymology data on Wiktionary.
It enables the creation of etymology trees and text by parsing etymon chains,
scraping linked pages for their own {{etymon}} data, and recursively building a tree
of derivational relationships.
Authors:
- Original implementation: [[User:Ioaxxere]]
- Full refactor (September 2025): [[User:Fenakhay]] ([[Special:Diff/86717746]])
Modules:
- [[Module:etymon]]: main module handling parsing, validation, tree building, and page scraping
- [[Module:etymon/data]]: keyword definitions, configuration, and status constants
- [[Module:etymon/tree]]: etymology tree rendering
- [[Module:etymon/text]]: etymology text generation
- [[Module:etymon/categories]]: category generation logic
- [[Module:etymon/tracking]]: tracking
]=]
local export = {}
local __state = {
cached_etymon_args = {},
cached_etymon_pages = {},
cached_descendants_checks = {},
senseid_parent_etymon = {},
available_etymon_ids = {},
single_etymons = {},
entry_title = nil,
entry_lang_code = nil,
current_page_has_inline_etymology = false,
current_page_has_redundant_etymology = false,
used_idless_etymon = false,
toplevel_has_inline_etymology = false,
toplevel_redundant_etymology = false,
toplevel_idless_etymon = false,
has_mismatched_id = false,
linked_page_multiple_etymons_idless = false,
linked_page_partial_etymology_sections = false,
partial_etymology_targets = {},
skip_partial_etymology_category = false,
max_depth_reached = 0,
total_nodes = 0,
language_count = {},
toplevel_keyword_stats = {},
id_stats = nil,
warnings = {},
}
local function reset_invocation_state()
__state.current_page_has_inline_etymology = false
__state.current_page_has_redundant_etymology = false
__state.used_idless_etymon = false
__state.toplevel_has_inline_etymology = false
__state.toplevel_redundant_etymology = false
__state.toplevel_idless_etymon = false
__state.has_mismatched_id = false
__state.linked_page_multiple_etymons_idless = false
__state.linked_page_partial_etymology_sections = false
__state.max_depth_reached = 0
__state.total_nodes = 0
__state.language_count = {}
__state.toplevel_keyword_stats = {}
__state.warnings = {}
end
local M = require("Module:module loader").init({
require = {
data = "Module:etymon/data",
tree = "Module:etymon/tree",
text = "Module:etymon/text",
categories = "Module:etymon/categories",
tracking = "Module:etymon/tracking",
descendants = "Module:etymon/descendants",
anchors = "Module:anchors",
etydate = "Module:etydate",
etymology = "Module:etymology",
families = "Module:families",
languages = "Module:languages",
languages_errorgetby = "Module:languages/errorGetBy",
links = "Module:links",
pages = "Module:pages",
parameters = "Module:parameters",
string_utilities = "Module:string utilities",
template_parser = "Module:template parser",
utilities = "Module:utilities",
debug = "Module:debug",
en_utilities = "Module:en-utilities",
parse_utilities = "Module:parse utilities",
references = "Module:references",
template_styles = "Module:TemplateStyles",
script_utilities = "Module:script utilities",
JSON = "Module:JSON",
yesno = "Module:yesno",
},
loadData = {
headword_data = "Module:headword/data",
parameters_data = "Module:parameters/data",
text_allowed = "Module:etymon/data/text_allowed",
},
})
-- Template names that carry etymon data, and the heading that opens an etymology section.
-- Pages are scraped for these, so both must match what ku.wiktionary actually uses:
-- the section is "Etîmolojî", and the new template is "etîmon".
-- Only the new template: pages still using Şablon:etymon carry the old ">"-separated syntax, which
-- this module would misparse into garbage node labels. Add "etymon" here only once
-- Şablon:etymon itself invokes this module.
local ETYMON_TEMPLATES = {
["etîmon"] = true,
["etymon/nû"] = true, -- redirect to Şablon:etîmon; still recognised if written out
-- Do NOT add "etymon" here while Şablon:etymon still uses the old ">"-separated syntax:
-- this module would read those calls and parse the bare keyword ("inh") as a term.
}
local ETYMOLOGY_HEADING = "^Etîmolojî"
-- ku's reconstruction namespace is "Jinûvesazî" (id 108), where en.wiktionary uses
-- "Reconstruction" (id 118). A page here is a reconstructed term, so its title needs the
-- leading "*" that Modul:links requires for reconstructed languages.
local RECONSTRUCTION_NS_NAME = "Jinûvesazî"
local RECONSTRUCTION_NS_ID = 108
local Util = {}
function Util.format_error(message, preview_only)
if preview_only and not M.pages.is_preview() then
return nil
end
return '<span class="error">' .. message .. '</span>'
end
function Util.add_warning(message, preview_only)
local formatted = Util.format_error(message, preview_only)
if formatted then
table.insert(__state.warnings, formatted)
end
end
function Util.is_text_param_allowed_for_lang(lang)
if not lang or type(lang) ~= "table" then
return false
end
local types = lang.getTypes and lang:getTypes()
if types and types.family then
local code = lang.getCode and lang:getCode()
return code and M.text_allowed.families[code] == true
end
local full_code = lang.getFullCode and lang:getFullCode()
if full_code and M.text_allowed.langs[full_code] then
return true
end
if lang.inFamily then
for family_code in pairs(M.text_allowed.families) do
if lang:inFamily(family_code) then
return true
end
end
end
return false
end
function Util.get_lang(code, no_error)
if no_error then
return M.languages.getByCode(code, nil, true)
end
return M.languages.getByCode(code, nil, true) or M.languages_errorgetby.code(code, true, true)
end
-- Match a term language against a text=:lang stop target (supports etymology-only codes).
function Util.lang_matches_stop_code(term_lang, stop_code)
if not term_lang or not stop_code or stop_code == "" then
return false
end
local stop_lang = Util.get_lang(stop_code, true)
if not stop_lang then
return false
end
if term_lang:getCode() == stop_lang:getCode() then
return true
end
if stop_lang:getFullCode() == stop_lang:getCode() then
return term_lang:getFullCode() == stop_lang:getCode()
end
return false
end
function Util.get_family(code)
return M.families.getByCode(code)
end
function Util.get_lang_exception(lang)
-- Families have no language-specific exceptions
if lang.getTypes and lang:getTypes().family then
return nil
end
local code = lang:getCode()
local lang_exceptions = M.data.config.lang_exceptions
if lang_exceptions[code] then
return lang_exceptions[code]
end
for norm_code, exc in pairs(lang_exceptions) do
if exc.normalize_to and code == exc.normalize_to then
return exc
end
if exc.normalize_from_families then
local should_normalize = false
for _, family in ipairs(exc.normalize_from_families) do
if lang:inFamily(family) then
should_normalize = true
break
end
end
if should_normalize and exc.normalize_exclude_families then
for _, family in ipairs(exc.normalize_exclude_families) do
if lang:inFamily(family) then
should_normalize = false
break
end
end
end
if should_normalize then
local ret = {}
for k, v in pairs(exc) do
ret[k] = v
end
ret.suppress_tr = nil
return ret
end
end
end
return nil
end
function Util.get_norm_lang(lang)
local exc = Util.get_lang_exception(lang)
if exc and exc.normalize_to then
return M.languages.getByCode(exc.normalize_to)
end
return lang
end
function Util.resolve_context_lang(lang, node_args)
if type(node_args) ~= "table" then return lang end
if node_args.status == M.data.STATUS.INLINE then return lang end
if not (lang.hasType and lang:hasType("etymology-only")) then return lang end
local full = lang.getFull and lang:getFull()
if not full or full:getCode() == lang:getCode() then return lang end
if full.hasAncestor and full:hasAncestor(lang) then return lang end
return full
end
-- Add default values for boolean modifiers (e.g., <unc> becomes <unc:1>)
-- This is needed because Module:parse utilities expects boolean modifiers to have explicit values
function Util.add_boolean_defaults(str, param_mods)
local result = str
for name, spec in pairs(param_mods) do
if spec.type == "boolean" then
-- Replace <name> with <name:1> (but not <name:...> which already has a value)
result = result:gsub("<" .. name .. ">", "<" .. name .. ":1>")
end
end
return result
end
local REQUEST_TEMPLATE_PARAM_MODS = {
rfe = {
nocat = { type = "boolean" },
sort = {},
y = {},
m = {},
fragment = {},
section = {},
box = { type = "boolean" },
noes = { type = "boolean" },
},
etystub = {
nocat = { type = "boolean" },
sort = {},
nocap = { type = "boolean" },
nodot = { type = "boolean" },
},
}
function Util.expand_request_template(frame, template_name, param_value, lang_code)
local param_mods = REQUEST_TEMPLATE_PARAM_MODS[template_name]
local with_defaults = Util.add_boolean_defaults(param_value, param_mods)
local parsed = M.parse_utilities.parse_inline_modifiers(with_defaults, {
param_mods = param_mods,
generate_obj = function(text)
if M.yesno(text, false) then
return { is_boolean = true }
end
return { text = text }
end,
})
local template_args = { [1] = lang_code }
for name in pairs(param_mods) do
template_args[name] = parsed[name]
end
if not parsed.is_boolean then
template_args[2] = parsed.text
end
return " " .. frame:expandTemplate({
title = template_name,
args = template_args,
})
end
-- Kurdish values accepted for |pos= (|crz=) and <postype:>, mapped to the English values the rest of
-- the module compares against.
local POS_ALIASES = {
["reh"] = "root",
["kelîme"] = "word",
["pêşgir"] = "prefix",
["paşgir"] = "suffix",
["navgir"] = "interfix",
}
function Util.normalize_pos(value)
if type(value) ~= "string" then
return value
end
value = mw.text.trim(value)
return POS_ALIASES[value] or value
end
-- {{etîmon}} arguments read straight from another page skip Module:parameters, so `crz` (the Kurdish
-- name of `pos`) and the Kurdish values are resolved here.
function Util.normalize_raw_etymon_args(args)
if args.pos == nil and args.crz ~= nil then
args.pos = args.crz
end
args.pos = Util.normalize_pos(args.pos)
return args
end
-- Centralized term formatting: handles suppress_term (-), unknown_term (empty/+), and regular terms
function Util.format_term(term, is_toplevel, opts)
opts = opts or {}
-- suppress_term (-) returns nil
if term.suppress_term then
return nil
end
local lang = term.lang
local exc = Util.get_lang_exception(lang)
if is_toplevel then
local display_text = term.alt or term.title or ""
local sc = term.sc or lang:findBestScript(display_text)
local bold_text = tostring(mw.html.create("strong")
:addClass("selflink")
:wikitext(display_text))
return M.script_utilities.tag_text(bold_text, lang, sc, "term")
end
local link_params = { lang = lang }
link_params.term = not term.unknown_term and term.title or nil
link_params.alt = term.alt
link_params.id = (not term.unknown_term and term.id and term.id ~= "") and term.id or nil
if not (exc and exc.suppress_tr) then
link_params.tr = term.tr
link_params.ts = term.ts
else
link_params.suppress_tr = true
end
link_params.lit = (opts.lit ~= "suppress") and term.lit or nil
-- An explicit <t:...> wins; otherwise fall back to the etymon id, which on ku is usually a
-- Kurdish gloss in its own right ("berik", "hêştir"). An id that is a key rather than a
-- translation ("H2O", "paşgira meslekî") can be overridden with a <t:...>.
local t = (term.t and term.t ~= "") and term.t or nil
local id_gloss = (term.id and term.id ~= "") and term.id or nil
local gloss = t or id_gloss
-- gloss = "separate" leaves the gloss out of the link and returns it as a second value, so
-- the tree can put it on its own line.
if opts.gloss ~= "suppress" and opts.gloss ~= "separate" then
link_params.gloss = gloss
end
if term.g and term.g ~= "" then
local genders = M.string_utilities.split(term.g, ",")
for i = 1, #genders do
genders[i] = M.string_utilities.trim(genders[i])
end
link_params.genders = genders
end
if opts.pos ~= "suppress" then
link_params.pos = term.pos
link_params.ng = term.ng
end
if exc and exc.suppress_tr then
link_params.lit = nil
end
local show_qualifiers
if opts.tree_ql ~= "suppress" then
if term.q then
link_params.q = term.q
end
if term.qq then
link_params.qq = term.qq
end
if term.l then
link_params.l = term.l
end
if term.ll then
link_params.ll = term.ll
end
show_qualifiers = term.q or term.qq or term.l or term.ll
end
local link = M.links.full_link(link_params, "term", nil, show_qualifiers and true or nil)
if opts.gloss == "separate" then
return link, gloss
end
return link
end
local __is_content_page_cached
function Util.is_content_page()
if __is_content_page_cached == nil then
__is_content_page_cached = M.pages.is_content_page(mw.title.getCurrentTitle())
end
return __is_content_page_cached
end
local __page_data_cached
function Util.get_page_data()
if not __page_data_cached then
__page_data_cached = M.headword_data.page
end
return __page_data_cached
end
-- Extract base keyword from param (without modifiers)
local function get_keyword_base(param)
if type(param) ~= "string" then return nil end
local base = param:match("^:?([^<]+)") or param:gsub("^:", "")
return base
end
local function is_keyword(param, allow_colon_less)
if type(param) ~= "string" then return false end
local keywords = M.data.keywords
if param:sub(1, 1) == ":" then
local base = get_keyword_base(param)
return keywords[base] ~= nil
end
if allow_colon_less then
local base = get_keyword_base(param)
return keywords[base] ~= nil
end
return false
end
local function get_keyword(param, allow_colon_less)
if type(param) ~= "string" then return nil end
local keywords = M.data.keywords
if param:sub(1, 1) == ":" then
return get_keyword_base(param)
end
if allow_colon_less then
local base = get_keyword_base(param)
if keywords[base] then
return base
end
end
return nil
end
local function normalize_keyword(keyword)
if keyword:sub(1, 1) == ":" then
return keyword
end
return ":" .. keyword
end
-- Resolve keyword (possibly an alias) to its canonical form. Used only at input boundaries
local function get_canonical_keyword(keyword)
if not keyword then return keyword end
return M.data.keyword_canonical[keyword] or keyword
end
local function is_affix_group_keyword(keyword)
local config = keyword and M.data.keywords[keyword]
return config and config.affix_categories or false
end
local function reject_removed_surf_keyword(param)
local base = get_keyword_base(param)
if base == "surf" then
error("The `:surf` keyword has been removed. Use `<surf>` on a formation keyword instead (e.g. `:af<surf>`, `:bor<surf>`).")
end
end
local function copy_keyword_info(source)
local copy = {}
for k, v in pairs(source) do
copy[k] = v
end
return copy
end
local function lowercase_glossary_display(text)
return text:gsub("(%[%[Nimînok:Ferhengok#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest)
return prefix .. mw.ustring.lower(first) .. rest .. "]]"
end)
end
local function surf_should_keep_formation_phrase(base)
if not base.phrase then
return false
end
if base.glossary then
return true
end
return not (base.phrase == "from" and (base.text == "From" or base.text == "from"))
end
-- Runtime overrides when <surf> is present on a keyword.
local function get_effective_keyword_info(keyword, modifiers)
local base = M.data.keywords[keyword]
if not base or not modifiers or not modifiers.surf then
return base
end
local effective = copy_keyword_info(base)
local surf_text = "By [[Nimînok:Ferhengok#surface_analysis|surface analysis]],"
local surf_phrase = "by surface analysis,"
effective.new_sentence = true
effective.invisible = "tree"
if surf_should_keep_formation_phrase(base) then
effective.phrase = surf_phrase .. " " .. base.phrase
if base.text then
effective.text = surf_text .. " " .. lowercase_glossary_display(base.text)
else
effective.text = surf_text .. " " .. base.phrase
end
else
effective.text = surf_text
effective.phrase = surf_phrase
end
return effective
end
-- Build text/phrase for nominalization with <g:code> (uses data module for codes only).
local function get_nominalization_label_for_g(code)
if not code or code == "" then return nil end
local codes = M.data.nominalization_g_codes
local adj = codes[code]
if not adj and code:find("-", 1, true) then
-- ku combines a gender with a number by hyphenating them ("m-p"), where en.wikt runs the
-- letters together ("mp"); build the label from the parts. Splitting two-letter codes the
-- en.wikt way would mislabel ku codes that are not combinations at all, such as "np"
-- (nepersonel).
local parts, all_known = {}, true
for part in code:gmatch("[^-]+") do
local part_adj = codes[part]
if part_adj then
table.insert(parts, part_adj)
else
all_known = false
end
end
if all_known and parts[1] then
adj = table.concat(parts, " ")
end
end
if not adj then return nil end
local text = adj:gsub("^%l", function(c) return string.upper(c) end) .. " [[Nimînok:Ferhengok#nominalization|nominalization]] of"
local phrase = M.en_utilities.add_indefinite_article(adj .. " [[Nimînok:Ferhengok#nominalization|nominalization]] of", false)
return { text = text, phrase = phrase }
end
local EtymonParser = {}
-- Keyword modifier definitions
EtymonParser.keyword_param_mods = {
unc = { type = "boolean" },
ref = {},
text = { restrict = { keywords = { "from", "derived" } } },
lit = { restrict = { affix_group = true } },
conj = {}, -- conjunction for alternatives: "and", "or", "and/or", etc.
g = { restrict = { keywords = { "nominalization" } } },
surf = { type = "boolean" },
senseid = { restrict = { keywords = { "semantic loan" } } },
-- Kurdish names, resolved by resolve_modifier_aliases() below.
maneid = { alias_of = "senseid", restrict = { keywords = { "semantic loan" } } },
}
-- Term modifier definitions
EtymonParser.etymon_param_mods = {
id = {},
t = {},
tr = {},
ts = {},
q = {},
qq = {},
l = {},
ll = {},
pos = {},
ng = {},
alt = {},
g = {},
ety = {},
lit = {},
unc = { type = "boolean" },
ref = {},
aftype = { restrict = { affix_group = true } },
postype = {},
bor = { type = "boolean", restrict = { affix_group = true } },
slbor = { type = "boolean", restrict = { affix_group = true } },
lbor = { type = "boolean", restrict = { affix_group = true } },
-- Kurdish names for the same modifiers, resolved by resolve_modifier_aliases() below.
-- cuda/t/w/crz are the names ku's own templates already accept; the affix-group
-- borrowing flags reuse the Kurdish keyword names.
cuda = { alias_of = "alt" },
-- ASCII only: Modul:parse utilities matches a modifier prefix with "^([a-zA-Z0-9+_-]+):",
-- so a name containing "î" can never be recognised as a prefix.
etimon = { alias_of = "ety" },
w = { alias_of = "t" },
crz = { alias_of = "pos" },
nediyar = { type = "boolean", alias_of = "unc" },
deyn = { type = "boolean", alias_of = "bor", restrict = { affix_group = true } },
deynh = { type = "boolean", alias_of = "lbor", restrict = { affix_group = true } },
deynhq = { type = "boolean", alias_of = "slbor", restrict = { affix_group = true } },
}
--[==[
Move any Kurdish modifier onto the canonical name it aliases, so the rest of the module only ever
sees the canonical set. Called right after the inline modifiers are parsed.
]==]
function EtymonParser.resolve_modifier_aliases(obj, param_mods)
for name, def in pairs(param_mods) do
if def.alias_of and obj[name] ~= nil then
if obj[def.alias_of] ~= nil then
error("`<" .. name .. ":>` and `<" .. def.alias_of .. ":>` are the same modifier; use one.")
end
obj[def.alias_of] = obj[name]
obj[name] = nil
end
end
return obj
end
local function get_clean_param_mods(param_mods)
local clean = {}
for mod_name, mod_def in pairs(param_mods) do
clean[mod_name] = {}
for key, value in pairs(mod_def) do
if key ~= "restrict" and key ~= "alias_of" then
clean[mod_name][key] = value
end
end
end
return clean
end
function EtymonParser.check_modifier_restrictions(modifiers, current_keyword, param_mods)
for mod_name, mod_value in pairs(modifiers) do
-- Only check restrictions if the modifier has a non-false/nil value
if mod_value then
local mod_def = param_mods[mod_name]
if mod_def and mod_def.restrict then
if mod_def.restrict.affix_group then
if not is_affix_group_keyword(current_keyword) then
local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">"
error("The modifier `" .. mod_display .. "` is only allowed for affix-group keywords (e.g. `:af`, `:blend`, `:univ`).")
end
elseif mod_def.restrict.keywords then
local allowed_keywords = mod_def.restrict.keywords
local is_allowed = false
for _, allowed_keyword in ipairs(allowed_keywords) do
if current_keyword == allowed_keyword then
is_allowed = true
break
end
end
if not is_allowed then
local keyword_list = {}
for _, kw in ipairs(allowed_keywords) do
table.insert(keyword_list, ":" .. kw)
end
local keyword_str = table.concat(keyword_list, #keyword_list == 2 and " or " or ", ")
if #keyword_list > 2 then
-- Replace last comma with "or"
keyword_str = keyword_str:gsub(", ([^,]+)$", " or %1")
end
local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">"
error("The modifier `" .. mod_display .. "` is only allowed for the keyword" .. (#keyword_list > 1 and "s " or " ") .. keyword_str .. ".")
end
end
end
end
end
end
local TERM_RULE_DISALLOW = {
suppress = { field = "suppress_term", label = "suppressed" },
unknown = { field = "unknown_term", label = "unknown" },
family = { field = "is_family", label = "family" },
}
function EtymonParser.check_etymon_limits(count, limits, label, opts)
if not limits then
return
end
opts = opts or {}
local min_etymons = limits.min_etymons
if min_etymons == nil and not opts.skip_default_min then
min_etymons = 1
end
if min_etymons and count < min_etymons then
if min_etymons > 1 then
error("Detected " .. label .. " group with fewer than " .. min_etymons .. " etymons.")
else
error("Detected " .. label .. " with no etymons.")
end
end
if limits.max_etymons and count > limits.max_etymons then
local unit = (limits.max_etymons == 1) and "etymon" or "etymons"
error("Detected " .. label .. " with more than " .. limits.max_etymons .. " " .. unit .. ".")
end
end
function EtymonParser.check_term_rules(etymon_data, entry_lang, rules, label)
label = label or "term"
if rules and rules.disallow then
local disallowed = {}
for _, typ in ipairs(rules.disallow) do
local spec = TERM_RULE_DISALLOW[typ]
if spec and etymon_data[spec.field] then
table.insert(disallowed, spec.label)
end
end
if #disallowed > 0 then
error(label .. " does not support " ..
mw.text.listToText(disallowed, "or") .. " etymons.")
end
end
if etymon_data.is_family then
if rules and rules.family == "disallowed" then
error(label .. " does not support family codes" .. (rules.family_suffix or "."))
elseif not etymon_data.suppress_term then
error("Family codes require suppressed term (use family:-).")
end
end
if rules then
if rules.require_term and (not etymon_data.term or etymon_data.term == "") then
error(label .. " requires a term for each listed form.")
end
if rules.entry_lang then
if Util.get_norm_lang(etymon_data.lang):getFullCode() ~=
Util.get_norm_lang(entry_lang):getFullCode() then
error(label .. " terms must be in the entry language (" ..
entry_lang:getFullCode() .. "), got '" .. etymon_data.lang:getFullCode() .. "'.")
end
end
if rules.ancestor_check then
M.etymology.check_ancestor(entry_lang, etymon_data.lang)
end
elseif etymon_data.is_family and not etymon_data.suppress_term then
error("Family codes require suppressed term (use family:-).")
end
end
function EtymonParser.check_keyword_term(etymon_data, entry_lang, keyword)
local config = M.data.keywords[keyword]
EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "`:" .. keyword .. "`")
end
function EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type)
local config = M.data.supplements[supplement_type]
EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "|" .. supplement_type .. "=")
end
-- Parse keyword with modifiers (e.g., ":bor<unc>" or ":bor<ref:{{R:example}}>")
function EtymonParser.parse_keyword_modifiers(param)
if type(param) ~= "string" then return nil, {} end
local base_keyword = get_keyword_base(param)
if not base_keyword then return nil, {} end
local canonical_keyword = get_canonical_keyword(base_keyword)
-- Check if there are any modifiers
if not param:find("<", 1, true) then
return canonical_keyword, {}
end
-- Parse modifiers using the same mechanism as etymon parsing
local rest_with_defaults = Util.add_boolean_defaults(param, EtymonParser.keyword_param_mods)
local function generate_obj(ignored)
return {}
end
local parsed = M.parse_utilities.parse_inline_modifiers(rest_with_defaults:gsub("^:?[^<]+", ""),
{ param_mods = get_clean_param_mods(EtymonParser.keyword_param_mods), generate_obj = generate_obj })
EtymonParser.resolve_modifier_aliases(parsed, EtymonParser.keyword_param_mods)
local modifiers = {
unc = parsed.unc or false,
ref = parsed.ref,
text = parsed.text,
lit = parsed.lit,
conj = parsed.conj,
g = parsed.g,
surf = parsed.surf or false,
senseid = parsed.senseid,
}
-- Validate modifiers against restrictions
EtymonParser.check_modifier_restrictions(modifiers, canonical_keyword, EtymonParser.keyword_param_mods)
return canonical_keyword, modifiers
end
local function normalize_keyword_param(keyword_with_mods)
local trimmed = M.string_utilities.trim(keyword_with_mods)
reject_removed_surf_keyword(trimmed:match("^:") and trimmed or (":" .. trimmed))
local base = get_keyword_base(trimmed)
if not base or not M.data.keywords[base] then
error("Invalid keyword '" .. trimmed .. "' in inline etymology")
end
local canonical_base = get_canonical_keyword(base)
local without_colon = trimmed:gsub("^:", "")
local mods_part = without_colon:sub(#base + 1)
local kw_param = normalize_keyword(canonical_base .. mods_part)
EtymonParser.parse_keyword_modifiers(kw_param)
return kw_param
end
local function get_keyword_mod_names()
local names = {}
for mod_name in pairs(EtymonParser.keyword_param_mods) do
names[mod_name] = true
end
return names
end
local function parse_inline_ety_run(ety_string)
local body = ety_string or ""
if body == "" then
error("Empty inline etymology")
end
local keyword_mod_names = get_keyword_mod_names()
local pos = 1
local len = #body
local function parse_err(msg)
error(msg .. " in inline etymology: '" .. body .. "'")
end
local function peek_double()
return body:sub(pos, pos + 1) == "<<"
end
local function mod_name_from_unwrapped(unwrapped)
return unwrapped:match("^<([^:>]+)")
end
local function is_keyword_mod(unwrapped)
local name = mod_name_from_unwrapped(unwrapped)
return name and keyword_mod_names[name] or false
end
local function read_double_bracket()
if not peek_double() then
return nil
end
local start = pos
pos = pos + 2
while pos <= len - 1 do
if body:sub(pos, pos + 1) == ">>" then
local token = body:sub(start, pos + 1)
pos = pos + 2
return token, token:sub(2, -2)
end
pos = pos + 1
end
parse_err("Unmatched <<")
end
local function read_angle_cell()
if body:sub(pos, pos) ~= "<" or peek_double() then
return nil
end
local open = pos
pos = pos + 1
local depth = 1
local i = pos
while i <= len do
local ch = body:sub(i, i)
if ch == "<" then
depth = depth + 1
elseif ch == ">" then
depth = depth - 1
if depth == 0 then
local inner = body:sub(open + 1, i - 1)
pos = i + 1
return inner
end
end
i = i + 1
end
parse_err("Unmatched <")
end
local function read_bare_run()
local start = pos
while pos <= len and body:sub(pos, pos) ~= "<" do
pos = pos + 1
end
return body:sub(start, pos - 1)
end
local function absorb_double_keyword_mods(keyword_str)
while peek_double() do
local saved = pos
local _, unwrapped = read_double_bracket()
if is_keyword_mod(unwrapped) then
keyword_str = keyword_str .. unwrapped
else
pos = saved
break
end
end
return keyword_str
end
local kw_start = pos
while pos <= len and body:sub(pos, pos) ~= "<" do
pos = pos + 1
end
local keyword = body:sub(kw_start, pos - 1)
if keyword:match("^%s*$") then
parse_err("Missing keyword")
end
keyword = absorb_double_keyword_mods(keyword)
local cells = {}
while pos <= len do
if peek_double() then
local _, unwrapped = read_double_bracket()
if is_keyword_mod(unwrapped) then
parse_err("Unexpected keyword modifier " .. unwrapped .. " outside of a keyword")
end
table.insert(cells, "+" .. unwrapped)
elseif body:sub(pos, pos) == "<" then
local inner = read_angle_cell()
if inner ~= "" then
table.insert(cells, inner)
end
else
local bare = read_bare_run()
if bare ~= "" then
if bare:sub(1, 1) ~= ":" then
parse_err("Unexpected bare text '" .. bare .. "' (use :keyword for nested keywords in inline etymology)")
end
if not is_keyword(bare, true) then
parse_err("Invalid keyword '" .. bare .. "' in inline etymology")
end
table.insert(cells, absorb_double_keyword_mods(bare))
end
end
end
return {
keyword = keyword,
cells = cells,
}
end
function EtymonParser.inline_ety_to_pipe(ety_string)
local run = parse_inline_ety_run(ety_string)
if not run.keyword or run.keyword:match("^%s*$") then
return "|"
end
local pipe_parts = { normalize_keyword_param(M.string_utilities.trim(run.keyword)) }
for _, segment in ipairs(run.cells) do
if is_keyword(segment, true) then
table.insert(pipe_parts, normalize_keyword_param(segment))
else
table.insert(pipe_parts, segment)
end
end
return "|" .. table.concat(pipe_parts, "|") .. "|"
end
function EtymonParser.pipe_to_inline_ety(pipe_string)
local cells = {}
for cell in pipe_string:gmatch("([^|]+)") do
if cell ~= "" then
table.insert(cells, cell)
end
end
if #cells == 0 then
return ""
end
local inline_parts = {}
for index, cell in ipairs(cells) do
local base = get_keyword_base(cell)
if base and M.data.keywords[base] then
local without_colon = cell:gsub("^:", "")
local kw_base, mods = without_colon:match("^([^<]+)(.*)$")
local inline_kw = (kw_base or without_colon) .. (mods or ""):gsub("<([^>]+)>", "<<%1>>")
if index > 1 then
inline_kw = ":" .. inline_kw
end
table.insert(inline_parts, inline_kw)
elseif cell:sub(1, 1) == "+" then
local mod = cell:sub(2)
if mod:match("^<.->$") then
mod = mod:sub(2, -2)
end
table.insert(inline_parts, "<<" .. mod .. ">>")
else
table.insert(inline_parts, "<" .. cell .. ">")
end
end
return table.concat(inline_parts, "")
end
function EtymonParser.parse_inline_ety(ety_string, context_lang)
local run = parse_inline_ety_run(ety_string)
local keyword = M.string_utilities.trim(run.keyword)
reject_removed_surf_keyword(":" .. keyword)
if not is_keyword(keyword, true) then
error("Invalid keyword '" .. keyword .. "' in inline etymology <ety:" .. keyword .. "...>")
end
local args = { context_lang:getCode(), normalize_keyword_param(keyword) }
for _, segment in ipairs(run.cells) do
if is_keyword(segment, true) then
table.insert(args, normalize_keyword_param(segment))
else
table.insert(args, segment)
end
end
return args
end
function EtymonParser.parse_etymon(param, context_lang)
if is_keyword(param) then
return nil
end
if type(param) ~= "string" then
return nil
end
local lang, rest
local is_family = false
local before_bracket = param:match("^([^<]*)") or param
local lang_code, rest_match = before_bracket:match("^([a-zA-Z][a-zA-Z0-9._-]*):(.*)$")
if lang_code then
local potential_lang = Util.get_lang(lang_code, true)
if potential_lang then
lang = potential_lang
rest = param:sub(#lang_code + 2)
else
local potential_family = Util.get_family(lang_code)
if potential_family then
lang = potential_family
rest = param:sub(#lang_code + 2)
is_family = true
else
lang = context_lang
rest = param
end
end
else
lang = context_lang
rest = param
end
M.tracking.track_term(rest)
if rest == "" or rest == "+" then
return {
lang = lang,
term = nil,
unknown_term = true,
is_family = is_family,
}
end
if rest == "-" then
return {
lang = lang,
term = nil,
suppress_term = true,
is_family = is_family,
}
end
if not rest:find("<", 1, true) then
return {
lang = lang,
term = M.string_utilities.trim(rest),
is_family = is_family,
}
end
local term_text = rest:match("^([^<]*)") or ""
local is_unknown = (term_text == "" or term_text == "+")
local is_suppress = (term_text == "-")
local function generate_obj(ignored_term)
return { term = (is_unknown or is_suppress) and nil or M.string_utilities.trim(term_text) }
end
local rest_with_defaults = Util.add_boolean_defaults(rest, EtymonParser.etymon_param_mods)
local parsed_obj = M.parse_utilities.parse_inline_modifiers(rest_with_defaults,
{ param_mods = get_clean_param_mods(EtymonParser.etymon_param_mods), generate_obj = generate_obj })
EtymonParser.resolve_modifier_aliases(parsed_obj, EtymonParser.etymon_param_mods)
parsed_obj.postype = Util.normalize_pos(parsed_obj.postype)
if parsed_obj.id and parsed_obj.id:match("^!") then
parsed_obj.id = parsed_obj.id:sub(2)
parsed_obj.override = true
end
parsed_obj.lang = lang
parsed_obj.is_family = is_family
if is_unknown then
parsed_obj.unknown_term = true
elseif is_suppress then
parsed_obj.suppress_term = true
end
return parsed_obj
end
function EtymonParser.validate(lang, args, id, title, pos, starts_with_lang_code)
-- id is now optional, so only validate if provided
if id then
if mw.ustring.len(id) < 2 then
error("The `id` parameter must have at least two characters.")
end
if id == title or id == Util.get_page_data().pagename then
error("The `id` parameter must not be the same as the page title.")
end
end
local valid_pos = { prefix = true, suffix = true, interfix = true, infix = true, root = true, word = true }
if pos and not valid_pos[pos] then
error("Unknown value provided for `pos`. Valid values: " .. table.concat(require("Module:table").keysToList(valid_pos), ", ")
.. " (Kurdish: " .. table.concat(require("Module:table").keysToList(POS_ALIASES), ", ") .. ").")
end
local current_keyword = "from"
local current_keyword_explicit = false
local keyword_etymons = {}
local keywords = M.data.keywords
local function checkKeyword()
local config = keywords[current_keyword]
if current_keyword == "from" and not current_keyword_explicit and #keyword_etymons == 0 then
keyword_etymons = {}
return
end
EtymonParser.check_etymon_limits(#keyword_etymons, config, "`:" .. current_keyword .. "`")
keyword_etymons = {}
end
local start_index = starts_with_lang_code and 2 or 1
for i = start_index, #args do
local param = args[i]
if type(param) ~= "string" then
elseif param:sub(1, 1) == ":" and not is_keyword(param) then
reject_removed_surf_keyword(param)
error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?")
elseif is_keyword(param) then
checkKeyword()
current_keyword = get_canonical_keyword(get_keyword(param))
current_keyword_explicit = true
else
local etymon_data = EtymonParser.parse_etymon(param, lang)
if etymon_data then
table.insert(keyword_etymons, param)
EtymonParser.check_keyword_term(etymon_data, lang, current_keyword)
-- Check modifier restrictions
EtymonParser.check_modifier_restrictions(etymon_data, current_keyword, EtymonParser.etymon_param_mods)
-- postype must be "root" or "word"
local VALID_POSTYPES = { root = true, word = true }
if etymon_data.postype and not VALID_POSTYPES[etymon_data.postype] then
error("Invalid <postype:" .. etymon_data.postype .. ">; must be \"root\" or \"word\" (Kurdish \"reh\" or \"kelîme\").")
end
if etymon_data.ety then
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
EtymonParser.validate(etymon_data.lang, inline_args, nil, nil, nil, true)
end
else
table.insert(keyword_etymons, param)
end
end
end
checkKeyword()
end
local DataRetriever = {}
local function format_etymon_id_hint(id_data, idx)
local id = type(id_data) == "table" and id_data.id or id_data
local pos = type(id_data) == "table" and id_data.pos
if id and id ~= "" and id ~= "*" then
return '"' .. id .. '"'
end
if pos and pos ~= "" then
return "unnamed (|pos=" .. pos .. "|)"
end
return "etymon #" .. idx .. " (no |id= on page)"
end
local function etymon_target_page_link(page, norm_lang)
-- `page` is an already-resolved page name ("Jinûvesazî:proto-îranî/hižwáH"), so link to it
-- directly. Passing it back through full_link() with a reconstructed language raises an error,
-- because the resolved name no longer carries the leading "*" those languages require -- and
-- this link is built even when the warning it belongs to is later discarded outside preview.
return "[[" .. page .. "]]"
end
-- Summarize {{etymon}} id slots on a linked page for preview warnings.
local function summarize_available_etymon_ids(ids)
local id_list = {}
local all_idless = true
local target_has_idless = false
local any_pos = false
for i, id_data in ipairs(ids) do
local id = type(id_data) == "table" and id_data.id or id_data
local pos = type(id_data) == "table" and id_data.pos
if id and id ~= "" and id ~= "*" then
all_idless = false
else
target_has_idless = true
end
if pos and pos ~= "" then
any_pos = true
end
table.insert(id_list, format_etymon_id_hint(id_data, i))
end
return {
id_list = id_list,
all_idless = all_idless,
target_has_idless = target_has_idless,
any_pos = any_pos,
count = #ids,
options_text = mw.text.listToText(id_list),
}
end
local function ambiguous_etymon_suggestion(page_link, summary)
if summary.all_idless then
if summary.any_pos then
return " None set `|id=` yet; add a unique `|id=` to each on " .. page_link
.. ", then `<id:identifier>` after the term here. Section order / hints: "
.. summary.options_text .. "."
end
return " None set `|id=` yet; add a unique `|id=` to each {{etymon}} in that section from top to bottom, then `<id:identifier>` after the term here (same value as `|id=`)."
end
return " Specify which one with `<id:identifier>` after the term. Options: " .. summary.options_text .. "."
end
local function warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel)
local page_link = etymon_target_page_link(page, norm_lang)
local summary = summarize_available_etymon_ids(ids)
if is_toplevel and summary.target_has_idless then
__state.linked_page_multiple_etymons_idless = true
end
local lang_name = norm_lang:getCanonicalName()
local lead = "Etymology link to " .. page_link .. " is ambiguous (" .. summary.count
.. " {{etymon}} templates for " .. lang_name .. ")."
Util.add_warning(lead .. ambiguous_etymon_suggestion(page_link, summary), true)
end
local function is_mismatched_explicit_id(base_key, cached_args, parent_etymon)
return cached_args == M.data.STATUS.MISSING and not parent_etymon
and #(__state.available_etymon_ids[base_key] or {}) > 0
end
local function maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel)
if not is_toplevel or __state.skip_partial_etymology_category then
return
end
if not __state.partial_etymology_targets[base_key] then
return
end
if etymon_data.id and type(cached_args) == "table" then
return
end
__state.linked_page_partial_etymology_sections = true
end
local function is_nonlemma_etymon_template(template_args)
return template_args and M.yesno(template_args.nl, false)
end
local function warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_id)
local page_link = etymon_target_page_link(page, norm_lang)
local summary = summarize_available_etymon_ids(__state.available_etymon_ids[base_key] or {})
local lang_name = norm_lang:getCanonicalName()
local lead = "Etymology link to " .. page_link .. " uses `<id:" .. etymon_id
.. ">`, but no {{etymon}} on that page has `|id=" .. etymon_id .. "|` for " .. lang_name .. "."
Util.add_warning(lead .. " Valid IDs: " .. summary.options_text .. ".", true)
end
-- Given an etymon data, scrape its page and cache the result in the global state object.
function DataRetriever.cache_page_etymons(etymon_page, etymon_title, key, etymon_lang, etymon_id, redirected_from, descendants_is_toplevel)
local content = etymon_title:getContent()
if not content then
__state.cached_etymon_args[key] = M.data.STATUS.REDLINK
return
end
-- Check if the linked page is a redirect. If it is, the template parsing
-- code below will be effectively skipped, and `scrape_page` will be called
-- again on the redirect target (see the bottom of this function)
local lang_section_for_descendants = nil
local redirect_target = etymon_title.redirect_target
if not redirect_target then
-- ku.wiktionary writes L2 headings as "== {{ziman|CODE}} ==" rather than the language
-- name, and this scrape runs on raw wikitext, so the template form has to be tried too.
content = M.pages.get_section(content, etymon_lang:getFullName(), 2)
or M.pages.get_section(content, "{{ziman|" .. etymon_lang:getFullCode() .. "}}", 2)
if not content then
__state.cached_etymon_args[key] = M.data.STATUS.MISSING
return
end
lang_section_for_descendants = content
end
local etymon_lang_code = etymon_lang:getFullCode()
local lang_page_key = etymon_lang_code .. ":" .. etymon_page
local found_templates_for_lang = {}
local found_ids = {}
local get_node_class = M.template_parser.class_else_type
-- Look for all {{etymon}} templates within the page content using the template parser
-- This way the same page is never parsed more than once
-- Build a map from senseids to their parent etymonids.
local active_etymon_args = nil
local etymology_section_count = 0
local etymology_sections_with_etymon = 0
local current_etymology_has_etymon = false
local current_etymology_has_nonlemma = false
local function finalize_current_etymology_section()
if etymology_section_count == 0 then
return
end
if current_etymology_has_etymon or current_etymology_has_nonlemma then
etymology_sections_with_etymon = etymology_sections_with_etymon + 1
end
current_etymology_has_etymon = false
current_etymology_has_nonlemma = false
end
for node in M.template_parser.parse(content):iterate_nodes() do
local node_class = get_node_class(node)
if node_class == "heading" then
-- A new L2 or etymology section acts as a barrier: an {{etymon}} usage
-- used previously cannot be the parent of any subsequent senseids.
-- Note that we don't have to check for L2s due to the usage of `M.pages.get_section` above.
if node:get_name():find(ETYMOLOGY_HEADING) then
finalize_current_etymology_section()
etymology_section_count = etymology_section_count + 1
active_etymon_args = nil
end
elseif node_class == "template" then
local template_name = node:get_name()
if ETYMON_TEMPLATES[template_name] then
local template_args = Util.normalize_raw_etymon_args(node:get_arguments())
-- Check if this etymon is for our language
if template_args[1] == etymon_lang_code then
if is_nonlemma_etymon_template(template_args) then
if etymology_section_count > 0 then
current_etymology_has_nonlemma = true
end
else
if etymology_section_count > 0 then
current_etymology_has_etymon = true
end
table.insert(found_templates_for_lang, template_args)
if template_args.id then
local etymon_key = lang_page_key .. ":" .. template_args.id
__state.cached_etymon_args[etymon_key] = template_args
__state.cached_etymon_pages[etymon_key] = tostring(etymon_page)
table.insert(found_ids, template_args.id)
active_etymon_args = template_args
else
-- Store idless etymon with default key
local etymon_key = lang_page_key .. ":*"
__state.cached_etymon_args[etymon_key] = template_args
__state.cached_etymon_pages[etymon_key] = tostring(etymon_page)
table.insert(found_ids, "*")
active_etymon_args = template_args
end
end
end
elseif active_etymon_args and template_name == "senseid" then
local template_args = node:get_arguments()
-- This should always be true for proper usages of {{senseid}}.
if template_args[1] == etymon_lang_code and template_args[2] then
local sense_id_key = lang_page_key .. ":" .. template_args[2]
__state.senseid_parent_etymon[sense_id_key] = active_etymon_args
__state.cached_etymon_pages[sense_id_key] = tostring(etymon_page)
end
end
end
end
finalize_current_etymology_section()
if lang_section_for_descendants
and etymology_section_count > 1
and etymology_sections_with_etymon > 0
and etymology_sections_with_etymon < etymology_section_count
then
__state.partial_etymology_targets[lang_page_key] = true
end
if descendants_is_toplevel and lang_section_for_descendants and #found_templates_for_lang > 0 then
M.descendants.cache_page_checks({
lang_section = lang_section_for_descendants,
etymon_lang_code = etymon_lang_code,
found_templates_for_lang = found_templates_for_lang,
entry_title = __state.entry_title,
entry_lang_code = __state.entry_lang_code,
entry_lang = __state.entry_lang_code and Util.get_lang(__state.entry_lang_code, true) or nil,
cached_descendants_checks = __state.cached_descendants_checks,
lang_page_key = lang_page_key,
redirected_from = redirected_from,
})
end
local id_data_list = {}
for _, args in ipairs(found_templates_for_lang) do
local id = args.id or "*"
table.insert(id_data_list, { id = id, pos = args.pos })
end
__state.available_etymon_ids[lang_page_key] = id_data_list
if #found_templates_for_lang == 1 then
__state.single_etymons[lang_page_key] = found_templates_for_lang[1]
end
if redirected_from and __state.available_etymon_ids[lang_page_key] then
__state.available_etymon_ids[redirected_from] = __state.available_etymon_ids[redirected_from] or {}
for _, id_data in ipairs(__state.available_etymon_ids[lang_page_key]) do
table.insert(__state.available_etymon_ids[redirected_from], id_data)
end
end
if __state.cached_etymon_args[key] ~= nil or __state.senseid_parent_etymon[key] ~= nil then
-- All done!
return
elseif redirect_target and not redirected_from then
-- Try scraping the redirect.
etymon_page = redirect_target.prefixedText
DataRetriever.cache_page_etymons(etymon_page, redirect_target, lang_page_key .. ":" .. etymon_id, etymon_lang, etymon_id, lang_page_key, descendants_is_toplevel)
__state.cached_etymon_args[key] = __state.cached_etymon_args[etymon_lang_code .. ":" .. etymon_page .. ":" .. etymon_id]
else
__state.cached_etymon_args[key] = M.data.STATUS.MISSING
end
end
local function has_linkable_term(etymon_data)
if etymon_data.is_family or etymon_data.suppress_term or etymon_data.unknown_term then
return false
end
local term = etymon_data.term
if term == nil or term == "" then
return false
end
return M.string_utilities.trim(term) ~= ""
end
local function record_term_id_tracking(etymon_data)
if not has_linkable_term(etymon_data) then
return
end
local term_page = M.links.get_link_page(etymon_data.term, etymon_data.lang)
M.tracking.record_term_id_usage(__state.id_stats, etymon_data, term_page)
end
-- Given an etymon object, scrape its page (if necessary) and return its own etymon arguments as well as the page name.
function DataRetriever.get_etymon_args(etymon_data, is_toplevel)
if not has_linkable_term(etymon_data) then
return M.data.STATUS.MISSING, nil, nil, nil
end
local page = M.links.get_link_page(etymon_data.term, etymon_data.lang)
local norm_lang = Util.get_norm_lang(etymon_data.lang)
local base_key = norm_lang:getFullCode() .. ":" .. page
if etymon_data.id then
local key = base_key .. ":" .. etymon_data.id
local cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key]
if cached_args == nil then
local title = mw.title.new(page)
if not title then error('Invalid page title "' .. page .. '" encountered.') end
DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, is_toplevel)
end
cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key] -- refresh
-- Get etymon_id from parent if this was resolved via senseid
local parent_etymon = __state.senseid_parent_etymon[key]
local resolved_etymon_id = parent_etymon and parent_etymon.id
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = {
explicit_id = etymon_data.id,
parent_etymon = parent_etymon,
},
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = {
explicit_id = etymon_data.id,
parent_etymon = parent_etymon,
},
})
end
end
local mismatched_id = is_mismatched_explicit_id(base_key, cached_args, parent_etymon)
if mismatched_id and is_toplevel then
__state.has_mismatched_id = true
M.tracking.record_mismatched_id_usage(__state.id_stats, norm_lang, page, etymon_data.id)
warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_data.id)
end
maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel)
return cached_args, __state.cached_etymon_pages[key], resolved_etymon_id, descendants_check
else
__state.used_idless_etymon = true
if is_toplevel then
__state.toplevel_idless_etymon = true
end
if __state.available_etymon_ids[base_key] == nil then
local title = mw.title.new(page)
if not title then error('Invalid page title "' .. page .. '" encountered.') end
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, is_toplevel)
end
local ids = __state.available_etymon_ids[base_key] or {}
local count = #ids
-- Try to filter by postype if available and we have multiple candidates
if count > 1 and etymon_data.postype then
local matching_ids = {}
for _, id_data in ipairs(ids) do
if id_data.pos == etymon_data.postype then
table.insert(matching_ids, id_data)
end
end
if #matching_ids == 1 then
local matched_id = matching_ids[1].id
local matched_key = base_key .. ":" .. matched_id
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "postype")
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = { id = matched_id },
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = { id = matched_id },
})
end
end
local matched_args = __state.cached_etymon_args[matched_key]
maybe_flag_partial_etymology_reference(base_key, etymon_data, matched_args, is_toplevel)
return matched_args, __state.cached_etymon_pages[matched_key], nil, descendants_check
end
end
if count == 1 then
local only_id_data = ids[1]
local only_id = (type(only_id_data) == "table" and only_id_data.id) or only_id_data or "*"
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "single")
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = { id_data = only_id_data },
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = { id_data = only_id_data },
})
end
end
local single_args = __state.single_etymons[base_key]
maybe_flag_partial_etymology_reference(base_key, etymon_data, single_args, is_toplevel)
return single_args, __state.cached_etymon_pages[base_key .. ":" .. only_id], nil, descendants_check
elseif count > 1 then
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "ambiguous")
warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel)
maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.AMBIGUOUS, is_toplevel)
return M.data.STATUS.AMBIGUOUS, nil, nil, nil
else
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "missing")
maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.MISSING, is_toplevel)
return M.data.STATUS.MISSING, nil, nil, nil
end
end
end
local function keyword_invisible_in_tree(keyword_info)
if not keyword_info then
return false
end
local inv = keyword_info.invisible
return inv == "all" or inv == true or inv == "tree"
end
-- True when the node has at least one top-level child container visible in the tree.
local function node_has_visible_tree_children(node)
for _, container in ipairs(node.children or {}) do
if not keyword_invisible_in_tree(container.keyword_info) then
return true
end
end
return false
end
-- Count visible term nodes in the tree.
local function get_visible_tree_depth(node, skip_child_rendering)
local max_depth = 1
if skip_child_rendering or not node then
return max_depth
end
for _, container in ipairs(node.children or {}) do
local keyword_info = container.keyword_info
if not keyword_invisible_in_tree(keyword_info) then
local skip_grandchildren = keyword_info and keyword_info.no_child_categories
for _, term in ipairs(container.terms or {}) do
if term.is_duplicate then
if term.original_has_children then
max_depth = math.max(max_depth, 2)
end
else
max_depth = math.max(max_depth, 1 + get_visible_tree_depth(term, skip_grandchildren))
end
end
end
end
return max_depth
end
local function as_param_list(val)
if val == nil then
return {}
end
if type(val) == "table" then
return val
end
if type(val) == "string" and val ~= "" then
return { val }
end
return {}
end
local TreeBuilder = {}
local function parse_etymon_references(refs_text)
if not refs_text or refs_text == "" then
return ""
end
return M.references.parse_references(refs_text)
end
local function parse_tree_references(node)
if node.ref then
node.parsed_ref = parse_etymon_references(node.ref)
end
if node.children then
for _, container in ipairs(node.children) do
if container.terms then
for _, term in ipairs(container.terms) do
parse_tree_references(term)
end
end
end
end
if node.supplements then
for _, supplement in ipairs(node.supplements) do
if supplement.terms then
for _, term in ipairs(supplement.terms) do
parse_tree_references(term)
end
end
end
end
end
-- Build a unique key for deduplication in the seen table
function TreeBuilder.build_key(lang, title, args)
local norm_lang_code = Util.get_norm_lang(lang):getFullCode()
local is_table = type(args) == "table"
local id = (is_table and args.id) or ""
if title then
return norm_lang_code .. ":" .. M.links.get_link_page(title, lang) .. ":" .. id
end
if is_table and args.status == M.data.STATUS.INLINE then
local content_parts = {}
for i = 1, #args do
content_parts[i] = tostring(args[i])
end
return norm_lang_code .. ":*:" .. id .. "\0" .. table.concat(content_parts, "\0")
end
return norm_lang_code .. ":*:" .. id
end
-- Copy parsed etymon modifiers onto a tree/supplement term node.
function TreeBuilder.apply_etymon_fields(term, etymon_data)
-- A reference without <id:> still resolves when the target page has a single etymon, and the
-- node already carries that etymon's own id. Keep it instead of clearing it, so the tree shows
-- the target's id as the gloss without every reference having to repeat it. An explicit
-- <id:...> still wins.
term.id = etymon_data.id or term.id
term.t = etymon_data.t
term.tr = etymon_data.tr
term.ts = etymon_data.ts
term.alt = etymon_data.alt
term.g = etymon_data.g
term.pos = etymon_data.pos
term.ng = etymon_data.ng
term.ref = etymon_data.ref
term.is_uncertain = etymon_data.unc
term.lit = etymon_data.lit
term.q = etymon_data.q
term.qq = etymon_data.qq
term.l = etymon_data.l
term.ll = etymon_data.ll
term.suppress_term = etymon_data.suppress_term
term.unknown_term = etymon_data.unknown_term
term.is_family = etymon_data.is_family
term.override = etymon_data.override
term.aftype = etymon_data.aftype
term.postype = etymon_data.postype
term.bor = etymon_data.bor
term.lbor = etymon_data.lbor
term.slbor = etymon_data.slbor
end
function TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type)
EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type)
local term = {
lang = etymon_data.lang,
title = etymon_data.term,
children = {},
status = M.data.STATUS.OK,
}
TreeBuilder.apply_etymon_fields(term, etymon_data)
return term
end
function TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value)
local terms = {}
for _, term_param in ipairs(as_param_list(param_value)) do
if type(term_param) == "string" and term_param ~= "" then
local etymon_data = EtymonParser.parse_etymon(term_param, entry_lang)
if etymon_data then
table.insert(terms, TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type))
end
end
end
return terms
end
-- Attach a |param= supplement defined in etymon_data.supplements (e.g. doublet=).
function TreeBuilder.append_term_supplement(data_tree, entry_lang, supplement_type, param_value)
local config = M.data.supplements[supplement_type]
if not config then
error("Unknown supplement '" .. tostring(supplement_type) .. "'.")
end
local terms = TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value)
if #terms == 0 then
return
end
data_tree.supplements = data_tree.supplements or {}
table.insert(data_tree.supplements, {
type = supplement_type,
config = config,
terms = terms,
})
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, supplement_type, entry_lang, entry_lang, true)
end
function TreeBuilder.build(lang, title, args, seen, depth, stop_recursion)
seen = seen or {}
depth = depth or 0
local is_toplevel = (depth == 0)
if depth > __state.max_depth_reached then
__state.max_depth_reached = depth
end
__state.total_nodes = __state.total_nodes + 1
local lang_code = lang:getCode()
__state.language_count[lang_code] = (__state.language_count[lang_code] or 0) + 1
local current_id = (type(args) == "table" and args.id) or ""
local key = TreeBuilder.build_key(lang, title, args)
local node = { lang = lang, title = title, id = current_id, args = args, children = {}, status = M.data.STATUS.OK }
if type(args) ~= "table" or seen[key] then
node.status = args or M.data.STATUS.MISSING
-- Mark as duplicate if we've seen this node before
if seen[key] then
node.is_duplicate = true
node.duplicate_key = key
local original_node = seen[key]
if type(original_node) == "table" and original_node.children and #original_node.children > 0 then
node.original_has_children = true
end
end
return node
end
node.status = args.status or M.data.STATUS.OK
seen[key] = node
-- If stop_recursion is set, skip parsing children but check for visible children
if stop_recursion then
local keywords = M.data.keywords
local has_visible_children = false
for i = 2, #args do
local param = args[i]
if type(param) == "string" then
local keyword_base = get_keyword_base(param)
if keyword_base and keywords[keyword_base] then
local _, kw_modifiers = EtymonParser.parse_keyword_modifiers(param:sub(1, 1) == ":" and param or (":" .. param))
if not keyword_invisible_in_tree(get_effective_keyword_info(keyword_base, kw_modifiers)) then
has_visible_children = true
break
end
elseif param:sub(1, 1) ~= ":" then
-- It's a term (not a keyword), so there are visible children
has_visible_children = true
break
end
end
end
node.has_visible_children = has_visible_children
return node
end
-- Parse args into keyword containers
local current_keyword = "from"
local current_keyword_modifiers = {}
local current_container = nil
local function ensure_container()
if not current_container or current_container.keyword ~= current_keyword then
local keyword_info = get_effective_keyword_info(current_keyword, current_keyword_modifiers)
current_container = {
keyword = current_keyword,
keyword_info = keyword_info,
keyword_modifiers = current_keyword_modifiers,
terms = {},
}
table.insert(node.children, current_container)
-- Override keyword text/phrase for nominalization with <g:code>
if current_keyword_modifiers.g and current_keyword == "nominalization" then
local labels = get_nominalization_label_for_g(current_keyword_modifiers.g)
if not labels then
local codes = {}
for c in pairs(M.data.nominalization_g_codes) do table.insert(codes, c) end
table.sort(codes)
error("Invalid <g:" .. tostring(current_keyword_modifiers.g) .. ">. Supported codes for nominalization: " .. table.concat(codes, ", "))
end
current_container.keyword_info = copy_keyword_info(keyword_info)
current_container.keyword_info.text = labels.text
current_container.keyword_info.phrase = labels.phrase
end
end
return current_container
end
local parse_context_lang = Util.resolve_context_lang(lang, args)
for i = 2, #args do
local param = args[i]
if is_keyword(param) then
local keyword, modifiers = EtymonParser.parse_keyword_modifiers(param)
if not keyword then
error("Invalid keyword '" .. param .. "'.")
end
current_keyword = keyword
current_keyword_modifiers = modifiers
current_container = nil -- Force new container for new keyword
elseif type(param) == "string" and param:sub(1, 1) == ":" then
reject_removed_surf_keyword(param)
error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?")
elseif type(param) == "string" then
local etymon_data = EtymonParser.parse_etymon(param, parse_context_lang)
if etymon_data then
-- Track keyword usage at top level
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, current_keyword, lang, etymon_data.lang, is_toplevel)
local term_node = {}
local container
-- Handle suppress_term (-) and unknown_term (empty or +) directly
if etymon_data.suppress_term or etymon_data.unknown_term then
container = ensure_container()
if etymon_data.ety then
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
inline_args.id = etymon_data.id
inline_args.status = M.data.STATUS.INLINE
term_node = TreeBuilder.build(etymon_data.lang, nil, inline_args, seen, depth + 1)
else
term_node = {
lang = etymon_data.lang,
children = {},
status = M.data.STATUS.OK,
}
end
TreeBuilder.apply_etymon_fields(term_node, etymon_data)
else
-- Regular term: fetch arguments from page
record_term_id_tracking(etymon_data)
local etymon_args, page_of, resolved_etymon_id, descendants_check =
DataRetriever.get_etymon_args(etymon_data, is_toplevel)
-- Check for <ety> inline parameter doesn't override the scraped arguments, unless the latter are missing
if etymon_data.ety then
if etymon_args == M.data.STATUS.REDLINK or etymon_args == M.data.STATUS.MISSING then
__state.current_page_has_inline_etymology = true
if is_toplevel then
__state.toplevel_has_inline_etymology = true
end
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
-- Track inline ety keywords too
local inline_keyword = get_keyword(inline_args[2], true)
if inline_keyword and #inline_args >= 3 then
local inline_etymon = EtymonParser.parse_etymon(inline_args[3], etymon_data.lang)
if inline_etymon then
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, inline_keyword, etymon_data.lang, inline_etymon.lang, is_toplevel)
end
end
inline_args.id = etymon_data.id
inline_args.status = M.data.STATUS.INLINE
etymon_args = inline_args
term_node.page_of = __state.cached_etymon_pages[key] -- term node is on the same page as the parent
else
-- Scraped arguments exist, <ety> is redundant and ignored
__state.current_page_has_redundant_etymology = true
if is_toplevel then
__state.toplevel_redundant_etymology = true
end
end
end
-- Ensure container exists before checking keyword info
container = ensure_container()
-- Check if current keyword has no_child_categories - if so, stop recursion
local keyword_info = container.keyword_info
local should_stop_recursion = (stop_recursion or (keyword_info and keyword_info.no_child_categories))
term_node = TreeBuilder.build(etymon_data.lang, etymon_data.term, etymon_args, seen, depth + 1, should_stop_recursion)
term_node.target_key = Util.get_norm_lang(etymon_data.lang):getFullCode() ..
":" .. M.links.get_link_page(etymon_data.term, etymon_data.lang)
term_node.etymon_id = resolved_etymon_id -- The actual etymon id when resolved via senseid
term_node.page_of = page_of
TreeBuilder.apply_etymon_fields(term_node, etymon_data)
term_node.missing_descendants_header, term_node.missing_descendants_entry =
M.descendants.get_term_sync_flags(current_keyword, term_node.status, descendants_check)
end
table.insert(container.terms, term_node)
end
end
end
return node
end
-- Convert etymology tree to JSON-serializable table
local function tree_to_json(node)
local obj = {
term = node.title,
lang = node.lang:getCode(),
lang_name = node.lang:getCanonicalName(),
id = (node.id and node.id ~= "") and node.id or nil,
status = node.status,
is_uncertain = node.is_uncertain or nil,
is_duplicate = node.is_duplicate or nil,
gloss = node.t,
transliteration = node.tr,
transcription = node.ts,
alt = node.alt,
g = node.g,
pos = node.pos,
ng = node.ng,
children = {},
}
for _, container in ipairs(node.children or {}) do
local keyword_info = container.keyword_info
if keyword_info then
local container_obj = {
keyword = container.keyword,
keyword_label = keyword_info.text,
keyword_abbrev = keyword_info.abbrev,
is_group = keyword_info.is_group or nil,
is_invisible = keyword_info.invisible or nil,
is_uncertain = (container.keyword_modifiers and container.keyword_modifiers.unc) or nil,
terms = {},
}
for _, term in ipairs(container.terms or {}) do
table.insert(container_obj.terms, tree_to_json(term))
end
table.insert(obj.children, container_obj)
end
end
return obj
end
-- Build and return the etymology data tree for a given term.
function export.get_tree(lang, title, args, options)
options = options or {}
__state.entry_title = title
__state.entry_lang_code = lang:getCode()
__state.id_stats = M.tracking.new_id_stats()
__state.skip_partial_etymology_category = options.skip_partial_etymology_category == true
if options.validate then
EtymonParser.validate(lang, args, options.id, title, options.pos, false)
end
local lang_code = lang:getCode()
local start_index = (args[1] == lang_code) and 2 or 1
local tree_args = { [1] = lang_code, id = options.id or args.id }
for i = start_index, #args do
table.insert(tree_args, args[i])
end
__state.cached_etymon_args[lang_code .. ":" .. title .. ":" .. (tree_args.id or "")] = tree_args
local ety_data_tree = TreeBuilder.build(lang, title, tree_args)
parse_tree_references(ety_data_tree)
if options.json then
return M.JSON.toJSON(tree_to_json(ety_data_tree))
end
return ety_data_tree
end
-- Given a language code, page name and optionally the id= parameter,
-- render the tree and only the etymology tree for the relevant page.
-- Fetches and parses the corresponding {{etymon}} from the requested page,
-- and any further pages needed to render the tree.
-- Parameters can be passed either through the #invoke or as
-- template parameters *through* an #invoke.
function export.render_tree_for_etymon_on_page(frame)
local frame_args = frame.args
local parent_args = frame:getParent().args
local langcode = frame_args[1] or parent_args[1]
local pagename = frame_args[2] or parent_args[2]
local id = frame_args["id"] or parent_args["id"]
local display_title = frame_args["title"] or parent_args["title"]
local parsed_title = mw.title.new(pagename, 0)
local title
if parsed_title.namespace == 0 then
title = M.pages.safe_page_name(parsed_title)
elseif parsed_title.namespace == RECONSTRUCTION_NS_ID then
title = "*" .. M.pages.safe_page_name(parsed_title)
else
error("Unsupported namespace for render_tree_for_etymon_on_page: " .. parsed_title.namespace)
end
local lang = Util.get_lang(langcode)
__state.entry_title = title
__state.entry_lang_code = lang:getCode()
__state.id_stats = M.tracking.new_id_stats()
-- Construct etymon_data for DataRetriever.get_args.
local etymon_data = {
lang = lang,
term = title,
id = id
}
local args, pagename = DataRetriever.get_etymon_args(etymon_data, true)
if args == M.data.STATUS.MISSING then
error("The etymon template was not found (language " ..
langcode ..
", title '" ..
title ..
"'" ..
(id and ", ID '" .. id .. "'" or ", no ID given") .. "). Page contents may have changed in the interim.")
end
local tree_title = display_title or title
if lang:makeEntryName(M.links.remove_links(tree_title)) ~= lang:makeEntryName(M.links.remove_links(title)) then
M.tracking.track_title_pagename_mismatch(lang)
end
reset_invocation_state()
local ety_data_tree = export.get_tree(lang, tree_title, args, {
validate = true,
id = id,
})
local output = {}
table.insert(output, M.template_styles("Module:etymon/styles.css"))
table.insert(output, M.tree.render({
data_tree = ety_data_tree,
format_term_func = function(term, is_toplevel)
return Util.format_term(term, is_toplevel, {
pos = "suppress",
lit = "suppress",
tree_ql = "suppress",
gloss = "separate",
})
end,
}))
return table.concat(output)
end
function export.main(frame)
local parent_args = frame:getParent().args
local args = M.parameters.process(parent_args, M.parameters_data.etymon)
args.pos = Util.normalize_pos(args.pos)
local lang = args[1]
local etymon_args = args[2]
local id = args.id
local title = args.title
local text = args.text
local tree = args.tree
local etydate = args.etydate
local doublet = args.doublet
local rfe = args.rfe
local etystub = args.etystub
local is_nonlemma = M.yesno(args.nl, false)
local page_data = Util.get_page_data()
if not title then
title = page_data.pagename
if page_data.namespace == RECONSTRUCTION_NS_NAME then title = "*" .. title end
end
local entry_pagename = page_data.pagename
if page_data.namespace == RECONSTRUCTION_NS_NAME then
entry_pagename = "*" .. entry_pagename
end
if lang:makeEntryName(M.links.remove_links(title)) ~= lang:makeEntryName(M.links.remove_links(entry_pagename)) then
M.tracking.track_title_pagename_mismatch(lang)
end
local current_L2 = M.pages.get_current_L2()
if current_L2 then
local norm_lang = Util.get_norm_lang(lang)
local norm_name = norm_lang:getCanonicalName()
if current_L2 ~= norm_name then
local lang_desc = lang:getCode() .. " (" .. lang:getCanonicalName() .. ")"
if norm_lang:getCode() ~= lang:getCode() then
lang_desc = lang_desc .. ", normalized to " .. norm_lang:getCode() .. " (" .. norm_name .. ")"
end
error("Language '" .. lang_desc .. "' does not match the L2 header (" .. current_L2 .. ").")
end
end
reset_invocation_state()
local ety_data_tree = export.get_tree(lang, title, etymon_args, {
validate = true,
pos = args.pos,
id = id,
json = args.json,
skip_partial_etymology_category = is_nonlemma,
})
if args.json then
return ety_data_tree
end
local output = {}
local text_allowlist_mode = M.text_allowed.default_mode or "off"
if text and text_allowlist_mode ~= "off" and not Util.is_text_param_allowed_for_lang(lang) then
local msg = "Etymology texts (parameter <code>text=</code>) are not allowed for " .. lang:getFullName() ..
"; see [[Template:etymon#Text allowlist|Template:etymon § Text allowlist]] for the list of languages that may use the <code>text=</code> parameter."
if text_allowlist_mode == "error" then
error(msg)
else
Util.add_warning(msg, true)
end
end
local lang_exc = Util.get_lang_exception(lang)
if lang_exc and lang_exc.disallow then
local disallow = lang_exc.disallow
local error_text = " for " .. lang:getFullName()
if disallow.ref then
error_text = error_text .. "; see " .. disallow.ref
else
error_text = error_text .. "."
end
if tree and disallow.tree then
error("Etymology trees are not allowed" .. error_text)
end
if text and disallow.text then
error("Etymology texts are not allowed" .. error_text)
end
end
if etydate then
local etydate_param_mods = {
ref = { list = true, type = "references", allow_holes = true },
refn = { list = true, allow_holes = true },
nocap = { type = "boolean" },
}
local function generate_etydate_obj(etydate_text)
local etydate_specs = {}
for spec in etydate_text:gmatch("[^,]+") do
table.insert(etydate_specs, mw.text.trim(spec))
end
return { [1] = etydate_specs }
end
local parsed_etydate = M.parse_utilities.parse_inline_modifiers(etydate, { param_mods = etydate_param_mods, generate_obj = generate_etydate_obj })
local etydate_args = {
[1] = parsed_etydate[1],
nocap = parsed_etydate.nocap or false,
}
ety_data_tree.supplements = ety_data_tree.supplements or {}
table.insert(ety_data_tree.supplements, {
type = "etydate",
etydate_text = M.etydate.format_etydate(etydate_args, { omit_refs = true }),
etydate_refs = (parsed_etydate.ref and #parsed_etydate.ref > 0) and parsed_etydate.ref or nil,
})
end
TreeBuilder.append_term_supplement(ety_data_tree, lang, "doublet", doublet)
if ety_data_tree.supplements then
parse_tree_references(ety_data_tree)
end
local has_visible_children = node_has_visible_tree_children(ety_data_tree)
-- Suppress trees for multiword entries and one-step chains
local visible_tree_depth = get_visible_tree_depth(ety_data_tree)
local is_trivial_tree = visible_tree_depth <= 2
local is_multiword = title:find("%s") ~= nil or title:find("_") ~= nil
if tree and (is_multiword or is_trivial_tree) then
tree = false
end
if tree then
table.insert(output, M.template_styles("Module:etymon/styles.css"))
table.insert(output, M.tree.render({
data_tree = ety_data_tree,
format_term_func = function(term, is_toplevel)
return Util.format_term(term, is_toplevel, {
pos = "suppress",
lit = "suppress",
tree_ql = "suppress",
gloss = "separate",
})
end,
}))
end
local tree_disallowed = lang_exc and lang_exc.disallow and lang_exc.disallow.tree
local ety_tree_json = M.JSON.toJSON(tree_to_json(ety_data_tree))
local anchor = M.anchors.etymonid(lang, id, {
no_tree = args.notree,
title = title,
empty_tree = (not has_visible_children) or tree_disallowed,
ety_tree_json = ety_tree_json,
})
table.insert(output, anchor)
local text_stop_lang_missing = nil
if text then
local max_depth, stop_at_blue_link, stop_at_lang, stop_at_lang_or_bluelink
if text == "++" then
max_depth, stop_at_blue_link = false, false
elseif text == "+" then
max_depth, stop_at_blue_link = 1, false
elseif text == "*" then
max_depth, stop_at_blue_link = false, true
elseif text:match("^:[^*]+%*$") then
-- Stop at a specific language OR first bluelink after it, e.g., ":ota*"
-- If the target language is a redlink, continue to the first bluelink
local lang_code = text:match("^:([^*]+)%*$")
if lang_code and lang_code ~= "" then
local lang_obj = Util.get_lang(lang_code, true)
if lang_obj then
stop_at_lang_or_bluelink = lang_code
else
Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false
end
else
Util.add_warning('Empty language code in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false
end
elseif text:sub(1, 1) == ":" then
-- Stop at a specific language, e.g., ":ar" stops at first Arabic term
local lang_code = text:sub(2)
if lang_code ~= "" then
-- Validate the language code
local lang_obj = Util.get_lang(lang_code, true)
if lang_obj then
stop_at_lang = lang_code
else
Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false -- default to ++
end
else
Util.add_warning('Empty language code in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false -- default to ++
end
else
local num = tonumber(text)
if num and num >= 1 then
max_depth, stop_at_blue_link = num, false
else
error('Invalid text value "' ..
text .. '". Valid values are: "++" (full chain), "+" (first step only), "*" (until first blue link), a number (max steps), ":lang" (stop at language), or ":lang*" (stop at language or first bluelink if redlink)')
end
end
local text_output, text_render_meta = M.text.render({
data_tree = ety_data_tree,
format_term_func = Util.format_term,
lang_matches_stop_code = Util.lang_matches_stop_code,
max_depth = max_depth,
stop_at_blue_link = stop_at_blue_link,
curr_page = page_data.pagename,
nodot = args.nodot,
dot = args.dot,
stop_at_lang = stop_at_lang,
stop_at_lang_or_bluelink = stop_at_lang_or_bluelink,
})
table.insert(output, text_output)
if stop_at_lang and text_render_meta and not text_render_meta.stop_lang_reached then
M.tracking.track_text_stop_lang_missing(lang, stop_at_lang)
text_stop_lang_missing = stop_at_lang
end
end
if rfe then
table.insert(output, Util.expand_request_template(frame, "rfe", rfe, lang:getCode()))
end
if etystub then
table.insert(output, Util.expand_request_template(frame, "etystub", etystub, lang:getCode()))
end
if is_nonlemma then
table.insert(output, " " .. frame:expandTemplate({
title = "nonlemma",
args = {},
}))
end
local categories = {}
if Util.is_content_page() then
M.tracking.track_tree_metrics({
max_depth_reached = __state.max_depth_reached,
total_nodes = __state.total_nodes,
language_count = __state.language_count,
lang = lang,
})
categories = M.categories.build({
data_tree = ety_data_tree,
page_lang = lang,
available_etymon_ids = __state.available_etymon_ids,
senseid_parent_etymon = __state.senseid_parent_etymon,
get_norm_lang_func = Util.get_norm_lang,
lang_exc = lang_exc,
suppress_categories = lang_exc and lang_exc.suppress_categories,
nocat = args.nocat,
tree = tree,
text = text,
exnihilo = args.exnihilo,
toplevel_has_inline_etymology = __state.toplevel_has_inline_etymology,
toplevel_redundant_etymology = __state.toplevel_redundant_etymology,
toplevel_idless_etymon = __state.toplevel_idless_etymon,
has_mismatched_id = __state.has_mismatched_id,
linked_page_multiple_etymons_idless = __state.linked_page_multiple_etymons_idless,
linked_page_partial_etymology_sections = __state.linked_page_partial_etymology_sections,
text_stop_lang_missing = text_stop_lang_missing,
})
M.tracking.track_keywords(__state.toplevel_keyword_stats, lang)
M.tracking.track_page_id(lang, id)
M.tracking.track_ids(__state.id_stats, lang)
end
if #categories > 0 then
table.insert(output, M.categories.format(categories, lang))
end
if __state.warnings then
for i, warning in ipairs(__state.warnings) do
table.insert(output, (i == 1 and "\n" or "") .. warning .. "\n")
end
end
return table.concat(output)
end
return export
j7eqppzoz3so9lb9jii1odz87o1mnkx
6532082
6532061
2026-09-18T19:07:46Z
Wikihez
7344
Kurdish names for the parameters (tarîxa-etîm, niqtena, niqte, katna/nekat, darna) and for the modifiers (hrf, crztip, grdk, anlz, metn)
6532082
Scribunto
text/plain
--[=[
This module implements the {{etymon}} template for structured etymology data on Wiktionary.
It enables the creation of etymology trees and text by parsing etymon chains,
scraping linked pages for their own {{etymon}} data, and recursively building a tree
of derivational relationships.
Authors:
- Original implementation: [[User:Ioaxxere]]
- Full refactor (September 2025): [[User:Fenakhay]] ([[Special:Diff/86717746]])
Modules:
- [[Module:etymon]]: main module handling parsing, validation, tree building, and page scraping
- [[Module:etymon/data]]: keyword definitions, configuration, and status constants
- [[Module:etymon/tree]]: etymology tree rendering
- [[Module:etymon/text]]: etymology text generation
- [[Module:etymon/categories]]: category generation logic
- [[Module:etymon/tracking]]: tracking
]=]
local export = {}
local __state = {
cached_etymon_args = {},
cached_etymon_pages = {},
cached_descendants_checks = {},
senseid_parent_etymon = {},
available_etymon_ids = {},
single_etymons = {},
entry_title = nil,
entry_lang_code = nil,
current_page_has_inline_etymology = false,
current_page_has_redundant_etymology = false,
used_idless_etymon = false,
toplevel_has_inline_etymology = false,
toplevel_redundant_etymology = false,
toplevel_idless_etymon = false,
has_mismatched_id = false,
linked_page_multiple_etymons_idless = false,
linked_page_partial_etymology_sections = false,
partial_etymology_targets = {},
skip_partial_etymology_category = false,
max_depth_reached = 0,
total_nodes = 0,
language_count = {},
toplevel_keyword_stats = {},
id_stats = nil,
warnings = {},
}
local function reset_invocation_state()
__state.current_page_has_inline_etymology = false
__state.current_page_has_redundant_etymology = false
__state.used_idless_etymon = false
__state.toplevel_has_inline_etymology = false
__state.toplevel_redundant_etymology = false
__state.toplevel_idless_etymon = false
__state.has_mismatched_id = false
__state.linked_page_multiple_etymons_idless = false
__state.linked_page_partial_etymology_sections = false
__state.max_depth_reached = 0
__state.total_nodes = 0
__state.language_count = {}
__state.toplevel_keyword_stats = {}
__state.warnings = {}
end
local M = require("Module:module loader").init({
require = {
data = "Module:etymon/data",
tree = "Module:etymon/tree",
text = "Module:etymon/text",
categories = "Module:etymon/categories",
tracking = "Module:etymon/tracking",
descendants = "Module:etymon/descendants",
anchors = "Module:anchors",
etydate = "Module:etydate",
etymology = "Module:etymology",
families = "Module:families",
languages = "Module:languages",
languages_errorgetby = "Module:languages/errorGetBy",
links = "Module:links",
pages = "Module:pages",
parameters = "Module:parameters",
string_utilities = "Module:string utilities",
template_parser = "Module:template parser",
utilities = "Module:utilities",
debug = "Module:debug",
en_utilities = "Module:en-utilities",
parse_utilities = "Module:parse utilities",
references = "Module:references",
template_styles = "Module:TemplateStyles",
script_utilities = "Module:script utilities",
JSON = "Module:JSON",
yesno = "Module:yesno",
},
loadData = {
headword_data = "Module:headword/data",
parameters_data = "Module:parameters/data",
text_allowed = "Module:etymon/data/text_allowed",
},
})
-- Template names that carry etymon data, and the heading that opens an etymology section.
-- Pages are scraped for these, so both must match what ku.wiktionary actually uses:
-- the section is "Etîmolojî", and the new template is "etîmon".
-- Only the new template: pages still using Şablon:etymon carry the old ">"-separated syntax, which
-- this module would misparse into garbage node labels. Add "etymon" here only once
-- Şablon:etymon itself invokes this module.
local ETYMON_TEMPLATES = {
["etîmon"] = true,
["etymon/nû"] = true, -- redirect to Şablon:etîmon; still recognised if written out
-- Do NOT add "etymon" here while Şablon:etymon still uses the old ">"-separated syntax:
-- this module would read those calls and parse the bare keyword ("inh") as a term.
}
local ETYMOLOGY_HEADING = "^Etîmolojî"
-- ku's reconstruction namespace is "Jinûvesazî" (id 108), where en.wiktionary uses
-- "Reconstruction" (id 118). A page here is a reconstructed term, so its title needs the
-- leading "*" that Modul:links requires for reconstructed languages.
local RECONSTRUCTION_NS_NAME = "Jinûvesazî"
local RECONSTRUCTION_NS_ID = 108
local Util = {}
function Util.format_error(message, preview_only)
if preview_only and not M.pages.is_preview() then
return nil
end
return '<span class="error">' .. message .. '</span>'
end
function Util.add_warning(message, preview_only)
local formatted = Util.format_error(message, preview_only)
if formatted then
table.insert(__state.warnings, formatted)
end
end
function Util.is_text_param_allowed_for_lang(lang)
if not lang or type(lang) ~= "table" then
return false
end
local types = lang.getTypes and lang:getTypes()
if types and types.family then
local code = lang.getCode and lang:getCode()
return code and M.text_allowed.families[code] == true
end
local full_code = lang.getFullCode and lang:getFullCode()
if full_code and M.text_allowed.langs[full_code] then
return true
end
if lang.inFamily then
for family_code in pairs(M.text_allowed.families) do
if lang:inFamily(family_code) then
return true
end
end
end
return false
end
function Util.get_lang(code, no_error)
if no_error then
return M.languages.getByCode(code, nil, true)
end
return M.languages.getByCode(code, nil, true) or M.languages_errorgetby.code(code, true, true)
end
-- Match a term language against a text=:lang stop target (supports etymology-only codes).
function Util.lang_matches_stop_code(term_lang, stop_code)
if not term_lang or not stop_code or stop_code == "" then
return false
end
local stop_lang = Util.get_lang(stop_code, true)
if not stop_lang then
return false
end
if term_lang:getCode() == stop_lang:getCode() then
return true
end
if stop_lang:getFullCode() == stop_lang:getCode() then
return term_lang:getFullCode() == stop_lang:getCode()
end
return false
end
function Util.get_family(code)
return M.families.getByCode(code)
end
function Util.get_lang_exception(lang)
-- Families have no language-specific exceptions
if lang.getTypes and lang:getTypes().family then
return nil
end
local code = lang:getCode()
local lang_exceptions = M.data.config.lang_exceptions
if lang_exceptions[code] then
return lang_exceptions[code]
end
for norm_code, exc in pairs(lang_exceptions) do
if exc.normalize_to and code == exc.normalize_to then
return exc
end
if exc.normalize_from_families then
local should_normalize = false
for _, family in ipairs(exc.normalize_from_families) do
if lang:inFamily(family) then
should_normalize = true
break
end
end
if should_normalize and exc.normalize_exclude_families then
for _, family in ipairs(exc.normalize_exclude_families) do
if lang:inFamily(family) then
should_normalize = false
break
end
end
end
if should_normalize then
local ret = {}
for k, v in pairs(exc) do
ret[k] = v
end
ret.suppress_tr = nil
return ret
end
end
end
return nil
end
function Util.get_norm_lang(lang)
local exc = Util.get_lang_exception(lang)
if exc and exc.normalize_to then
return M.languages.getByCode(exc.normalize_to)
end
return lang
end
function Util.resolve_context_lang(lang, node_args)
if type(node_args) ~= "table" then return lang end
if node_args.status == M.data.STATUS.INLINE then return lang end
if not (lang.hasType and lang:hasType("etymology-only")) then return lang end
local full = lang.getFull and lang:getFull()
if not full or full:getCode() == lang:getCode() then return lang end
if full.hasAncestor and full:hasAncestor(lang) then return lang end
return full
end
-- Add default values for boolean modifiers (e.g., <unc> becomes <unc:1>)
-- This is needed because Module:parse utilities expects boolean modifiers to have explicit values
function Util.add_boolean_defaults(str, param_mods)
local result = str
for name, spec in pairs(param_mods) do
if spec.type == "boolean" then
-- Replace <name> with <name:1> (but not <name:...> which already has a value)
result = result:gsub("<" .. name .. ">", "<" .. name .. ":1>")
end
end
return result
end
local REQUEST_TEMPLATE_PARAM_MODS = {
rfe = {
nocat = { type = "boolean" },
sort = {},
y = {},
m = {},
fragment = {},
section = {},
box = { type = "boolean" },
noes = { type = "boolean" },
},
etystub = {
nocat = { type = "boolean" },
sort = {},
nocap = { type = "boolean" },
nodot = { type = "boolean" },
},
}
function Util.expand_request_template(frame, template_name, param_value, lang_code)
local param_mods = REQUEST_TEMPLATE_PARAM_MODS[template_name]
local with_defaults = Util.add_boolean_defaults(param_value, param_mods)
local parsed = M.parse_utilities.parse_inline_modifiers(with_defaults, {
param_mods = param_mods,
generate_obj = function(text)
if M.yesno(text, false) then
return { is_boolean = true }
end
return { text = text }
end,
})
local template_args = { [1] = lang_code }
for name in pairs(param_mods) do
template_args[name] = parsed[name]
end
if not parsed.is_boolean then
template_args[2] = parsed.text
end
return " " .. frame:expandTemplate({
title = template_name,
args = template_args,
})
end
-- Kurdish values accepted for |pos= (|crz=) and <postype:>, mapped to the English values the rest of
-- the module compares against.
local POS_ALIASES = {
["reh"] = "root",
["kelîme"] = "word",
["pêşgir"] = "prefix",
["paşgir"] = "suffix",
["navgir"] = "interfix",
}
function Util.normalize_pos(value)
if type(value) ~= "string" then
return value
end
value = mw.text.trim(value)
return POS_ALIASES[value] or value
end
-- {{etîmon}} arguments read straight from another page skip Module:parameters, so `crz` (the Kurdish
-- name of `pos`) and the Kurdish values are resolved here.
function Util.normalize_raw_etymon_args(args)
if args.pos == nil and args.crz ~= nil then
args.pos = args.crz
end
args.pos = Util.normalize_pos(args.pos)
return args
end
-- Centralized term formatting: handles suppress_term (-), unknown_term (empty/+), and regular terms
function Util.format_term(term, is_toplevel, opts)
opts = opts or {}
-- suppress_term (-) returns nil
if term.suppress_term then
return nil
end
local lang = term.lang
local exc = Util.get_lang_exception(lang)
if is_toplevel then
local display_text = term.alt or term.title or ""
local sc = term.sc or lang:findBestScript(display_text)
local bold_text = tostring(mw.html.create("strong")
:addClass("selflink")
:wikitext(display_text))
return M.script_utilities.tag_text(bold_text, lang, sc, "term")
end
local link_params = { lang = lang }
link_params.term = not term.unknown_term and term.title or nil
link_params.alt = term.alt
link_params.id = (not term.unknown_term and term.id and term.id ~= "") and term.id or nil
if not (exc and exc.suppress_tr) then
link_params.tr = term.tr
link_params.ts = term.ts
else
link_params.suppress_tr = true
end
link_params.lit = (opts.lit ~= "suppress") and term.lit or nil
-- An explicit <t:...> wins; otherwise fall back to the etymon id, which on ku is usually a
-- Kurdish gloss in its own right ("berik", "hêştir"). An id that is a key rather than a
-- translation ("H2O", "paşgira meslekî") can be overridden with a <t:...>.
local t = (term.t and term.t ~= "") and term.t or nil
local id_gloss = (term.id and term.id ~= "") and term.id or nil
local gloss = t or id_gloss
-- gloss = "separate" leaves the gloss out of the link and returns it as a second value, so
-- the tree can put it on its own line.
if opts.gloss ~= "suppress" and opts.gloss ~= "separate" then
link_params.gloss = gloss
end
if term.g and term.g ~= "" then
local genders = M.string_utilities.split(term.g, ",")
for i = 1, #genders do
genders[i] = M.string_utilities.trim(genders[i])
end
link_params.genders = genders
end
if opts.pos ~= "suppress" then
link_params.pos = term.pos
link_params.ng = term.ng
end
if exc and exc.suppress_tr then
link_params.lit = nil
end
local show_qualifiers
if opts.tree_ql ~= "suppress" then
if term.q then
link_params.q = term.q
end
if term.qq then
link_params.qq = term.qq
end
if term.l then
link_params.l = term.l
end
if term.ll then
link_params.ll = term.ll
end
show_qualifiers = term.q or term.qq or term.l or term.ll
end
local link = M.links.full_link(link_params, "term", nil, show_qualifiers and true or nil)
if opts.gloss == "separate" then
return link, gloss
end
return link
end
local __is_content_page_cached
function Util.is_content_page()
if __is_content_page_cached == nil then
__is_content_page_cached = M.pages.is_content_page(mw.title.getCurrentTitle())
end
return __is_content_page_cached
end
local __page_data_cached
function Util.get_page_data()
if not __page_data_cached then
__page_data_cached = M.headword_data.page
end
return __page_data_cached
end
-- Extract base keyword from param (without modifiers)
local function get_keyword_base(param)
if type(param) ~= "string" then return nil end
local base = param:match("^:?([^<]+)") or param:gsub("^:", "")
return base
end
local function is_keyword(param, allow_colon_less)
if type(param) ~= "string" then return false end
local keywords = M.data.keywords
if param:sub(1, 1) == ":" then
local base = get_keyword_base(param)
return keywords[base] ~= nil
end
if allow_colon_less then
local base = get_keyword_base(param)
return keywords[base] ~= nil
end
return false
end
local function get_keyword(param, allow_colon_less)
if type(param) ~= "string" then return nil end
local keywords = M.data.keywords
if param:sub(1, 1) == ":" then
return get_keyword_base(param)
end
if allow_colon_less then
local base = get_keyword_base(param)
if keywords[base] then
return base
end
end
return nil
end
local function normalize_keyword(keyword)
if keyword:sub(1, 1) == ":" then
return keyword
end
return ":" .. keyword
end
-- Resolve keyword (possibly an alias) to its canonical form. Used only at input boundaries
local function get_canonical_keyword(keyword)
if not keyword then return keyword end
return M.data.keyword_canonical[keyword] or keyword
end
local function is_affix_group_keyword(keyword)
local config = keyword and M.data.keywords[keyword]
return config and config.affix_categories or false
end
local function reject_removed_surf_keyword(param)
local base = get_keyword_base(param)
if base == "surf" then
error("The `:surf` keyword has been removed. Use `<surf>` on a formation keyword instead (e.g. `:af<surf>`, `:bor<surf>`).")
end
end
local function copy_keyword_info(source)
local copy = {}
for k, v in pairs(source) do
copy[k] = v
end
return copy
end
local function lowercase_glossary_display(text)
return text:gsub("(%[%[Nimînok:Ferhengok#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest)
return prefix .. mw.ustring.lower(first) .. rest .. "]]"
end)
end
local function surf_should_keep_formation_phrase(base)
if not base.phrase then
return false
end
if base.glossary then
return true
end
return not (base.phrase == "from" and (base.text == "From" or base.text == "from"))
end
-- Runtime overrides when <surf> is present on a keyword.
local function get_effective_keyword_info(keyword, modifiers)
local base = M.data.keywords[keyword]
if not base or not modifiers or not modifiers.surf then
return base
end
local effective = copy_keyword_info(base)
local surf_text = "By [[Nimînok:Ferhengok#surface_analysis|surface analysis]],"
local surf_phrase = "by surface analysis,"
effective.new_sentence = true
effective.invisible = "tree"
if surf_should_keep_formation_phrase(base) then
effective.phrase = surf_phrase .. " " .. base.phrase
if base.text then
effective.text = surf_text .. " " .. lowercase_glossary_display(base.text)
else
effective.text = surf_text .. " " .. base.phrase
end
else
effective.text = surf_text
effective.phrase = surf_phrase
end
return effective
end
-- Build text/phrase for nominalization with <g:code> (uses data module for codes only).
local function get_nominalization_label_for_g(code)
if not code or code == "" then return nil end
local codes = M.data.nominalization_g_codes
local adj = codes[code]
if not adj and code:find("-", 1, true) then
-- ku combines a gender with a number by hyphenating them ("m-p"), where en.wikt runs the
-- letters together ("mp"); build the label from the parts. Splitting two-letter codes the
-- en.wikt way would mislabel ku codes that are not combinations at all, such as "np"
-- (nepersonel).
local parts, all_known = {}, true
for part in code:gmatch("[^-]+") do
local part_adj = codes[part]
if part_adj then
table.insert(parts, part_adj)
else
all_known = false
end
end
if all_known and parts[1] then
adj = table.concat(parts, " ")
end
end
if not adj then return nil end
local text = adj:gsub("^%l", function(c) return string.upper(c) end) .. " [[Nimînok:Ferhengok#nominalization|nominalization]] of"
local phrase = M.en_utilities.add_indefinite_article(adj .. " [[Nimînok:Ferhengok#nominalization|nominalization]] of", false)
return { text = text, phrase = phrase }
end
local EtymonParser = {}
-- Keyword modifier definitions
EtymonParser.keyword_param_mods = {
unc = { type = "boolean" },
ref = {},
text = { restrict = { keywords = { "from", "derived" } } },
lit = { restrict = { affix_group = true } },
conj = {}, -- conjunction for alternatives: "and", "or", "and/or", etc.
g = { restrict = { keywords = { "nominalization" } } },
surf = { type = "boolean" },
senseid = { restrict = { keywords = { "semantic loan" } } },
-- Kurdish names, resolved by resolve_modifier_aliases() below.
maneid = { alias_of = "senseid", restrict = { keywords = { "semantic loan" } } },
grdk = { alias_of = "conj" },
anlz = { type = "boolean", alias_of = "surf" },
metn = { alias_of = "text", restrict = { keywords = { "from", "derived" } } },
}
-- Term modifier definitions
EtymonParser.etymon_param_mods = {
id = {},
t = {},
tr = {},
ts = {},
q = {},
qq = {},
l = {},
ll = {},
pos = {},
ng = {},
alt = {},
g = {},
ety = {},
lit = {},
unc = { type = "boolean" },
ref = {},
aftype = { restrict = { affix_group = true } },
postype = {},
bor = { type = "boolean", restrict = { affix_group = true } },
slbor = { type = "boolean", restrict = { affix_group = true } },
lbor = { type = "boolean", restrict = { affix_group = true } },
-- Kurdish names for the same modifiers, resolved by resolve_modifier_aliases() below.
-- cuda/t/w/crz are the names ku's own templates already accept; the affix-group
-- borrowing flags reuse the Kurdish keyword names.
cuda = { alias_of = "alt" },
-- ASCII only: Modul:parse utilities matches a modifier prefix with "^([a-zA-Z0-9+_-]+):",
-- so a name containing "î" can never be recognised as a prefix.
etimon = { alias_of = "ety" },
w = { alias_of = "t" },
crz = { alias_of = "pos" },
crztip = { alias_of = "postype" },
hrf = { alias_of = "lit" },
nediyar = { type = "boolean", alias_of = "unc" },
deyn = { type = "boolean", alias_of = "bor", restrict = { affix_group = true } },
deynh = { type = "boolean", alias_of = "lbor", restrict = { affix_group = true } },
deynhq = { type = "boolean", alias_of = "slbor", restrict = { affix_group = true } },
}
--[==[
Move any Kurdish modifier onto the canonical name it aliases, so the rest of the module only ever
sees the canonical set. Called right after the inline modifiers are parsed.
]==]
function EtymonParser.resolve_modifier_aliases(obj, param_mods)
for name, def in pairs(param_mods) do
if def.alias_of and obj[name] ~= nil then
if obj[def.alias_of] ~= nil then
error("`<" .. name .. ":>` and `<" .. def.alias_of .. ":>` are the same modifier; use one.")
end
obj[def.alias_of] = obj[name]
obj[name] = nil
end
end
return obj
end
local function get_clean_param_mods(param_mods)
local clean = {}
for mod_name, mod_def in pairs(param_mods) do
clean[mod_name] = {}
for key, value in pairs(mod_def) do
if key ~= "restrict" and key ~= "alias_of" then
clean[mod_name][key] = value
end
end
end
return clean
end
function EtymonParser.check_modifier_restrictions(modifiers, current_keyword, param_mods)
for mod_name, mod_value in pairs(modifiers) do
-- Only check restrictions if the modifier has a non-false/nil value
if mod_value then
local mod_def = param_mods[mod_name]
if mod_def and mod_def.restrict then
if mod_def.restrict.affix_group then
if not is_affix_group_keyword(current_keyword) then
local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">"
error("The modifier `" .. mod_display .. "` is only allowed for affix-group keywords (e.g. `:af`, `:blend`, `:univ`).")
end
elseif mod_def.restrict.keywords then
local allowed_keywords = mod_def.restrict.keywords
local is_allowed = false
for _, allowed_keyword in ipairs(allowed_keywords) do
if current_keyword == allowed_keyword then
is_allowed = true
break
end
end
if not is_allowed then
local keyword_list = {}
for _, kw in ipairs(allowed_keywords) do
table.insert(keyword_list, ":" .. kw)
end
local keyword_str = table.concat(keyword_list, #keyword_list == 2 and " or " or ", ")
if #keyword_list > 2 then
-- Replace last comma with "or"
keyword_str = keyword_str:gsub(", ([^,]+)$", " or %1")
end
local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">"
error("The modifier `" .. mod_display .. "` is only allowed for the keyword" .. (#keyword_list > 1 and "s " or " ") .. keyword_str .. ".")
end
end
end
end
end
end
local TERM_RULE_DISALLOW = {
suppress = { field = "suppress_term", label = "suppressed" },
unknown = { field = "unknown_term", label = "unknown" },
family = { field = "is_family", label = "family" },
}
function EtymonParser.check_etymon_limits(count, limits, label, opts)
if not limits then
return
end
opts = opts or {}
local min_etymons = limits.min_etymons
if min_etymons == nil and not opts.skip_default_min then
min_etymons = 1
end
if min_etymons and count < min_etymons then
if min_etymons > 1 then
error("Detected " .. label .. " group with fewer than " .. min_etymons .. " etymons.")
else
error("Detected " .. label .. " with no etymons.")
end
end
if limits.max_etymons and count > limits.max_etymons then
local unit = (limits.max_etymons == 1) and "etymon" or "etymons"
error("Detected " .. label .. " with more than " .. limits.max_etymons .. " " .. unit .. ".")
end
end
function EtymonParser.check_term_rules(etymon_data, entry_lang, rules, label)
label = label or "term"
if rules and rules.disallow then
local disallowed = {}
for _, typ in ipairs(rules.disallow) do
local spec = TERM_RULE_DISALLOW[typ]
if spec and etymon_data[spec.field] then
table.insert(disallowed, spec.label)
end
end
if #disallowed > 0 then
error(label .. " does not support " ..
mw.text.listToText(disallowed, "or") .. " etymons.")
end
end
if etymon_data.is_family then
if rules and rules.family == "disallowed" then
error(label .. " does not support family codes" .. (rules.family_suffix or "."))
elseif not etymon_data.suppress_term then
error("Family codes require suppressed term (use family:-).")
end
end
if rules then
if rules.require_term and (not etymon_data.term or etymon_data.term == "") then
error(label .. " requires a term for each listed form.")
end
if rules.entry_lang then
if Util.get_norm_lang(etymon_data.lang):getFullCode() ~=
Util.get_norm_lang(entry_lang):getFullCode() then
error(label .. " terms must be in the entry language (" ..
entry_lang:getFullCode() .. "), got '" .. etymon_data.lang:getFullCode() .. "'.")
end
end
if rules.ancestor_check then
M.etymology.check_ancestor(entry_lang, etymon_data.lang)
end
elseif etymon_data.is_family and not etymon_data.suppress_term then
error("Family codes require suppressed term (use family:-).")
end
end
function EtymonParser.check_keyword_term(etymon_data, entry_lang, keyword)
local config = M.data.keywords[keyword]
EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "`:" .. keyword .. "`")
end
function EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type)
local config = M.data.supplements[supplement_type]
EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "|" .. supplement_type .. "=")
end
-- Parse keyword with modifiers (e.g., ":bor<unc>" or ":bor<ref:{{R:example}}>")
function EtymonParser.parse_keyword_modifiers(param)
if type(param) ~= "string" then return nil, {} end
local base_keyword = get_keyword_base(param)
if not base_keyword then return nil, {} end
local canonical_keyword = get_canonical_keyword(base_keyword)
-- Check if there are any modifiers
if not param:find("<", 1, true) then
return canonical_keyword, {}
end
-- Parse modifiers using the same mechanism as etymon parsing
local rest_with_defaults = Util.add_boolean_defaults(param, EtymonParser.keyword_param_mods)
local function generate_obj(ignored)
return {}
end
local parsed = M.parse_utilities.parse_inline_modifiers(rest_with_defaults:gsub("^:?[^<]+", ""),
{ param_mods = get_clean_param_mods(EtymonParser.keyword_param_mods), generate_obj = generate_obj })
EtymonParser.resolve_modifier_aliases(parsed, EtymonParser.keyword_param_mods)
local modifiers = {
unc = parsed.unc or false,
ref = parsed.ref,
text = parsed.text,
lit = parsed.lit,
conj = parsed.conj,
g = parsed.g,
surf = parsed.surf or false,
senseid = parsed.senseid,
}
-- Validate modifiers against restrictions
EtymonParser.check_modifier_restrictions(modifiers, canonical_keyword, EtymonParser.keyword_param_mods)
return canonical_keyword, modifiers
end
local function normalize_keyword_param(keyword_with_mods)
local trimmed = M.string_utilities.trim(keyword_with_mods)
reject_removed_surf_keyword(trimmed:match("^:") and trimmed or (":" .. trimmed))
local base = get_keyword_base(trimmed)
if not base or not M.data.keywords[base] then
error("Invalid keyword '" .. trimmed .. "' in inline etymology")
end
local canonical_base = get_canonical_keyword(base)
local without_colon = trimmed:gsub("^:", "")
local mods_part = without_colon:sub(#base + 1)
local kw_param = normalize_keyword(canonical_base .. mods_part)
EtymonParser.parse_keyword_modifiers(kw_param)
return kw_param
end
local function get_keyword_mod_names()
local names = {}
for mod_name in pairs(EtymonParser.keyword_param_mods) do
names[mod_name] = true
end
return names
end
local function parse_inline_ety_run(ety_string)
local body = ety_string or ""
if body == "" then
error("Empty inline etymology")
end
local keyword_mod_names = get_keyword_mod_names()
local pos = 1
local len = #body
local function parse_err(msg)
error(msg .. " in inline etymology: '" .. body .. "'")
end
local function peek_double()
return body:sub(pos, pos + 1) == "<<"
end
local function mod_name_from_unwrapped(unwrapped)
return unwrapped:match("^<([^:>]+)")
end
local function is_keyword_mod(unwrapped)
local name = mod_name_from_unwrapped(unwrapped)
return name and keyword_mod_names[name] or false
end
local function read_double_bracket()
if not peek_double() then
return nil
end
local start = pos
pos = pos + 2
while pos <= len - 1 do
if body:sub(pos, pos + 1) == ">>" then
local token = body:sub(start, pos + 1)
pos = pos + 2
return token, token:sub(2, -2)
end
pos = pos + 1
end
parse_err("Unmatched <<")
end
local function read_angle_cell()
if body:sub(pos, pos) ~= "<" or peek_double() then
return nil
end
local open = pos
pos = pos + 1
local depth = 1
local i = pos
while i <= len do
local ch = body:sub(i, i)
if ch == "<" then
depth = depth + 1
elseif ch == ">" then
depth = depth - 1
if depth == 0 then
local inner = body:sub(open + 1, i - 1)
pos = i + 1
return inner
end
end
i = i + 1
end
parse_err("Unmatched <")
end
local function read_bare_run()
local start = pos
while pos <= len and body:sub(pos, pos) ~= "<" do
pos = pos + 1
end
return body:sub(start, pos - 1)
end
local function absorb_double_keyword_mods(keyword_str)
while peek_double() do
local saved = pos
local _, unwrapped = read_double_bracket()
if is_keyword_mod(unwrapped) then
keyword_str = keyword_str .. unwrapped
else
pos = saved
break
end
end
return keyword_str
end
local kw_start = pos
while pos <= len and body:sub(pos, pos) ~= "<" do
pos = pos + 1
end
local keyword = body:sub(kw_start, pos - 1)
if keyword:match("^%s*$") then
parse_err("Missing keyword")
end
keyword = absorb_double_keyword_mods(keyword)
local cells = {}
while pos <= len do
if peek_double() then
local _, unwrapped = read_double_bracket()
if is_keyword_mod(unwrapped) then
parse_err("Unexpected keyword modifier " .. unwrapped .. " outside of a keyword")
end
table.insert(cells, "+" .. unwrapped)
elseif body:sub(pos, pos) == "<" then
local inner = read_angle_cell()
if inner ~= "" then
table.insert(cells, inner)
end
else
local bare = read_bare_run()
if bare ~= "" then
if bare:sub(1, 1) ~= ":" then
parse_err("Unexpected bare text '" .. bare .. "' (use :keyword for nested keywords in inline etymology)")
end
if not is_keyword(bare, true) then
parse_err("Invalid keyword '" .. bare .. "' in inline etymology")
end
table.insert(cells, absorb_double_keyword_mods(bare))
end
end
end
return {
keyword = keyword,
cells = cells,
}
end
function EtymonParser.inline_ety_to_pipe(ety_string)
local run = parse_inline_ety_run(ety_string)
if not run.keyword or run.keyword:match("^%s*$") then
return "|"
end
local pipe_parts = { normalize_keyword_param(M.string_utilities.trim(run.keyword)) }
for _, segment in ipairs(run.cells) do
if is_keyword(segment, true) then
table.insert(pipe_parts, normalize_keyword_param(segment))
else
table.insert(pipe_parts, segment)
end
end
return "|" .. table.concat(pipe_parts, "|") .. "|"
end
function EtymonParser.pipe_to_inline_ety(pipe_string)
local cells = {}
for cell in pipe_string:gmatch("([^|]+)") do
if cell ~= "" then
table.insert(cells, cell)
end
end
if #cells == 0 then
return ""
end
local inline_parts = {}
for index, cell in ipairs(cells) do
local base = get_keyword_base(cell)
if base and M.data.keywords[base] then
local without_colon = cell:gsub("^:", "")
local kw_base, mods = without_colon:match("^([^<]+)(.*)$")
local inline_kw = (kw_base or without_colon) .. (mods or ""):gsub("<([^>]+)>", "<<%1>>")
if index > 1 then
inline_kw = ":" .. inline_kw
end
table.insert(inline_parts, inline_kw)
elseif cell:sub(1, 1) == "+" then
local mod = cell:sub(2)
if mod:match("^<.->$") then
mod = mod:sub(2, -2)
end
table.insert(inline_parts, "<<" .. mod .. ">>")
else
table.insert(inline_parts, "<" .. cell .. ">")
end
end
return table.concat(inline_parts, "")
end
function EtymonParser.parse_inline_ety(ety_string, context_lang)
local run = parse_inline_ety_run(ety_string)
local keyword = M.string_utilities.trim(run.keyword)
reject_removed_surf_keyword(":" .. keyword)
if not is_keyword(keyword, true) then
error("Invalid keyword '" .. keyword .. "' in inline etymology <ety:" .. keyword .. "...>")
end
local args = { context_lang:getCode(), normalize_keyword_param(keyword) }
for _, segment in ipairs(run.cells) do
if is_keyword(segment, true) then
table.insert(args, normalize_keyword_param(segment))
else
table.insert(args, segment)
end
end
return args
end
function EtymonParser.parse_etymon(param, context_lang)
if is_keyword(param) then
return nil
end
if type(param) ~= "string" then
return nil
end
local lang, rest
local is_family = false
local before_bracket = param:match("^([^<]*)") or param
local lang_code, rest_match = before_bracket:match("^([a-zA-Z][a-zA-Z0-9._-]*):(.*)$")
if lang_code then
local potential_lang = Util.get_lang(lang_code, true)
if potential_lang then
lang = potential_lang
rest = param:sub(#lang_code + 2)
else
local potential_family = Util.get_family(lang_code)
if potential_family then
lang = potential_family
rest = param:sub(#lang_code + 2)
is_family = true
else
lang = context_lang
rest = param
end
end
else
lang = context_lang
rest = param
end
M.tracking.track_term(rest)
if rest == "" or rest == "+" then
return {
lang = lang,
term = nil,
unknown_term = true,
is_family = is_family,
}
end
if rest == "-" then
return {
lang = lang,
term = nil,
suppress_term = true,
is_family = is_family,
}
end
if not rest:find("<", 1, true) then
return {
lang = lang,
term = M.string_utilities.trim(rest),
is_family = is_family,
}
end
local term_text = rest:match("^([^<]*)") or ""
local is_unknown = (term_text == "" or term_text == "+")
local is_suppress = (term_text == "-")
local function generate_obj(ignored_term)
return { term = (is_unknown or is_suppress) and nil or M.string_utilities.trim(term_text) }
end
local rest_with_defaults = Util.add_boolean_defaults(rest, EtymonParser.etymon_param_mods)
local parsed_obj = M.parse_utilities.parse_inline_modifiers(rest_with_defaults,
{ param_mods = get_clean_param_mods(EtymonParser.etymon_param_mods), generate_obj = generate_obj })
EtymonParser.resolve_modifier_aliases(parsed_obj, EtymonParser.etymon_param_mods)
parsed_obj.postype = Util.normalize_pos(parsed_obj.postype)
if parsed_obj.id and parsed_obj.id:match("^!") then
parsed_obj.id = parsed_obj.id:sub(2)
parsed_obj.override = true
end
parsed_obj.lang = lang
parsed_obj.is_family = is_family
if is_unknown then
parsed_obj.unknown_term = true
elseif is_suppress then
parsed_obj.suppress_term = true
end
return parsed_obj
end
function EtymonParser.validate(lang, args, id, title, pos, starts_with_lang_code)
-- id is now optional, so only validate if provided
if id then
if mw.ustring.len(id) < 2 then
error("The `id` parameter must have at least two characters.")
end
if id == title or id == Util.get_page_data().pagename then
error("The `id` parameter must not be the same as the page title.")
end
end
local valid_pos = { prefix = true, suffix = true, interfix = true, infix = true, root = true, word = true }
if pos and not valid_pos[pos] then
error("Unknown value provided for `pos`. Valid values: " .. table.concat(require("Module:table").keysToList(valid_pos), ", ")
.. " (Kurdish: " .. table.concat(require("Module:table").keysToList(POS_ALIASES), ", ") .. ").")
end
local current_keyword = "from"
local current_keyword_explicit = false
local keyword_etymons = {}
local keywords = M.data.keywords
local function checkKeyword()
local config = keywords[current_keyword]
if current_keyword == "from" and not current_keyword_explicit and #keyword_etymons == 0 then
keyword_etymons = {}
return
end
EtymonParser.check_etymon_limits(#keyword_etymons, config, "`:" .. current_keyword .. "`")
keyword_etymons = {}
end
local start_index = starts_with_lang_code and 2 or 1
for i = start_index, #args do
local param = args[i]
if type(param) ~= "string" then
elseif param:sub(1, 1) == ":" and not is_keyword(param) then
reject_removed_surf_keyword(param)
error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?")
elseif is_keyword(param) then
checkKeyword()
current_keyword = get_canonical_keyword(get_keyword(param))
current_keyword_explicit = true
else
local etymon_data = EtymonParser.parse_etymon(param, lang)
if etymon_data then
table.insert(keyword_etymons, param)
EtymonParser.check_keyword_term(etymon_data, lang, current_keyword)
-- Check modifier restrictions
EtymonParser.check_modifier_restrictions(etymon_data, current_keyword, EtymonParser.etymon_param_mods)
-- postype must be "root" or "word"
local VALID_POSTYPES = { root = true, word = true }
if etymon_data.postype and not VALID_POSTYPES[etymon_data.postype] then
error("Invalid <postype:" .. etymon_data.postype .. ">; must be \"root\" or \"word\" (Kurdish \"reh\" or \"kelîme\").")
end
if etymon_data.ety then
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
EtymonParser.validate(etymon_data.lang, inline_args, nil, nil, nil, true)
end
else
table.insert(keyword_etymons, param)
end
end
end
checkKeyword()
end
local DataRetriever = {}
local function format_etymon_id_hint(id_data, idx)
local id = type(id_data) == "table" and id_data.id or id_data
local pos = type(id_data) == "table" and id_data.pos
if id and id ~= "" and id ~= "*" then
return '"' .. id .. '"'
end
if pos and pos ~= "" then
return "unnamed (|pos=" .. pos .. "|)"
end
return "etymon #" .. idx .. " (no |id= on page)"
end
local function etymon_target_page_link(page, norm_lang)
-- `page` is an already-resolved page name ("Jinûvesazî:proto-îranî/hižwáH"), so link to it
-- directly. Passing it back through full_link() with a reconstructed language raises an error,
-- because the resolved name no longer carries the leading "*" those languages require -- and
-- this link is built even when the warning it belongs to is later discarded outside preview.
return "[[" .. page .. "]]"
end
-- Summarize {{etymon}} id slots on a linked page for preview warnings.
local function summarize_available_etymon_ids(ids)
local id_list = {}
local all_idless = true
local target_has_idless = false
local any_pos = false
for i, id_data in ipairs(ids) do
local id = type(id_data) == "table" and id_data.id or id_data
local pos = type(id_data) == "table" and id_data.pos
if id and id ~= "" and id ~= "*" then
all_idless = false
else
target_has_idless = true
end
if pos and pos ~= "" then
any_pos = true
end
table.insert(id_list, format_etymon_id_hint(id_data, i))
end
return {
id_list = id_list,
all_idless = all_idless,
target_has_idless = target_has_idless,
any_pos = any_pos,
count = #ids,
options_text = mw.text.listToText(id_list),
}
end
local function ambiguous_etymon_suggestion(page_link, summary)
if summary.all_idless then
if summary.any_pos then
return " None set `|id=` yet; add a unique `|id=` to each on " .. page_link
.. ", then `<id:identifier>` after the term here. Section order / hints: "
.. summary.options_text .. "."
end
return " None set `|id=` yet; add a unique `|id=` to each {{etymon}} in that section from top to bottom, then `<id:identifier>` after the term here (same value as `|id=`)."
end
return " Specify which one with `<id:identifier>` after the term. Options: " .. summary.options_text .. "."
end
local function warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel)
local page_link = etymon_target_page_link(page, norm_lang)
local summary = summarize_available_etymon_ids(ids)
if is_toplevel and summary.target_has_idless then
__state.linked_page_multiple_etymons_idless = true
end
local lang_name = norm_lang:getCanonicalName()
local lead = "Etymology link to " .. page_link .. " is ambiguous (" .. summary.count
.. " {{etymon}} templates for " .. lang_name .. ")."
Util.add_warning(lead .. ambiguous_etymon_suggestion(page_link, summary), true)
end
local function is_mismatched_explicit_id(base_key, cached_args, parent_etymon)
return cached_args == M.data.STATUS.MISSING and not parent_etymon
and #(__state.available_etymon_ids[base_key] or {}) > 0
end
local function maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel)
if not is_toplevel or __state.skip_partial_etymology_category then
return
end
if not __state.partial_etymology_targets[base_key] then
return
end
if etymon_data.id and type(cached_args) == "table" then
return
end
__state.linked_page_partial_etymology_sections = true
end
local function is_nonlemma_etymon_template(template_args)
return template_args and M.yesno(template_args.nl, false)
end
local function warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_id)
local page_link = etymon_target_page_link(page, norm_lang)
local summary = summarize_available_etymon_ids(__state.available_etymon_ids[base_key] or {})
local lang_name = norm_lang:getCanonicalName()
local lead = "Etymology link to " .. page_link .. " uses `<id:" .. etymon_id
.. ">`, but no {{etymon}} on that page has `|id=" .. etymon_id .. "|` for " .. lang_name .. "."
Util.add_warning(lead .. " Valid IDs: " .. summary.options_text .. ".", true)
end
-- Given an etymon data, scrape its page and cache the result in the global state object.
function DataRetriever.cache_page_etymons(etymon_page, etymon_title, key, etymon_lang, etymon_id, redirected_from, descendants_is_toplevel)
local content = etymon_title:getContent()
if not content then
__state.cached_etymon_args[key] = M.data.STATUS.REDLINK
return
end
-- Check if the linked page is a redirect. If it is, the template parsing
-- code below will be effectively skipped, and `scrape_page` will be called
-- again on the redirect target (see the bottom of this function)
local lang_section_for_descendants = nil
local redirect_target = etymon_title.redirect_target
if not redirect_target then
-- ku.wiktionary writes L2 headings as "== {{ziman|CODE}} ==" rather than the language
-- name, and this scrape runs on raw wikitext, so the template form has to be tried too.
content = M.pages.get_section(content, etymon_lang:getFullName(), 2)
or M.pages.get_section(content, "{{ziman|" .. etymon_lang:getFullCode() .. "}}", 2)
if not content then
__state.cached_etymon_args[key] = M.data.STATUS.MISSING
return
end
lang_section_for_descendants = content
end
local etymon_lang_code = etymon_lang:getFullCode()
local lang_page_key = etymon_lang_code .. ":" .. etymon_page
local found_templates_for_lang = {}
local found_ids = {}
local get_node_class = M.template_parser.class_else_type
-- Look for all {{etymon}} templates within the page content using the template parser
-- This way the same page is never parsed more than once
-- Build a map from senseids to their parent etymonids.
local active_etymon_args = nil
local etymology_section_count = 0
local etymology_sections_with_etymon = 0
local current_etymology_has_etymon = false
local current_etymology_has_nonlemma = false
local function finalize_current_etymology_section()
if etymology_section_count == 0 then
return
end
if current_etymology_has_etymon or current_etymology_has_nonlemma then
etymology_sections_with_etymon = etymology_sections_with_etymon + 1
end
current_etymology_has_etymon = false
current_etymology_has_nonlemma = false
end
for node in M.template_parser.parse(content):iterate_nodes() do
local node_class = get_node_class(node)
if node_class == "heading" then
-- A new L2 or etymology section acts as a barrier: an {{etymon}} usage
-- used previously cannot be the parent of any subsequent senseids.
-- Note that we don't have to check for L2s due to the usage of `M.pages.get_section` above.
if node:get_name():find(ETYMOLOGY_HEADING) then
finalize_current_etymology_section()
etymology_section_count = etymology_section_count + 1
active_etymon_args = nil
end
elseif node_class == "template" then
local template_name = node:get_name()
if ETYMON_TEMPLATES[template_name] then
local template_args = Util.normalize_raw_etymon_args(node:get_arguments())
-- Check if this etymon is for our language
if template_args[1] == etymon_lang_code then
if is_nonlemma_etymon_template(template_args) then
if etymology_section_count > 0 then
current_etymology_has_nonlemma = true
end
else
if etymology_section_count > 0 then
current_etymology_has_etymon = true
end
table.insert(found_templates_for_lang, template_args)
if template_args.id then
local etymon_key = lang_page_key .. ":" .. template_args.id
__state.cached_etymon_args[etymon_key] = template_args
__state.cached_etymon_pages[etymon_key] = tostring(etymon_page)
table.insert(found_ids, template_args.id)
active_etymon_args = template_args
else
-- Store idless etymon with default key
local etymon_key = lang_page_key .. ":*"
__state.cached_etymon_args[etymon_key] = template_args
__state.cached_etymon_pages[etymon_key] = tostring(etymon_page)
table.insert(found_ids, "*")
active_etymon_args = template_args
end
end
end
elseif active_etymon_args and template_name == "senseid" then
local template_args = node:get_arguments()
-- This should always be true for proper usages of {{senseid}}.
if template_args[1] == etymon_lang_code and template_args[2] then
local sense_id_key = lang_page_key .. ":" .. template_args[2]
__state.senseid_parent_etymon[sense_id_key] = active_etymon_args
__state.cached_etymon_pages[sense_id_key] = tostring(etymon_page)
end
end
end
end
finalize_current_etymology_section()
if lang_section_for_descendants
and etymology_section_count > 1
and etymology_sections_with_etymon > 0
and etymology_sections_with_etymon < etymology_section_count
then
__state.partial_etymology_targets[lang_page_key] = true
end
if descendants_is_toplevel and lang_section_for_descendants and #found_templates_for_lang > 0 then
M.descendants.cache_page_checks({
lang_section = lang_section_for_descendants,
etymon_lang_code = etymon_lang_code,
found_templates_for_lang = found_templates_for_lang,
entry_title = __state.entry_title,
entry_lang_code = __state.entry_lang_code,
entry_lang = __state.entry_lang_code and Util.get_lang(__state.entry_lang_code, true) or nil,
cached_descendants_checks = __state.cached_descendants_checks,
lang_page_key = lang_page_key,
redirected_from = redirected_from,
})
end
local id_data_list = {}
for _, args in ipairs(found_templates_for_lang) do
local id = args.id or "*"
table.insert(id_data_list, { id = id, pos = args.pos })
end
__state.available_etymon_ids[lang_page_key] = id_data_list
if #found_templates_for_lang == 1 then
__state.single_etymons[lang_page_key] = found_templates_for_lang[1]
end
if redirected_from and __state.available_etymon_ids[lang_page_key] then
__state.available_etymon_ids[redirected_from] = __state.available_etymon_ids[redirected_from] or {}
for _, id_data in ipairs(__state.available_etymon_ids[lang_page_key]) do
table.insert(__state.available_etymon_ids[redirected_from], id_data)
end
end
if __state.cached_etymon_args[key] ~= nil or __state.senseid_parent_etymon[key] ~= nil then
-- All done!
return
elseif redirect_target and not redirected_from then
-- Try scraping the redirect.
etymon_page = redirect_target.prefixedText
DataRetriever.cache_page_etymons(etymon_page, redirect_target, lang_page_key .. ":" .. etymon_id, etymon_lang, etymon_id, lang_page_key, descendants_is_toplevel)
__state.cached_etymon_args[key] = __state.cached_etymon_args[etymon_lang_code .. ":" .. etymon_page .. ":" .. etymon_id]
else
__state.cached_etymon_args[key] = M.data.STATUS.MISSING
end
end
local function has_linkable_term(etymon_data)
if etymon_data.is_family or etymon_data.suppress_term or etymon_data.unknown_term then
return false
end
local term = etymon_data.term
if term == nil or term == "" then
return false
end
return M.string_utilities.trim(term) ~= ""
end
local function record_term_id_tracking(etymon_data)
if not has_linkable_term(etymon_data) then
return
end
local term_page = M.links.get_link_page(etymon_data.term, etymon_data.lang)
M.tracking.record_term_id_usage(__state.id_stats, etymon_data, term_page)
end
-- Given an etymon object, scrape its page (if necessary) and return its own etymon arguments as well as the page name.
function DataRetriever.get_etymon_args(etymon_data, is_toplevel)
if not has_linkable_term(etymon_data) then
return M.data.STATUS.MISSING, nil, nil, nil
end
local page = M.links.get_link_page(etymon_data.term, etymon_data.lang)
local norm_lang = Util.get_norm_lang(etymon_data.lang)
local base_key = norm_lang:getFullCode() .. ":" .. page
if etymon_data.id then
local key = base_key .. ":" .. etymon_data.id
local cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key]
if cached_args == nil then
local title = mw.title.new(page)
if not title then error('Invalid page title "' .. page .. '" encountered.') end
DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, is_toplevel)
end
cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key] -- refresh
-- Get etymon_id from parent if this was resolved via senseid
local parent_etymon = __state.senseid_parent_etymon[key]
local resolved_etymon_id = parent_etymon and parent_etymon.id
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = {
explicit_id = etymon_data.id,
parent_etymon = parent_etymon,
},
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = {
explicit_id = etymon_data.id,
parent_etymon = parent_etymon,
},
})
end
end
local mismatched_id = is_mismatched_explicit_id(base_key, cached_args, parent_etymon)
if mismatched_id and is_toplevel then
__state.has_mismatched_id = true
M.tracking.record_mismatched_id_usage(__state.id_stats, norm_lang, page, etymon_data.id)
warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_data.id)
end
maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel)
return cached_args, __state.cached_etymon_pages[key], resolved_etymon_id, descendants_check
else
__state.used_idless_etymon = true
if is_toplevel then
__state.toplevel_idless_etymon = true
end
if __state.available_etymon_ids[base_key] == nil then
local title = mw.title.new(page)
if not title then error('Invalid page title "' .. page .. '" encountered.') end
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, is_toplevel)
end
local ids = __state.available_etymon_ids[base_key] or {}
local count = #ids
-- Try to filter by postype if available and we have multiple candidates
if count > 1 and etymon_data.postype then
local matching_ids = {}
for _, id_data in ipairs(ids) do
if id_data.pos == etymon_data.postype then
table.insert(matching_ids, id_data)
end
end
if #matching_ids == 1 then
local matched_id = matching_ids[1].id
local matched_key = base_key .. ":" .. matched_id
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "postype")
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = { id = matched_id },
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = { id = matched_id },
})
end
end
local matched_args = __state.cached_etymon_args[matched_key]
maybe_flag_partial_etymology_reference(base_key, etymon_data, matched_args, is_toplevel)
return matched_args, __state.cached_etymon_pages[matched_key], nil, descendants_check
end
end
if count == 1 then
local only_id_data = ids[1]
local only_id = (type(only_id_data) == "table" and only_id_data.id) or only_id_data or "*"
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "single")
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = { id_data = only_id_data },
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = { id_data = only_id_data },
})
end
end
local single_args = __state.single_etymons[base_key]
maybe_flag_partial_etymology_reference(base_key, etymon_data, single_args, is_toplevel)
return single_args, __state.cached_etymon_pages[base_key .. ":" .. only_id], nil, descendants_check
elseif count > 1 then
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "ambiguous")
warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel)
maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.AMBIGUOUS, is_toplevel)
return M.data.STATUS.AMBIGUOUS, nil, nil, nil
else
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "missing")
maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.MISSING, is_toplevel)
return M.data.STATUS.MISSING, nil, nil, nil
end
end
end
local function keyword_invisible_in_tree(keyword_info)
if not keyword_info then
return false
end
local inv = keyword_info.invisible
return inv == "all" or inv == true or inv == "tree"
end
-- True when the node has at least one top-level child container visible in the tree.
local function node_has_visible_tree_children(node)
for _, container in ipairs(node.children or {}) do
if not keyword_invisible_in_tree(container.keyword_info) then
return true
end
end
return false
end
-- Count visible term nodes in the tree.
local function get_visible_tree_depth(node, skip_child_rendering)
local max_depth = 1
if skip_child_rendering or not node then
return max_depth
end
for _, container in ipairs(node.children or {}) do
local keyword_info = container.keyword_info
if not keyword_invisible_in_tree(keyword_info) then
local skip_grandchildren = keyword_info and keyword_info.no_child_categories
for _, term in ipairs(container.terms or {}) do
if term.is_duplicate then
if term.original_has_children then
max_depth = math.max(max_depth, 2)
end
else
max_depth = math.max(max_depth, 1 + get_visible_tree_depth(term, skip_grandchildren))
end
end
end
end
return max_depth
end
local function as_param_list(val)
if val == nil then
return {}
end
if type(val) == "table" then
return val
end
if type(val) == "string" and val ~= "" then
return { val }
end
return {}
end
local TreeBuilder = {}
local function parse_etymon_references(refs_text)
if not refs_text or refs_text == "" then
return ""
end
return M.references.parse_references(refs_text)
end
local function parse_tree_references(node)
if node.ref then
node.parsed_ref = parse_etymon_references(node.ref)
end
if node.children then
for _, container in ipairs(node.children) do
if container.terms then
for _, term in ipairs(container.terms) do
parse_tree_references(term)
end
end
end
end
if node.supplements then
for _, supplement in ipairs(node.supplements) do
if supplement.terms then
for _, term in ipairs(supplement.terms) do
parse_tree_references(term)
end
end
end
end
end
-- Build a unique key for deduplication in the seen table
function TreeBuilder.build_key(lang, title, args)
local norm_lang_code = Util.get_norm_lang(lang):getFullCode()
local is_table = type(args) == "table"
local id = (is_table and args.id) or ""
if title then
return norm_lang_code .. ":" .. M.links.get_link_page(title, lang) .. ":" .. id
end
if is_table and args.status == M.data.STATUS.INLINE then
local content_parts = {}
for i = 1, #args do
content_parts[i] = tostring(args[i])
end
return norm_lang_code .. ":*:" .. id .. "\0" .. table.concat(content_parts, "\0")
end
return norm_lang_code .. ":*:" .. id
end
-- Copy parsed etymon modifiers onto a tree/supplement term node.
function TreeBuilder.apply_etymon_fields(term, etymon_data)
-- A reference without <id:> still resolves when the target page has a single etymon, and the
-- node already carries that etymon's own id. Keep it instead of clearing it, so the tree shows
-- the target's id as the gloss without every reference having to repeat it. An explicit
-- <id:...> still wins.
term.id = etymon_data.id or term.id
term.t = etymon_data.t
term.tr = etymon_data.tr
term.ts = etymon_data.ts
term.alt = etymon_data.alt
term.g = etymon_data.g
term.pos = etymon_data.pos
term.ng = etymon_data.ng
term.ref = etymon_data.ref
term.is_uncertain = etymon_data.unc
term.lit = etymon_data.lit
term.q = etymon_data.q
term.qq = etymon_data.qq
term.l = etymon_data.l
term.ll = etymon_data.ll
term.suppress_term = etymon_data.suppress_term
term.unknown_term = etymon_data.unknown_term
term.is_family = etymon_data.is_family
term.override = etymon_data.override
term.aftype = etymon_data.aftype
term.postype = etymon_data.postype
term.bor = etymon_data.bor
term.lbor = etymon_data.lbor
term.slbor = etymon_data.slbor
end
function TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type)
EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type)
local term = {
lang = etymon_data.lang,
title = etymon_data.term,
children = {},
status = M.data.STATUS.OK,
}
TreeBuilder.apply_etymon_fields(term, etymon_data)
return term
end
function TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value)
local terms = {}
for _, term_param in ipairs(as_param_list(param_value)) do
if type(term_param) == "string" and term_param ~= "" then
local etymon_data = EtymonParser.parse_etymon(term_param, entry_lang)
if etymon_data then
table.insert(terms, TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type))
end
end
end
return terms
end
-- Attach a |param= supplement defined in etymon_data.supplements (e.g. doublet=).
function TreeBuilder.append_term_supplement(data_tree, entry_lang, supplement_type, param_value)
local config = M.data.supplements[supplement_type]
if not config then
error("Unknown supplement '" .. tostring(supplement_type) .. "'.")
end
local terms = TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value)
if #terms == 0 then
return
end
data_tree.supplements = data_tree.supplements or {}
table.insert(data_tree.supplements, {
type = supplement_type,
config = config,
terms = terms,
})
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, supplement_type, entry_lang, entry_lang, true)
end
function TreeBuilder.build(lang, title, args, seen, depth, stop_recursion)
seen = seen or {}
depth = depth or 0
local is_toplevel = (depth == 0)
if depth > __state.max_depth_reached then
__state.max_depth_reached = depth
end
__state.total_nodes = __state.total_nodes + 1
local lang_code = lang:getCode()
__state.language_count[lang_code] = (__state.language_count[lang_code] or 0) + 1
local current_id = (type(args) == "table" and args.id) or ""
local key = TreeBuilder.build_key(lang, title, args)
local node = { lang = lang, title = title, id = current_id, args = args, children = {}, status = M.data.STATUS.OK }
if type(args) ~= "table" or seen[key] then
node.status = args or M.data.STATUS.MISSING
-- Mark as duplicate if we've seen this node before
if seen[key] then
node.is_duplicate = true
node.duplicate_key = key
local original_node = seen[key]
if type(original_node) == "table" and original_node.children and #original_node.children > 0 then
node.original_has_children = true
end
end
return node
end
node.status = args.status or M.data.STATUS.OK
seen[key] = node
-- If stop_recursion is set, skip parsing children but check for visible children
if stop_recursion then
local keywords = M.data.keywords
local has_visible_children = false
for i = 2, #args do
local param = args[i]
if type(param) == "string" then
local keyword_base = get_keyword_base(param)
if keyword_base and keywords[keyword_base] then
local _, kw_modifiers = EtymonParser.parse_keyword_modifiers(param:sub(1, 1) == ":" and param or (":" .. param))
if not keyword_invisible_in_tree(get_effective_keyword_info(keyword_base, kw_modifiers)) then
has_visible_children = true
break
end
elseif param:sub(1, 1) ~= ":" then
-- It's a term (not a keyword), so there are visible children
has_visible_children = true
break
end
end
end
node.has_visible_children = has_visible_children
return node
end
-- Parse args into keyword containers
local current_keyword = "from"
local current_keyword_modifiers = {}
local current_container = nil
local function ensure_container()
if not current_container or current_container.keyword ~= current_keyword then
local keyword_info = get_effective_keyword_info(current_keyword, current_keyword_modifiers)
current_container = {
keyword = current_keyword,
keyword_info = keyword_info,
keyword_modifiers = current_keyword_modifiers,
terms = {},
}
table.insert(node.children, current_container)
-- Override keyword text/phrase for nominalization with <g:code>
if current_keyword_modifiers.g and current_keyword == "nominalization" then
local labels = get_nominalization_label_for_g(current_keyword_modifiers.g)
if not labels then
local codes = {}
for c in pairs(M.data.nominalization_g_codes) do table.insert(codes, c) end
table.sort(codes)
error("Invalid <g:" .. tostring(current_keyword_modifiers.g) .. ">. Supported codes for nominalization: " .. table.concat(codes, ", "))
end
current_container.keyword_info = copy_keyword_info(keyword_info)
current_container.keyword_info.text = labels.text
current_container.keyword_info.phrase = labels.phrase
end
end
return current_container
end
local parse_context_lang = Util.resolve_context_lang(lang, args)
for i = 2, #args do
local param = args[i]
if is_keyword(param) then
local keyword, modifiers = EtymonParser.parse_keyword_modifiers(param)
if not keyword then
error("Invalid keyword '" .. param .. "'.")
end
current_keyword = keyword
current_keyword_modifiers = modifiers
current_container = nil -- Force new container for new keyword
elseif type(param) == "string" and param:sub(1, 1) == ":" then
reject_removed_surf_keyword(param)
error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?")
elseif type(param) == "string" then
local etymon_data = EtymonParser.parse_etymon(param, parse_context_lang)
if etymon_data then
-- Track keyword usage at top level
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, current_keyword, lang, etymon_data.lang, is_toplevel)
local term_node = {}
local container
-- Handle suppress_term (-) and unknown_term (empty or +) directly
if etymon_data.suppress_term or etymon_data.unknown_term then
container = ensure_container()
if etymon_data.ety then
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
inline_args.id = etymon_data.id
inline_args.status = M.data.STATUS.INLINE
term_node = TreeBuilder.build(etymon_data.lang, nil, inline_args, seen, depth + 1)
else
term_node = {
lang = etymon_data.lang,
children = {},
status = M.data.STATUS.OK,
}
end
TreeBuilder.apply_etymon_fields(term_node, etymon_data)
else
-- Regular term: fetch arguments from page
record_term_id_tracking(etymon_data)
local etymon_args, page_of, resolved_etymon_id, descendants_check =
DataRetriever.get_etymon_args(etymon_data, is_toplevel)
-- Check for <ety> inline parameter doesn't override the scraped arguments, unless the latter are missing
if etymon_data.ety then
if etymon_args == M.data.STATUS.REDLINK or etymon_args == M.data.STATUS.MISSING then
__state.current_page_has_inline_etymology = true
if is_toplevel then
__state.toplevel_has_inline_etymology = true
end
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
-- Track inline ety keywords too
local inline_keyword = get_keyword(inline_args[2], true)
if inline_keyword and #inline_args >= 3 then
local inline_etymon = EtymonParser.parse_etymon(inline_args[3], etymon_data.lang)
if inline_etymon then
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, inline_keyword, etymon_data.lang, inline_etymon.lang, is_toplevel)
end
end
inline_args.id = etymon_data.id
inline_args.status = M.data.STATUS.INLINE
etymon_args = inline_args
term_node.page_of = __state.cached_etymon_pages[key] -- term node is on the same page as the parent
else
-- Scraped arguments exist, <ety> is redundant and ignored
__state.current_page_has_redundant_etymology = true
if is_toplevel then
__state.toplevel_redundant_etymology = true
end
end
end
-- Ensure container exists before checking keyword info
container = ensure_container()
-- Check if current keyword has no_child_categories - if so, stop recursion
local keyword_info = container.keyword_info
local should_stop_recursion = (stop_recursion or (keyword_info and keyword_info.no_child_categories))
term_node = TreeBuilder.build(etymon_data.lang, etymon_data.term, etymon_args, seen, depth + 1, should_stop_recursion)
term_node.target_key = Util.get_norm_lang(etymon_data.lang):getFullCode() ..
":" .. M.links.get_link_page(etymon_data.term, etymon_data.lang)
term_node.etymon_id = resolved_etymon_id -- The actual etymon id when resolved via senseid
term_node.page_of = page_of
TreeBuilder.apply_etymon_fields(term_node, etymon_data)
term_node.missing_descendants_header, term_node.missing_descendants_entry =
M.descendants.get_term_sync_flags(current_keyword, term_node.status, descendants_check)
end
table.insert(container.terms, term_node)
end
end
end
return node
end
-- Convert etymology tree to JSON-serializable table
local function tree_to_json(node)
local obj = {
term = node.title,
lang = node.lang:getCode(),
lang_name = node.lang:getCanonicalName(),
id = (node.id and node.id ~= "") and node.id or nil,
status = node.status,
is_uncertain = node.is_uncertain or nil,
is_duplicate = node.is_duplicate or nil,
gloss = node.t,
transliteration = node.tr,
transcription = node.ts,
alt = node.alt,
g = node.g,
pos = node.pos,
ng = node.ng,
children = {},
}
for _, container in ipairs(node.children or {}) do
local keyword_info = container.keyword_info
if keyword_info then
local container_obj = {
keyword = container.keyword,
keyword_label = keyword_info.text,
keyword_abbrev = keyword_info.abbrev,
is_group = keyword_info.is_group or nil,
is_invisible = keyword_info.invisible or nil,
is_uncertain = (container.keyword_modifiers and container.keyword_modifiers.unc) or nil,
terms = {},
}
for _, term in ipairs(container.terms or {}) do
table.insert(container_obj.terms, tree_to_json(term))
end
table.insert(obj.children, container_obj)
end
end
return obj
end
-- Build and return the etymology data tree for a given term.
function export.get_tree(lang, title, args, options)
options = options or {}
__state.entry_title = title
__state.entry_lang_code = lang:getCode()
__state.id_stats = M.tracking.new_id_stats()
__state.skip_partial_etymology_category = options.skip_partial_etymology_category == true
if options.validate then
EtymonParser.validate(lang, args, options.id, title, options.pos, false)
end
local lang_code = lang:getCode()
local start_index = (args[1] == lang_code) and 2 or 1
local tree_args = { [1] = lang_code, id = options.id or args.id }
for i = start_index, #args do
table.insert(tree_args, args[i])
end
__state.cached_etymon_args[lang_code .. ":" .. title .. ":" .. (tree_args.id or "")] = tree_args
local ety_data_tree = TreeBuilder.build(lang, title, tree_args)
parse_tree_references(ety_data_tree)
if options.json then
return M.JSON.toJSON(tree_to_json(ety_data_tree))
end
return ety_data_tree
end
-- Given a language code, page name and optionally the id= parameter,
-- render the tree and only the etymology tree for the relevant page.
-- Fetches and parses the corresponding {{etymon}} from the requested page,
-- and any further pages needed to render the tree.
-- Parameters can be passed either through the #invoke or as
-- template parameters *through* an #invoke.
function export.render_tree_for_etymon_on_page(frame)
local frame_args = frame.args
local parent_args = frame:getParent().args
local langcode = frame_args[1] or parent_args[1]
local pagename = frame_args[2] or parent_args[2]
local id = frame_args["id"] or parent_args["id"]
local display_title = frame_args["title"] or parent_args["title"]
local parsed_title = mw.title.new(pagename, 0)
local title
if parsed_title.namespace == 0 then
title = M.pages.safe_page_name(parsed_title)
elseif parsed_title.namespace == RECONSTRUCTION_NS_ID then
title = "*" .. M.pages.safe_page_name(parsed_title)
else
error("Unsupported namespace for render_tree_for_etymon_on_page: " .. parsed_title.namespace)
end
local lang = Util.get_lang(langcode)
__state.entry_title = title
__state.entry_lang_code = lang:getCode()
__state.id_stats = M.tracking.new_id_stats()
-- Construct etymon_data for DataRetriever.get_args.
local etymon_data = {
lang = lang,
term = title,
id = id
}
local args, pagename = DataRetriever.get_etymon_args(etymon_data, true)
if args == M.data.STATUS.MISSING then
error("The etymon template was not found (language " ..
langcode ..
", title '" ..
title ..
"'" ..
(id and ", ID '" .. id .. "'" or ", no ID given") .. "). Page contents may have changed in the interim.")
end
local tree_title = display_title or title
if lang:makeEntryName(M.links.remove_links(tree_title)) ~= lang:makeEntryName(M.links.remove_links(title)) then
M.tracking.track_title_pagename_mismatch(lang)
end
reset_invocation_state()
local ety_data_tree = export.get_tree(lang, tree_title, args, {
validate = true,
id = id,
})
local output = {}
table.insert(output, M.template_styles("Module:etymon/styles.css"))
table.insert(output, M.tree.render({
data_tree = ety_data_tree,
format_term_func = function(term, is_toplevel)
return Util.format_term(term, is_toplevel, {
pos = "suppress",
lit = "suppress",
tree_ql = "suppress",
gloss = "separate",
})
end,
}))
return table.concat(output)
end
function export.main(frame)
local parent_args = frame:getParent().args
local args = M.parameters.process(parent_args, M.parameters_data.etymon)
args.pos = Util.normalize_pos(args.pos)
local lang = args[1]
local etymon_args = args[2]
local id = args.id
local title = args.title
local text = args.text
local tree = args.tree
local etydate = args.etydate
local doublet = args.doublet
local rfe = args.rfe
local etystub = args.etystub
local is_nonlemma = M.yesno(args.nl, false)
local page_data = Util.get_page_data()
if not title then
title = page_data.pagename
if page_data.namespace == RECONSTRUCTION_NS_NAME then title = "*" .. title end
end
local entry_pagename = page_data.pagename
if page_data.namespace == RECONSTRUCTION_NS_NAME then
entry_pagename = "*" .. entry_pagename
end
if lang:makeEntryName(M.links.remove_links(title)) ~= lang:makeEntryName(M.links.remove_links(entry_pagename)) then
M.tracking.track_title_pagename_mismatch(lang)
end
local current_L2 = M.pages.get_current_L2()
if current_L2 then
local norm_lang = Util.get_norm_lang(lang)
local norm_name = norm_lang:getCanonicalName()
if current_L2 ~= norm_name then
local lang_desc = lang:getCode() .. " (" .. lang:getCanonicalName() .. ")"
if norm_lang:getCode() ~= lang:getCode() then
lang_desc = lang_desc .. ", normalized to " .. norm_lang:getCode() .. " (" .. norm_name .. ")"
end
error("Language '" .. lang_desc .. "' does not match the L2 header (" .. current_L2 .. ").")
end
end
reset_invocation_state()
local ety_data_tree = export.get_tree(lang, title, etymon_args, {
validate = true,
pos = args.pos,
id = id,
json = args.json,
skip_partial_etymology_category = is_nonlemma,
})
if args.json then
return ety_data_tree
end
local output = {}
local text_allowlist_mode = M.text_allowed.default_mode or "off"
if text and text_allowlist_mode ~= "off" and not Util.is_text_param_allowed_for_lang(lang) then
local msg = "Etymology texts (parameter <code>text=</code>) are not allowed for " .. lang:getFullName() ..
"; see [[Template:etymon#Text allowlist|Template:etymon § Text allowlist]] for the list of languages that may use the <code>text=</code> parameter."
if text_allowlist_mode == "error" then
error(msg)
else
Util.add_warning(msg, true)
end
end
local lang_exc = Util.get_lang_exception(lang)
if lang_exc and lang_exc.disallow then
local disallow = lang_exc.disallow
local error_text = " for " .. lang:getFullName()
if disallow.ref then
error_text = error_text .. "; see " .. disallow.ref
else
error_text = error_text .. "."
end
if tree and disallow.tree then
error("Etymology trees are not allowed" .. error_text)
end
if text and disallow.text then
error("Etymology texts are not allowed" .. error_text)
end
end
if etydate then
local etydate_param_mods = {
ref = { list = true, type = "references", allow_holes = true },
refn = { list = true, allow_holes = true },
nocap = { type = "boolean" },
}
local function generate_etydate_obj(etydate_text)
local etydate_specs = {}
for spec in etydate_text:gmatch("[^,]+") do
table.insert(etydate_specs, mw.text.trim(spec))
end
return { [1] = etydate_specs }
end
local parsed_etydate = M.parse_utilities.parse_inline_modifiers(etydate, { param_mods = etydate_param_mods, generate_obj = generate_etydate_obj })
local etydate_args = {
[1] = parsed_etydate[1],
nocap = parsed_etydate.nocap or false,
}
ety_data_tree.supplements = ety_data_tree.supplements or {}
table.insert(ety_data_tree.supplements, {
type = "etydate",
etydate_text = M.etydate.format_etydate(etydate_args, { omit_refs = true }),
etydate_refs = (parsed_etydate.ref and #parsed_etydate.ref > 0) and parsed_etydate.ref or nil,
})
end
TreeBuilder.append_term_supplement(ety_data_tree, lang, "doublet", doublet)
if ety_data_tree.supplements then
parse_tree_references(ety_data_tree)
end
local has_visible_children = node_has_visible_tree_children(ety_data_tree)
-- Suppress trees for multiword entries and one-step chains
local visible_tree_depth = get_visible_tree_depth(ety_data_tree)
local is_trivial_tree = visible_tree_depth <= 2
local is_multiword = title:find("%s") ~= nil or title:find("_") ~= nil
if tree and (is_multiword or is_trivial_tree) then
tree = false
end
if tree then
table.insert(output, M.template_styles("Module:etymon/styles.css"))
table.insert(output, M.tree.render({
data_tree = ety_data_tree,
format_term_func = function(term, is_toplevel)
return Util.format_term(term, is_toplevel, {
pos = "suppress",
lit = "suppress",
tree_ql = "suppress",
gloss = "separate",
})
end,
}))
end
local tree_disallowed = lang_exc and lang_exc.disallow and lang_exc.disallow.tree
local ety_tree_json = M.JSON.toJSON(tree_to_json(ety_data_tree))
local anchor = M.anchors.etymonid(lang, id, {
no_tree = args.notree,
title = title,
empty_tree = (not has_visible_children) or tree_disallowed,
ety_tree_json = ety_tree_json,
})
table.insert(output, anchor)
local text_stop_lang_missing = nil
if text then
local max_depth, stop_at_blue_link, stop_at_lang, stop_at_lang_or_bluelink
if text == "++" then
max_depth, stop_at_blue_link = false, false
elseif text == "+" then
max_depth, stop_at_blue_link = 1, false
elseif text == "*" then
max_depth, stop_at_blue_link = false, true
elseif text:match("^:[^*]+%*$") then
-- Stop at a specific language OR first bluelink after it, e.g., ":ota*"
-- If the target language is a redlink, continue to the first bluelink
local lang_code = text:match("^:([^*]+)%*$")
if lang_code and lang_code ~= "" then
local lang_obj = Util.get_lang(lang_code, true)
if lang_obj then
stop_at_lang_or_bluelink = lang_code
else
Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false
end
else
Util.add_warning('Empty language code in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false
end
elseif text:sub(1, 1) == ":" then
-- Stop at a specific language, e.g., ":ar" stops at first Arabic term
local lang_code = text:sub(2)
if lang_code ~= "" then
-- Validate the language code
local lang_obj = Util.get_lang(lang_code, true)
if lang_obj then
stop_at_lang = lang_code
else
Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false -- default to ++
end
else
Util.add_warning('Empty language code in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false -- default to ++
end
else
local num = tonumber(text)
if num and num >= 1 then
max_depth, stop_at_blue_link = num, false
else
error('Invalid text value "' ..
text .. '". Valid values are: "++" (full chain), "+" (first step only), "*" (until first blue link), a number (max steps), ":lang" (stop at language), or ":lang*" (stop at language or first bluelink if redlink)')
end
end
local text_output, text_render_meta = M.text.render({
data_tree = ety_data_tree,
format_term_func = Util.format_term,
lang_matches_stop_code = Util.lang_matches_stop_code,
max_depth = max_depth,
stop_at_blue_link = stop_at_blue_link,
curr_page = page_data.pagename,
nodot = args.nodot,
dot = args.dot,
stop_at_lang = stop_at_lang,
stop_at_lang_or_bluelink = stop_at_lang_or_bluelink,
})
table.insert(output, text_output)
if stop_at_lang and text_render_meta and not text_render_meta.stop_lang_reached then
M.tracking.track_text_stop_lang_missing(lang, stop_at_lang)
text_stop_lang_missing = stop_at_lang
end
end
if rfe then
table.insert(output, Util.expand_request_template(frame, "rfe", rfe, lang:getCode()))
end
if etystub then
table.insert(output, Util.expand_request_template(frame, "etystub", etystub, lang:getCode()))
end
if is_nonlemma then
table.insert(output, " " .. frame:expandTemplate({
title = "nonlemma",
args = {},
}))
end
local categories = {}
if Util.is_content_page() then
M.tracking.track_tree_metrics({
max_depth_reached = __state.max_depth_reached,
total_nodes = __state.total_nodes,
language_count = __state.language_count,
lang = lang,
})
categories = M.categories.build({
data_tree = ety_data_tree,
page_lang = lang,
available_etymon_ids = __state.available_etymon_ids,
senseid_parent_etymon = __state.senseid_parent_etymon,
get_norm_lang_func = Util.get_norm_lang,
lang_exc = lang_exc,
suppress_categories = lang_exc and lang_exc.suppress_categories,
nocat = args.nocat,
tree = tree,
text = text,
exnihilo = args.exnihilo,
toplevel_has_inline_etymology = __state.toplevel_has_inline_etymology,
toplevel_redundant_etymology = __state.toplevel_redundant_etymology,
toplevel_idless_etymon = __state.toplevel_idless_etymon,
has_mismatched_id = __state.has_mismatched_id,
linked_page_multiple_etymons_idless = __state.linked_page_multiple_etymons_idless,
linked_page_partial_etymology_sections = __state.linked_page_partial_etymology_sections,
text_stop_lang_missing = text_stop_lang_missing,
})
M.tracking.track_keywords(__state.toplevel_keyword_stats, lang)
M.tracking.track_page_id(lang, id)
M.tracking.track_ids(__state.id_stats, lang)
end
if #categories > 0 then
table.insert(output, M.categories.format(categories, lang))
end
if __state.warnings then
for i, warning in ipairs(__state.warnings) do
table.insert(output, (i == 1 and "\n" or "") .. warning .. "\n")
end
end
return table.concat(output)
end
return export
bbnxhy9wlfwad1q8o7d3a58o7n3gta0
6533208
6532082
2026-09-19T10:37:02Z
Wikihez
7344
Accept <c:> and <z:> for gender, the names ku's own templates use, as aliases of <g:>
6533208
Scribunto
text/plain
--[=[
This module implements the {{etymon}} template for structured etymology data on Wiktionary.
It enables the creation of etymology trees and text by parsing etymon chains,
scraping linked pages for their own {{etymon}} data, and recursively building a tree
of derivational relationships.
Authors:
- Original implementation: [[User:Ioaxxere]]
- Full refactor (September 2025): [[User:Fenakhay]] ([[Special:Diff/86717746]])
Modules:
- [[Module:etymon]]: main module handling parsing, validation, tree building, and page scraping
- [[Module:etymon/data]]: keyword definitions, configuration, and status constants
- [[Module:etymon/tree]]: etymology tree rendering
- [[Module:etymon/text]]: etymology text generation
- [[Module:etymon/categories]]: category generation logic
- [[Module:etymon/tracking]]: tracking
]=]
local export = {}
local __state = {
cached_etymon_args = {},
cached_etymon_pages = {},
cached_descendants_checks = {},
senseid_parent_etymon = {},
available_etymon_ids = {},
single_etymons = {},
entry_title = nil,
entry_lang_code = nil,
current_page_has_inline_etymology = false,
current_page_has_redundant_etymology = false,
used_idless_etymon = false,
toplevel_has_inline_etymology = false,
toplevel_redundant_etymology = false,
toplevel_idless_etymon = false,
has_mismatched_id = false,
linked_page_multiple_etymons_idless = false,
linked_page_partial_etymology_sections = false,
partial_etymology_targets = {},
skip_partial_etymology_category = false,
max_depth_reached = 0,
total_nodes = 0,
language_count = {},
toplevel_keyword_stats = {},
id_stats = nil,
warnings = {},
}
local function reset_invocation_state()
__state.current_page_has_inline_etymology = false
__state.current_page_has_redundant_etymology = false
__state.used_idless_etymon = false
__state.toplevel_has_inline_etymology = false
__state.toplevel_redundant_etymology = false
__state.toplevel_idless_etymon = false
__state.has_mismatched_id = false
__state.linked_page_multiple_etymons_idless = false
__state.linked_page_partial_etymology_sections = false
__state.max_depth_reached = 0
__state.total_nodes = 0
__state.language_count = {}
__state.toplevel_keyword_stats = {}
__state.warnings = {}
end
local M = require("Module:module loader").init({
require = {
data = "Module:etymon/data",
tree = "Module:etymon/tree",
text = "Module:etymon/text",
categories = "Module:etymon/categories",
tracking = "Module:etymon/tracking",
descendants = "Module:etymon/descendants",
anchors = "Module:anchors",
etydate = "Module:etydate",
etymology = "Module:etymology",
families = "Module:families",
languages = "Module:languages",
languages_errorgetby = "Module:languages/errorGetBy",
links = "Module:links",
pages = "Module:pages",
parameters = "Module:parameters",
string_utilities = "Module:string utilities",
template_parser = "Module:template parser",
utilities = "Module:utilities",
debug = "Module:debug",
en_utilities = "Module:en-utilities",
parse_utilities = "Module:parse utilities",
references = "Module:references",
template_styles = "Module:TemplateStyles",
script_utilities = "Module:script utilities",
JSON = "Module:JSON",
yesno = "Module:yesno",
},
loadData = {
headword_data = "Module:headword/data",
parameters_data = "Module:parameters/data",
text_allowed = "Module:etymon/data/text_allowed",
},
})
-- Template names that carry etymon data, and the heading that opens an etymology section.
-- Pages are scraped for these, so both must match what ku.wiktionary actually uses:
-- the section is "Etîmolojî", and the new template is "etîmon".
-- Only the new template: pages still using Şablon:etymon carry the old ">"-separated syntax, which
-- this module would misparse into garbage node labels. Add "etymon" here only once
-- Şablon:etymon itself invokes this module.
local ETYMON_TEMPLATES = {
["etîmon"] = true,
["etymon/nû"] = true, -- redirect to Şablon:etîmon; still recognised if written out
-- Do NOT add "etymon" here while Şablon:etymon still uses the old ">"-separated syntax:
-- this module would read those calls and parse the bare keyword ("inh") as a term.
}
local ETYMOLOGY_HEADING = "^Etîmolojî"
-- ku's reconstruction namespace is "Jinûvesazî" (id 108), where en.wiktionary uses
-- "Reconstruction" (id 118). A page here is a reconstructed term, so its title needs the
-- leading "*" that Modul:links requires for reconstructed languages.
local RECONSTRUCTION_NS_NAME = "Jinûvesazî"
local RECONSTRUCTION_NS_ID = 108
local Util = {}
function Util.format_error(message, preview_only)
if preview_only and not M.pages.is_preview() then
return nil
end
return '<span class="error">' .. message .. '</span>'
end
function Util.add_warning(message, preview_only)
local formatted = Util.format_error(message, preview_only)
if formatted then
table.insert(__state.warnings, formatted)
end
end
function Util.is_text_param_allowed_for_lang(lang)
if not lang or type(lang) ~= "table" then
return false
end
local types = lang.getTypes and lang:getTypes()
if types and types.family then
local code = lang.getCode and lang:getCode()
return code and M.text_allowed.families[code] == true
end
local full_code = lang.getFullCode and lang:getFullCode()
if full_code and M.text_allowed.langs[full_code] then
return true
end
if lang.inFamily then
for family_code in pairs(M.text_allowed.families) do
if lang:inFamily(family_code) then
return true
end
end
end
return false
end
function Util.get_lang(code, no_error)
if no_error then
return M.languages.getByCode(code, nil, true)
end
return M.languages.getByCode(code, nil, true) or M.languages_errorgetby.code(code, true, true)
end
-- Match a term language against a text=:lang stop target (supports etymology-only codes).
function Util.lang_matches_stop_code(term_lang, stop_code)
if not term_lang or not stop_code or stop_code == "" then
return false
end
local stop_lang = Util.get_lang(stop_code, true)
if not stop_lang then
return false
end
if term_lang:getCode() == stop_lang:getCode() then
return true
end
if stop_lang:getFullCode() == stop_lang:getCode() then
return term_lang:getFullCode() == stop_lang:getCode()
end
return false
end
function Util.get_family(code)
return M.families.getByCode(code)
end
function Util.get_lang_exception(lang)
-- Families have no language-specific exceptions
if lang.getTypes and lang:getTypes().family then
return nil
end
local code = lang:getCode()
local lang_exceptions = M.data.config.lang_exceptions
if lang_exceptions[code] then
return lang_exceptions[code]
end
for norm_code, exc in pairs(lang_exceptions) do
if exc.normalize_to and code == exc.normalize_to then
return exc
end
if exc.normalize_from_families then
local should_normalize = false
for _, family in ipairs(exc.normalize_from_families) do
if lang:inFamily(family) then
should_normalize = true
break
end
end
if should_normalize and exc.normalize_exclude_families then
for _, family in ipairs(exc.normalize_exclude_families) do
if lang:inFamily(family) then
should_normalize = false
break
end
end
end
if should_normalize then
local ret = {}
for k, v in pairs(exc) do
ret[k] = v
end
ret.suppress_tr = nil
return ret
end
end
end
return nil
end
function Util.get_norm_lang(lang)
local exc = Util.get_lang_exception(lang)
if exc and exc.normalize_to then
return M.languages.getByCode(exc.normalize_to)
end
return lang
end
function Util.resolve_context_lang(lang, node_args)
if type(node_args) ~= "table" then return lang end
if node_args.status == M.data.STATUS.INLINE then return lang end
if not (lang.hasType and lang:hasType("etymology-only")) then return lang end
local full = lang.getFull and lang:getFull()
if not full or full:getCode() == lang:getCode() then return lang end
if full.hasAncestor and full:hasAncestor(lang) then return lang end
return full
end
-- Add default values for boolean modifiers (e.g., <unc> becomes <unc:1>)
-- This is needed because Module:parse utilities expects boolean modifiers to have explicit values
function Util.add_boolean_defaults(str, param_mods)
local result = str
for name, spec in pairs(param_mods) do
if spec.type == "boolean" then
-- Replace <name> with <name:1> (but not <name:...> which already has a value)
result = result:gsub("<" .. name .. ">", "<" .. name .. ":1>")
end
end
return result
end
local REQUEST_TEMPLATE_PARAM_MODS = {
rfe = {
nocat = { type = "boolean" },
sort = {},
y = {},
m = {},
fragment = {},
section = {},
box = { type = "boolean" },
noes = { type = "boolean" },
},
etystub = {
nocat = { type = "boolean" },
sort = {},
nocap = { type = "boolean" },
nodot = { type = "boolean" },
},
}
function Util.expand_request_template(frame, template_name, param_value, lang_code)
local param_mods = REQUEST_TEMPLATE_PARAM_MODS[template_name]
local with_defaults = Util.add_boolean_defaults(param_value, param_mods)
local parsed = M.parse_utilities.parse_inline_modifiers(with_defaults, {
param_mods = param_mods,
generate_obj = function(text)
if M.yesno(text, false) then
return { is_boolean = true }
end
return { text = text }
end,
})
local template_args = { [1] = lang_code }
for name in pairs(param_mods) do
template_args[name] = parsed[name]
end
if not parsed.is_boolean then
template_args[2] = parsed.text
end
return " " .. frame:expandTemplate({
title = template_name,
args = template_args,
})
end
-- Kurdish values accepted for |pos= (|crz=) and <postype:>, mapped to the English values the rest of
-- the module compares against.
local POS_ALIASES = {
["reh"] = "root",
["kelîme"] = "word",
["pêşgir"] = "prefix",
["paşgir"] = "suffix",
["navgir"] = "interfix",
}
function Util.normalize_pos(value)
if type(value) ~= "string" then
return value
end
value = mw.text.trim(value)
return POS_ALIASES[value] or value
end
-- {{etîmon}} arguments read straight from another page skip Module:parameters, so `crz` (the Kurdish
-- name of `pos`) and the Kurdish values are resolved here.
function Util.normalize_raw_etymon_args(args)
if args.pos == nil and args.crz ~= nil then
args.pos = args.crz
end
args.pos = Util.normalize_pos(args.pos)
return args
end
-- Centralized term formatting: handles suppress_term (-), unknown_term (empty/+), and regular terms
function Util.format_term(term, is_toplevel, opts)
opts = opts or {}
-- suppress_term (-) returns nil
if term.suppress_term then
return nil
end
local lang = term.lang
local exc = Util.get_lang_exception(lang)
if is_toplevel then
local display_text = term.alt or term.title or ""
local sc = term.sc or lang:findBestScript(display_text)
local bold_text = tostring(mw.html.create("strong")
:addClass("selflink")
:wikitext(display_text))
return M.script_utilities.tag_text(bold_text, lang, sc, "term")
end
local link_params = { lang = lang }
link_params.term = not term.unknown_term and term.title or nil
link_params.alt = term.alt
link_params.id = (not term.unknown_term and term.id and term.id ~= "") and term.id or nil
if not (exc and exc.suppress_tr) then
link_params.tr = term.tr
link_params.ts = term.ts
else
link_params.suppress_tr = true
end
link_params.lit = (opts.lit ~= "suppress") and term.lit or nil
-- An explicit <t:...> wins; otherwise fall back to the etymon id, which on ku is usually a
-- Kurdish gloss in its own right ("berik", "hêştir"). An id that is a key rather than a
-- translation ("H2O", "paşgira meslekî") can be overridden with a <t:...>.
local t = (term.t and term.t ~= "") and term.t or nil
local id_gloss = (term.id and term.id ~= "") and term.id or nil
local gloss = t or id_gloss
-- gloss = "separate" leaves the gloss out of the link and returns it as a second value, so
-- the tree can put it on its own line.
if opts.gloss ~= "suppress" and opts.gloss ~= "separate" then
link_params.gloss = gloss
end
if term.g and term.g ~= "" then
local genders = M.string_utilities.split(term.g, ",")
for i = 1, #genders do
genders[i] = M.string_utilities.trim(genders[i])
end
link_params.genders = genders
end
if opts.pos ~= "suppress" then
link_params.pos = term.pos
link_params.ng = term.ng
end
if exc and exc.suppress_tr then
link_params.lit = nil
end
local show_qualifiers
if opts.tree_ql ~= "suppress" then
if term.q then
link_params.q = term.q
end
if term.qq then
link_params.qq = term.qq
end
if term.l then
link_params.l = term.l
end
if term.ll then
link_params.ll = term.ll
end
show_qualifiers = term.q or term.qq or term.l or term.ll
end
local link = M.links.full_link(link_params, "term", nil, show_qualifiers and true or nil)
if opts.gloss == "separate" then
return link, gloss
end
return link
end
local __is_content_page_cached
function Util.is_content_page()
if __is_content_page_cached == nil then
__is_content_page_cached = M.pages.is_content_page(mw.title.getCurrentTitle())
end
return __is_content_page_cached
end
local __page_data_cached
function Util.get_page_data()
if not __page_data_cached then
__page_data_cached = M.headword_data.page
end
return __page_data_cached
end
-- Extract base keyword from param (without modifiers)
local function get_keyword_base(param)
if type(param) ~= "string" then return nil end
local base = param:match("^:?([^<]+)") or param:gsub("^:", "")
return base
end
local function is_keyword(param, allow_colon_less)
if type(param) ~= "string" then return false end
local keywords = M.data.keywords
if param:sub(1, 1) == ":" then
local base = get_keyword_base(param)
return keywords[base] ~= nil
end
if allow_colon_less then
local base = get_keyword_base(param)
return keywords[base] ~= nil
end
return false
end
local function get_keyword(param, allow_colon_less)
if type(param) ~= "string" then return nil end
local keywords = M.data.keywords
if param:sub(1, 1) == ":" then
return get_keyword_base(param)
end
if allow_colon_less then
local base = get_keyword_base(param)
if keywords[base] then
return base
end
end
return nil
end
local function normalize_keyword(keyword)
if keyword:sub(1, 1) == ":" then
return keyword
end
return ":" .. keyword
end
-- Resolve keyword (possibly an alias) to its canonical form. Used only at input boundaries
local function get_canonical_keyword(keyword)
if not keyword then return keyword end
return M.data.keyword_canonical[keyword] or keyword
end
local function is_affix_group_keyword(keyword)
local config = keyword and M.data.keywords[keyword]
return config and config.affix_categories or false
end
local function reject_removed_surf_keyword(param)
local base = get_keyword_base(param)
if base == "surf" then
error("The `:surf` keyword has been removed. Use `<surf>` on a formation keyword instead (e.g. `:af<surf>`, `:bor<surf>`).")
end
end
local function copy_keyword_info(source)
local copy = {}
for k, v in pairs(source) do
copy[k] = v
end
return copy
end
local function lowercase_glossary_display(text)
return text:gsub("(%[%[Nimînok:Ferhengok#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest)
return prefix .. mw.ustring.lower(first) .. rest .. "]]"
end)
end
local function surf_should_keep_formation_phrase(base)
if not base.phrase then
return false
end
if base.glossary then
return true
end
return not (base.phrase == "from" and (base.text == "From" or base.text == "from"))
end
-- Runtime overrides when <surf> is present on a keyword.
local function get_effective_keyword_info(keyword, modifiers)
local base = M.data.keywords[keyword]
if not base or not modifiers or not modifiers.surf then
return base
end
local effective = copy_keyword_info(base)
local surf_text = "By [[Nimînok:Ferhengok#surface_analysis|surface analysis]],"
local surf_phrase = "by surface analysis,"
effective.new_sentence = true
effective.invisible = "tree"
if surf_should_keep_formation_phrase(base) then
effective.phrase = surf_phrase .. " " .. base.phrase
if base.text then
effective.text = surf_text .. " " .. lowercase_glossary_display(base.text)
else
effective.text = surf_text .. " " .. base.phrase
end
else
effective.text = surf_text
effective.phrase = surf_phrase
end
return effective
end
-- Build text/phrase for nominalization with <g:code> (uses data module for codes only).
local function get_nominalization_label_for_g(code)
if not code or code == "" then return nil end
local codes = M.data.nominalization_g_codes
local adj = codes[code]
if not adj and code:find("-", 1, true) then
-- ku combines a gender with a number by hyphenating them ("m-p"), where en.wikt runs the
-- letters together ("mp"); build the label from the parts. Splitting two-letter codes the
-- en.wikt way would mislabel ku codes that are not combinations at all, such as "np"
-- (nepersonel).
local parts, all_known = {}, true
for part in code:gmatch("[^-]+") do
local part_adj = codes[part]
if part_adj then
table.insert(parts, part_adj)
else
all_known = false
end
end
if all_known and parts[1] then
adj = table.concat(parts, " ")
end
end
if not adj then return nil end
local text = adj:gsub("^%l", function(c) return string.upper(c) end) .. " [[Nimînok:Ferhengok#nominalization|nominalization]] of"
local phrase = M.en_utilities.add_indefinite_article(adj .. " [[Nimînok:Ferhengok#nominalization|nominalization]] of", false)
return { text = text, phrase = phrase }
end
local EtymonParser = {}
-- Keyword modifier definitions
EtymonParser.keyword_param_mods = {
unc = { type = "boolean" },
ref = {},
text = { restrict = { keywords = { "from", "derived" } } },
lit = { restrict = { affix_group = true } },
conj = {}, -- conjunction for alternatives: "and", "or", "and/or", etc.
g = { restrict = { keywords = { "nominalization" } } },
surf = { type = "boolean" },
senseid = { restrict = { keywords = { "semantic loan" } } },
-- Kurdish names, resolved by resolve_modifier_aliases() below.
maneid = { alias_of = "senseid", restrict = { keywords = { "semantic loan" } } },
grdk = { alias_of = "conj" },
c = { alias_of = "g", restrict = { keywords = { "nominalization" } } },
z = { alias_of = "g", restrict = { keywords = { "nominalization" } } },
anlz = { type = "boolean", alias_of = "surf" },
metn = { alias_of = "text", restrict = { keywords = { "from", "derived" } } },
}
-- Term modifier definitions
EtymonParser.etymon_param_mods = {
id = {},
t = {},
tr = {},
ts = {},
q = {},
qq = {},
l = {},
ll = {},
pos = {},
ng = {},
alt = {},
g = {},
ety = {},
lit = {},
unc = { type = "boolean" },
ref = {},
aftype = { restrict = { affix_group = true } },
postype = {},
bor = { type = "boolean", restrict = { affix_group = true } },
slbor = { type = "boolean", restrict = { affix_group = true } },
lbor = { type = "boolean", restrict = { affix_group = true } },
-- Kurdish names for the same modifiers, resolved by resolve_modifier_aliases() below.
-- cuda/t/w/crz are the names ku's own templates already accept; the affix-group
-- borrowing flags reuse the Kurdish keyword names.
cuda = { alias_of = "alt" },
-- Gender is "c" (cinsiyet) in ku's own templates, "z" (zayend) in the headword ones.
c = { alias_of = "g" },
z = { alias_of = "g" },
-- ASCII only: Modul:parse utilities matches a modifier prefix with "^([a-zA-Z0-9+_-]+):",
-- so a name containing "î" can never be recognised as a prefix.
etimon = { alias_of = "ety" },
w = { alias_of = "t" },
crz = { alias_of = "pos" },
crztip = { alias_of = "postype" },
hrf = { alias_of = "lit" },
nediyar = { type = "boolean", alias_of = "unc" },
deyn = { type = "boolean", alias_of = "bor", restrict = { affix_group = true } },
deynh = { type = "boolean", alias_of = "lbor", restrict = { affix_group = true } },
deynhq = { type = "boolean", alias_of = "slbor", restrict = { affix_group = true } },
}
--[==[
Move any Kurdish modifier onto the canonical name it aliases, so the rest of the module only ever
sees the canonical set. Called right after the inline modifiers are parsed.
]==]
function EtymonParser.resolve_modifier_aliases(obj, param_mods)
for name, def in pairs(param_mods) do
if def.alias_of and obj[name] ~= nil then
if obj[def.alias_of] ~= nil then
error("`<" .. name .. ":>` and `<" .. def.alias_of .. ":>` are the same modifier; use one.")
end
obj[def.alias_of] = obj[name]
obj[name] = nil
end
end
return obj
end
local function get_clean_param_mods(param_mods)
local clean = {}
for mod_name, mod_def in pairs(param_mods) do
clean[mod_name] = {}
for key, value in pairs(mod_def) do
if key ~= "restrict" and key ~= "alias_of" then
clean[mod_name][key] = value
end
end
end
return clean
end
function EtymonParser.check_modifier_restrictions(modifiers, current_keyword, param_mods)
for mod_name, mod_value in pairs(modifiers) do
-- Only check restrictions if the modifier has a non-false/nil value
if mod_value then
local mod_def = param_mods[mod_name]
if mod_def and mod_def.restrict then
if mod_def.restrict.affix_group then
if not is_affix_group_keyword(current_keyword) then
local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">"
error("The modifier `" .. mod_display .. "` is only allowed for affix-group keywords (e.g. `:af`, `:blend`, `:univ`).")
end
elseif mod_def.restrict.keywords then
local allowed_keywords = mod_def.restrict.keywords
local is_allowed = false
for _, allowed_keyword in ipairs(allowed_keywords) do
if current_keyword == allowed_keyword then
is_allowed = true
break
end
end
if not is_allowed then
local keyword_list = {}
for _, kw in ipairs(allowed_keywords) do
table.insert(keyword_list, ":" .. kw)
end
local keyword_str = table.concat(keyword_list, #keyword_list == 2 and " or " or ", ")
if #keyword_list > 2 then
-- Replace last comma with "or"
keyword_str = keyword_str:gsub(", ([^,]+)$", " or %1")
end
local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">"
error("The modifier `" .. mod_display .. "` is only allowed for the keyword" .. (#keyword_list > 1 and "s " or " ") .. keyword_str .. ".")
end
end
end
end
end
end
local TERM_RULE_DISALLOW = {
suppress = { field = "suppress_term", label = "suppressed" },
unknown = { field = "unknown_term", label = "unknown" },
family = { field = "is_family", label = "family" },
}
function EtymonParser.check_etymon_limits(count, limits, label, opts)
if not limits then
return
end
opts = opts or {}
local min_etymons = limits.min_etymons
if min_etymons == nil and not opts.skip_default_min then
min_etymons = 1
end
if min_etymons and count < min_etymons then
if min_etymons > 1 then
error("Detected " .. label .. " group with fewer than " .. min_etymons .. " etymons.")
else
error("Detected " .. label .. " with no etymons.")
end
end
if limits.max_etymons and count > limits.max_etymons then
local unit = (limits.max_etymons == 1) and "etymon" or "etymons"
error("Detected " .. label .. " with more than " .. limits.max_etymons .. " " .. unit .. ".")
end
end
function EtymonParser.check_term_rules(etymon_data, entry_lang, rules, label)
label = label or "term"
if rules and rules.disallow then
local disallowed = {}
for _, typ in ipairs(rules.disallow) do
local spec = TERM_RULE_DISALLOW[typ]
if spec and etymon_data[spec.field] then
table.insert(disallowed, spec.label)
end
end
if #disallowed > 0 then
error(label .. " does not support " ..
mw.text.listToText(disallowed, "or") .. " etymons.")
end
end
if etymon_data.is_family then
if rules and rules.family == "disallowed" then
error(label .. " does not support family codes" .. (rules.family_suffix or "."))
elseif not etymon_data.suppress_term then
error("Family codes require suppressed term (use family:-).")
end
end
if rules then
if rules.require_term and (not etymon_data.term or etymon_data.term == "") then
error(label .. " requires a term for each listed form.")
end
if rules.entry_lang then
if Util.get_norm_lang(etymon_data.lang):getFullCode() ~=
Util.get_norm_lang(entry_lang):getFullCode() then
error(label .. " terms must be in the entry language (" ..
entry_lang:getFullCode() .. "), got '" .. etymon_data.lang:getFullCode() .. "'.")
end
end
if rules.ancestor_check then
M.etymology.check_ancestor(entry_lang, etymon_data.lang)
end
elseif etymon_data.is_family and not etymon_data.suppress_term then
error("Family codes require suppressed term (use family:-).")
end
end
function EtymonParser.check_keyword_term(etymon_data, entry_lang, keyword)
local config = M.data.keywords[keyword]
EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "`:" .. keyword .. "`")
end
function EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type)
local config = M.data.supplements[supplement_type]
EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "|" .. supplement_type .. "=")
end
-- Parse keyword with modifiers (e.g., ":bor<unc>" or ":bor<ref:{{R:example}}>")
function EtymonParser.parse_keyword_modifiers(param)
if type(param) ~= "string" then return nil, {} end
local base_keyword = get_keyword_base(param)
if not base_keyword then return nil, {} end
local canonical_keyword = get_canonical_keyword(base_keyword)
-- Check if there are any modifiers
if not param:find("<", 1, true) then
return canonical_keyword, {}
end
-- Parse modifiers using the same mechanism as etymon parsing
local rest_with_defaults = Util.add_boolean_defaults(param, EtymonParser.keyword_param_mods)
local function generate_obj(ignored)
return {}
end
local parsed = M.parse_utilities.parse_inline_modifiers(rest_with_defaults:gsub("^:?[^<]+", ""),
{ param_mods = get_clean_param_mods(EtymonParser.keyword_param_mods), generate_obj = generate_obj })
EtymonParser.resolve_modifier_aliases(parsed, EtymonParser.keyword_param_mods)
local modifiers = {
unc = parsed.unc or false,
ref = parsed.ref,
text = parsed.text,
lit = parsed.lit,
conj = parsed.conj,
g = parsed.g,
surf = parsed.surf or false,
senseid = parsed.senseid,
}
-- Validate modifiers against restrictions
EtymonParser.check_modifier_restrictions(modifiers, canonical_keyword, EtymonParser.keyword_param_mods)
return canonical_keyword, modifiers
end
local function normalize_keyword_param(keyword_with_mods)
local trimmed = M.string_utilities.trim(keyword_with_mods)
reject_removed_surf_keyword(trimmed:match("^:") and trimmed or (":" .. trimmed))
local base = get_keyword_base(trimmed)
if not base or not M.data.keywords[base] then
error("Invalid keyword '" .. trimmed .. "' in inline etymology")
end
local canonical_base = get_canonical_keyword(base)
local without_colon = trimmed:gsub("^:", "")
local mods_part = without_colon:sub(#base + 1)
local kw_param = normalize_keyword(canonical_base .. mods_part)
EtymonParser.parse_keyword_modifiers(kw_param)
return kw_param
end
local function get_keyword_mod_names()
local names = {}
for mod_name in pairs(EtymonParser.keyword_param_mods) do
names[mod_name] = true
end
return names
end
local function parse_inline_ety_run(ety_string)
local body = ety_string or ""
if body == "" then
error("Empty inline etymology")
end
local keyword_mod_names = get_keyword_mod_names()
local pos = 1
local len = #body
local function parse_err(msg)
error(msg .. " in inline etymology: '" .. body .. "'")
end
local function peek_double()
return body:sub(pos, pos + 1) == "<<"
end
local function mod_name_from_unwrapped(unwrapped)
return unwrapped:match("^<([^:>]+)")
end
local function is_keyword_mod(unwrapped)
local name = mod_name_from_unwrapped(unwrapped)
return name and keyword_mod_names[name] or false
end
local function read_double_bracket()
if not peek_double() then
return nil
end
local start = pos
pos = pos + 2
while pos <= len - 1 do
if body:sub(pos, pos + 1) == ">>" then
local token = body:sub(start, pos + 1)
pos = pos + 2
return token, token:sub(2, -2)
end
pos = pos + 1
end
parse_err("Unmatched <<")
end
local function read_angle_cell()
if body:sub(pos, pos) ~= "<" or peek_double() then
return nil
end
local open = pos
pos = pos + 1
local depth = 1
local i = pos
while i <= len do
local ch = body:sub(i, i)
if ch == "<" then
depth = depth + 1
elseif ch == ">" then
depth = depth - 1
if depth == 0 then
local inner = body:sub(open + 1, i - 1)
pos = i + 1
return inner
end
end
i = i + 1
end
parse_err("Unmatched <")
end
local function read_bare_run()
local start = pos
while pos <= len and body:sub(pos, pos) ~= "<" do
pos = pos + 1
end
return body:sub(start, pos - 1)
end
local function absorb_double_keyword_mods(keyword_str)
while peek_double() do
local saved = pos
local _, unwrapped = read_double_bracket()
if is_keyword_mod(unwrapped) then
keyword_str = keyword_str .. unwrapped
else
pos = saved
break
end
end
return keyword_str
end
local kw_start = pos
while pos <= len and body:sub(pos, pos) ~= "<" do
pos = pos + 1
end
local keyword = body:sub(kw_start, pos - 1)
if keyword:match("^%s*$") then
parse_err("Missing keyword")
end
keyword = absorb_double_keyword_mods(keyword)
local cells = {}
while pos <= len do
if peek_double() then
local _, unwrapped = read_double_bracket()
if is_keyword_mod(unwrapped) then
parse_err("Unexpected keyword modifier " .. unwrapped .. " outside of a keyword")
end
table.insert(cells, "+" .. unwrapped)
elseif body:sub(pos, pos) == "<" then
local inner = read_angle_cell()
if inner ~= "" then
table.insert(cells, inner)
end
else
local bare = read_bare_run()
if bare ~= "" then
if bare:sub(1, 1) ~= ":" then
parse_err("Unexpected bare text '" .. bare .. "' (use :keyword for nested keywords in inline etymology)")
end
if not is_keyword(bare, true) then
parse_err("Invalid keyword '" .. bare .. "' in inline etymology")
end
table.insert(cells, absorb_double_keyword_mods(bare))
end
end
end
return {
keyword = keyword,
cells = cells,
}
end
function EtymonParser.inline_ety_to_pipe(ety_string)
local run = parse_inline_ety_run(ety_string)
if not run.keyword or run.keyword:match("^%s*$") then
return "|"
end
local pipe_parts = { normalize_keyword_param(M.string_utilities.trim(run.keyword)) }
for _, segment in ipairs(run.cells) do
if is_keyword(segment, true) then
table.insert(pipe_parts, normalize_keyword_param(segment))
else
table.insert(pipe_parts, segment)
end
end
return "|" .. table.concat(pipe_parts, "|") .. "|"
end
function EtymonParser.pipe_to_inline_ety(pipe_string)
local cells = {}
for cell in pipe_string:gmatch("([^|]+)") do
if cell ~= "" then
table.insert(cells, cell)
end
end
if #cells == 0 then
return ""
end
local inline_parts = {}
for index, cell in ipairs(cells) do
local base = get_keyword_base(cell)
if base and M.data.keywords[base] then
local without_colon = cell:gsub("^:", "")
local kw_base, mods = without_colon:match("^([^<]+)(.*)$")
local inline_kw = (kw_base or without_colon) .. (mods or ""):gsub("<([^>]+)>", "<<%1>>")
if index > 1 then
inline_kw = ":" .. inline_kw
end
table.insert(inline_parts, inline_kw)
elseif cell:sub(1, 1) == "+" then
local mod = cell:sub(2)
if mod:match("^<.->$") then
mod = mod:sub(2, -2)
end
table.insert(inline_parts, "<<" .. mod .. ">>")
else
table.insert(inline_parts, "<" .. cell .. ">")
end
end
return table.concat(inline_parts, "")
end
function EtymonParser.parse_inline_ety(ety_string, context_lang)
local run = parse_inline_ety_run(ety_string)
local keyword = M.string_utilities.trim(run.keyword)
reject_removed_surf_keyword(":" .. keyword)
if not is_keyword(keyword, true) then
error("Invalid keyword '" .. keyword .. "' in inline etymology <ety:" .. keyword .. "...>")
end
local args = { context_lang:getCode(), normalize_keyword_param(keyword) }
for _, segment in ipairs(run.cells) do
if is_keyword(segment, true) then
table.insert(args, normalize_keyword_param(segment))
else
table.insert(args, segment)
end
end
return args
end
function EtymonParser.parse_etymon(param, context_lang)
if is_keyword(param) then
return nil
end
if type(param) ~= "string" then
return nil
end
local lang, rest
local is_family = false
local before_bracket = param:match("^([^<]*)") or param
local lang_code, rest_match = before_bracket:match("^([a-zA-Z][a-zA-Z0-9._-]*):(.*)$")
if lang_code then
local potential_lang = Util.get_lang(lang_code, true)
if potential_lang then
lang = potential_lang
rest = param:sub(#lang_code + 2)
else
local potential_family = Util.get_family(lang_code)
if potential_family then
lang = potential_family
rest = param:sub(#lang_code + 2)
is_family = true
else
lang = context_lang
rest = param
end
end
else
lang = context_lang
rest = param
end
M.tracking.track_term(rest)
if rest == "" or rest == "+" then
return {
lang = lang,
term = nil,
unknown_term = true,
is_family = is_family,
}
end
if rest == "-" then
return {
lang = lang,
term = nil,
suppress_term = true,
is_family = is_family,
}
end
if not rest:find("<", 1, true) then
return {
lang = lang,
term = M.string_utilities.trim(rest),
is_family = is_family,
}
end
local term_text = rest:match("^([^<]*)") or ""
local is_unknown = (term_text == "" or term_text == "+")
local is_suppress = (term_text == "-")
local function generate_obj(ignored_term)
return { term = (is_unknown or is_suppress) and nil or M.string_utilities.trim(term_text) }
end
local rest_with_defaults = Util.add_boolean_defaults(rest, EtymonParser.etymon_param_mods)
local parsed_obj = M.parse_utilities.parse_inline_modifiers(rest_with_defaults,
{ param_mods = get_clean_param_mods(EtymonParser.etymon_param_mods), generate_obj = generate_obj })
EtymonParser.resolve_modifier_aliases(parsed_obj, EtymonParser.etymon_param_mods)
parsed_obj.postype = Util.normalize_pos(parsed_obj.postype)
if parsed_obj.id and parsed_obj.id:match("^!") then
parsed_obj.id = parsed_obj.id:sub(2)
parsed_obj.override = true
end
parsed_obj.lang = lang
parsed_obj.is_family = is_family
if is_unknown then
parsed_obj.unknown_term = true
elseif is_suppress then
parsed_obj.suppress_term = true
end
return parsed_obj
end
function EtymonParser.validate(lang, args, id, title, pos, starts_with_lang_code)
-- id is now optional, so only validate if provided
if id then
if mw.ustring.len(id) < 2 then
error("The `id` parameter must have at least two characters.")
end
if id == title or id == Util.get_page_data().pagename then
error("The `id` parameter must not be the same as the page title.")
end
end
local valid_pos = { prefix = true, suffix = true, interfix = true, infix = true, root = true, word = true }
if pos and not valid_pos[pos] then
error("Unknown value provided for `pos`. Valid values: " .. table.concat(require("Module:table").keysToList(valid_pos), ", ")
.. " (Kurdish: " .. table.concat(require("Module:table").keysToList(POS_ALIASES), ", ") .. ").")
end
local current_keyword = "from"
local current_keyword_explicit = false
local keyword_etymons = {}
local keywords = M.data.keywords
local function checkKeyword()
local config = keywords[current_keyword]
if current_keyword == "from" and not current_keyword_explicit and #keyword_etymons == 0 then
keyword_etymons = {}
return
end
EtymonParser.check_etymon_limits(#keyword_etymons, config, "`:" .. current_keyword .. "`")
keyword_etymons = {}
end
local start_index = starts_with_lang_code and 2 or 1
for i = start_index, #args do
local param = args[i]
if type(param) ~= "string" then
elseif param:sub(1, 1) == ":" and not is_keyword(param) then
reject_removed_surf_keyword(param)
error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?")
elseif is_keyword(param) then
checkKeyword()
current_keyword = get_canonical_keyword(get_keyword(param))
current_keyword_explicit = true
else
local etymon_data = EtymonParser.parse_etymon(param, lang)
if etymon_data then
table.insert(keyword_etymons, param)
EtymonParser.check_keyword_term(etymon_data, lang, current_keyword)
-- Check modifier restrictions
EtymonParser.check_modifier_restrictions(etymon_data, current_keyword, EtymonParser.etymon_param_mods)
-- postype must be "root" or "word"
local VALID_POSTYPES = { root = true, word = true }
if etymon_data.postype and not VALID_POSTYPES[etymon_data.postype] then
error("Invalid <postype:" .. etymon_data.postype .. ">; must be \"root\" or \"word\" (Kurdish \"reh\" or \"kelîme\").")
end
if etymon_data.ety then
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
EtymonParser.validate(etymon_data.lang, inline_args, nil, nil, nil, true)
end
else
table.insert(keyword_etymons, param)
end
end
end
checkKeyword()
end
local DataRetriever = {}
local function format_etymon_id_hint(id_data, idx)
local id = type(id_data) == "table" and id_data.id or id_data
local pos = type(id_data) == "table" and id_data.pos
if id and id ~= "" and id ~= "*" then
return '"' .. id .. '"'
end
if pos and pos ~= "" then
return "unnamed (|pos=" .. pos .. "|)"
end
return "etymon #" .. idx .. " (no |id= on page)"
end
local function etymon_target_page_link(page, norm_lang)
-- `page` is an already-resolved page name ("Jinûvesazî:proto-îranî/hižwáH"), so link to it
-- directly. Passing it back through full_link() with a reconstructed language raises an error,
-- because the resolved name no longer carries the leading "*" those languages require -- and
-- this link is built even when the warning it belongs to is later discarded outside preview.
return "[[" .. page .. "]]"
end
-- Summarize {{etymon}} id slots on a linked page for preview warnings.
local function summarize_available_etymon_ids(ids)
local id_list = {}
local all_idless = true
local target_has_idless = false
local any_pos = false
for i, id_data in ipairs(ids) do
local id = type(id_data) == "table" and id_data.id or id_data
local pos = type(id_data) == "table" and id_data.pos
if id and id ~= "" and id ~= "*" then
all_idless = false
else
target_has_idless = true
end
if pos and pos ~= "" then
any_pos = true
end
table.insert(id_list, format_etymon_id_hint(id_data, i))
end
return {
id_list = id_list,
all_idless = all_idless,
target_has_idless = target_has_idless,
any_pos = any_pos,
count = #ids,
options_text = mw.text.listToText(id_list),
}
end
local function ambiguous_etymon_suggestion(page_link, summary)
if summary.all_idless then
if summary.any_pos then
return " None set `|id=` yet; add a unique `|id=` to each on " .. page_link
.. ", then `<id:identifier>` after the term here. Section order / hints: "
.. summary.options_text .. "."
end
return " None set `|id=` yet; add a unique `|id=` to each {{etymon}} in that section from top to bottom, then `<id:identifier>` after the term here (same value as `|id=`)."
end
return " Specify which one with `<id:identifier>` after the term. Options: " .. summary.options_text .. "."
end
local function warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel)
local page_link = etymon_target_page_link(page, norm_lang)
local summary = summarize_available_etymon_ids(ids)
if is_toplevel and summary.target_has_idless then
__state.linked_page_multiple_etymons_idless = true
end
local lang_name = norm_lang:getCanonicalName()
local lead = "Etymology link to " .. page_link .. " is ambiguous (" .. summary.count
.. " {{etymon}} templates for " .. lang_name .. ")."
Util.add_warning(lead .. ambiguous_etymon_suggestion(page_link, summary), true)
end
local function is_mismatched_explicit_id(base_key, cached_args, parent_etymon)
return cached_args == M.data.STATUS.MISSING and not parent_etymon
and #(__state.available_etymon_ids[base_key] or {}) > 0
end
local function maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel)
if not is_toplevel or __state.skip_partial_etymology_category then
return
end
if not __state.partial_etymology_targets[base_key] then
return
end
if etymon_data.id and type(cached_args) == "table" then
return
end
__state.linked_page_partial_etymology_sections = true
end
local function is_nonlemma_etymon_template(template_args)
return template_args and M.yesno(template_args.nl, false)
end
local function warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_id)
local page_link = etymon_target_page_link(page, norm_lang)
local summary = summarize_available_etymon_ids(__state.available_etymon_ids[base_key] or {})
local lang_name = norm_lang:getCanonicalName()
local lead = "Etymology link to " .. page_link .. " uses `<id:" .. etymon_id
.. ">`, but no {{etymon}} on that page has `|id=" .. etymon_id .. "|` for " .. lang_name .. "."
Util.add_warning(lead .. " Valid IDs: " .. summary.options_text .. ".", true)
end
-- Given an etymon data, scrape its page and cache the result in the global state object.
function DataRetriever.cache_page_etymons(etymon_page, etymon_title, key, etymon_lang, etymon_id, redirected_from, descendants_is_toplevel)
local content = etymon_title:getContent()
if not content then
__state.cached_etymon_args[key] = M.data.STATUS.REDLINK
return
end
-- Check if the linked page is a redirect. If it is, the template parsing
-- code below will be effectively skipped, and `scrape_page` will be called
-- again on the redirect target (see the bottom of this function)
local lang_section_for_descendants = nil
local redirect_target = etymon_title.redirect_target
if not redirect_target then
-- ku.wiktionary writes L2 headings as "== {{ziman|CODE}} ==" rather than the language
-- name, and this scrape runs on raw wikitext, so the template form has to be tried too.
content = M.pages.get_section(content, etymon_lang:getFullName(), 2)
or M.pages.get_section(content, "{{ziman|" .. etymon_lang:getFullCode() .. "}}", 2)
if not content then
__state.cached_etymon_args[key] = M.data.STATUS.MISSING
return
end
lang_section_for_descendants = content
end
local etymon_lang_code = etymon_lang:getFullCode()
local lang_page_key = etymon_lang_code .. ":" .. etymon_page
local found_templates_for_lang = {}
local found_ids = {}
local get_node_class = M.template_parser.class_else_type
-- Look for all {{etymon}} templates within the page content using the template parser
-- This way the same page is never parsed more than once
-- Build a map from senseids to their parent etymonids.
local active_etymon_args = nil
local etymology_section_count = 0
local etymology_sections_with_etymon = 0
local current_etymology_has_etymon = false
local current_etymology_has_nonlemma = false
local function finalize_current_etymology_section()
if etymology_section_count == 0 then
return
end
if current_etymology_has_etymon or current_etymology_has_nonlemma then
etymology_sections_with_etymon = etymology_sections_with_etymon + 1
end
current_etymology_has_etymon = false
current_etymology_has_nonlemma = false
end
for node in M.template_parser.parse(content):iterate_nodes() do
local node_class = get_node_class(node)
if node_class == "heading" then
-- A new L2 or etymology section acts as a barrier: an {{etymon}} usage
-- used previously cannot be the parent of any subsequent senseids.
-- Note that we don't have to check for L2s due to the usage of `M.pages.get_section` above.
if node:get_name():find(ETYMOLOGY_HEADING) then
finalize_current_etymology_section()
etymology_section_count = etymology_section_count + 1
active_etymon_args = nil
end
elseif node_class == "template" then
local template_name = node:get_name()
if ETYMON_TEMPLATES[template_name] then
local template_args = Util.normalize_raw_etymon_args(node:get_arguments())
-- Check if this etymon is for our language
if template_args[1] == etymon_lang_code then
if is_nonlemma_etymon_template(template_args) then
if etymology_section_count > 0 then
current_etymology_has_nonlemma = true
end
else
if etymology_section_count > 0 then
current_etymology_has_etymon = true
end
table.insert(found_templates_for_lang, template_args)
if template_args.id then
local etymon_key = lang_page_key .. ":" .. template_args.id
__state.cached_etymon_args[etymon_key] = template_args
__state.cached_etymon_pages[etymon_key] = tostring(etymon_page)
table.insert(found_ids, template_args.id)
active_etymon_args = template_args
else
-- Store idless etymon with default key
local etymon_key = lang_page_key .. ":*"
__state.cached_etymon_args[etymon_key] = template_args
__state.cached_etymon_pages[etymon_key] = tostring(etymon_page)
table.insert(found_ids, "*")
active_etymon_args = template_args
end
end
end
elseif active_etymon_args and template_name == "senseid" then
local template_args = node:get_arguments()
-- This should always be true for proper usages of {{senseid}}.
if template_args[1] == etymon_lang_code and template_args[2] then
local sense_id_key = lang_page_key .. ":" .. template_args[2]
__state.senseid_parent_etymon[sense_id_key] = active_etymon_args
__state.cached_etymon_pages[sense_id_key] = tostring(etymon_page)
end
end
end
end
finalize_current_etymology_section()
if lang_section_for_descendants
and etymology_section_count > 1
and etymology_sections_with_etymon > 0
and etymology_sections_with_etymon < etymology_section_count
then
__state.partial_etymology_targets[lang_page_key] = true
end
if descendants_is_toplevel and lang_section_for_descendants and #found_templates_for_lang > 0 then
M.descendants.cache_page_checks({
lang_section = lang_section_for_descendants,
etymon_lang_code = etymon_lang_code,
found_templates_for_lang = found_templates_for_lang,
entry_title = __state.entry_title,
entry_lang_code = __state.entry_lang_code,
entry_lang = __state.entry_lang_code and Util.get_lang(__state.entry_lang_code, true) or nil,
cached_descendants_checks = __state.cached_descendants_checks,
lang_page_key = lang_page_key,
redirected_from = redirected_from,
})
end
local id_data_list = {}
for _, args in ipairs(found_templates_for_lang) do
local id = args.id or "*"
table.insert(id_data_list, { id = id, pos = args.pos })
end
__state.available_etymon_ids[lang_page_key] = id_data_list
if #found_templates_for_lang == 1 then
__state.single_etymons[lang_page_key] = found_templates_for_lang[1]
end
if redirected_from and __state.available_etymon_ids[lang_page_key] then
__state.available_etymon_ids[redirected_from] = __state.available_etymon_ids[redirected_from] or {}
for _, id_data in ipairs(__state.available_etymon_ids[lang_page_key]) do
table.insert(__state.available_etymon_ids[redirected_from], id_data)
end
end
if __state.cached_etymon_args[key] ~= nil or __state.senseid_parent_etymon[key] ~= nil then
-- All done!
return
elseif redirect_target and not redirected_from then
-- Try scraping the redirect.
etymon_page = redirect_target.prefixedText
DataRetriever.cache_page_etymons(etymon_page, redirect_target, lang_page_key .. ":" .. etymon_id, etymon_lang, etymon_id, lang_page_key, descendants_is_toplevel)
__state.cached_etymon_args[key] = __state.cached_etymon_args[etymon_lang_code .. ":" .. etymon_page .. ":" .. etymon_id]
else
__state.cached_etymon_args[key] = M.data.STATUS.MISSING
end
end
local function has_linkable_term(etymon_data)
if etymon_data.is_family or etymon_data.suppress_term or etymon_data.unknown_term then
return false
end
local term = etymon_data.term
if term == nil or term == "" then
return false
end
return M.string_utilities.trim(term) ~= ""
end
local function record_term_id_tracking(etymon_data)
if not has_linkable_term(etymon_data) then
return
end
local term_page = M.links.get_link_page(etymon_data.term, etymon_data.lang)
M.tracking.record_term_id_usage(__state.id_stats, etymon_data, term_page)
end
-- Given an etymon object, scrape its page (if necessary) and return its own etymon arguments as well as the page name.
function DataRetriever.get_etymon_args(etymon_data, is_toplevel)
if not has_linkable_term(etymon_data) then
return M.data.STATUS.MISSING, nil, nil, nil
end
local page = M.links.get_link_page(etymon_data.term, etymon_data.lang)
local norm_lang = Util.get_norm_lang(etymon_data.lang)
local base_key = norm_lang:getFullCode() .. ":" .. page
if etymon_data.id then
local key = base_key .. ":" .. etymon_data.id
local cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key]
if cached_args == nil then
local title = mw.title.new(page)
if not title then error('Invalid page title "' .. page .. '" encountered.') end
DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, is_toplevel)
end
cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key] -- refresh
-- Get etymon_id from parent if this was resolved via senseid
local parent_etymon = __state.senseid_parent_etymon[key]
local resolved_etymon_id = parent_etymon and parent_etymon.id
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = {
explicit_id = etymon_data.id,
parent_etymon = parent_etymon,
},
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = {
explicit_id = etymon_data.id,
parent_etymon = parent_etymon,
},
})
end
end
local mismatched_id = is_mismatched_explicit_id(base_key, cached_args, parent_etymon)
if mismatched_id and is_toplevel then
__state.has_mismatched_id = true
M.tracking.record_mismatched_id_usage(__state.id_stats, norm_lang, page, etymon_data.id)
warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_data.id)
end
maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel)
return cached_args, __state.cached_etymon_pages[key], resolved_etymon_id, descendants_check
else
__state.used_idless_etymon = true
if is_toplevel then
__state.toplevel_idless_etymon = true
end
if __state.available_etymon_ids[base_key] == nil then
local title = mw.title.new(page)
if not title then error('Invalid page title "' .. page .. '" encountered.') end
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, is_toplevel)
end
local ids = __state.available_etymon_ids[base_key] or {}
local count = #ids
-- Try to filter by postype if available and we have multiple candidates
if count > 1 and etymon_data.postype then
local matching_ids = {}
for _, id_data in ipairs(ids) do
if id_data.pos == etymon_data.postype then
table.insert(matching_ids, id_data)
end
end
if #matching_ids == 1 then
local matched_id = matching_ids[1].id
local matched_key = base_key .. ":" .. matched_id
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "postype")
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = { id = matched_id },
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = { id = matched_id },
})
end
end
local matched_args = __state.cached_etymon_args[matched_key]
maybe_flag_partial_etymology_reference(base_key, etymon_data, matched_args, is_toplevel)
return matched_args, __state.cached_etymon_pages[matched_key], nil, descendants_check
end
end
if count == 1 then
local only_id_data = ids[1]
local only_id = (type(only_id_data) == "table" and only_id_data.id) or only_id_data or "*"
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "single")
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = { id_data = only_id_data },
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = { id_data = only_id_data },
})
end
end
local single_args = __state.single_etymons[base_key]
maybe_flag_partial_etymology_reference(base_key, etymon_data, single_args, is_toplevel)
return single_args, __state.cached_etymon_pages[base_key .. ":" .. only_id], nil, descendants_check
elseif count > 1 then
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "ambiguous")
warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel)
maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.AMBIGUOUS, is_toplevel)
return M.data.STATUS.AMBIGUOUS, nil, nil, nil
else
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "missing")
maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.MISSING, is_toplevel)
return M.data.STATUS.MISSING, nil, nil, nil
end
end
end
local function keyword_invisible_in_tree(keyword_info)
if not keyword_info then
return false
end
local inv = keyword_info.invisible
return inv == "all" or inv == true or inv == "tree"
end
-- True when the node has at least one top-level child container visible in the tree.
local function node_has_visible_tree_children(node)
for _, container in ipairs(node.children or {}) do
if not keyword_invisible_in_tree(container.keyword_info) then
return true
end
end
return false
end
-- Count visible term nodes in the tree.
local function get_visible_tree_depth(node, skip_child_rendering)
local max_depth = 1
if skip_child_rendering or not node then
return max_depth
end
for _, container in ipairs(node.children or {}) do
local keyword_info = container.keyword_info
if not keyword_invisible_in_tree(keyword_info) then
local skip_grandchildren = keyword_info and keyword_info.no_child_categories
for _, term in ipairs(container.terms or {}) do
if term.is_duplicate then
if term.original_has_children then
max_depth = math.max(max_depth, 2)
end
else
max_depth = math.max(max_depth, 1 + get_visible_tree_depth(term, skip_grandchildren))
end
end
end
end
return max_depth
end
local function as_param_list(val)
if val == nil then
return {}
end
if type(val) == "table" then
return val
end
if type(val) == "string" and val ~= "" then
return { val }
end
return {}
end
local TreeBuilder = {}
local function parse_etymon_references(refs_text)
if not refs_text or refs_text == "" then
return ""
end
return M.references.parse_references(refs_text)
end
local function parse_tree_references(node)
if node.ref then
node.parsed_ref = parse_etymon_references(node.ref)
end
if node.children then
for _, container in ipairs(node.children) do
if container.terms then
for _, term in ipairs(container.terms) do
parse_tree_references(term)
end
end
end
end
if node.supplements then
for _, supplement in ipairs(node.supplements) do
if supplement.terms then
for _, term in ipairs(supplement.terms) do
parse_tree_references(term)
end
end
end
end
end
-- Build a unique key for deduplication in the seen table
function TreeBuilder.build_key(lang, title, args)
local norm_lang_code = Util.get_norm_lang(lang):getFullCode()
local is_table = type(args) == "table"
local id = (is_table and args.id) or ""
if title then
return norm_lang_code .. ":" .. M.links.get_link_page(title, lang) .. ":" .. id
end
if is_table and args.status == M.data.STATUS.INLINE then
local content_parts = {}
for i = 1, #args do
content_parts[i] = tostring(args[i])
end
return norm_lang_code .. ":*:" .. id .. "\0" .. table.concat(content_parts, "\0")
end
return norm_lang_code .. ":*:" .. id
end
-- Copy parsed etymon modifiers onto a tree/supplement term node.
function TreeBuilder.apply_etymon_fields(term, etymon_data)
-- A reference without <id:> still resolves when the target page has a single etymon, and the
-- node already carries that etymon's own id. Keep it instead of clearing it, so the tree shows
-- the target's id as the gloss without every reference having to repeat it. An explicit
-- <id:...> still wins.
term.id = etymon_data.id or term.id
term.t = etymon_data.t
term.tr = etymon_data.tr
term.ts = etymon_data.ts
term.alt = etymon_data.alt
term.g = etymon_data.g
term.pos = etymon_data.pos
term.ng = etymon_data.ng
term.ref = etymon_data.ref
term.is_uncertain = etymon_data.unc
term.lit = etymon_data.lit
term.q = etymon_data.q
term.qq = etymon_data.qq
term.l = etymon_data.l
term.ll = etymon_data.ll
term.suppress_term = etymon_data.suppress_term
term.unknown_term = etymon_data.unknown_term
term.is_family = etymon_data.is_family
term.override = etymon_data.override
term.aftype = etymon_data.aftype
term.postype = etymon_data.postype
term.bor = etymon_data.bor
term.lbor = etymon_data.lbor
term.slbor = etymon_data.slbor
end
function TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type)
EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type)
local term = {
lang = etymon_data.lang,
title = etymon_data.term,
children = {},
status = M.data.STATUS.OK,
}
TreeBuilder.apply_etymon_fields(term, etymon_data)
return term
end
function TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value)
local terms = {}
for _, term_param in ipairs(as_param_list(param_value)) do
if type(term_param) == "string" and term_param ~= "" then
local etymon_data = EtymonParser.parse_etymon(term_param, entry_lang)
if etymon_data then
table.insert(terms, TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type))
end
end
end
return terms
end
-- Attach a |param= supplement defined in etymon_data.supplements (e.g. doublet=).
function TreeBuilder.append_term_supplement(data_tree, entry_lang, supplement_type, param_value)
local config = M.data.supplements[supplement_type]
if not config then
error("Unknown supplement '" .. tostring(supplement_type) .. "'.")
end
local terms = TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value)
if #terms == 0 then
return
end
data_tree.supplements = data_tree.supplements or {}
table.insert(data_tree.supplements, {
type = supplement_type,
config = config,
terms = terms,
})
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, supplement_type, entry_lang, entry_lang, true)
end
function TreeBuilder.build(lang, title, args, seen, depth, stop_recursion)
seen = seen or {}
depth = depth or 0
local is_toplevel = (depth == 0)
if depth > __state.max_depth_reached then
__state.max_depth_reached = depth
end
__state.total_nodes = __state.total_nodes + 1
local lang_code = lang:getCode()
__state.language_count[lang_code] = (__state.language_count[lang_code] or 0) + 1
local current_id = (type(args) == "table" and args.id) or ""
local key = TreeBuilder.build_key(lang, title, args)
local node = { lang = lang, title = title, id = current_id, args = args, children = {}, status = M.data.STATUS.OK }
if type(args) ~= "table" or seen[key] then
node.status = args or M.data.STATUS.MISSING
-- Mark as duplicate if we've seen this node before
if seen[key] then
node.is_duplicate = true
node.duplicate_key = key
local original_node = seen[key]
if type(original_node) == "table" and original_node.children and #original_node.children > 0 then
node.original_has_children = true
end
end
return node
end
node.status = args.status or M.data.STATUS.OK
seen[key] = node
-- If stop_recursion is set, skip parsing children but check for visible children
if stop_recursion then
local keywords = M.data.keywords
local has_visible_children = false
for i = 2, #args do
local param = args[i]
if type(param) == "string" then
local keyword_base = get_keyword_base(param)
if keyword_base and keywords[keyword_base] then
local _, kw_modifiers = EtymonParser.parse_keyword_modifiers(param:sub(1, 1) == ":" and param or (":" .. param))
if not keyword_invisible_in_tree(get_effective_keyword_info(keyword_base, kw_modifiers)) then
has_visible_children = true
break
end
elseif param:sub(1, 1) ~= ":" then
-- It's a term (not a keyword), so there are visible children
has_visible_children = true
break
end
end
end
node.has_visible_children = has_visible_children
return node
end
-- Parse args into keyword containers
local current_keyword = "from"
local current_keyword_modifiers = {}
local current_container = nil
local function ensure_container()
if not current_container or current_container.keyword ~= current_keyword then
local keyword_info = get_effective_keyword_info(current_keyword, current_keyword_modifiers)
current_container = {
keyword = current_keyword,
keyword_info = keyword_info,
keyword_modifiers = current_keyword_modifiers,
terms = {},
}
table.insert(node.children, current_container)
-- Override keyword text/phrase for nominalization with <g:code>
if current_keyword_modifiers.g and current_keyword == "nominalization" then
local labels = get_nominalization_label_for_g(current_keyword_modifiers.g)
if not labels then
local codes = {}
for c in pairs(M.data.nominalization_g_codes) do table.insert(codes, c) end
table.sort(codes)
error("Invalid <g:" .. tostring(current_keyword_modifiers.g) .. ">. Supported codes for nominalization: " .. table.concat(codes, ", "))
end
current_container.keyword_info = copy_keyword_info(keyword_info)
current_container.keyword_info.text = labels.text
current_container.keyword_info.phrase = labels.phrase
end
end
return current_container
end
local parse_context_lang = Util.resolve_context_lang(lang, args)
for i = 2, #args do
local param = args[i]
if is_keyword(param) then
local keyword, modifiers = EtymonParser.parse_keyword_modifiers(param)
if not keyword then
error("Invalid keyword '" .. param .. "'.")
end
current_keyword = keyword
current_keyword_modifiers = modifiers
current_container = nil -- Force new container for new keyword
elseif type(param) == "string" and param:sub(1, 1) == ":" then
reject_removed_surf_keyword(param)
error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?")
elseif type(param) == "string" then
local etymon_data = EtymonParser.parse_etymon(param, parse_context_lang)
if etymon_data then
-- Track keyword usage at top level
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, current_keyword, lang, etymon_data.lang, is_toplevel)
local term_node = {}
local container
-- Handle suppress_term (-) and unknown_term (empty or +) directly
if etymon_data.suppress_term or etymon_data.unknown_term then
container = ensure_container()
if etymon_data.ety then
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
inline_args.id = etymon_data.id
inline_args.status = M.data.STATUS.INLINE
term_node = TreeBuilder.build(etymon_data.lang, nil, inline_args, seen, depth + 1)
else
term_node = {
lang = etymon_data.lang,
children = {},
status = M.data.STATUS.OK,
}
end
TreeBuilder.apply_etymon_fields(term_node, etymon_data)
else
-- Regular term: fetch arguments from page
record_term_id_tracking(etymon_data)
local etymon_args, page_of, resolved_etymon_id, descendants_check =
DataRetriever.get_etymon_args(etymon_data, is_toplevel)
-- Check for <ety> inline parameter doesn't override the scraped arguments, unless the latter are missing
if etymon_data.ety then
if etymon_args == M.data.STATUS.REDLINK or etymon_args == M.data.STATUS.MISSING then
__state.current_page_has_inline_etymology = true
if is_toplevel then
__state.toplevel_has_inline_etymology = true
end
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
-- Track inline ety keywords too
local inline_keyword = get_keyword(inline_args[2], true)
if inline_keyword and #inline_args >= 3 then
local inline_etymon = EtymonParser.parse_etymon(inline_args[3], etymon_data.lang)
if inline_etymon then
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, inline_keyword, etymon_data.lang, inline_etymon.lang, is_toplevel)
end
end
inline_args.id = etymon_data.id
inline_args.status = M.data.STATUS.INLINE
etymon_args = inline_args
term_node.page_of = __state.cached_etymon_pages[key] -- term node is on the same page as the parent
else
-- Scraped arguments exist, <ety> is redundant and ignored
__state.current_page_has_redundant_etymology = true
if is_toplevel then
__state.toplevel_redundant_etymology = true
end
end
end
-- Ensure container exists before checking keyword info
container = ensure_container()
-- Check if current keyword has no_child_categories - if so, stop recursion
local keyword_info = container.keyword_info
local should_stop_recursion = (stop_recursion or (keyword_info and keyword_info.no_child_categories))
term_node = TreeBuilder.build(etymon_data.lang, etymon_data.term, etymon_args, seen, depth + 1, should_stop_recursion)
term_node.target_key = Util.get_norm_lang(etymon_data.lang):getFullCode() ..
":" .. M.links.get_link_page(etymon_data.term, etymon_data.lang)
term_node.etymon_id = resolved_etymon_id -- The actual etymon id when resolved via senseid
term_node.page_of = page_of
TreeBuilder.apply_etymon_fields(term_node, etymon_data)
term_node.missing_descendants_header, term_node.missing_descendants_entry =
M.descendants.get_term_sync_flags(current_keyword, term_node.status, descendants_check)
end
table.insert(container.terms, term_node)
end
end
end
return node
end
-- Convert etymology tree to JSON-serializable table
local function tree_to_json(node)
local obj = {
term = node.title,
lang = node.lang:getCode(),
lang_name = node.lang:getCanonicalName(),
id = (node.id and node.id ~= "") and node.id or nil,
status = node.status,
is_uncertain = node.is_uncertain or nil,
is_duplicate = node.is_duplicate or nil,
gloss = node.t,
transliteration = node.tr,
transcription = node.ts,
alt = node.alt,
g = node.g,
pos = node.pos,
ng = node.ng,
children = {},
}
for _, container in ipairs(node.children or {}) do
local keyword_info = container.keyword_info
if keyword_info then
local container_obj = {
keyword = container.keyword,
keyword_label = keyword_info.text,
keyword_abbrev = keyword_info.abbrev,
is_group = keyword_info.is_group or nil,
is_invisible = keyword_info.invisible or nil,
is_uncertain = (container.keyword_modifiers and container.keyword_modifiers.unc) or nil,
terms = {},
}
for _, term in ipairs(container.terms or {}) do
table.insert(container_obj.terms, tree_to_json(term))
end
table.insert(obj.children, container_obj)
end
end
return obj
end
-- Build and return the etymology data tree for a given term.
function export.get_tree(lang, title, args, options)
options = options or {}
__state.entry_title = title
__state.entry_lang_code = lang:getCode()
__state.id_stats = M.tracking.new_id_stats()
__state.skip_partial_etymology_category = options.skip_partial_etymology_category == true
if options.validate then
EtymonParser.validate(lang, args, options.id, title, options.pos, false)
end
local lang_code = lang:getCode()
local start_index = (args[1] == lang_code) and 2 or 1
local tree_args = { [1] = lang_code, id = options.id or args.id }
for i = start_index, #args do
table.insert(tree_args, args[i])
end
__state.cached_etymon_args[lang_code .. ":" .. title .. ":" .. (tree_args.id or "")] = tree_args
local ety_data_tree = TreeBuilder.build(lang, title, tree_args)
parse_tree_references(ety_data_tree)
if options.json then
return M.JSON.toJSON(tree_to_json(ety_data_tree))
end
return ety_data_tree
end
-- Given a language code, page name and optionally the id= parameter,
-- render the tree and only the etymology tree for the relevant page.
-- Fetches and parses the corresponding {{etymon}} from the requested page,
-- and any further pages needed to render the tree.
-- Parameters can be passed either through the #invoke or as
-- template parameters *through* an #invoke.
function export.render_tree_for_etymon_on_page(frame)
local frame_args = frame.args
local parent_args = frame:getParent().args
local langcode = frame_args[1] or parent_args[1]
local pagename = frame_args[2] or parent_args[2]
local id = frame_args["id"] or parent_args["id"]
local display_title = frame_args["title"] or parent_args["title"]
local parsed_title = mw.title.new(pagename, 0)
local title
if parsed_title.namespace == 0 then
title = M.pages.safe_page_name(parsed_title)
elseif parsed_title.namespace == RECONSTRUCTION_NS_ID then
title = "*" .. M.pages.safe_page_name(parsed_title)
else
error("Unsupported namespace for render_tree_for_etymon_on_page: " .. parsed_title.namespace)
end
local lang = Util.get_lang(langcode)
__state.entry_title = title
__state.entry_lang_code = lang:getCode()
__state.id_stats = M.tracking.new_id_stats()
-- Construct etymon_data for DataRetriever.get_args.
local etymon_data = {
lang = lang,
term = title,
id = id
}
local args, pagename = DataRetriever.get_etymon_args(etymon_data, true)
if args == M.data.STATUS.MISSING then
error("The etymon template was not found (language " ..
langcode ..
", title '" ..
title ..
"'" ..
(id and ", ID '" .. id .. "'" or ", no ID given") .. "). Page contents may have changed in the interim.")
end
local tree_title = display_title or title
if lang:makeEntryName(M.links.remove_links(tree_title)) ~= lang:makeEntryName(M.links.remove_links(title)) then
M.tracking.track_title_pagename_mismatch(lang)
end
reset_invocation_state()
local ety_data_tree = export.get_tree(lang, tree_title, args, {
validate = true,
id = id,
})
local output = {}
table.insert(output, M.template_styles("Module:etymon/styles.css"))
table.insert(output, M.tree.render({
data_tree = ety_data_tree,
format_term_func = function(term, is_toplevel)
return Util.format_term(term, is_toplevel, {
pos = "suppress",
lit = "suppress",
tree_ql = "suppress",
gloss = "separate",
})
end,
}))
return table.concat(output)
end
function export.main(frame)
local parent_args = frame:getParent().args
local args = M.parameters.process(parent_args, M.parameters_data.etymon)
args.pos = Util.normalize_pos(args.pos)
local lang = args[1]
local etymon_args = args[2]
local id = args.id
local title = args.title
local text = args.text
local tree = args.tree
local etydate = args.etydate
local doublet = args.doublet
local rfe = args.rfe
local etystub = args.etystub
local is_nonlemma = M.yesno(args.nl, false)
local page_data = Util.get_page_data()
if not title then
title = page_data.pagename
if page_data.namespace == RECONSTRUCTION_NS_NAME then title = "*" .. title end
end
local entry_pagename = page_data.pagename
if page_data.namespace == RECONSTRUCTION_NS_NAME then
entry_pagename = "*" .. entry_pagename
end
if lang:makeEntryName(M.links.remove_links(title)) ~= lang:makeEntryName(M.links.remove_links(entry_pagename)) then
M.tracking.track_title_pagename_mismatch(lang)
end
local current_L2 = M.pages.get_current_L2()
if current_L2 then
local norm_lang = Util.get_norm_lang(lang)
local norm_name = norm_lang:getCanonicalName()
if current_L2 ~= norm_name then
local lang_desc = lang:getCode() .. " (" .. lang:getCanonicalName() .. ")"
if norm_lang:getCode() ~= lang:getCode() then
lang_desc = lang_desc .. ", normalized to " .. norm_lang:getCode() .. " (" .. norm_name .. ")"
end
error("Language '" .. lang_desc .. "' does not match the L2 header (" .. current_L2 .. ").")
end
end
reset_invocation_state()
local ety_data_tree = export.get_tree(lang, title, etymon_args, {
validate = true,
pos = args.pos,
id = id,
json = args.json,
skip_partial_etymology_category = is_nonlemma,
})
if args.json then
return ety_data_tree
end
local output = {}
local text_allowlist_mode = M.text_allowed.default_mode or "off"
if text and text_allowlist_mode ~= "off" and not Util.is_text_param_allowed_for_lang(lang) then
local msg = "Etymology texts (parameter <code>text=</code>) are not allowed for " .. lang:getFullName() ..
"; see [[Template:etymon#Text allowlist|Template:etymon § Text allowlist]] for the list of languages that may use the <code>text=</code> parameter."
if text_allowlist_mode == "error" then
error(msg)
else
Util.add_warning(msg, true)
end
end
local lang_exc = Util.get_lang_exception(lang)
if lang_exc and lang_exc.disallow then
local disallow = lang_exc.disallow
local error_text = " for " .. lang:getFullName()
if disallow.ref then
error_text = error_text .. "; see " .. disallow.ref
else
error_text = error_text .. "."
end
if tree and disallow.tree then
error("Etymology trees are not allowed" .. error_text)
end
if text and disallow.text then
error("Etymology texts are not allowed" .. error_text)
end
end
if etydate then
local etydate_param_mods = {
ref = { list = true, type = "references", allow_holes = true },
refn = { list = true, allow_holes = true },
nocap = { type = "boolean" },
}
local function generate_etydate_obj(etydate_text)
local etydate_specs = {}
for spec in etydate_text:gmatch("[^,]+") do
table.insert(etydate_specs, mw.text.trim(spec))
end
return { [1] = etydate_specs }
end
local parsed_etydate = M.parse_utilities.parse_inline_modifiers(etydate, { param_mods = etydate_param_mods, generate_obj = generate_etydate_obj })
local etydate_args = {
[1] = parsed_etydate[1],
nocap = parsed_etydate.nocap or false,
}
ety_data_tree.supplements = ety_data_tree.supplements or {}
table.insert(ety_data_tree.supplements, {
type = "etydate",
etydate_text = M.etydate.format_etydate(etydate_args, { omit_refs = true }),
etydate_refs = (parsed_etydate.ref and #parsed_etydate.ref > 0) and parsed_etydate.ref or nil,
})
end
TreeBuilder.append_term_supplement(ety_data_tree, lang, "doublet", doublet)
if ety_data_tree.supplements then
parse_tree_references(ety_data_tree)
end
local has_visible_children = node_has_visible_tree_children(ety_data_tree)
-- Suppress trees for multiword entries and one-step chains
local visible_tree_depth = get_visible_tree_depth(ety_data_tree)
local is_trivial_tree = visible_tree_depth <= 2
local is_multiword = title:find("%s") ~= nil or title:find("_") ~= nil
if tree and (is_multiword or is_trivial_tree) then
tree = false
end
if tree then
table.insert(output, M.template_styles("Module:etymon/styles.css"))
table.insert(output, M.tree.render({
data_tree = ety_data_tree,
format_term_func = function(term, is_toplevel)
return Util.format_term(term, is_toplevel, {
pos = "suppress",
lit = "suppress",
tree_ql = "suppress",
gloss = "separate",
})
end,
}))
end
local tree_disallowed = lang_exc and lang_exc.disallow and lang_exc.disallow.tree
local ety_tree_json = M.JSON.toJSON(tree_to_json(ety_data_tree))
local anchor = M.anchors.etymonid(lang, id, {
no_tree = args.notree,
title = title,
empty_tree = (not has_visible_children) or tree_disallowed,
ety_tree_json = ety_tree_json,
})
table.insert(output, anchor)
local text_stop_lang_missing = nil
if text then
local max_depth, stop_at_blue_link, stop_at_lang, stop_at_lang_or_bluelink
if text == "++" then
max_depth, stop_at_blue_link = false, false
elseif text == "+" then
max_depth, stop_at_blue_link = 1, false
elseif text == "*" then
max_depth, stop_at_blue_link = false, true
elseif text:match("^:[^*]+%*$") then
-- Stop at a specific language OR first bluelink after it, e.g., ":ota*"
-- If the target language is a redlink, continue to the first bluelink
local lang_code = text:match("^:([^*]+)%*$")
if lang_code and lang_code ~= "" then
local lang_obj = Util.get_lang(lang_code, true)
if lang_obj then
stop_at_lang_or_bluelink = lang_code
else
Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false
end
else
Util.add_warning('Empty language code in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false
end
elseif text:sub(1, 1) == ":" then
-- Stop at a specific language, e.g., ":ar" stops at first Arabic term
local lang_code = text:sub(2)
if lang_code ~= "" then
-- Validate the language code
local lang_obj = Util.get_lang(lang_code, true)
if lang_obj then
stop_at_lang = lang_code
else
Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false -- default to ++
end
else
Util.add_warning('Empty language code in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false -- default to ++
end
else
local num = tonumber(text)
if num and num >= 1 then
max_depth, stop_at_blue_link = num, false
else
error('Invalid text value "' ..
text .. '". Valid values are: "++" (full chain), "+" (first step only), "*" (until first blue link), a number (max steps), ":lang" (stop at language), or ":lang*" (stop at language or first bluelink if redlink)')
end
end
local text_output, text_render_meta = M.text.render({
data_tree = ety_data_tree,
format_term_func = Util.format_term,
lang_matches_stop_code = Util.lang_matches_stop_code,
max_depth = max_depth,
stop_at_blue_link = stop_at_blue_link,
curr_page = page_data.pagename,
nodot = args.nodot,
dot = args.dot,
stop_at_lang = stop_at_lang,
stop_at_lang_or_bluelink = stop_at_lang_or_bluelink,
})
table.insert(output, text_output)
if stop_at_lang and text_render_meta and not text_render_meta.stop_lang_reached then
M.tracking.track_text_stop_lang_missing(lang, stop_at_lang)
text_stop_lang_missing = stop_at_lang
end
end
if rfe then
table.insert(output, Util.expand_request_template(frame, "rfe", rfe, lang:getCode()))
end
if etystub then
table.insert(output, Util.expand_request_template(frame, "etystub", etystub, lang:getCode()))
end
if is_nonlemma then
table.insert(output, " " .. frame:expandTemplate({
title = "nonlemma",
args = {},
}))
end
local categories = {}
if Util.is_content_page() then
M.tracking.track_tree_metrics({
max_depth_reached = __state.max_depth_reached,
total_nodes = __state.total_nodes,
language_count = __state.language_count,
lang = lang,
})
categories = M.categories.build({
data_tree = ety_data_tree,
page_lang = lang,
available_etymon_ids = __state.available_etymon_ids,
senseid_parent_etymon = __state.senseid_parent_etymon,
get_norm_lang_func = Util.get_norm_lang,
lang_exc = lang_exc,
suppress_categories = lang_exc and lang_exc.suppress_categories,
nocat = args.nocat,
tree = tree,
text = text,
exnihilo = args.exnihilo,
toplevel_has_inline_etymology = __state.toplevel_has_inline_etymology,
toplevel_redundant_etymology = __state.toplevel_redundant_etymology,
toplevel_idless_etymon = __state.toplevel_idless_etymon,
has_mismatched_id = __state.has_mismatched_id,
linked_page_multiple_etymons_idless = __state.linked_page_multiple_etymons_idless,
linked_page_partial_etymology_sections = __state.linked_page_partial_etymology_sections,
text_stop_lang_missing = text_stop_lang_missing,
})
M.tracking.track_keywords(__state.toplevel_keyword_stats, lang)
M.tracking.track_page_id(lang, id)
M.tracking.track_ids(__state.id_stats, lang)
end
if #categories > 0 then
table.insert(output, M.categories.format(categories, lang))
end
if __state.warnings then
for i, warning in ipairs(__state.warnings) do
table.insert(output, (i == 1 and "\n" or "") .. warning .. "\n")
end
end
return table.concat(output)
end
return export
o0owhom4nesvcr3x3f2pgy9hbjm4yts
Modul:etymon/styles.css
828
1326098
6532098
6435087
2026-09-18T20:10:54Z
Wikihez
7344
etymology tree: the language label is a quiet dark-grey caption instead of a second blue link
6532098
sanitized-css
text/css
/* Main container. Follows the frame that {{tewandin-ser}} gives inflection tables
(Şablon:tewandin-ser/style.css): pale-blue frame, rounded, soft shadow, white body. */
.etytree {
width: max-content;
max-width: 100%;
overflow: hidden;
box-sizing: border-box;
padding: 3px;
margin: 0.5em 0;
background: var(--wikt-palette-paleblue);
border: 1px solid var(--wikt-palette-grey);
border-radius: 6px;
box-shadow: 0 4px 15px var(--wikt-palette-grey-3);
}
/* Title bar, styled like the inflection-table caption. */
.etytree .NavHead {
background: var(--wikt-palette-paleblue);
text-align: left;
font-size: 95%;
font-weight: bold;
padding: 0.1em 0.5em;
box-sizing: border-box;
}
/* Was a fixed 25em, which stretched even a two-node tree to that width. */
.etytree .NavHead > div {
min-width: 14em;
}
/* A fixed height; a taller tree scrolls (or drags, with the EtytreeZoom gadget) inside the box.
The gadget's "Biçûk bike" lifts the limit and scales the whole tree into view. */
.etytree .NavContent {
overflow: auto;
max-height: 28em;
background: var(--wikt-palette-white);
border: 1px solid var(--wikt-palette-grey-6);
border-radius: 4px;
}
.etytree-body {
display: flex;
flex-direction: column;
align-items: center;
padding: 0.75em 0.5em;
margin: auto;
width: fit-content;
}
.etytree-branch-group {
display: flex;
column-gap: 0.5em;
align-items: end;
position: relative;
}
.etytree-branch {
display: flex;
flex-direction: column;
align-items: center;
}
/* Term blocks */
.etytree-block {
position: relative;
padding: 0.3em 0.7em;
border: 1px solid var(--wikt-palette-lightgrey);
border-radius: 4px;
background: var(--wikt-palette-beige);
text-align: center;
line-height: 1.35;
box-shadow: 0 1px 2px var(--wikt-palette-grey-3);
}
/* The language sits above the term, so give it the quieter weight of the two: smaller, grey and
out of link blue, so only the term itself reads as a link. */
.etytree-block .etyl {
font-size: 85%;
letter-spacing: 0.02em;
}
.etytree-block .etyl a {
color: var(--wikt-palette-darkgrey);
text-decoration: none;
}
.etytree-block .etyl a:hover,
.etytree-block .etyl a:focus {
color: var(--wikt-palette-blue);
text-decoration: underline;
}
/* Reconstructed languages: a cooler tint than the beige of attested terms. */
.etytree-block.etytree-reconstructed {
background: var(--wikt-palette-grey-blue-1);
/* the sanitiser rejects border-color with a var(), so set the shorthand */
border: 1px solid var(--wikt-palette-grey-blue-3);
}
/* Termless keyword blocks (invisible wrapper for positioning) */
.etytree-termless-block {
height: 0 !important;
padding: 0 !important;
border: none !important;
background: transparent !important;
margin: 0 !important;
overflow: visible;
}
.etytree-block.etytree-duplicate {
border: 1px dashed var(--wikt-palette-grey);
}
.etytree-term {
display: inline-block;
}
/* The meaning, on its own line under the term. */
.etytree-gloss {
display: inline-block;
max-width: 16em;
font-size: 85%;
font-style: italic;
line-height: 1.25;
color: var(--wikt-palette-grey-9);
}
/* Vertical connectors */
.etytree-connector-vertical,
.etytree-connector-vertical-short {
border-right: 2px solid var(--wikt-palette-grey);
position: relative;
transform: translateX(1px);
}
.etytree-connector-vertical { height: 20px; }
.etytree-connector-vertical-short { height: 10px; }
.etytree-connector-dotted {
border-left: 2px dotted var(--wikt-palette-grey);
height: 20px;
display: block;
margin-left: 50%;
}
/* Branch connectors */
.etytree-branch-left,
.etytree-branch-right {
height: 10px;
width: calc(50% + 0.25em);
border-bottom: 2px solid var(--wikt-palette-grey);
}
.etytree-branch-left {
border-left: 2px solid var(--wikt-palette-grey);
border-bottom-left-radius: 4px;
transform: translateX(50%);
}
.etytree-branch-right {
border-right: 2px solid var(--wikt-palette-grey);
border-bottom-right-radius: 4px;
transform: translateX(-50%);
}
.etytree-branch-mid {
border-bottom: 2px solid var(--wikt-palette-grey);
width: calc(100% + 0.5em);
}
/* Duplicate connector (L-shaped with arrow) */
.etytree-duplicate-connector {
display: flex;
justify-content: center;
height: 20px;
}
.etytree-duplicate-connector > div {
position: relative;
width: 60px;
height: 100%;
}
.etytree-duplicate-connector .etytree-dup-right {
position: absolute;
right: 0;
top: 50%;
bottom: 0;
border-left: 2px dotted var(--wikt-palette-grey);
}
.etytree-duplicate-connector .etytree-dup-horiz {
position: absolute;
left: 0;
right: 0;
top: 50%;
border-top: 2px dotted var(--wikt-palette-grey);
}
.etytree-duplicate-connector .etytree-dup-left {
position: absolute;
left: 0;
top: 0;
bottom: 50%;
border-left: 2px dotted var(--wikt-palette-grey);
}
.etytree-duplicate-connector .etytree-dup-arrow {
position: absolute;
left: -5px;
top: -5px;
font-size: 10px;
color: var(--wikt-palette-grey);
}
/* Label containers */
.etytree-label-container {
z-index: 1;
position: absolute;
transform: translate(-50%);
top: calc(100% + 5px);
left: 50%;
line-height: 10px;
overflow: visible;
}
.etytree-group-label {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
z-index: 2;
height: 10px;
line-height: 10px;
}
/* Labels */
.etytree-label abbr {
font-size: 12px;
font-style: italic;
color: var(--wikt-palette-black);
background: var(--wikt-palette-cyan);
border-radius: 2px;
text-decoration: none;
}
/* Uncertainty marker */
.etytree-unc {
font-size: 10px;
font-weight: bold;
padding: 1px 2px;
background: var(--wikt-palette-pink);
border-radius: 2px;
text-decoration: none;
}
.etytree-label + .etytree-unc {
position: absolute;
left: calc(100% + 3px);
}
/* Final marker (for termless keywords) */
.etytree-final {
font-size: 10px;
font-weight: bold;
padding: 1px 2px;
background: var(--wikt-palette-grey) !important;
color: var(--wikt-palette-white) !important;
border-radius: 2px;
text-decoration: none;
display: inline-block;
line-height: 1;
}
.etytree-label-container .etytree-final {
position: absolute;
left: 50%;
top: -12px;
transform: translateX(-50%);
z-index: 3;
margin-left: 0;
}
d7wsfcirpqt63vplh60vc7778du531i
Jinûvesazî:proto-hindûewropî/peh₂-
108
1326174
6532020
6369920
2026-09-18T15:33:22Z
Wikihez
7344
Wikihez rûpela [[Jinûvesazî:proto-hindûewropî/peh₂]] bêyî beralîkirinek bar kir [[Jinûvesazî:proto-hindûewropî/peh₂-]]
6369920
wikitext
text/x-wiki
{{jinûvesazkirî}}
== {{ziman|ine-pro}} ==
{{etîmon|ine-pro|pos=root|id=parastin}}
=== Reh ===
{{reh|ine-pro}}<ref>{{R:ine:IEW|page=787|cuda=pā-: pə-}}</ref><ref>{{R:ine:IEW|page=839|cuda=pō(i)-: (pəi- ?:) pī-}}</ref><ref>{{R:ine:LIV|cuda=*peh₂(i̯)-|page=460}}</ref>
# [[parastin]]
=== Çavkanî ===
{{çavkanî}}
oevuuqgbsft1pfoipl7bc236pobjk76
Modul:etymon/data
828
1357603
6532064
6531859
2026-09-18T17:44:33Z
Wikihez
7344
language and family names link to their category instead of Wikipedia; a family now reads "zimanên îranî"; glossary links point at Nimînok:Ferhengok (tree keeps a full "Rûpel#lenger" target); Kurdish names, shorthands and tree labels for nomînalîzasyon, ûnîverbasyon, translîterasyon, redûblîkasyon, elîpsîz, akronîm, înîtîalîzm, deynort, deynne
6532064
Scribunto
text/plain
local export = {}
export.STATUS = {
OK = "ok",
INLINE = "inline",
MISSING = "missing",
REDLINK = "redlink",
AMBIGUOUS = "ambiguous",
}
export.TRANSITIVE = {
ALWAYS = "always", -- always recurse into children
NEVER = "never", -- never recurse into children
CROSS_LANG = "cross_lang", -- only recurse when source lang differs from target lang (but pos chain continues)
CROSS_LANG_NO_INTERNAL_SOURCE = "cross_lang_no_internal_source", -- like CROSS_LANG, but source breaks for internal derivations in the same language context
}
-- Deep merge tables (nested tables are merged recursively, later values override earlier)
local function deep_merge(...)
local result = {}
for _, t in ipairs({ ... }) do
for k, v in pairs(t) do
if type(v) == "table" and type(result[k]) == "table" then
result[k] = deep_merge(result[k], v)
else
result[k] = v
end
end
end
return result
end
local glossary_page = "Nimînok:Ferhengok"
-- `term` is either a bare anchor on the glossary page or a full "Rûpel#lenger".
local function make_glossary_link(term, display_text)
if not term then return display_text end
local page, anchor = term:match("^(.-)#(.+)$")
if not page then
page, anchor = glossary_page, term
end
return "[[" .. page .. "#" .. anchor:gsub(" ", "_") .. "|" .. display_text .. "]]"
end
-- Extract base word and connector from text like "Borrowed from" or "calque of"
local function split_glossary_text(text)
for _, pattern in ipairs({ "^(.-)(%s+[Jj][Ii])$", "^(.-)(%s+[Oo][Ff])$", "^(.-)(%s+[Ff][Rr][Oo][Mm])$" }) do
local base, rest = text:match(pattern)
if base then return base, rest end
end
return text, ""
end
local TRANSITIVE = export.TRANSITIVE
local function create_keyword(opts)
local entry = {
is_group = opts.is_group or false,
abbrev = opts.abbrev,
glossary = opts.glossary,
transitive = opts.transitive or TRANSITIVE.ALWAYS, -- default "always"
inherited_chain = opts.inherited_chain or false,
affix_categories = opts.affix_categories or false,
borrowing_type = opts.borrowing_type,
specialized_borrowing = opts.specialized_borrowing,
toplevel_category = opts.toplevel_category,
no_child_categories = opts.no_child_categories or false,
source_category_type = opts.source_category_type,
invisible = (opts.invisible == true and "all") or opts.invisible or false,
pos_override = opts.pos_override,
new_sentence = opts.new_sentence or false,
separate_clause = opts.separate_clause or false,
default_conj = opts.default_conj,
min_etymons = opts.min_etymons,
max_etymons = opts.max_etymons,
term_rules = opts.term_rules,
aliases = opts.aliases,
}
-- Only set text/phrase when visible in text (invisible ~= "all" and ~= "text")
local inv = entry.invisible
if inv ~= "all" and inv ~= "text" then
entry.phrase = opts.phrase
if opts.text then
if opts.glossary then
local base_word, rest = split_glossary_text(opts.text)
entry.text = make_glossary_link(opts.glossary, base_word) .. rest
else
entry.text = opts.text
end
end
end
return entry
end
-- Shared defaults for keyword groups
local DEFAULTS = {
-- Keywords that pass through inheritance chain
inheritance = {
transitive = TRANSITIVE.ALWAYS,
inherited_chain = true,
},
-- Standard transitive derivation
transitive = {
transitive = TRANSITIVE.ALWAYS,
},
-- Standard for internal derivations: transitive across languages, but not within them
internal_derivation = {
transitive = TRANSITIVE.CROSS_LANG,
},
-- Borrowing keywords
borrowing = {
transitive = TRANSITIVE.ALWAYS,
},
-- Affix group keywords (compound words, blends, etc.)
affix_group = {
is_group = true,
min_etymons = 2,
transitive = TRANSITIVE.CROSS_LANG,
affix_categories = true,
},
-- Calque-like keywords (calque, partial calque, semantic loan)
calque_like = {
transitive = TRANSITIVE.NEVER,
no_child_categories = true,
new_sentence = true,
},
-- Non-transitive influence
influence_like = {
transitive = TRANSITIVE.NEVER,
no_child_categories = true,
},
}
export.keywords = {
--
-- Inheritance keywords
--
["from"] = create_keyword(deep_merge(DEFAULTS.inheritance, {
text = "Ji", phrase = "ji",
aliases = { "ji" },
term_rules = { entry_lang = true },
})),
["inherited"] = create_keyword(deep_merge(DEFAULTS.inheritance, {
text = "Mîrasmayî ji",
phrase = "mîrasmayî ji",
glossary = "Wîkîferheng:Etîmolojî#Peyvên mîrasmayî",
aliases = { "inh", "mîrasmayî", "mîr" },
term_rules = {
family = "disallowed",
family_suffix = "; use a specific language.",
ancestor_check = true,
},
})),
--
-- Basic derivation keywords
--
["uder"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Ji",
phrase = "ji",
aliases = { "drşnd" },
toplevel_category = "Dariştinên nediyar",
})),
["derived"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Ji",
phrase = "ji",
abbrev = "drş.",
glossary = "Nimînok:Ferhengok#dariştî",
aliases = { "der", "dariştî", "drş" },
})),
--
-- Affix/compound group keywords
--
["affix"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "Ji",
phrase = "ji",
min_etymons = 1,
aliases = { "af", "qertaf", "qf" },
})),
["blend"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "Têkilkirin ji",
phrase = "têkilkirin ji",
aliases = { "têkilkirin" },
abbrev = "blend",
glossary = "Nimînok:Ferhengok#têkilkirin",
toplevel_category = "Têkilkirin",
})),
["univerbation"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "Ûnîverbasyona",
phrase = "ûnîverbasyona",
abbrev = "ûnîv.",
glossary = "ûnîverbasyon",
toplevel_category = "univerbations",
min_etymons = 1,
aliases = { "univ", "ûnîverbasyon", "ûnîv" },
})),
["vrd-af"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "Vṛddhi derivative of",
phrase = "a vṛddhi derivative of",
abbrev = "vṛd.",
glossary = "vṛddhi derivative",
toplevel_category = "vrddhi derivatives",
})),
["sa-af"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "[[Sanskritic]] formation from",
phrase = "a [[Sanskritic]] formation of",
toplevel_category = "Sanskritic formations",
})),
--
-- Borrowing keywords
--
["bor"] = create_keyword(deep_merge(DEFAULTS.borrowing, {
text = "Deyn ji",
phrase = "deynkirî ji",
abbrev = "deyn.",
glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî",
borrowing_type = "borrowed",
aliases = { "borrowed", "deyn" },
})),
["lbor"] = create_keyword(deep_merge(DEFAULTS.borrowing, {
text = "Deynkirina hînbûyî ji",
phrase = "deynkirina hînbûyî ji",
aliases = { "deynh" },
abbrev = "deynh.",
glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî",
specialized_borrowing = "learned",
})),
["obor"] = create_keyword(deep_merge(DEFAULTS.borrowing, {
text = "Deynkirina ortografîk ji",
phrase = "deynkirina ortografîk ji",
abbrev = "deynort.",
glossary = "deynkirina ortografîk",
specialized_borrowing = "orthographic",
aliases = { "deynort" },
})),
["slbor"] = create_keyword(deep_merge(DEFAULTS.borrowing, {
text = "Deynkirina hînbûyî ya qismî ji",
phrase = "deynkirina hînbûyî ya qismî ji",
aliases = { "deynhq" },
abbrev = "deynhq.",
glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî",
specialized_borrowing = "semi-learned",
})),
["ubor"] = create_keyword(deep_merge(DEFAULTS.borrowing, {
text = "Deynkirina neadaptekirî ji",
phrase = "deynkirina neadaptekirî ji",
abbrev = "deynne.",
glossary = "deynkirina neadaptekirî",
specialized_borrowing = "unadapted",
aliases = { "deynne" },
})),
--
-- Calque-like keywords (non-transitive, start new sentence)
--
["calque"] = create_keyword(deep_merge(DEFAULTS.calque_like, {
text = "Wergerandina yekser ji",
phrase = "wergerandina yekser ji",
abbrev = "yekser",
glossary = "Nimînok:Ferhengok#yekser",
specialized_borrowing = "calque",
aliases = { "cal", "clq", "yekser" },
})),
["partial calque"] = create_keyword(deep_merge(DEFAULTS.calque_like, {
text = "Wergerandina yekser a qismî ji",
phrase = "wergerandina yekser a qismî ji",
abbrev = "yekserq.",
glossary = "Nimînok:Ferhengok#yekser",
specialized_borrowing = "partial-calque",
aliases = { "pcal", "yekserqismî", "yekserq" },
})),
["semantic loan"] = create_keyword(deep_merge(DEFAULTS.calque_like, {
text = "Wergirtina maneyê ji",
phrase = "wergirtina maneyê ji",
abbrev = "wer. mane",
glossary = "Wîkîferheng:Etîmolojî#Wergirtina maneyê",
specialized_borrowing = "semantic-loan",
aliases = { "sl", "wergirtin" },
})),
["psm"] = create_keyword(deep_merge(DEFAULTS.calque_like, {
text = "Lihevanîna dengî-maneyî ji",
phrase = "lihevanîna dengî-maneyî ji",
abbrev = "lihevanîn",
glossary = "Wîkîferheng:Etîmolojî#Lihevanîna dengî-maneyî",
specialized_borrowing = "phono-semantic-matching",
aliases = { "phono-semantic matching", "lihevanîn" },
})),
--
-- Influence keywords (non-transitive, separate clause)
--
["influence"] = create_keyword(deep_merge(DEFAULTS.influence_like, {
text = "Di bin tesîra",
phrase = "bin tesîra",
aliases = { "tesîr" },
abbrev = "tesîr.",
glossary = "belavbûn ji zimanekî din",
separate_clause = true,
})),
--
-- Morphological derivation keywords
--
["clipping"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Qusandin ji",
phrase = "qusandin ji",
abbrev = "qusandin",
glossary = "Nimînok:Ferhengok#qusandin",
toplevel_category = "Qusandin",
aliases = { "clip", "qusandin" },
})),
["ellipsis"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Elîpsîza",
phrase = "elîpsîza",
abbrev = "elîp.",
glossary = "elîpsîz",
toplevel_category = "ellipses",
aliases = { "ellip", "elîpsîz", "elîp" },
})),
["back-formation"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Paşvesazî ji",
phrase = "paşvesazî ji",
abbrev = "paşvesazî",
glossary = "Nimînok:Ferhengok#paşvesazî",
toplevel_category = "Paşvesazî",
aliases = { "bf", "paşvesazî" },
})),
["nominalization"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Nomînalîzasyona",
phrase = "nomînalîzasyona",
abbrev = "nomîn.",
glossary = "nomînalîzasyon",
toplevel_category = "nominalizations",
aliases = { "nom", "nomînalîzasyon", "nomîn" },
})),
["transliteration"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Translîterasyona",
phrase = "translîterasyona",
abbrev = "translît.",
glossary = "translîterasyon",
aliases = { "translit", "translîterasyon", "translît" },
})),
["vrd"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Vṛddhi derivative of",
phrase = "a vṛddhi derivative of",
abbrev = "vṛd.",
glossary = "vṛddhi derivative",
toplevel_category = "vrddhi derivatives",
})),
["apheretic"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Apheretic form of",
phrase = "an apheretic form of",
abbrev = "aph.",
glossary = "apheresis",
aliases = { "apheresis", "aphetic" },
})),
["denominal"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Denominal verb from",
phrase = "denominal verb from",
abbrev = "denom.",
glossary = "denominal",
toplevel_category = "denominal verbs",
aliases = { "denom" },
})),
["deverbal"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Deverbal from",
phrase = "deverbal from",
abbrev = "deverb.",
glossary = "deverbal",
toplevel_category = "deverbals",
})),
["reduplication"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Redûblîkasyona",
phrase = "redûblîkasyona",
abbrev = "redûb.",
glossary = "redûblîkasyon",
toplevel_category = "reduplications",
aliases = { "redup", "redûblîkasyon", "redûb" },
})),
["abbreviation"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Kurtkirina",
phrase = "kurtkirina",
abbrev = "kurt.",
aliases = { "abbr", "abbrev", "kurtkirin" },
})),
["syllabic abbreviation"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Syllabic abbreviation of",
phrase = "syllabic abbreviation of",
abbrev = "syl. abbr.",
glossary = "syllabic abbreviation",
aliases = { "sylabbr", "sylabbrev" },
})),
["acronym"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Akronîma",
phrase = "akronîma",
abbrev = "akronîm",
glossary = "akronîm",
aliases = { "acro", "akronîm" },
})),
["initialism"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Înîtîalîzma",
phrase = "înîtîalîzma",
abbrev = "înît.",
glossary = "înîtîalîzm",
aliases = { "init", "înîtîalîzm", "înît" },
})),
["metathesis"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Metateza",
phrase = "metateza",
abbrev = "meta.",
glossary = "metatez",
toplevel_category = "peyvên dariştî bi riya metatezê",
aliases = { "meta", "metatez" },
})),
--
-- Invisible keywords (no text output)
--
["root"] = create_keyword {
transitive = TRANSITIVE.ALWAYS,
invisible = "all",
pos_override = "root",
aliases = { "reh" },
},
["afeq"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "Ji",
phrase = "ji",
transitive = TRANSITIVE.NEVER,
min_etymons = 1,
invisible = "all",
})),
}
-- Template-parameter supplements.
export.supplements = {
doublet = {
text = "Cotreha",
phrase = "cotreha",
glossary = "Nimînok:Ferhengok#cotreh",
toplevel_category = "Cotreh",
default_conj = "û",
term_rules = {
entry_lang = true,
require_term = true,
disallow = { "suppress", "unknown", "family" },
},
},
}
local aliases_to_register = {}
local canonical_aliases = {}
-- Map every keyword (canonical or alias) to its canonical form for consistent checks and tracking.
export.keyword_canonical = {}
for name, keyword_data in pairs(export.keywords) do
export.keyword_canonical[name] = name
if keyword_data.aliases then
canonical_aliases[name] = keyword_data.aliases
for _, alias in ipairs(keyword_data.aliases) do
if export.keywords[alias] then
error("Alias '" ..
alias .. "' defined in keyword '" .. name .. "' collides with existing keyword '" .. alias .. "'.")
end
if aliases_to_register[alias] then
error("Alias '" ..
alias .. "' defined in keyword '" .. name .. "' is already claimed by another keyword.")
end
aliases_to_register[alias] = keyword_data
export.keyword_canonical[alias] = name
end
keyword_data.aliases = nil
end
end
for alias, data in pairs(aliases_to_register) do
export.keywords[alias] = data
end
--
-- Language exception presets
--
local EXCEPTION_PRESETS = {
-- Fully disallowed: no tree, no text, no categories
disallowed = {
disallow = { tree = true, text = true },
suppress_categories = true,
},
-- Suppress transliteration only
no_translit = {
suppress_tr = true,
},
-- Suppress all categories only
no_categories = {
suppress_categories = true,
},
}
--[=[
Available exception options:
disallow = { Related options for disallowing output:
tree Disallow etymology trees for this language
text Disallow etymology text generation for this language
ref Reference link shown when tree/text is disallowed
}
suppress_tr Suppress transliteration in links
suppress_categories Suppress all category generation
normalize_to Normalize language code to a different code
normalize_from_families Apply normalization to languages in these families
normalize_exclude_families Exclude these families from normalization
keyword_overrides Per-keyword categorisation overrides (e.g. { ["af"] = { transitive = TRANSITIVE.NEVER } })
]=]
local function create_exception(preset, overrides)
local base = preset and EXCEPTION_PRESETS[preset] or {}
return deep_merge(base, overrides or {})
end
export.config = {
lang_exceptions = {
["zh"] = create_exception("disallowed", {
disallow = { ref = "[[Wiktionary:Beer parlour/2025/May#Template:etymon for Chinese]]" },
suppress_tr = true,
normalize_to = "zh",
normalize_from_families = { "zhx" },
normalize_exclude_families = { "qfa-cnt" },
}),
},
}
-- Supported codes for the nominalization <g:code> modifier (subset of common gender/number-style codes)
-- Codes accepted by the <g:code> modifier on a nominalization. These are the codes of
-- [[Modul:gender and number/data]], with that module's own Kurdish wording -- the same value is
-- passed through to it for the gender tag, so anything valid here is valid there. A two-letter
-- gender+number code that is not listed ("np", "mp") is decomposed automatically below.
export.nominalization_g_codes = {
-- Cins
["n"] = "nêr",
["m"] = "mê",
["f"] = "mê",
["nt"] = "nêtar",
["c"] = "giştî",
["g"] = "giştî",
["cnt"] = "cinsê-notr",
-- Hejmar
["y"] = "yekjimar",
["s"] = "yekjimar",
["p"] = "pirjimar",
["d"] = "dual",
-- Kodên hevedudanî yên [[Modul:gender and number/data]]
["mf"] = "nêr an mê",
["mn"] = "mê an nêr",
["mnt"] = "mê an nêtar",
}
--
-- Propagate keyword overrides to aliases
--
if export.config.lang_exceptions then
for lang_code, exception in pairs(export.config.lang_exceptions) do
if exception.keyword_overrides then
for canonical, aliases in pairs(canonical_aliases) do
if exception.keyword_overrides[canonical] then
local override_data = exception.keyword_overrides[canonical]
for _, alias in ipairs(aliases) do
if not exception.keyword_overrides[alias] then
exception.keyword_overrides[alias] = override_data
end
end
end
end
end
end
end
return export
ccvtb8l8zkezxqph95plteme7ki8zxy
Modul:etymon/tree
828
1357623
6532062
6433456
2026-09-18T17:44:13Z
Wikihez
7344
language and family names link to their category instead of Wikipedia; a family now reads "zimanên îranî"; glossary links point at Nimînok:Ferhengok (tree keeps a full "Rûpel#lenger" target); Kurdish names, shorthands and tree labels for nomînalîzasyon, ûnîverbasyon, translîterasyon, redûblîkasyon, elîpsîz, akronîm, înîtîalîzm, deynort, deynne
6532062
Scribunto
text/plain
local export = {}
local html_create = mw.html.create
local max = math.max
--[==[
The language label on a tree node: a link to the language's category with the first letter
capitalised, the way Modul:etymon kevn rendered it. Families and anything without a category
fall back to the plain canonical name.
]==]
local function language_label(lang)
if lang and lang.makeCategoryLink then
local ok, link = pcall(lang.makeCategoryLink, lang)
if ok and link and link ~= "" then
return link
end
end
local name = lang and lang:getCanonicalName() or ""
return mw.ustring.upper(mw.ustring.sub(name, 1, 1)) .. mw.ustring.sub(name, 2)
end
local function create_vertical_connector()
return html_create('span'):addClass('etytree-connector-vertical')
end
local function create_abbr(text, title, glossary)
local abbr = html_create('abbr')
:attr('title', title)
:wikitext(text)
if glossary then
-- Like Modul:etymon/data: a bare anchor sits on the glossary page, "Rûpel#lenger" is a full target.
local page, anchor = glossary:match("^(.-)#(.+)$")
if not page then
page, anchor = "Nimînok:Ferhengok", glossary
end
abbr = '[[' .. page .. '#' .. anchor:gsub(" ", "_") .. '|' .. tostring(abbr) .. ']]'
end
return html_create('span'):addClass('etytree-label'):node(abbr)
end
local function create_uncertainty_marker()
return html_create('abbr')
:addClass('etytree-unc')
:attr('title', 'nediyar')
:wikitext('?')
end
local function create_label_container()
return html_create('span'):addClass('etytree-label-container')
end
local function invisible_in_tree(inv)
return inv == "all" or inv == true or inv == "tree"
end
local function render_label(term_block, keyword_info, keyword_modifiers, is_uncertain, is_group_child, term_labels)
-- Skip label when invisible in tree
local has_label = keyword_info and keyword_info.abbrev and not is_group_child and not invisible_in_tree(keyword_info.invisible)
-- For group children, keyword uncertainty is shown on the group label, not on individual terms
local keyword_uncertain = keyword_modifiers and keyword_modifiers.unc and not is_group_child
local show_term_uncertainty = is_uncertain
-- Check if we have term-specific labels
local has_term_labels = term_labels and #term_labels > 0
if not has_label and not show_term_uncertainty and not keyword_uncertain and not has_term_labels then
return
end
local label_span = create_label_container()
if has_label then
local glossary_title = keyword_info.glossary
and keyword_info.glossary:gsub("_", " ")
or keyword_info.abbrev
label_span:node(create_abbr(
keyword_info.abbrev,
glossary_title,
keyword_info.glossary
))
-- Show uncertainty marker if term or keyword is uncertain
if show_term_uncertainty or keyword_uncertain then
label_span:node(create_uncertainty_marker())
end
else
-- No label, but term or keyword is uncertain
if show_term_uncertainty or keyword_uncertain then
label_span:node(create_uncertainty_marker())
end
end
-- Add term-specific labels
if has_term_labels then
for _, label_info in ipairs(term_labels) do
label_span:node(create_abbr(label_info.abbrev, label_info.title, label_info.glossary))
end
end
term_block:node(label_span)
end
local function render_term_block(node_data, format_term_func, is_toplevel)
local link_content = html_create()
link_content
:tag('span')
:addClass('etyl')
:wikitext(language_label(node_data.lang))
:done()
local term_text, gloss = format_term_func(node_data, is_toplevel)
if term_text then
link_content
:wikitext('<br>')
:tag('span')
:addClass('etytree-term')
:wikitext(term_text)
:done()
end
-- The meaning goes on its own line, smaller and in italics, instead of in (“...”) brackets.
if gloss then
link_content
:wikitext('<br>')
:tag('span')
:addClass('etytree-gloss')
:wikitext(gloss)
:done()
end
local block = html_create('div'):addClass('etytree-block'):node(link_content)
-- Reconstructed languages get their own tint, so an unattested step is obvious at a glance.
local lang = node_data.lang
if lang and lang.hasType then
local ok, is_recon = pcall(lang.hasType, lang, "reconstructed")
if ok and is_recon then
block:addClass('etytree-reconstructed')
end
end
-- Add duplicate styling if this is a duplicate node
if node_data.is_duplicate then
block:addClass('etytree-duplicate')
end
return block
end
local function create_dotted_connector()
return html_create('span'):addClass('etytree-connector-dotted')
end
-- Create an L-shaped connector for nodes with hidden ancestry (duplicate or no_child_categories)
local function create_duplicate_connector()
local container = html_create('div'):addClass('etytree-duplicate-connector')
local inner_wrapper = container:tag('div')
inner_wrapper:tag('span'):addClass('etytree-dup-right')
inner_wrapper:tag('span'):addClass('etytree-dup-horiz')
inner_wrapper:tag('span'):addClass('etytree-dup-left')
inner_wrapper:tag('span'):addClass('etytree-dup-arrow'):wikitext('▲')
return container
end
local function render_group_label(connecting_line, keyword_info, keyword_modifiers)
local has_abbrev = keyword_info and keyword_info.abbrev
local keyword_uncertain = keyword_modifiers and keyword_modifiers.unc
-- Nothing to show if no abbrev and no uncertainty
if not has_abbrev and not keyword_uncertain then
return
end
local label_span = connecting_line:tag('span'):addClass('etytree-group-label')
if has_abbrev then
local glossary_title = keyword_info.glossary
and keyword_info.glossary:gsub("_", " ")
or keyword_info.abbrev
label_span:node(create_abbr(keyword_info.abbrev, glossary_title, nil))
end
-- Add uncertainty marker if keyword has <unc> modifier
if keyword_uncertain then
label_span:node(create_uncertainty_marker())
end
end
local function add_branch_connector(column, index, total)
if index == 1 then
column:tag('span'):addClass('etytree-branch-left')
elseif index == total then
column:tag('span'):addClass('etytree-branch-right')
else
column:tag('span'):addClass('etytree-connector-vertical-short')
column:tag('span'):addClass('etytree-branch-mid')
end
end
function export.render(opts)
opts = opts or {}
local data_tree = opts.data_tree
local format_term_func = opts.format_term_func
-- Forward declaration
local render_term
-- Render a container (keyword + its terms)
local function render_container(container, is_toplevel)
local keyword_info = container.keyword_info
local keyword_modifiers = container.keyword_modifiers or {}
local is_group = keyword_info and keyword_info.is_group
local terms = container.terms or {}
-- Skip container entirely only when invisible = "all" (or true)
if keyword_info and invisible_in_tree(keyword_info.invisible) then
return nil, 0, 0
end
if #terms == 0 then
return nil, 0, 0
end
-- For no_child_categories keywords (calque, semantic loan, etc.), don't render term's children
local skip_child_rendering = keyword_info and keyword_info.no_child_categories
-- Render each term in the container
local rendered_terms = {}
local container_height = 0
local container_width = 0
for _, term in ipairs(terms) do
-- Collect term-specific labels
local term_labels = {}
if term.bor then
table.insert(term_labels, { abbrev = "bor.", title = "borrowed", glossary = "loanword" })
end
if term.slbor then
table.insert(term_labels, { abbrev = "slbor.", title = "semi-learned borrowing", glossary = "semi-learned_borrowing" })
end
if term.lbor then
table.insert(term_labels, { abbrev = "lbor.", title = "learned borrowing", glossary = "learned_borrowing" })
end
local term_tree, term_height, term_width = render_term(term, keyword_info, keyword_modifiers, is_group, false, skip_child_rendering, term_labels)
table.insert(rendered_terms, {
tree = term_tree,
height = term_height,
width = term_width,
is_uncertain = term.is_uncertain,
})
container_height = max(container_height, term_height)
container_width = container_width + term_width
end
local rendered_html
local has_connector = false
if #rendered_terms == 1 then
-- Single term: just return it directly
rendered_html = rendered_terms[1].tree
container_height = rendered_terms[1].height
container_width = rendered_terms[1].width
else
-- Multiple terms: group them together
local subtree_container = html_create('div'):addClass('etytree-branch-group')
for i, term_data in ipairs(rendered_terms) do
local column = html_create('div'):addClass('etytree-branch')
column:node(term_data.tree)
add_branch_connector(column, i, #rendered_terms)
subtree_container:node(column)
end
local connecting_line = create_vertical_connector()
-- Add group label for group keywords
if is_group and not invisible_in_tree(keyword_info.invisible) then
render_group_label(connecting_line, keyword_info, keyword_modifiers)
end
rendered_html = html_create()
:node(subtree_container)
:node(connecting_line)
has_connector = true
end
return rendered_html, container_height, container_width, has_connector
end
-- Render a term node
render_term = function(term_node, keyword_info, keyword_modifiers, is_group_child, is_toplevel_term, skip_child_rendering, term_labels)
local tree_width, tree_height = 0, 0
local subtrees = {}
-- Process term's children (which are containers)
local has_hidden_children = false
if not term_node.is_duplicate and not skip_child_rendering then
for _, container in ipairs(term_node.children or {}) do
local subtree, sub_height, sub_width, subtree_has_connector = render_container(container, is_toplevel_term)
if subtree then
table.insert(subtrees, {
tree = subtree,
height = sub_height,
width = sub_width,
has_connector = subtree_has_connector,
})
tree_height = max(tree_height, sub_height)
tree_width = tree_width + sub_width
end
end
elseif skip_child_rendering then
-- Check if there are any visible children
-- When stop_recursion is true, children aren't parsed, but has_visible_children flag is set
if term_node.has_visible_children then
has_hidden_children = true
elseif term_node.children and #term_node.children > 0 then
-- Fallback: check parsed children for visibility
for _, container in ipairs(term_node.children) do
local child_keyword_info = container.keyword_info
if not (child_keyword_info and (child_keyword_info.invisible == "all" or child_keyword_info.invisible == true)) then
has_hidden_children = true
break
end
end
end
end
local is_toplevel_node = (keyword_info == nil)
local term_block = render_term_block(term_node, format_term_func, is_toplevel_node)
render_label(term_block, keyword_info, keyword_modifiers, term_node.is_uncertain, is_group_child, term_labels or {})
local term_html = html_create()
if #subtrees == 0 then
local show_connector = (term_node.is_duplicate and term_node.original_has_children) or has_hidden_children
if show_connector then
term_html:node(create_duplicate_connector())
end
term_html:node(term_block)
tree_width = tree_width + 1
elseif #subtrees == 1 then
term_html:node(subtrees[1].tree)
if not subtrees[1].has_connector then
term_html:node(create_vertical_connector())
end
term_html:node(term_block)
else
-- Multiple containers: need to merge them
local subtree_container = html_create('div'):addClass('etytree-branch-group')
for i, subtree_data in ipairs(subtrees) do
local column = html_create('div'):addClass('etytree-branch')
column:node(subtree_data.tree)
add_branch_connector(column, i, #subtrees)
subtree_container:node(column)
end
local connecting_line = create_vertical_connector()
term_html
:node(subtree_container)
:node(connecting_line)
:node(term_block)
end
return term_html, tree_height + 1, tree_width
end
local final_tree, final_height, final_width = render_term(data_tree, nil, nil, false, true)
local container = html_create('div')
:addClass('etytree-body')
:node(final_tree)
return tostring(html_create('div')
:addClass('etytree NavFrame')
:attr('data-etytree-height', final_height)
:attr('data-etytree-width', final_width)
:tag('div')
:addClass('NavHead')
:tag('div')
:wikitext('Dara etîmolojiyê')
:done()
:done()
:tag('div')
:addClass('NavContent')
:node(container)
:done())
end
return export
g28ydu0v7itj59qfvz5j478j5n9s9qj
Modul:etymon/text
828
1357626
6532063
6371307
2026-09-18T17:44:23Z
Wikihez
7344
language and family names link to their category instead of Wikipedia; a family now reads "zimanên îranî"; glossary links point at Nimînok:Ferhengok (tree keeps a full "Rûpel#lenger" target); Kurdish names, shorthands and tree labels for nomînalîzasyon, ûnîverbasyon, translîterasyon, redûblîkasyon, elîpsîz, akronîm, înîtîalîzm, deynort, deynne
6532063
Scribunto
text/plain
local export = {}
local loader = require("Module:module loader")
local M = loader.init({
require = {
en_utilities = "Module:en-utilities",
references = "Module:references",
senseno = "Module:senseno",
},
loadData = {
data = "Module:etymon/data",
},
})
function export.render(opts)
opts = opts or {}
local data_tree = opts.data_tree
local format_term_func = opts.format_term_func
local max_depth = opts.max_depth
local stop_at_blue_link = opts.stop_at_blue_link
local curr_page = opts.curr_page
local nodot = opts.nodot and opts.nodot ~= "" and opts.nodot ~= "0"
local function explicit_dot_override()
if opts.dot == nil or opts.dot == false then
return nil
end
local d = mw.text.trim(tostring(opts.dot))
if d == "" or d == "." then
return nil
end
return d
end
local dot_override = explicit_dot_override()
local function find_deepest_last_part(tree)
if not tree or not tree.container_parts or #tree.container_parts == 0 then
return nil
end
local last_part = tree.container_parts[#tree.container_parts]
if last_part.continuation then
return find_deepest_last_part(last_part.continuation)
end
return last_part
end
local function apply_final_punctuation_override(tree, punct)
if not tree or punct == nil then
return
end
local last_part = find_deepest_last_part(tree)
if last_part then
last_part.punctuation = punct
end
end
local function apply_closing_punctuation_override(tree, is_last_segment)
if not is_last_segment then
return
end
local punct
if nodot then
punct = ""
elseif dot_override ~= nil then
punct = dot_override
else
return
end
apply_final_punctuation_override(tree, punct)
end
local function has_supplements()
return data_tree.supplements and #data_tree.supplements > 0
end
local stop_at_lang = opts.stop_at_lang
local stop_at_lang_or_bluelink = opts.stop_at_lang_or_bluelink
local lang_matches_stop_code = opts.lang_matches_stop_code
local stop_lang_reached = false
local function term_matches_stop_code(term_lang, stop_code)
if lang_matches_stop_code then
return lang_matches_stop_code(term_lang, stop_code)
end
return term_lang and term_lang:getCode() == stop_code
end
local children = data_tree.children
local function has_text_supplements()
if not data_tree.supplements then
return false
end
for _, supplement in ipairs(data_tree.supplements) do
if supplement.type == "doublet" and supplement.terms and #supplement.terms > 0 then
return true
end
if supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then
return true
end
end
return false
end
if (not children or #children == 0) and not has_text_supplements() then
if stop_at_lang then
return "", { stop_lang_reached = false }
end
return ""
end
local top_l2 = data_tree.lang:getFullCode() .. ":" .. curr_page
local entry_lang = data_tree.lang
local function lowercase_glossary_link_display(wikitext)
return wikitext:gsub("(%[%[Nimînok:Ferhengok#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest)
return prefix .. mw.ustring.lower(first) .. rest .. "]]"
end)
end
local function format_sl_senseid_intro(senseid, keyword_text, keyword_phrase, capitalize_senseno, is_uncertain)
local senseids = mw.text.split(senseid, "!!", true)
local senseno_parts = {}
for i, id in ipairs(senseids) do
id = mw.text.trim(id)
if id ~= "" then
table.insert(senseno_parts, M.senseno.link_text(entry_lang:getCode(), { id }, {
title = curr_page,
uc = (i == 1 and capitalize_senseno) or nil,
}))
end
end
if #senseno_parts == 0 then
return keyword_text, keyword_phrase
end
local senseno_text = mw.text.listToText(senseno_parts)
local glossary_link = (keyword_text or ""):gsub(" from$", "")
local glossary_lower = lowercase_glossary_link_display(glossary_link)
if #senseno_parts > 1 then
local plural_link = glossary_lower:gsub("|semantic loan%]%]", "|semantic loans]]")
if is_uncertain then
return senseno_text .. " are possibly " .. plural_link .. " from",
senseno_text .. " are possibly semantic loans from"
end
return senseno_text .. " are " .. plural_link .. " from",
senseno_text .. " are semantic loans from"
end
if is_uncertain then
return senseno_text .. " is possibly a " .. glossary_lower .. " from",
senseno_text .. " is possibly a semantic loan from"
end
return senseno_text .. " is a " .. glossary_lower .. " from",
senseno_text .. " is a semantic loan from"
end
-- Get refs for a term
local function get_term_refs(term, term_lang, depth)
local term_l2 = term_lang:getFullCode() .. ":" .. curr_page
if term.parsed_ref and (depth == 1 or term_l2 == top_l2) then
return M.references.format_references(term.parsed_ref)
end
return ""
end
-- Build a text part for a single term
local function build_term_part(term, current_lang, depth)
local text = ""
local new_lang = current_lang
local lang_changed = term.lang:getCanonicalName() ~= current_lang:getCanonicalName()
-- Use centralized format_term (handles suppress_term, unknown_term, and regular terms)
local term_text = format_term_func(term)
if lang_changed then
new_lang = term.lang
if term_text then
text = term.lang:makeCategoryLink(true) .. " " .. term_text
elseif term.is_family then
text = term.lang:makeCategoryLink(true) -- a family: "zimanên îranî"
else
-- suppress_term with language change: show only language
text = term.lang:makeCategoryLink(true)
end
else
text = term_text or ""
end
return {
type = "term",
text = text,
refs = get_term_refs(term, new_lang, depth),
lang = new_lang,
is_uncertain = term.is_uncertain or false,
}
end
-- Build text parts for a container
local function build_container_part(container, node, depth, allow_continuation, fallback_to_bluelink)
local keyword_info = container.keyword_info
local keyword_modifiers = container.keyword_modifiers or {}
local terms = container.terms or {}
if not keyword_info or #terms == 0 then
return nil
end
-- Skip building text part when invisible in text ("all", "text", or true)
local inv = keyword_info.invisible
if inv == "all" or inv == true or inv == "text" then
return nil
end
local is_group = keyword_info.is_group
local keyword_uncertain = keyword_modifiers.unc or false
-- Determine text and phrase (allowing for overrides)
local intro_text = keyword_info.text
local phrase = keyword_info.phrase
local new_sentence = keyword_info.new_sentence or false
if keyword_modifiers.text then
-- User-provided override: assumed to be lowercase
phrase = keyword_modifiers.text
-- Auto-capitalize for intro text (e.g., "derived from" -> "Derived from")
intro_text = mw.ustring.upper(phrase:sub(1, 1)) .. phrase:sub(2)
end
-- Get keyword references
local keyword_refs = ""
if keyword_modifiers.ref then
local parsed_keyword_refs = M.references.parse_references(keyword_modifiers.ref)
if parsed_keyword_refs and parsed_keyword_refs ~= "" then
keyword_refs = M.references.format_references(parsed_keyword_refs)
end
end
-- Build term parts
local term_parts = {}
local current_lang = node.lang
for _, term in ipairs(terms) do
local term_part = build_term_part(term, current_lang, depth)
if term_part.text ~= "" then
table.insert(term_parts, term_part)
current_lang = term_part.lang
end
end
-- Check uncertainty distribution
local uncertain_count = 0
for _, term_part in ipairs(term_parts) do
if term_part.is_uncertain then
uncertain_count = uncertain_count + 1
end
end
-- If keyword itself is uncertain, treat all terms as uncertain
local all_uncertain = keyword_uncertain or (uncertain_count == #term_parts and #term_parts > 0)
if is_group and uncertain_count > 0 then
all_uncertain = true
end
local has_mixed_uncertainty = not all_uncertain and uncertain_count > 0
-- Check if there are more steps (only if continuation is allowed)
local has_more_steps = false
local next_node = nil
local first_term = terms[1]
-- Check if we should stop at this language
local reached_stop_lang = false
if stop_at_lang then
for _, term in ipairs(terms) do
if term.lang and term_matches_stop_code(term.lang, stop_at_lang) then
reached_stop_lang = true
stop_lang_reached = true
break
end
end
elseif stop_at_lang_or_bluelink then
-- Check if we should stop at this language, or at the first bluelink if it's a redlink
for _, term in ipairs(terms) do
if term.lang and term_matches_stop_code(term.lang, stop_at_lang_or_bluelink) then
if first_term.status == M.data.STATUS.OK then
reached_stop_lang = true
else
fallback_to_bluelink = true
end
break
end
end
if fallback_to_bluelink and first_term.status == M.data.STATUS.OK then
reached_stop_lang = true
end
end
if allow_continuation and not is_group and #terms == 1 and not reached_stop_lang then
local first_term_children = first_term.children
if first_term_children and #first_term_children > 0 and (not max_depth or depth < max_depth) then
local next_container = first_term_children[1]
local next_keyword_info = next_container and next_container.keyword_info
if not (next_keyword_info and next_keyword_info.invisible) then
if stop_at_blue_link then
if first_term.status ~= M.data.STATUS.OK then
has_more_steps = true
next_node = first_term
end
else
has_more_steps = true
next_node = first_term
end
end
end
end
return {
type = "container",
intro_text = intro_text,
phrase = phrase,
senseid = keyword_modifiers.senseid,
sl_keyword_text = keyword_modifiers.senseid and keyword_info.text or nil,
is_uncertain = all_uncertain,
has_mixed_uncertainty = has_mixed_uncertainty,
term_parts = term_parts,
is_group = is_group,
has_more_steps = has_more_steps,
next_node = next_node,
new_sentence = new_sentence,
separate_clause = keyword_info.separate_clause or false,
conj = keyword_modifiers.conj or keyword_info.default_conj, -- custom conjunction: "and", "or", "and/or", etc.
lit = keyword_modifiers.lit,
keyword_refs = keyword_refs,
fallback_to_bluelink = fallback_to_bluelink,
}
end
-- Build the full tree of text parts
local function build_text_tree(node, depth, allow_continuation, fallback_to_bluelink)
local containers = node.children
if not containers or #containers == 0 then
return nil
end
local container_parts = {}
-- Count containers that get a text part (invisible in text = "all", "text", or true)
local visible_container_count = 0
for _, container in ipairs(containers) do
local keyword_info = container.keyword_info
local inv = keyword_info and keyword_info.invisible
if not (inv == "all" or inv == true or inv == "text") then
visible_container_count = visible_container_count + 1
end
end
-- If there are multiple visible containers at this level, don't allow continuation for any
local has_multiple_containers = visible_container_count > 1
local should_allow_continuation = allow_continuation and not has_multiple_containers
for _, container in ipairs(containers) do
local part = build_container_part(container, node, depth, should_allow_continuation, fallback_to_bluelink)
if part then
-- Recursively build children if there are more steps
if part.has_more_steps and part.next_node then
part.continuation = build_text_tree(part.next_node, depth + 1, true, part.fallback_to_bluelink)
end
table.insert(container_parts, part)
end
end
if #container_parts == 0 then
return nil
end
return {
type = "tree",
container_parts = container_parts,
depth = depth,
}
end
-- Check if tree has mixed joining types
local function container_join_kind(part)
if part.type == "etydate" then
return nil
end
if part.new_sentence or part.separate_clause then
return "supplement"
end
return "or_join"
end
local function check_complexity(tree)
if not tree then return nil end
local parts = tree.container_parts
if #parts <= 1 then
-- Single container
if parts[1] and parts[1].continuation then
return check_complexity(parts[1].continuation)
end
return nil
end
-- Or-join containers must precede any supplemental (calque-like / influence) containers.
local seen_supplement = false
for _, part in ipairs(parts) do
local kind = container_join_kind(part)
if kind == "supplement" then
seen_supplement = true
elseif kind == "or_join" and seen_supplement then
error(
"Cannot generate etymology text: a main derivation step cannot follow a calque, semantic loan, or influence clause in the same list.")
end
end
for _, part in ipairs(parts) do
if part.continuation then
check_complexity(part.continuation)
end
end
return nil
end
-- Analyze tree and assign punctuation
local function analyze_punctuation(tree, is_toplevel)
if not tree then return end
local parts = tree.container_parts
local num_parts = #parts
for i, part in ipairs(parts) do
local is_first = (i == 1)
local is_last = (i == num_parts)
local next_part = parts[i + 1]
-- Analyze term punctuation within container
if part.term_parts then
-- Terms use Oxford comma style: "A, B, yan jî C"
-- Custom conjunction can be specified via conj modifier (e.g., "and/or", "and")
local num_terms = #part.term_parts
local term_conj = part.conj or "yan jî" -- Kurdish default
for j, term_part in ipairs(part.term_parts) do
local is_last_term = (j == num_terms)
if part.is_group then
-- Group: terms joined with " + "
term_part.joiner = is_last_term and "" or " + "
elseif num_terms > 1 then
-- Multiple terms not in a group: Oxford comma style
if is_last_term then
term_part.joiner = ""
elseif j == num_terms - 1 then
-- Second to last term
if num_terms == 2 then
term_part.joiner = " " .. term_conj .. " "
else
term_part.joiner = ", " .. term_conj .. " "
end
else
term_part.joiner = ", "
end
else
-- Single term
term_part.joiner = ""
end
end
end
-- Determine container punctuation based on what comes next
if part.continuation then
-- Has continuation
part.punctuation = ","
-- Recursively analyze continuation
analyze_punctuation(part.continuation, false)
elseif is_last then
-- Last container at this level (may still continue in part.continuation)
part.punctuation = "."
elseif next_part and next_part.new_sentence then
-- Next container starts a new sentence
part.punctuation = "."
elseif next_part and next_part.separate_clause then
-- Next container is a separate clause
part.punctuation = ","
else
-- Not last, next is joined with the conjunction
-- Containers use repeated conjunction style: "A, yan jî B, yan jî C"
part.punctuation = ","
end
-- Determine joiner to next part
-- Containers use the repeated conjunction between each
-- Custom conjunction can be specified via conj modifier
local container_conj = part.conj or "yan jî" -- Kurdish default
if not is_last then
if next_part and next_part.new_sentence then
-- New sentence
part.joiner = " "
elseif next_part and next_part.separate_clause then
-- Separate clause
part.joiner = " "
else
-- Same sentence: use the custom conjunction, else the default
part.joiner = " " .. container_conj .. " "
end
else
part.joiner = ""
end
-- Determine intro formatting
-- Capitalize if first at top level, OR if this container starts a new sentence
if (is_first and is_toplevel) or part.new_sentence then
part.intro_capitalized = true
part.use_full_intro = true
else
part.intro_capitalized = false
part.use_full_intro = false
end
end
end
-- Assemble text from analyzed tree
local function assemble_text(tree)
if not tree then return "" end
local result = ""
for i, part in ipairs(tree.container_parts) do
if part.type == "etydate" then
result = result .. part.etydate_text
if part.punctuation and part.punctuation ~= "" then
result = result .. part.punctuation
end
if part.etydate_refs and next(part.etydate_refs) then
result = result .. M.references.format_references(part.etydate_refs)
end
if part.joiner and part.joiner ~= "" then
result = result .. part.joiner
end
else
-- Build intro
local intro_text = part.intro_text
local phrase = part.phrase
if part.senseid then
intro_text, phrase = format_sl_senseid_intro(
part.senseid,
part.sl_keyword_text,
part.phrase,
part.intro_capitalized,
part.is_uncertain
)
end
local intro
if part.use_full_intro then
if part.is_uncertain and not part.senseid then
intro = "Mihtemelen " .. phrase
else
intro = intro_text
end
else
if part.is_uncertain and not part.senseid then
intro = "mihtemelen " .. phrase
else
intro = phrase
end
end
result = result .. intro
-- Build terms
if #part.term_parts > 0 then
result = result .. " "
for j, term_part in ipairs(part.term_parts) do
-- Add "possibly" prefix for uncertain terms when there's mixed uncertainty
if part.has_mixed_uncertainty and term_part.is_uncertain then
result = result .. "mihtemelen "
end
result = result .. term_part.text
-- Add joiner between terms
if term_part.joiner ~= "" then
-- Check if joiner contains comma (punctuation)
local comma_pos = term_part.joiner:find(",")
if comma_pos then
-- Add up to and including comma
result = result .. term_part.joiner:sub(1, comma_pos)
-- Add refs after comma
if term_part.refs ~= "" then
result = result .. term_part.refs
end
-- Add rest of joiner
result = result .. term_part.joiner:sub(comma_pos + 1)
else
-- No comma, add refs before joiner
if term_part.refs ~= "" then
result = result .. term_part.refs
end
result = result .. term_part.joiner
end
end
end
-- For the last term, add punctuation then refs
local last_term = part.term_parts[#part.term_parts]
if last_term and last_term.joiner == "" then
if part.punctuation ~= "" then
-- If we have literal text, punctuation goes AFTER it
if part.lit then
-- Add refs first (attached to term)
if last_term.refs ~= "" then
result = result .. last_term.refs
end
-- Add keyword refs
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
-- Add literal text
result = result .. ", literally “" .. part.lit .. "”"
-- Add punctuation
result = result .. part.punctuation
else
-- Normal behavior: punctuation then refs
result = result .. part.punctuation
if last_term.refs ~= "" then
result = result .. last_term.refs
end
-- Add keyword refs after term refs
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
end
else
-- No punctuation
if last_term.refs ~= "" then
result = result .. last_term.refs
end
-- Add keyword refs
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
-- Add literal text if present (even without punctuation)
if part.lit then
result = result .. ", literally “" .. part.lit .. "”"
end
end
end
else
-- No terms, just add punctuation and keyword refs
if part.punctuation ~= "" then
result = result .. part.punctuation
end
-- Add keyword refs even when there are no terms
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
end
-- Add continuation
if part.continuation then
result = result .. " " .. assemble_text(part.continuation)
end
-- Add joiner to next container
if part.joiner ~= "" then
result = result .. part.joiner
end
end
end
return result
end
local text_tree = build_text_tree(data_tree, 1, true, false)
-- Supplements (doublets, etydate, …) are rendered outside the main derivation text tree.
local function assemble_supplements()
if not data_tree.supplements then
return ""
end
local chunks = {}
local pending_trees = {}
local function flush_pending_trees()
local num = #pending_trees
for i, supplement_tree in ipairs(pending_trees) do
analyze_punctuation(supplement_tree, true)
apply_closing_punctuation_override(supplement_tree, i == num)
local chunk = assemble_text(supplement_tree)
if chunk ~= "" then
table.insert(chunks, chunk)
end
end
pending_trees = {}
end
for _, supplement in ipairs(data_tree.supplements) do
local supplement_tree
if supplement.type == "doublet" and supplement.config
and supplement.terms and #supplement.terms > 0 then
local config = supplement.config
local term_parts = {}
for _, term in ipairs(supplement.terms) do
local term_part = build_term_part(term, entry_lang, 1)
if term_part.text ~= "" then
table.insert(term_parts, term_part)
end
end
if #term_parts == 0 then
supplement_tree = nil
else
supplement_tree = {
type = "tree",
container_parts = {
{
type = "doublet",
intro_text = config.text,
phrase = config.phrase,
term_parts = term_parts,
conj = config.default_conj or "û",
new_sentence = true,
},
},
depth = 1,
}
end
elseif supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then
supplement_tree = {
type = "tree",
container_parts = {
{
type = "etydate",
etydate_text = supplement.etydate_text,
etydate_refs = supplement.etydate_refs,
new_sentence = true,
},
},
depth = 1,
}
end
if supplement_tree then
table.insert(pending_trees, supplement_tree)
end
end
flush_pending_trees()
return table.concat(chunks, " ")
end
if not text_tree then
local supplement_text = assemble_supplements()
if supplement_text == "" then
if stop_at_lang then
return "", { stop_lang_reached = false }
end
return ""
end
if stop_at_lang then
return supplement_text, { stop_lang_reached = false }
end
return supplement_text
end
local rendered = ""
if text_tree then
check_complexity(text_tree)
analyze_punctuation(text_tree, true)
apply_closing_punctuation_override(text_tree, not has_supplements())
rendered = assemble_text(text_tree)
end
local supplement_text = assemble_supplements()
if supplement_text ~= "" then
if rendered ~= "" then
rendered = rendered .. " " .. supplement_text
else
rendered = supplement_text
end
end
if stop_at_lang then
return rendered, { stop_lang_reached = stop_lang_reached }
end
return rendered
end
return export
pqx8yjht5pzl03xvsevt2srnfeaxp08
Bikarhêner:Wikihez/Gadget-test/loader.js
2
1358398
6532016
6531989
2026-09-18T14:21:24Z
Wikihez
7344
Test loader: EtytreeZoom out again, its change is live
6532016
javascript
text/javascript
// <nowiki>
// Test harness for the gadgets. Loaded from [[MediaWiki:Gadget-test.js]], which is one line:
// mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/Gadget-test/loader.js&action=raw&ctype=text/javascript');
//
// Runs the userspace copies in place of the site's gadgets, under the same module names. A gadget the
// wiki has registered but not yet loaded is implemented here from the test page instead, so its
// dependencies are the real ones from [[MediaWiki:Gadgets-definition]]. One already loading from the wiki
// cannot be replaced: turn the default gadgets that load it (start and wikt.dsb load wikt.core) off in
// Special:Preferences while testing, and this names any that are still on.
//
// MODULES lists only the gadgets with changes not yet live; everything else runs the site's copy. A
// gadget is added back when it is being changed, and taken out once that change is deployed.
(function () {
"use strict";
// Set synchronously, before add-examples' DOM-ready pass, so its own inline link is never built.
window.wikt = window.wikt || {};
wikt.addExamples = wikt.addExamples || {};
wikt.addExamples.suppressLinks = true;
// Subpage segments are case-sensitive, so BASE must match the pages exactly.
var BASE = "Bikarhêner:Wikihez/Gadget-test";
// A value carrying a namespace is used as the whole title; anything else is appended to BASE.
function pageTitle(suffix) {
return suffix.indexOf(":") !== -1 ? suffix : BASE + suffix;
}
// module name -> package ({main, files}) or plain script ({script}), plus styles.
// deferred held back until something asks for it, as production fetches it only then
// start asked for on page load, as production loads a default gadget
// deps only for a gadget not yet in Gadgets-definition; a registered one keeps the wiki's
// actions with start, only on these wgAction values, as a definition's "actions=" does
var MODULES = {
"ext.gadget.wikt.core": {
main: "wikt.core.js",
files: {
// Keyed exactly as Gadgets-definition names them, so a require that would fail in
// production fails here first.
"wikt.core.js": "/wikt-core.js",
"wikt.core/sections.js": "/sections.js",
"wikt.core/prefs.js": "/prefs.js",
"wikt.core/data-sections.json": "/data-sections.json"
},
styles: ["/tokens.css"]
},
"ext.gadget.wikt.edit": {
main: "wikt.edit.js",
files: {
"wikt.edit.js": "/wikt-edit.js",
"wikt.edit/util.js": "/util.js",
"wikt.edit/wikitext.js": "/wikitext.js",
"wikt.edit/langs.js": "/langs.js",
"wikt.edit/labels.js": "/labels.js",
"wikt.edit/posparams.js": "/posparams.js",
"wikt.edit/data-main.json": "/data-main.json",
"wikt.edit/ziman-core.json": "/ziman-core.json"
},
styles: ["/wikt-edit.css"]
},
"ext.gadget.wikt.cite": {
main: "wikt.cite.js",
files: { "wikt.cite.js": "/cite.js" },
styles: ["/cite.css"]
},
// Unchanged, but it is what loads the modules above and below, and it is off in Preferences while
// they are tested.
"ext.gadget.wikt.dsb": {
start: true,
main: "wikt.dsb.js",
files: { "wikt.dsb.js": "/dsb.js" },
styles: ["/dsb.css"]
},
"ext.gadget.wikt.dsb-panels": {
deferred: true,
main: "wikt.dsb-panels.js",
files: { "wikt.dsb-panels.js": "/dsb-panels.js" },
styles: ["/dsb-panels.css"]
}
};
// Force dataType "text": otherwise jQuery sees action=raw's JavaScript Content-Type and runs it.
function raw(suffix) {
return $.get({
url: mw.util.getUrl(pageTitle(suffix), { action: "raw" }),
dataType: "text"
});
}
function run() {
var names = Object.keys(MODULES);
// A module the wiki has started loading cannot be implemented a second time.
var busy = names.filter(function (name) {
var state = mw.loader.getState(name);
return state !== null && state !== "registered";
});
if (busy.length) {
console.warn("loader.js: already loaded from the wiki, so the site's copy runs: " + busy.join(", "));
mw.notify("loader.js: van amûran di Tercîhan de bigire, da ku kopiya ceribandinê bixebite: " +
busy.map(function (n) { return n.replace("ext.gadget.", ""); }).join(", "), { type: "warn" });
}
var ours = names.filter(function (name) {
return busy.indexOf(name) === -1;
});
// Every distinct page this harness needs, fetched once each.
var suffixes = [];
function need(suffix) {
if (suffixes.indexOf(suffix) === -1) {
suffixes.push(suffix);
}
}
ours.forEach(function (name) {
var m = MODULES[name];
if (m.script) {
need(m.script);
} else {
Object.keys(m.files).forEach(function (key) { need(m.files[key]); });
}
m.styles.forEach(need);
});
if (!suffixes.length) {
return;
}
$.when.apply($, suffixes.map(raw)).done(function () {
var args = suffixes.length === 1 ? [arguments] : [].slice.call(arguments);
var text = {};
suffixes.forEach(function (s, i) {
text[s] = args[i][0];
});
// Styles go in directly: a stylesheet passed to implement() that never fires its load event
// leaves the module stuck in "executing", and everything queued behind it with it.
function addStyles(styles) {
(styles || []).forEach(function (suffix) {
if (text[suffix]) {
mw.util.addCSS(text[suffix]);
}
});
}
var bad = null;
var payloads = {};
ours.forEach(function (name) {
var m = MODULES[name];
if (m.script) {
payloads[name] = new Function("$", "jQuery", "require", "module", text[m.script]);
return;
}
var files = {};
Object.keys(m.files).forEach(function (key) {
var src = text[m.files[key]];
if (key.slice(-5) === ".json") {
try {
files[key] = JSON.parse(src);
} catch (e) {
bad = m.files[key] + " nederbasdar e (JSON parse ket): " + e.message;
}
return;
}
files[key] = new Function("require", "module", "exports", src);
});
payloads[name] = { main: m.main, files: files };
});
if (bad) {
mw.notify(bad, { type: "error" });
return;
}
// implement() runs a module as soon as its dependencies are ready, so a deferred one is
// handed over only when something asks for it.
function implement(name) {
if (!payloads[name]) {
return;
}
var payload = payloads[name];
delete payloads[name];
if (mw.loader.getState(name) === null) {
mw.loader.register(name, "0", MODULES[name].deps || []);
} else if (mw.loader.getState(name) !== "registered") {
console.warn("loader.js: " + name + " is already loading from the wiki; its copy runs.");
return;
}
mw.loader.implement(name, payload);
addStyles(MODULES[name].styles);
}
// A deferred module reached as another's dependency is handed over too, or ResourceLoader
// fetches the site's copy of it instead.
function withDeps(list) {
var out = [];
(function walk(items) {
(items || []).forEach(function (n) {
if (out.indexOf(n) !== -1) {
return;
}
out.push(n);
var entry = mw.loader.moduleRegistry[n];
walk(entry ? entry.dependencies : MODULES[n] && MODULES[n].deps);
});
}(list));
return out;
}
var origUsing = mw.loader.using;
mw.loader.using = function (modules) {
withDeps([].concat(modules || [])).forEach(implement);
return origUsing.apply(this, arguments);
};
ours.forEach(function (name) {
if (!MODULES[name].deferred) {
implement(name);
}
});
var action = mw.config.get("wgAction");
var starting = ours.filter(function (name) {
var m = MODULES[name];
return m.start && (!m.actions || m.actions.indexOf(action) !== -1);
});
var settled = false;
mw.loader.using(starting).then(function () {
settled = true;
console.log("loader.js: started " + starting.join(", "));
}, function (err) {
settled = true;
mw.notify("Xeta barkirinê: " + err, { type: "error" });
});
// A dependency stuck half-loaded leaves using() pending forever, with no error at all.
setTimeout(function () {
if (settled) {
return;
}
var stuck = withDeps(starting)
.filter(function (m) { return mw.loader.getState(m) !== "ready"; })
.map(function (m) { return m + "=" + mw.loader.getState(m); });
mw.notify("Barkirin asê ma: " + stuck.join(", "), { type: "warn" });
}, 10000);
}).fail(function () {
mw.notify("Nikare hemû rûpelên " + BASE + " bixwîne: " + suffixes.join(", "), { type: "error" });
});
}
// The test gadget declares no dependencies, so mw.util is not there yet when this runs.
mw.loader.using("mediawiki.util").then(run);
})();
// </nowiki>
jn6wse86lukvbpik28qkvn80n3jd0al
6532106
6532016
2026-09-18T20:35:19Z
Wikihez
7344
Etymology: add a builder for {{etîmon}} to the shared template dialog, with its keywords, modifiers and metn= values in data-main.json
6532106
javascript
text/javascript
// <nowiki>
// Test harness for the gadgets. Loaded from [[MediaWiki:Gadget-test.js]], which is one line:
// mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/Gadget-test/loader.js&action=raw&ctype=text/javascript');
//
// Runs the userspace copies in place of the site's gadgets, under the same module names. A gadget the
// wiki has registered but not yet loaded is implemented here from the test page instead, so its
// dependencies are the real ones from [[MediaWiki:Gadgets-definition]]. One already loading from the wiki
// cannot be replaced: turn the default gadgets that load it (start and wikt.dsb load wikt.core) off in
// Special:Preferences while testing, and this names any that are still on.
//
// MODULES lists only the gadgets with changes not yet live; everything else runs the site's copy. A
// gadget is added back when it is being changed, and taken out once that change is deployed.
(function () {
"use strict";
// Set synchronously, before add-examples' DOM-ready pass, so its own inline link is never built.
window.wikt = window.wikt || {};
wikt.addExamples = wikt.addExamples || {};
wikt.addExamples.suppressLinks = true;
// Subpage segments are case-sensitive, so BASE must match the pages exactly.
var BASE = "Bikarhêner:Wikihez/Gadget-test";
// A value carrying a namespace is used as the whole title; anything else is appended to BASE.
function pageTitle(suffix) {
return suffix.indexOf(":") !== -1 ? suffix : BASE + suffix;
}
// module name -> package ({main, files}) or plain script ({script}), plus styles.
// deferred held back until something asks for it, as production fetches it only then
// start asked for on page load, as production loads a default gadget
// deps only for a gadget not yet in Gadgets-definition; a registered one keeps the wiki's
// actions with start, only on these wgAction values, as a definition's "actions=" does
var MODULES = {
"ext.gadget.wikt.core": {
main: "wikt.core.js",
files: {
// Keyed exactly as Gadgets-definition names them, so a require that would fail in
// production fails here first.
"wikt.core.js": "/wikt-core.js",
"wikt.core/sections.js": "/sections.js",
"wikt.core/prefs.js": "/prefs.js",
"wikt.core/data-sections.json": "/data-sections.json"
},
styles: ["/tokens.css"]
},
"ext.gadget.wikt.edit": {
main: "wikt.edit.js",
files: {
"wikt.edit.js": "/wikt-edit.js",
"wikt.edit/util.js": "/util.js",
"wikt.edit/wikitext.js": "/wikitext.js",
"wikt.edit/langs.js": "/langs.js",
"wikt.edit/labels.js": "/labels.js",
"wikt.edit/posparams.js": "/posparams.js",
"wikt.edit/data-main.json": "/data-main.json",
"wikt.edit/ziman-core.json": "/ziman-core.json"
},
styles: ["/wikt-edit.css"]
},
"ext.gadget.wikt.cite": {
main: "wikt.cite.js",
files: {
"wikt.cite.js": "/cite.js",
"wikt.cite/etimon.js": "/etimon.js"
},
styles: ["/cite.css"]
},
// Unchanged, but it is what loads the modules above and below, and it is off in Preferences while
// they are tested.
"ext.gadget.wikt.dsb": {
start: true,
main: "wikt.dsb.js",
files: { "wikt.dsb.js": "/dsb.js" },
styles: ["/dsb.css"]
},
"ext.gadget.wikt.dsb-panels": {
deferred: true,
main: "wikt.dsb-panels.js",
files: { "wikt.dsb-panels.js": "/dsb-panels.js" },
styles: ["/dsb-panels.css"]
}
};
// Force dataType "text": otherwise jQuery sees action=raw's JavaScript Content-Type and runs it.
function raw(suffix) {
return $.get({
url: mw.util.getUrl(pageTitle(suffix), { action: "raw" }),
dataType: "text"
});
}
function run() {
var names = Object.keys(MODULES);
// A module the wiki has started loading cannot be implemented a second time.
var busy = names.filter(function (name) {
var state = mw.loader.getState(name);
return state !== null && state !== "registered";
});
if (busy.length) {
console.warn("loader.js: already loaded from the wiki, so the site's copy runs: " + busy.join(", "));
mw.notify("loader.js: van amûran di Tercîhan de bigire, da ku kopiya ceribandinê bixebite: " +
busy.map(function (n) { return n.replace("ext.gadget.", ""); }).join(", "), { type: "warn" });
}
var ours = names.filter(function (name) {
return busy.indexOf(name) === -1;
});
// Every distinct page this harness needs, fetched once each.
var suffixes = [];
function need(suffix) {
if (suffixes.indexOf(suffix) === -1) {
suffixes.push(suffix);
}
}
ours.forEach(function (name) {
var m = MODULES[name];
if (m.script) {
need(m.script);
} else {
Object.keys(m.files).forEach(function (key) { need(m.files[key]); });
}
m.styles.forEach(need);
});
if (!suffixes.length) {
return;
}
$.when.apply($, suffixes.map(raw)).done(function () {
var args = suffixes.length === 1 ? [arguments] : [].slice.call(arguments);
var text = {};
suffixes.forEach(function (s, i) {
text[s] = args[i][0];
});
// Styles go in directly: a stylesheet passed to implement() that never fires its load event
// leaves the module stuck in "executing", and everything queued behind it with it.
function addStyles(styles) {
(styles || []).forEach(function (suffix) {
if (text[suffix]) {
mw.util.addCSS(text[suffix]);
}
});
}
var bad = null;
var payloads = {};
ours.forEach(function (name) {
var m = MODULES[name];
if (m.script) {
payloads[name] = new Function("$", "jQuery", "require", "module", text[m.script]);
return;
}
var files = {};
Object.keys(m.files).forEach(function (key) {
var src = text[m.files[key]];
if (key.slice(-5) === ".json") {
try {
files[key] = JSON.parse(src);
} catch (e) {
bad = m.files[key] + " nederbasdar e (JSON parse ket): " + e.message;
}
return;
}
files[key] = new Function("require", "module", "exports", src);
});
payloads[name] = { main: m.main, files: files };
});
if (bad) {
mw.notify(bad, { type: "error" });
return;
}
// implement() runs a module as soon as its dependencies are ready, so a deferred one is
// handed over only when something asks for it.
function implement(name) {
if (!payloads[name]) {
return;
}
var payload = payloads[name];
delete payloads[name];
if (mw.loader.getState(name) === null) {
mw.loader.register(name, "0", MODULES[name].deps || []);
} else if (mw.loader.getState(name) !== "registered") {
console.warn("loader.js: " + name + " is already loading from the wiki; its copy runs.");
return;
}
mw.loader.implement(name, payload);
addStyles(MODULES[name].styles);
}
// A deferred module reached as another's dependency is handed over too, or ResourceLoader
// fetches the site's copy of it instead.
function withDeps(list) {
var out = [];
(function walk(items) {
(items || []).forEach(function (n) {
if (out.indexOf(n) !== -1) {
return;
}
out.push(n);
var entry = mw.loader.moduleRegistry[n];
walk(entry ? entry.dependencies : MODULES[n] && MODULES[n].deps);
});
}(list));
return out;
}
var origUsing = mw.loader.using;
mw.loader.using = function (modules) {
withDeps([].concat(modules || [])).forEach(implement);
return origUsing.apply(this, arguments);
};
ours.forEach(function (name) {
if (!MODULES[name].deferred) {
implement(name);
}
});
var action = mw.config.get("wgAction");
var starting = ours.filter(function (name) {
var m = MODULES[name];
return m.start && (!m.actions || m.actions.indexOf(action) !== -1);
});
var settled = false;
mw.loader.using(starting).then(function () {
settled = true;
console.log("loader.js: started " + starting.join(", "));
}, function (err) {
settled = true;
mw.notify("Xeta barkirinê: " + err, { type: "error" });
});
// A dependency stuck half-loaded leaves using() pending forever, with no error at all.
setTimeout(function () {
if (settled) {
return;
}
var stuck = withDeps(starting)
.filter(function (m) { return mw.loader.getState(m) !== "ready"; })
.map(function (m) { return m + "=" + mw.loader.getState(m); });
mw.notify("Barkirin asê ma: " + stuck.join(", "), { type: "warn" });
}, 10000);
}).fail(function () {
mw.notify("Nikare hemû rûpelên " + BASE + " bixwîne: " + suffixes.join(", "), { type: "error" });
});
}
// The test gadget declares no dependencies, so mw.util is not there yet when this runs.
mw.loader.using("mediawiki.util").then(run);
})();
// </nowiki>
890bn76hx85qj14qnudyebr3vwza360
6533100
6532106
2026-09-19T10:19:12Z
Wikihez
7344
Test loader: empty the module list, everything in it is deployed
6533100
javascript
text/javascript
// <nowiki>
// Test harness for the gadgets. Loaded from [[MediaWiki:Gadget-test.js]], which is one line:
// mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/Gadget-test/loader.js&action=raw&ctype=text/javascript');
//
// Runs the userspace copies in place of the site's gadgets, under the same module names. A gadget the
// wiki has registered but not yet loaded is implemented here from the test page instead, so its
// dependencies are the real ones from [[MediaWiki:Gadgets-definition]]. One already loading from the wiki
// cannot be replaced: turn the default gadgets that load it (start and wikt.dsb load wikt.core) off in
// Special:Preferences while testing, and this names any that are still on.
//
// MODULES lists only the gadgets with changes not yet live; everything else runs the site's copy. A
// gadget is added back when it is being changed, and taken out once that change is deployed.
(function () {
"use strict";
// Set synchronously, before add-examples' DOM-ready pass, so its own inline link is never built.
window.wikt = window.wikt || {};
wikt.addExamples = wikt.addExamples || {};
wikt.addExamples.suppressLinks = true;
// Subpage segments are case-sensitive, so BASE must match the pages exactly.
var BASE = "Bikarhêner:Wikihez/Gadget-test";
// A value carrying a namespace is used as the whole title; anything else is appended to BASE.
function pageTitle(suffix) {
return suffix.indexOf(":") !== -1 ? suffix : BASE + suffix;
}
// module name -> package ({main, files}) or plain script ({script}), plus styles.
// deferred held back until something asks for it, as production fetches it only then
// start asked for on page load, as production loads a default gadget
// deps only for a gadget not yet in Gadgets-definition; a registered one keeps the wiki's
// actions with start, only on these wgAction values, as a definition's "actions=" does
var MODULES = {};
// Force dataType "text": otherwise jQuery sees action=raw's JavaScript Content-Type and runs it.
function raw(suffix) {
return $.get({
url: mw.util.getUrl(pageTitle(suffix), { action: "raw" }),
dataType: "text"
});
}
function run() {
var names = Object.keys(MODULES);
// A module the wiki has started loading cannot be implemented a second time.
var busy = names.filter(function (name) {
var state = mw.loader.getState(name);
return state !== null && state !== "registered";
});
if (busy.length) {
console.warn("loader.js: already loaded from the wiki, so the site's copy runs: " + busy.join(", "));
mw.notify("loader.js: van amûran di Tercîhan de bigire, da ku kopiya ceribandinê bixebite: " +
busy.map(function (n) { return n.replace("ext.gadget.", ""); }).join(", "), { type: "warn" });
}
var ours = names.filter(function (name) {
return busy.indexOf(name) === -1;
});
// Every distinct page this harness needs, fetched once each.
var suffixes = [];
function need(suffix) {
if (suffixes.indexOf(suffix) === -1) {
suffixes.push(suffix);
}
}
ours.forEach(function (name) {
var m = MODULES[name];
if (m.script) {
need(m.script);
} else {
Object.keys(m.files).forEach(function (key) { need(m.files[key]); });
}
m.styles.forEach(need);
});
if (!suffixes.length) {
return;
}
$.when.apply($, suffixes.map(raw)).done(function () {
var args = suffixes.length === 1 ? [arguments] : [].slice.call(arguments);
var text = {};
suffixes.forEach(function (s, i) {
text[s] = args[i][0];
});
// Styles go in directly: a stylesheet passed to implement() that never fires its load event
// leaves the module stuck in "executing", and everything queued behind it with it.
function addStyles(styles) {
(styles || []).forEach(function (suffix) {
if (text[suffix]) {
mw.util.addCSS(text[suffix]);
}
});
}
var bad = null;
var payloads = {};
ours.forEach(function (name) {
var m = MODULES[name];
if (m.script) {
payloads[name] = new Function("$", "jQuery", "require", "module", text[m.script]);
return;
}
var files = {};
Object.keys(m.files).forEach(function (key) {
var src = text[m.files[key]];
if (key.slice(-5) === ".json") {
try {
files[key] = JSON.parse(src);
} catch (e) {
bad = m.files[key] + " nederbasdar e (JSON parse ket): " + e.message;
}
return;
}
files[key] = new Function("require", "module", "exports", src);
});
payloads[name] = { main: m.main, files: files };
});
if (bad) {
mw.notify(bad, { type: "error" });
return;
}
// implement() runs a module as soon as its dependencies are ready, so a deferred one is
// handed over only when something asks for it.
function implement(name) {
if (!payloads[name]) {
return;
}
var payload = payloads[name];
delete payloads[name];
if (mw.loader.getState(name) === null) {
mw.loader.register(name, "0", MODULES[name].deps || []);
} else if (mw.loader.getState(name) !== "registered") {
console.warn("loader.js: " + name + " is already loading from the wiki; its copy runs.");
return;
}
mw.loader.implement(name, payload);
addStyles(MODULES[name].styles);
}
// A deferred module reached as another's dependency is handed over too, or ResourceLoader
// fetches the site's copy of it instead.
function withDeps(list) {
var out = [];
(function walk(items) {
(items || []).forEach(function (n) {
if (out.indexOf(n) !== -1) {
return;
}
out.push(n);
var entry = mw.loader.moduleRegistry[n];
walk(entry ? entry.dependencies : MODULES[n] && MODULES[n].deps);
});
}(list));
return out;
}
var origUsing = mw.loader.using;
mw.loader.using = function (modules) {
withDeps([].concat(modules || [])).forEach(implement);
return origUsing.apply(this, arguments);
};
ours.forEach(function (name) {
if (!MODULES[name].deferred) {
implement(name);
}
});
var action = mw.config.get("wgAction");
var starting = ours.filter(function (name) {
var m = MODULES[name];
return m.start && (!m.actions || m.actions.indexOf(action) !== -1);
});
var settled = false;
mw.loader.using(starting).then(function () {
settled = true;
console.log("loader.js: started " + starting.join(", "));
}, function (err) {
settled = true;
mw.notify("Xeta barkirinê: " + err, { type: "error" });
});
// A dependency stuck half-loaded leaves using() pending forever, with no error at all.
setTimeout(function () {
if (settled) {
return;
}
var stuck = withDeps(starting)
.filter(function (m) { return mw.loader.getState(m) !== "ready"; })
.map(function (m) { return m + "=" + mw.loader.getState(m); });
mw.notify("Barkirin asê ma: " + stuck.join(", "), { type: "warn" });
}, 10000);
}).fail(function () {
mw.notify("Nikare hemû rûpelên " + BASE + " bixwîne: " + suffixes.join(", "), { type: "error" });
});
}
// The test gadget declares no dependencies, so mw.util is not there yet when this runs.
mw.loader.using("mediawiki.util").then(run);
})();
// </nowiki>
q22g3500tyhz08rh8i8ss1jd2lzgr20
Bikarhêner:Wikihez/Gadget-test/langs.js
2
1358900
6532104
6353105
2026-09-18T20:34:59Z
Wikihez
7344
Etymology: add a builder for {{etîmon}} to the shared template dialog, with its keywords, modifiers and metn= values in data-main.json
6532104
javascript
text/javascript
// <nowiki>
/*
* Page: [[MediaWiki:Gadget-wikt.edit/langs.js]]
*/
// ~300 common languages ship with the gadget; the remaining ~3400 are fetched from the translation
// editor's copy only when a search finds nothing in the short list.
( function () {
"use strict";
var core = require( "./ziman-core.json" );
var FULL_PAGE = "MediaWiki:Gadget-translation editor.js/ziman.json";
var full = null;
var pending = null;
var listeners = [];
// {code: name} -- the full list once it has arrived, the short one until then.
function names() {
return full || core;
}
function isFull() {
return !!full;
}
// Resolves with the full list, fetched once; falls back to the short list rather than rejecting.
function ensureFull() {
if ( full ) {
return $.Deferred().resolve( full ).promise();
}
if ( pending ) {
return pending;
}
pending = $.get( {
url: mw.util.getUrl( FULL_PAGE, { action: "raw" } ),
dataType: "text"
} ).then( function ( text ) {
try {
full = $.extend( {}, core, JSON.parse( text ) );
} catch ( e ) {
full = core;
}
pending = null;
listeners.forEach( function ( fn ) {
fn( full );
} );
return full;
}, function () {
pending = null;
return core;
} );
return pending;
}
// True when the text names no language the short list knows -- the cue to go and fetch the rest.
function missingFromCore( query ) {
var wanted = $.trim( query || "" ).toLowerCase();
if ( !wanted || full ) {
return false;
}
var found = false;
Object.keys( core ).some( function ( code ) {
if ( code.toLowerCase().indexOf( wanted ) !== -1 ||
core[ code ].toLowerCase().indexOf( wanted ) !== -1 ) {
found = true;
return true;
}
return false;
} );
return !found;
}
// Called with the full list when it lands, so a picker built from the short one can rebuild itself.
function onFull( fn ) {
if ( full ) {
fn( full );
} else {
listeners.push( fn );
}
}
// One <datalist> for the whole page: 3693 options are far too many to rebuild per form, and a list
// can be shared by id, so every language box in every gadget points at this one.
var DATALIST_ID = "dsb-language-list";
function fillDatalist( $list ) {
var all = names();
$list.empty();
Object.keys( all ).forEach( function ( code ) {
$list.append( $( "<option></option>" ).val( code ).attr( "label", all[ code ] ) );
} );
}
function datalistId() {
if ( !document.getElementById( DATALIST_ID ) ) {
var $list = $( "<datalist></datalist>" ).attr( "id", DATALIST_ID );
fillDatalist( $list );
$( document.body ).append( $list );
// Refilled in place if the long list ever arrives, so every box using it grows at once.
onFull( function () {
fillDatalist( $( "#" + DATALIST_ID ) );
} );
}
return DATALIST_ID;
}
module.exports = {
names: names,
isFull: isFull,
ensureFull: ensureFull,
missingFromCore: missingFromCore,
onFull: onFull,
datalistId: datalistId
};
}() );
// </nowiki>
gz0t5o06ruekajg8el6j72y3uqg5eo5
Bikarhêner:Wikihez/Gadget-test/data-main.json
2
1358901
6532105
6425742
2026-09-18T20:35:09Z
Wikihez
7344
Etymology: add a builder for {{etîmon}} to the shared template dialog, with its keywords, modifiers and metn= values in data-main.json
6532105
json
application/json
{
"langChoices": {
"ku": "kurmancî",
"zza": "zazakî",
"ckb": "soranî",
"sdh": "kurdiya başûrî",
"hac": "hewramî",
"de": "almanî",
"ar": "erebî",
"fa": "farisî",
"fr": "fransî",
"fi": "fînî",
"en": "îngilîzî",
"ja": "japonî",
"sv": "swêdî",
"tr": "tirkî"
},
"posExamples": {
"navdêr": "Kelîmeyên ji bo tiştan (sêv, heywan, qedeh) yan terman (dilşadî, bextiyarî hwd.) di rêzimanê de.",
"lêker": "Kelîmeyên ji bo kirin an bûyînê wekî 'nivîsîn' yan 'xeber dan'.",
"rengdêr": "Kelîmeyên ku wesfa navdêran nîşan didin wekî 'sêva sor' yan 'xwarina şîrîn'.",
"hoker": "Kelîmeyên ku dem, cih yan awayê kirinê diyar dikin wekî 'bi vî awayî' yan 'demkî'.",
"daçek": "Kelîmeyên ku cih, dem yan hereketê diyar dikin wekî 'di.. de' yan 'ji'.",
"cînav": "Kelîmeyên ku li şûna navdêran tên bikaranîn daku navdêr neyên dubarekirin wekî 'ew' yan 'em'.",
"baneşan": "Kelîmeyên ku hest, deng hwd. îfade dikin wekî 'noşî!' yan 'aferîn'.",
"serenav": "Navdêrên ku şexsiyetên ferdî nîşan didin, wek navên kes, cih an organîzasyonan nimûne 'London' yan 'Diyarbekir'.",
"gotineke pêşiyan": "Gotinên ku di nav xelkê de bi berbelavî tên bikaranîn bo nimûne 'Serê neêşe ne hewceyî destmalê ye'."
},
"genderLabels": {
"m": "mê",
"n": "nêr",
"nt": "nêtar",
"mn": "mê yan nêr",
"mnmane": "mê yan nêr li gorî maneyê",
"mndudil": "mê yan nêr bikaranîn dudil e",
"g": "giştî",
"y": "yekjimar",
"p": "pirjimar"
},
"tplDefs": {
"rastnivîs": {
"langs": [
"ku"
],
"noLang": true
},
"ku-Latn": {
"langs": [
"ku"
],
"noLang": true
},
"ku-tewîna-nav": {
"langs": [
"ku"
],
"noLang": true
},
"sdh-Arab": {
"langs": [
"sdh"
],
"noLang": true
},
"hac-Arab": {
"langs": [
"hac"
],
"noLang": true
},
"ja-romanîzekirin": {
"langs": [
"ja"
],
"noLang": true
},
"ckb-Arab": {
"langs": [
"ckb"
],
"noLang": true
},
"zza-awayê-Jacobsonê": {
"langs": [
"zza"
]
},
"awayekî din": {
"langs": null
},
"guharto": {
"langs": null
},
"hevmaneya": {
"langs": null
},
"kevnbûyî": {
"langs": null
},
"kêmpeyda": {
"langs": null
},
"kurtkirin": {
"langs": null
},
"paşnav": {
"langs": null
},
"şaşnivîs": {
"langs": null
}
},
"jederDefs": {
"jêder-kitêb": {
"label": "Kitêb",
"fields": [
{
"key": "nivîskar",
"label": "Nivîskar",
"span": 3
},
{
"key": "terciman",
"label": "Terciman",
"span": 3
},
{
"key": "amadekar",
"label": "Amadekar",
"span": 3
},
{
"key": "weşanxane",
"label": "Weşanxane",
"span": 3
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "beş",
"label": "Beş",
"span": 3,
"width": "medium"
},
{
"key": "cih",
"label": "Cih",
"span": 2,
"width": "narrow"
},
{
"key": "sal",
"label": "Sal",
"span": 1,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3,
"width": "medium"
},
{
"key": "sala-weşandinê",
"label": "Sala weşandinê",
"span": 2,
"width": "narrow"
},
{
"key": "çap",
"label": "Çap",
"span": 1,
"width": "narrow"
},
{
"key": "cild",
"label": "Cild",
"span": 2,
"width": "narrow"
},
{
"key": "rûpel",
"label": "Rûpel",
"span": 1,
"width": "narrow"
},
{
"key": "isbn",
"label": "ISBN",
"span": 2,
"width": "narrow"
},
{
"key": "url",
"label": "URL",
"span": 12,
"width": "wide"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
}
]
},
"jêder-kovar": {
"label": "Kovar",
"fields": [
{
"key": "nivîskar",
"label": "Nivîskar",
"span": 3
},
{
"key": "terciman",
"label": "Terciman",
"span": 3
},
{
"key": "amadekar",
"label": "Amadekar",
"span": 3
},
{
"key": "weşanxane",
"label": "Weşanxane",
"span": 3
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "kovar",
"label": "Kovar",
"span": 4
},
{
"key": "cild",
"label": "Cild",
"span": 2,
"width": "narrow"
},
{
"key": "hejmar",
"label": "Hejmar",
"span": 2,
"width": "narrow"
},
{
"key": "sal",
"label": "Sal",
"span": 2,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3,
"width": "medium"
},
{
"key": "rûpel",
"label": "Rûpel",
"span": 2,
"width": "narrow"
},
{
"key": "issn",
"label": "ISSN",
"span": 2,
"width": "narrow"
},
{
"key": "doi",
"label": "DOI",
"span": 2,
"width": "narrow"
},
{
"key": "url",
"label": "URL",
"span": 12,
"width": "wide"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
}
]
},
"jêder-websîte": {
"label": "Websîte",
"fields": [
{
"key": "nivîskar",
"label": "Nivîskar",
"span": 4
},
{
"key": "terciman",
"label": "Terciman",
"span": 4
},
{
"key": "websîte",
"label": "Websîte",
"span": 4
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "url",
"label": "URL",
"span": 5
},
{
"key": "urlya-arşîvê",
"label": "URLya Arşîvê",
"span": 5
},
{
"key": "roja-arşîvê",
"label": "Roja arşîvê",
"span": 3,
"width": "medium"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
},
{
"key": "sal",
"label": "Sal",
"span": 1,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3,
"width": "medium"
}
]
},
"jêder-vîdeo": {
"fields": [
{
"key": "hunermend",
"label": "Hunermend",
"span": 6
},
{
"key": "platform",
"label": "Platform",
"span": 6
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "sal",
"label": "Sal",
"span": 2,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3
},
{
"key": "dem",
"label": "Dem",
"span": 2,
"width": "narrow"
},
{
"key": "url",
"label": "URL",
"span": 12,
"width": "wide"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
}
],
"label": "Vîdeo"
}
},
"pronTpls": {
"ku-IPA": {
"desc": "IPAya otomatîk ji bo kurmancî (kontrol hewce ye)",
"snippet": "* {{ku-IPA}}",
"langs": [
"ku"
],
"noLang": true
},
"ku-kîte": {
"desc": "Hecekirina otomatîk ji bo kurmancî",
"snippet": "* {{ku-kîte}}",
"langs": [
"ku"
],
"noLang": true
},
"zza-IPA": {
"desc": "IPAya otomatîk ji bo zazakî",
"snippet": "* {{zza-IPA}}",
"langs": [
"zza"
],
"noLang": true
},
"zza-kîte": {
"desc": "Hecekirina otomatîk ji bo zazakî",
"snippet": "* {{zza-kîte}}",
"langs": [
"zza"
],
"noLang": true
},
"IPA": {
"desc": "Alfabeya fonetîk a navmiletî (IPA)",
"snippet": "* {{IPA|CODE|/…/}}"
},
"deng": {
"desc": "Nimûneya telafûzê bi dosyeya dengî",
"snippet": "* {{deng|CODE|navê_dosyayê.ogg|dever=}}"
},
"bilêv": {
"desc": "{{bilêv|herf|nerm, req|hejmar}}",
"snippet": "* {{bilêv|herf|cure|hejmar}}"
},
"kîte": {
"desc": "Şablona hecekirinê",
"snippet": "* {{kîte|CODE|he|ce}}"
},
"hevdeng": {
"desc": "Hevdeng — gotinên bi heman dengî",
"snippet": "* {{hevdeng|CODE|…}}"
}
},
"etymTpls": {
"etîmon": {
"desc": "Etîmolojiya birêkûpêk: zincîr, dar û kategorî — {{etîmon|ku|:deyn|fa:پنجه\u003Ct:dest\u003E|metn=++}}",
"snippet": "{{etîmon|CODE}}"
},
"ji": {
"desc": "Ji zimanekî din hatiye — {{ji|en|ku|anatomy|tr=|t=}}",
"snippet": "{{ji|SOURCELANG|CODE|…}}"
},
"deyn": {
"desc": "Deynkirî — {{deyn|lang|kod|kelîme}}",
"snippet": "{{deyn|SOURCELANG|CODE|…}}"
},
"mîr": {
"desc": "Mîrasmayî — {{mîr|lang|kod|kelîme}}",
"snippet": "{{mîr|SOURCELANG|CODE|…}}"
},
"qertaf": {
"desc": "Ji bo pêşgir, paşgir û hevedudanî — {{qertaf|kod|pêşgir-|reh}}",
"snippet": "{{qertaf|CODE|…|…}}"
},
"anlz": {
"desc": "Wekî qertaf lê dibêje analîza şiklî — {{anlz|kod|pêşgir-|reh}}",
"snippet": "{{anlz|CODE|…|…}}"
},
"q": {
"desc": "Referans bo rûpelekê — {{q|kod|kelîme}} navê zimanî dernakeve",
"snippet": "{{q|CODE|…}}"
},
"hv": {
"desc": "Hevreh — {{hv|lang|kelîme}} navê zimanî derdikeve",
"snippet": "{{hv|SOURCELANG|…}}"
},
"nh": {
"desc": "Nehevreh — {{nh|lang|kelîme}} navê zimanî derdikeve",
"snippet": "{{nh|SOURCELANG|…}}"
},
"cotreh": {
"desc": "Cotreh — teror {{cotreh|ku|tirs}}",
"snippet": "{{cotreh|CODE|…}}"
},
"yekser": {
"desc": "tercimeya yekser — {{yekser|lang|kod|kelîme}}",
"snippet": "{{yekser|SOURCELANG|CODE|…}}"
},
"wergirtin": {
"desc": "Wergirtina maneyê — {{wergirtin|lang|kod|kelîme}}",
"snippet": "{{wergirtin|SOURCELANG|CODE|…}}"
},
"paşvesazî": {
"desc": "Paşvesazî — greed {{paşvesazî|en|greedy}}",
"snippet": "{{paşvesazî|CODE|…}}"
},
"qusandin": {
"desc": "Qusandin — Miho {{qusandin|ku|Mihemmed}}",
"snippet": "{{qusandin|CODE|…}}"
},
"têkilkirin": {
"desc": "Têkilkirin — sormancî {{têkilkirin|ku|soranî|kurmancî}}",
"snippet": "{{têkilkirin|CODE|…}}"
},
"nyz": {
"desc": "Nayê zanîn — {{nyz|ku|hûr=1}}",
"snippet": "{{nyz|CODE}}"
},
"onom": {
"desc": "Onomatopoetîk — {{onom|ku|hûr=1}}",
"snippet": "{{onom|CODE}}"
},
"navmiletî": {
"desc": "Navmiletî — {{navmiletî|ku|hûr=1}}",
"snippet": "{{navmiletî|CODE}}"
},
"neo": {
"desc": "neolojîzm — {{neolojîzm|ku|hûr=1}}",
"snippet": "{{neolojîzm|CODE}}"
}
},
"etimon": {
"keywords": [
{
"key": "mîr",
"desc": "Kelîmeya ku ji zimanê bav û kalan maye",
"aliases": [
"mîrasmayî",
"inh"
]
},
{
"key": "deyn",
"desc": "Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin",
"aliases": [
"bor",
"borrowed"
]
},
{
"key": "deynh",
"desc": "Deynkirina hînbûyî: ne bi riya têkiliya rojane, bi qesd hatiye girtin",
"aliases": [
"lbor"
]
},
{
"key": "deynhq",
"desc": "Deynkirina hînbûyî ya ku hinekî hatiye guhertin",
"aliases": [
"slbor"
]
},
{
"key": "deynort",
"desc": "Deynkirina ortografîk",
"aliases": [
"obor"
]
},
{
"key": "deynne",
"desc": "Deynkirina neadaptekirî",
"aliases": [
"ubor"
]
},
{
"key": "drş",
"desc": "Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be",
"aliases": [
"dariştî",
"der"
]
},
{
"key": "ji",
"desc": "Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e",
"aliases": [
"from"
]
},
{
"key": "drşnd",
"desc": "Dariştin heye lê cureyê wê ne diyar e",
"aliases": [
"uder"
]
},
{
"key": "qf",
"desc": "Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e",
"aliases": [
"qertaf",
"af"
]
},
{
"key": "reh",
"desc": "Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e (\"Peyvên … yên aîdî rehê …\") û di metn û darê de xuya nabe",
"aliases": [
"root"
],
"invisible": true
},
{
"key": "yekser",
"desc": "Wergerandina yekser; zincîr li vir disekine",
"aliases": [
"cal",
"clq"
]
},
{
"key": "yekserq",
"desc": "Wergerandina yekser a qismî; zincîr li vir disekine",
"aliases": [
"yekserqismî",
"pcal"
]
},
{
"key": "wergirtin",
"desc": "Wergirtina maneyê; mana wergirtî bi \u003Cmaneid:…\u003E tê nîşankirin",
"aliases": [
"sl"
]
},
{
"key": "lihevanîn",
"desc": "Lihevanîna dengî-maneyî",
"aliases": [
"psm"
]
},
{
"key": "tesîr",
"desc": "Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine",
"aliases": [
"influence"
]
},
{
"key": "têkilkirin",
"desc": "Têkilkirina du kelîmeyan",
"aliases": [
"blend"
],
"min": 2
},
{
"key": "ûnîverbasyon",
"desc": "Ûnîverbasyon",
"aliases": [
"ûnîv",
"univ"
]
},
{
"key": "qusandin",
"desc": "Qusandin",
"aliases": [
"clip"
]
},
{
"key": "paşvesazî",
"desc": "Paşvesazî",
"aliases": [
"bf"
]
},
{
"key": "elîpsîz",
"desc": "Elîpsîz",
"aliases": [
"elîp",
"ellip"
]
},
{
"key": "nomînalîzasyon",
"desc": "Nomînalîzasyon",
"aliases": [
"nomîn",
"nom"
]
},
{
"key": "translîterasyon",
"desc": "Translîterasyon",
"aliases": [
"translît",
"translit"
]
},
{
"key": "redûblîkasyon",
"desc": "Redûblîkasyon",
"aliases": [
"redûb",
"redup"
]
},
{
"key": "kurtkirin",
"desc": "Kurtkirina kelîmeyekê",
"aliases": [
"abbr"
]
},
{
"key": "sylabbr",
"desc": "Kurtkirin li gorî kîteyan",
"aliases": [
"syllabic abbreviation",
"sylabbrev"
]
},
{
"key": "akronîm",
"desc": "Akronîm",
"aliases": [
"acro"
]
},
{
"key": "înîtîalîzm",
"desc": "Înîtîalîzm",
"aliases": [
"înît",
"init"
]
},
{
"key": "metatez",
"desc": "Metatez",
"aliases": [
"meta"
]
},
{
"key": "afeq",
"desc": "Wek :qf, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike",
"invisible": true
},
{
"key": "apheresis",
"desc": "Şiklê ku dengê destpêkê winda kiriye",
"aliases": [
"apheretic",
"aphetic"
]
},
{
"key": "denom",
"desc": "Fiîla ji îsmekê çêbûyî",
"aliases": [
"denominal"
]
},
{
"key": "deverbal",
"desc": "Kelîmeya ji fiîlekê çêbûyî"
},
{
"key": "vrd",
"desc": "Dariştina vṛddhî (sanskrîtî); bi qertaf: :vrd-af"
},
{
"key": "sa-af",
"desc": "Pêkhateya sanskrîtî",
"min": 2
}
],
"wordMods": [
{
"key": "t",
"desc": "Tercimeya kelîmeyê bi kurmancî",
"aliases": [
"w"
]
},
{
"key": "tr",
"desc": "Translîterasyon"
},
{
"key": "ts",
"desc": "Transkrîpsiyon"
},
{
"key": "cuda",
"desc": "Şiklê ku tê nîşandan, eger ne wek navê rûpelê be",
"aliases": [
"alt"
]
},
{
"key": "id",
"desc": "Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan"
},
{
"key": "crz",
"desc": "Cureyê rêzimanî yê kelîmeyê",
"aliases": [
"pos"
],
"values": [
"reh",
"kelîme",
"pêşgir",
"paşgir",
"navgir"
]
},
{
"key": "g",
"desc": "Cinsiyet: n (nêr), m (mê), nt (nêtar)",
"values": [
"n",
"m",
"nt"
]
},
{
"key": "q",
"desc": "Wesf li pêşiyê kelîmeyê"
},
{
"key": "qq",
"desc": "Wesf li pey kelîmeyê"
},
{
"key": "hrf",
"desc": "Mana herfiyen",
"aliases": [
"lit"
]
},
{
"key": "ref",
"desc": "Çavkanî; binêre #Çavkanî"
},
{
"key": "nediyar",
"desc": "Ev gav ne teqez e",
"flag": true,
"aliases": [
"unc"
]
},
{
"key": "crztip",
"desc": "Kelîme ji bo kategoriyan wek reh yan kelîme tê hesibandin",
"aliases": [
"postype"
],
"values": [
"reh",
"kelîme"
]
},
{
"key": "etimon",
"desc": "Etîmolojiya di cih de; binêre jor",
"aliases": [
"ety"
]
},
{
"key": "aftype",
"desc": "Di nav :qf de: cureyê qertafê; binêre #Cureyên qertafan",
"values": [
"pêşgir",
"paşgir",
"navgir",
"circumfix",
"infix",
"non-affix",
"root"
]
},
{
"key": "deyn",
"desc": "Di nav :qf de: ev parçe deynkirî ye",
"flag": true
},
{
"key": "deynh",
"desc": "Di nav :qf de: ev parçe deynkirî ye",
"flag": true
},
{
"key": "deynhq",
"desc": "Di nav :qf de: ev parçe deynkirî ye",
"flag": true
}
],
"keywordMods": [
{
"key": "unc",
"desc": "Ev gav ne teqez e: \"Mihtemelen…\"",
"flag": true
},
{
"key": "grdk",
"desc": "Girêdeka di navbera kelîmeyên jêder de, li şûna \"yan jî\"",
"aliases": [
"conj"
]
},
{
"key": "anlz",
"desc": "Analîza şiklî",
"flag": true,
"aliases": [
"surf"
]
},
{
"key": "hrf",
"desc": "Di nav :qf de: mana herfiyen",
"aliases": [
"lit"
]
},
{
"key": "maneid",
"desc": "Di nav :wergirtin de: nasnameya maneya wergirtî",
"aliases": [
"senseid"
]
},
{
"key": "metn",
"desc": "Di nav :ji û :drş de: metnekî din li şûna \"Ji\"",
"aliases": [
"text"
]
},
{
"key": "ref",
"desc": "Çavkaniya vê gavê"
}
],
"metnChoices": [
{
"value": "++",
"desc": "Tevahiya zincîrê"
},
{
"value": "+",
"desc": "Tenê gava pêşîn"
},
{
"value": "*",
"desc": "Heta kelîmeya pêşîn a ku rûpela wê heye"
},
{
"value": "1",
"desc": "Ewqas gav (hejmarek)",
"free": true
},
{
"value": ":",
"desc": "Heta zimanê bi wê kodê (:kod)",
"free": true
},
{
"value": ":*",
"desc": "Heta wî zimanî, eger rûpela wî tune be heta ya pêşîn a heyî (:kod*)",
"free": true
}
],
"afTypes": [
{
"key": "pêşgir",
"desc": "Pêşgir"
},
{
"key": "paşgir",
"desc": "Paşgir"
},
{
"key": "navgir",
"desc": "Navgir"
},
{
"key": "circumfix",
"desc": "Dorgir"
},
{
"key": "infix",
"desc": "Nawgir (infix)"
},
{
"key": "non-affix",
"desc": "Ne qertaf"
},
{
"key": "root",
"desc": "Reh"
}
],
"params": [
{
"key": "dar",
"desc": "Bi 1 dara etîmolojiyê nîşan dide.",
"type": "flag"
},
{
"key": "id",
"desc": "Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan.",
"type": "text"
},
{
"key": "title",
"desc": "Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be.",
"type": "text"
},
{
"key": "crz",
"desc": "Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: reh, kelîme, pêşgir, paşgir, navgir.",
"type": "select",
"values": [
"reh",
"kelîme",
"pêşgir",
"paşgir",
"navgir"
]
},
{
"key": "cotreh",
"desc": "Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda.",
"type": "text"
},
{
"key": "tarîxa-etîm",
"desc": "Tarîxa peyitandina pêşîn, wek 1901, 1500s, 14c, c,1900, before,1850, r,1501,1558.",
"type": "text"
},
{
"key": "niqtena",
"desc": "Bi 1 niqteya dawiyê nayê zêdekirin.",
"type": "flag"
},
{
"key": "niqte",
"desc": "Li şûna niqteya dawiyê nîşaneke din.",
"type": "text"
},
{
"key": "katna",
"desc": "Bi 1 kategorî nayên zêdekirin. Herwiha {{para|nekat}}.",
"type": "flag"
},
{
"key": "darna",
"desc": "Bi 1 ev etîmolojî di dara rûpelên din de dernakeve.",
"type": "flag"
},
{
"key": "exnihilo",
"desc": "Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin.",
"type": "flag"
}
]
},
"metadata": {
"aa": {
"haswikt": 1,
"sc": [
"Latn",
"Ethi"
]
},
"ab": {
"haswikt": 1,
"sc": [
"Cyrl",
"Latn",
"Geor"
]
},
"aer": {
"sc": "Latn"
},
"af": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"ak": {
"haswikt": 1
},
"akk": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"sc": "Xsux"
},
"als": {
"haswikt": 1
},
"am": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1,
"sc": "Ethi"
},
"an": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"ang": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"ar": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"alt": 1,
"haswikt": 1,
"sc": "Arab"
},
"arc": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"sc": [
"Hebr",
"Syrc"
]
},
"are": {},
"arz": {
"alt": 1,
"g": [
"n",
"m",
"n-p",
"m-p"
],
"sc": "Arab"
},
"as": {
"haswikt": 1,
"sc": "Beng"
},
"ast": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"av": {
"haswikt": 1
},
"ay": {
"haswikt": 1
},
"az": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": [
"Latn",
"Cyrl",
"Arab"
]
},
"ba": {
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"bar": {},
"bat-smg": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"bbl": {
"sc": "Geor"
},
"be": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"be-x-old": {
"sc": "Cyrl"
},
"bg": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"bh": {
"haswikt": 1,
"sc": "Deva"
},
"bhb": {
"sc": "Deva"
},
"bi": {
"haswikt": 1
},
"blt": {
"sc": "Tavt"
},
"bm": {
"haswikt": 1,
"sc": [
"Latn",
"Nkoo",
"Arab"
]
},
"bn": {
"haswikt": 1,
"sc": "Beng"
},
"bo": {
"haswikt": 1,
"sc": "Tibt"
},
"br": {
"g": [
"n",
"m"
],
"haswikt": 1
},
"ca": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"cdo": {
"sc": "Hani"
},
"ce": {
"sc": "Cyrl"
},
"ch": {
"haswikt": 1
},
"chr": {
"haswikt": 1,
"sc": "Cher"
},
"cjy": {
"sc": "Hani"
},
"ckb": {
"haswikt": 1,
"sc": "Arab",
"wsc": "ku-Arab"
},
"cmn": {
"sc": "Hani",
"wiktprefix": "zh"
},
"co": {
"haswikt": 1
},
"cpx": {
"sc": "Hani"
},
"cr": {
"haswikt": 1,
"sc": "Cans"
},
"crh": {},
"cs": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"csb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"cu": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"sc": [
"Cyrs",
"Glag"
]
},
"cv": {
"sc": "Cyrl"
},
"cy": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"czh": {
"sc": "Hani"
},
"czo": {
"sc": "Hani"
},
"da": {
"g": [
"g",
"nt",
"g-p",
"nt-p",
"p"
],
"haswikt": 1
},
"dax": {},
"de": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1,
"allowCaps": 1
},
"dhg": {},
"djb": {},
"dji": {},
"djr": {},
"dng": {
"sc": "Cyrl"
},
"dsb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
]
},
"dsx": {},
"duj": {},
"dv": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Thaa"
},
"dz": {
"haswikt": 1,
"sc": "Tibt"
},
"el": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"en": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"eo": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"es": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"et": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"ett": {
"g": [
"y",
"p"
],
"sc": "Ital"
},
"eu": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"fa": {
"haswikt": 1,
"g": [
"y",
"p"
],
"sc": "Arab",
"wsc": "fa-Arab"
},
"fa-cls": {
"wiktprefix": "fa",
"sc": "Arab",
"wsc": "fa-Arab"
},
"fa-ira": {
"wiktprefix": "fa",
"sc": "Arab",
"wsc": "fa-Arab"
},
"fi": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"fil": {},
"fj": {
"haswikt": 1
},
"fo": {
"g": [
"n",
"m",
"nt"
],
"haswikt": 1
},
"fr": {
"g": [
"n",
"m",
"mnmane",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"frm": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"fro": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"fur": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"fy": {
"g": [
"g",
"nt",
"p"
],
"haswikt": 1
},
"ga": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"gan": {
"sc": "Hani"
},
"gd": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"gez": {
"sc": "Ethi"
},
"gl": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"gmw-ecg": {
"g": [
"n",
"m",
"nt",
"p"
],
"allowCaps": 1
},
"gmy": {
"sc": "Linb"
},
"gn": {
"haswikt": 1
},
"gnn": {
"sc": "Latn"
},
"got": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"sc": "Goth"
},
"grc": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
]
},
"gsw": {
"g": [
"n",
"m",
"nt",
"p"
],
"allowCaps": 1
},
"gu": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1,
"sc": "Gujr"
},
"guf": {
"sc": "Latn"
},
"gv": {
"haswikt": 1
},
"ha": {
"haswikt": 1
},
"hak": {
"sc": "Hani"
},
"har": {
"sc": "Ethi"
},
"he": {
"alt": 1,
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Hebr"
},
"hi": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Deva"
},
"hif": {
"sc": [
"Latn",
"Deva"
]
},
"hit": {
"sc": "Xsux"
},
"hrx": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"hsb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"hsn": {
"sc": "Hani"
},
"hu": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"hy": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Armn"
},
"ia": {
"haswikt": 1
},
"id": {
"haswikt": 1
},
"ie": {
"haswikt": 1
},
"ik": {
"haswikt": 1
},
"ike": {
"sc": "Cans"
},
"ikt": {
"sc": "Cans"
},
"io": {
"haswikt": 1
},
"is": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"it": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"iu": {
"haswikt": 1,
"sc": "Cans"
},
"ja": {
"haswikt": 1,
"sc": "Jpan"
},
"jay": {
"sc": "Latn"
},
"jbo": {
"haswikt": 1
},
"jv": {
"haswikt": 1
},
"ka": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"khb": {
"sc": [
"Talu",
"Lana",
"Thai"
]
},
"kjh": {
"sc": "Cyrl"
},
"kk": {
"haswikt": 1,
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"kkh": {
"sc": [
"Lana",
"Thai"
]
},
"kl": {
"haswikt": 1
},
"km": {
"haswikt": 1,
"sc": "Khmr"
},
"kn": {
"haswikt": 1,
"sc": "Knda"
},
"ku": {
"g": [
"n",
"m",
"mnmane",
"mndudil",
"n-p",
"m-p",
"p"
],
"wiktprefix": "ku"
},
"ko": {
"haswikt": 1,
"sc": "Kore"
},
"krc": {
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"ks": {
"haswikt": 1,
"sc": [
"Arab",
"Deva"
],
"wsc": "ks-Arab"
},
"kw": {
"haswikt": 1
},
"ky": {
"haswikt": 1,
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"la": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"lb": {
"g": [
"n",
"m",
"nt",
"p"
],
"haswikt": 1,
"allowCaps": 1
},
"lez": {
"sc": "Cyrl"
},
"li": {
"haswikt": 1
},
"lki": {
"wiktprefix": "ku"
},
"lld": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"lmo": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"ln": {
"haswikt": 1
},
"lo": {
"haswikt": 1,
"sc": "Laoo"
},
"lt": {
"alt": 1,
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"lv": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"lzz": {
"sc": "Geor"
},
"mg": {
"haswikt": 1
},
"mh": {
"haswikt": 1
},
"mi": {
"g": 0,
"haswikt": 1
},
"mk": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"ml": {
"haswikt": 1,
"sc": "Mlym"
},
"mn": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": [
"Cyrl",
"Mong"
]
},
"mnp": {
"sc": "Hani"
},
"mo": {
"haswikt": 1,
"sc": "Cyrl"
},
"mol": {
"sc": "Cyrl"
},
"mr": {
"g": [
"n",
"m",
"nt"
],
"haswikt": 1,
"sc": "Deva"
},
"ms": {
"haswikt": 1,
"sc": [
"Latn",
"Arab"
]
},
"mt": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"mwp": {
"sc": "Latn"
},
"my": {
"haswikt": 1,
"sc": "Mymr"
},
"na": {
"haswikt": 1
},
"nah": {
"haswikt": 1
},
"nan": {
"wiktprefix": "zh-min-nan",
"sc": "Hani"
},
"nb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"wiktprefix": "no"
},
"nds-de": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "nds"
},
"nds-nl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "nds"
},
"ne": {
"haswikt": 1,
"sc": "Deva"
},
"nl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1
},
"nn": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1
},
"no": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1
},
"nod": {
"sc": "Lana"
},
"non": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"oc": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"om": {
"haswikt": 1
},
"or": {
"haswikt": 1,
"sc": "Orya"
},
"orv": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"sc": "Cyrs"
},
"osc": {
"sc": "Ital"
},
"ota": {
"g": [
"y",
"p"
],
"sc": "Arab",
"wsc": "ota-Arab"
},
"pa": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": [
"Guru",
"Arab"
]
},
"pdt": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "nds"
},
"peo": {
"sc": "Xpeo"
},
"phn": {
"sc": "Phnx"
},
"pi": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"pjt": {
"sc": "Latn"
},
"pl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"pms": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"pox": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"împf",
"pf"
]
},
"prs": {
"wiktprefix": "fa",
"sc": "Arab",
"wsc": "fa-Arab"
},
"ps": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Arab",
"wsc": "ps-Arab"
},
"pt": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"qu": {
"haswikt": 1
},
"rgn": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"rit": {
"sc": "Latn"
},
"rm": {
"g": [
"n",
"m"
],
"haswikt": 1
},
"rn": {
"haswikt": 1
},
"ro": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1,
"sc": [
"Latn",
"Cyrl"
]
},
"roa-rup": {
"haswikt": 1
},
"ru": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"rue": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"sc": "Cyrl"
},
"ruo": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"rup": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "roa-rup"
},
"ruq": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"rw": {
"haswikt": 1
},
"sa": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1,
"sc": "Deva"
},
"sah": {
"sc": "Cyrl"
},
"sc": {
"haswikt": 1
},
"scn": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"sco": {
"sc": "Latn"
},
"sd": {
"haswikt": 1,
"sc": "Arab",
"wsc": "sd-Arab"
},
"sdh": {
"sc": "Arab",
"wiktprefix": "ku"
},
"sg": {
"haswikt": 1
},
"sh": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": [
"Latn",
"Cyrl"
]
},
"si": {
"haswikt": 1,
"sc": "Sinh"
},
"simple": {
"haswikt": 1
},
"sk": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"sl": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"sm": {
"haswikt": 1
},
"sn": {
"haswikt": 1
},
"so": {
"haswikt": 1
},
"spx": {
"sc": "Ital"
},
"sq": {
"g": [
"n",
"m"
],
"haswikt": 1
},
"ss": {
"haswikt": 1
},
"st": {
"haswikt": 1
},
"su": {
"haswikt": 1
},
"sux": {
"sc": "Xsux"
},
"sv": {
"g": [
"g",
"nt",
"g-p",
"nt-p"
],
"haswikt": 1
},
"sva": {
"sc": "Geor"
},
"sw": {
"nclass": 1,
"haswikt": 1
},
"syc": {
"sc": "Syrc"
},
"syr": {
"sc": "Syrc"
},
"szl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
]
},
"ta": {
"haswikt": 1,
"sc": "Taml"
},
"tdd": {
"sc": "Tale"
},
"te": {
"haswikt": 1,
"sc": "Telu"
},
"tg": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Cyrl"
},
"th": {
"haswikt": 1,
"sc": "Thai"
},
"ti": {
"haswikt": 1,
"sc": "Ethi"
},
"tig": {
"sc": "Ethi"
},
"tiw": {
"sc": "Latn"
},
"tk": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"tl": {
"haswikt": 1,
"sc": [
"Latn",
"Tglg"
]
},
"tmr": {
"sc": "Hebr"
},
"tn": {
"haswikt": 1
},
"to": {
"haswikt": 1
},
"tpi": {
"haswikt": 1
},
"tr": {
"g": [
"y",
"p"
],
"alt": 1,
"haswikt": 1
},
"ts": {
"haswikt": 1
},
"tt": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"tts": {
"sc": "Thai"
},
"tw": {
"haswikt": 1
},
"udi": {
"sc": [
"Cyrl",
"Latn",
"Armn",
"Geor"
]
},
"ug": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Arab",
"wsc": "ug-Arab"
},
"uga": {
"sc": "Ugar"
},
"uk": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"ulk": {
"sc": "Latn"
},
"ur": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Arab",
"wsc": "ur-Arab"
},
"uz": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"vec": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"vi": {
"haswikt": 1
},
"vls": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"vo": {
"haswikt": 1
},
"wa": {
"haswikt": 1
},
"wbp": {
"sc": "Latn"
},
"wo": {
"haswikt": 1
},
"wuu": {
"sc": "Hani"
},
"xae": {
"sc": "Ital"
},
"xcr": {
"sc": "Cari"
},
"xfa": {
"sc": "Ital"
},
"xh": {
"alt": 1,
"nclass": 1,
"haswikt": 1
},
"xlc": {
"sc": "Lyci"
},
"xld": {
"sc": "Lydi"
},
"xlu": {
"sc": "Xsux"
},
"xmf": {
"sc": "Geor"
},
"xno": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"xrr": {
"sc": "Ital"
},
"xst": {
"sc": "Ethi"
},
"xum": {
"sc": "Ital"
},
"xve": {
"sc": "Ital"
},
"xvo": {
"sc": "Ital"
},
"yi": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1,
"sc": "Hebr"
},
"yo": {
"haswikt": 1
},
"yua": {
"g": [
"y",
"p"
],
"alt": 1
},
"yue": {
"sc": "Hani"
},
"za": {
"haswikt": 1,
"sc": "Latn"
},
"zh-classical": {
"sc": "Hani"
},
"zh-min-nan": {
"haswikt": 1
},
"zh-yue": {
"sc": "Hani"
},
"zu": {
"alt": 1,
"nclass": 1,
"haswikt": 1
},
"zza": {
"g": [
"n",
"m",
"mn",
"n-p",
"m-p",
"p"
],
"wiktprefix": "diq"
}
},
"numberLabels": {
"y": {
"display": "yekjimar"
},
"d": {
"display": "hejmar dual"
},
"p": {
"display": "pirjimar"
},
"p+": {
"display": "axlebî pirjimar"
},
"tp": {
"display": "tenê pirjimar"
},
"j": {
"display": "jimarbar"
},
"j+": {
"display": "axlebî jimarbar"
},
"j/nj": {
"display": "jimarbar û nejimarbar"
},
"nj": {
"display": "nejimarbar"
},
"nj+": {
"display": "axlebî nejimarbar"
},
"hj!": {
"display": "hejmar nepeyitandî ye"
},
"hj?": {
"display": "hejmar hewce ye"
}
},
"leadingTplOrder": [
"maneid",
"K",
"e"
],
"lekturChoices": [
{
"code": "gh",
"label": "gerguhêz (îsmî mefûl digire)"
},
{
"code": "ngh",
"label": "negerguhêz (îsmî mefûl nagire)"
}
],
"lekturFormChoices": [
{
"code": "x",
"label": "xwerû"
},
{
"code": "p",
"label": "pêkhatî"
},
{
"code": "h",
"label": "hevedudanî"
}
],
"deverQuickPicks": [
"kurmanciya rojavayî",
"kurmanciya merkezî",
"kurmanciya rojhilatî",
"Badînî",
"Botî",
"Serhedî",
"Bakur",
"Amed",
"Riha"
],
"maneTags": [
"cure?",
"rêziman?",
"kat-rêziman",
"kategoriya rêzimanê?",
"bêcure"
],
"senseGroups": [
{
"key": "alt-r",
"label": "Formên alternatîv",
"field": "alternativ",
"order": 3,
"hint": "Varyantên vê kelîmeyê"
},
{
"key": "hevmane",
"label": "Hevmane",
"field": "hevmane",
"order": 1,
"hint": "Spehî hevmaneya Bedew e."
},
{
"key": "dijmane",
"label": "Dijmane",
"field": "dijmane",
"order": 2,
"hint": "Zengîn dijmaneya feqîr e."
},
{
"key": "koordîne",
"label": "Termên koordîne",
"field": "koordine",
"order": 4,
"hint": "Pisîk û kûçik termên koordîne ne çunkî Jornavên wan gelek in"
},
{
"key": "jornav",
"label": "Jornav",
"field": "jornav",
"order": 5,
"hint": "Heywan jornavê guhandar e"
},
{
"key": "jêrnav",
"label": "Jêrnav",
"field": "jernav",
"order": 6,
"hint": "Guhandar jêrnavê heywan e"
}
],
"subsectionOrder": [
"Bilêvkirin",
"Ji wêjeya klasîk",
"Ji wêjeyê",
"Tewandin",
"Notên bikaranînê",
"Bi alfabeyên din",
"Formên alternatîv",
"Kurtkirin",
"Sembol",
"Navê zanistî",
"Hevmane",
"Nêzîk",
"Dijmane",
"Jornav",
"Jêrnav",
"Jê",
"Têkildar",
"Etîmolojî",
"Dûnde",
"Bide ber",
"Herwiha binêre",
"Bêhtir bixwîne",
"Bi zaravayên din",
"Werger",
"Qafiye",
"Anagram",
"Çavkanî"
],
"templateAliases": {
"K": [
"K",
"kategorîzebike",
"mijar"
],
"alt-r": [
"alt-r",
"forma alt di rêzê de",
"herwiha-rêz",
"herwiha di rêza maneyê de"
],
"dijmane": [
"dijmane",
"dijwate",
"dijmaneyên peyvê"
],
"e": [
"e",
"etîket",
"f",
"lb"
],
"g": [
"g",
"girêdan",
"l",
"link"
],
"hevmane": [
"hevmane",
"hevwate",
"hevmaneya peyvê",
"hevmaneyên peyvê",
"synonyms"
],
"jornav": [
"jornav",
"hîpernîm"
],
"jêrnav": [
"jêrnav",
"hîponîm"
],
"koordîne": [
"koordîne",
"termên koordîne",
"peyvên koordîneyî"
],
"mane?": [
"mane?",
"wate?",
"bêmane",
"bêwate"
],
"maneid": [
"maneid",
"senseid"
],
"h-bnr": [
"h-bnr",
"bnr-h",
"bnr h",
"bnr-hrw",
"bnr herwiha",
"herwiha binêre",
"binêre herwiha"
]
},
"wordlistTemplates": [
"kol3",
"kol2",
"kol",
"col3",
"col2",
"col"
],
"templateParams": {
"deyn": {
"order": [
"1",
"2",
"3",
"4",
"5",
"tr",
"ts",
"sc",
"id"
],
"labels": {
"1": "Zimanê jêder",
"2": "Zimanê wergir",
"3": "Kelîme",
"4": "Xuyakirina alternatîv",
"5": "Maneya kelîmeyê",
"tr": "Transliterasyon",
"ts": "Transkîpsiyon",
"sc": "Koda skrîptê",
"id": "IDya maneyê"
}
},
"hv": {
"order": [
"1",
"2",
"3",
"4",
"tr",
"ts",
"sc"
],
"labels": {
"1": "Koda zimanî",
"2": "Kelîme",
"3": "Xuyakirina alternatîv",
"4": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"sc": "Koda skrîptê"
}
},
"ji": {
"order": [
"1",
"2",
"3",
"4",
"5",
"tr",
"ts",
"id",
"sc"
],
"labels": {
"1": "Zimanê jêder",
"2": "Zimanê wergir",
"3": "Kelîme",
"4": "Xuyakirina alternatîv",
"5": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"id": "IDya maneyê",
"sc": "Koda skrîptê"
}
},
"jêder-kitêb": {
"order": [
"1",
"jêgirtin",
"sc",
"tr",
"t",
"nivîskar",
"nivîskar2",
"nivîskar3",
"amadekar",
"terciman",
"sernav",
"url",
"weşanxane",
"cih",
"cild",
"sal",
"sala-weşandinê",
"çap",
"rûpel",
"isbn",
"nekat",
"nivîskar4",
"nivîskar5",
"issn",
"oclc",
"serî",
"doi"
],
"labels": {
"1": "koda zimanî",
"sc": "koda skrîptê eger hewce be",
"tr": "translîterasyon",
"t": "tercime",
"rûpel": "rûpel"
}
},
"jêder-kovar": {
"order": [
"1",
"jêgirtin",
"sc",
"tr",
"werger",
"kovar",
"sernav",
"wergêr",
"nivîskar",
"nivîskar2",
"url",
"weşanxane",
"cîld",
"hejmar",
"sal",
"tarîx",
"rûpel"
],
"labels": {
"1": "Koda zimanî",
"sc": "Koda skrîptê",
"tr": "Translîterasyon",
"werger": "Tercimeya kurmancî ya jêgirtinê"
}
},
"jêder-vîdeo": {
"order": [
"1",
"title",
"year",
"date",
"author",
"authorlink",
"actor",
"role",
"time",
"at",
"medium",
"network",
"text",
"translation",
"season",
"number",
"episode",
"publisher",
"url",
"director",
"brackets"
],
"labels": {
"1": "Language",
"title": "Title",
"year": "Year of release",
"date": "Date of release",
"author": "Writer (screenplay)",
"authorlink": "Wikipedia author page",
"actor": "Actor (speaker)",
"role": "Role",
"time": "Timecode",
"at": "Context",
"medium": "Recording medium",
"network": "Network",
"text": "Quoted line",
"translation": "Translation",
"season": "Season number (series)",
"number": "Episode number (series)",
"episode": "Episode title (series)",
"publisher": "Publisher",
"url": "URL",
"director": "Director",
"brackets": "Brackets"
}
},
"jêder-websîte": {
"order": [
"1",
"jêgirtin",
"sc",
"tr",
"t",
"nivîskar",
"terciman",
"sernav",
"url",
"urlya-arşîvê",
"websîte",
"tarîx",
"sal"
],
"labels": {
"1": "Koda zimanî",
"sc": "Koda skrîptê ya jêgirtinê",
"tr": "Translîterasyona jêgirtinê",
"t": "Tercimeya kurmancî ya jêgirtinê"
}
},
"mîr": {
"order": [
"1",
"2",
"3",
"4",
"5",
"tr",
"ts",
"id",
"sc"
],
"labels": {
"1": "Zimanê jêder",
"2": "Zimanê wergir",
"3": "Kelîme",
"4": "Xuyakirina alternatîv",
"5": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"id": "IDya maneyê",
"sc": "Koda skrîptê"
}
},
"nh": {
"order": [
"1",
"2",
"3",
"4",
"tr",
"ts",
"sc"
],
"labels": {
"1": "Koda zimanî",
"2": "Kelîme",
"3": "Xuyakirina alternatîv",
"4": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"sc": "Koda skrîptê"
}
},
"qertaf": {
"order": [
"1",
"2",
"3",
"sc",
"cuda1",
"cuda2",
"t1",
"t2",
"tr1",
"tr2"
],
"labels": {
"1": "language code",
"2": "first part",
"3": "second part",
"sc": "script code",
"cuda1": "first part alternate text",
"cuda2": "second part alternate text",
"w1": "first gloss",
"w2": "second gloss",
"tr1": "first part transliteration",
"tr2": "second part transliteration"
}
},
"yekser": {
"order": [
"1",
"2",
"3",
"hûr",
"nekat"
]
}
}
}
qfwpwpjexzcp34p790istw6qr2fe5i6
6532114
6532105
2026-09-18T20:45:35Z
Wikihez
7344
Etymology: offer a modifier only under the keywords it applies to
6532114
json
application/json
{
"langChoices": {
"ku": "kurmancî",
"zza": "zazakî",
"ckb": "soranî",
"sdh": "kurdiya başûrî",
"hac": "hewramî",
"de": "almanî",
"ar": "erebî",
"fa": "farisî",
"fr": "fransî",
"fi": "fînî",
"en": "îngilîzî",
"ja": "japonî",
"sv": "swêdî",
"tr": "tirkî"
},
"posExamples": {
"navdêr": "Kelîmeyên ji bo tiştan (sêv, heywan, qedeh) yan terman (dilşadî, bextiyarî hwd.) di rêzimanê de.",
"lêker": "Kelîmeyên ji bo kirin an bûyînê wekî 'nivîsîn' yan 'xeber dan'.",
"rengdêr": "Kelîmeyên ku wesfa navdêran nîşan didin wekî 'sêva sor' yan 'xwarina şîrîn'.",
"hoker": "Kelîmeyên ku dem, cih yan awayê kirinê diyar dikin wekî 'bi vî awayî' yan 'demkî'.",
"daçek": "Kelîmeyên ku cih, dem yan hereketê diyar dikin wekî 'di.. de' yan 'ji'.",
"cînav": "Kelîmeyên ku li şûna navdêran tên bikaranîn daku navdêr neyên dubarekirin wekî 'ew' yan 'em'.",
"baneşan": "Kelîmeyên ku hest, deng hwd. îfade dikin wekî 'noşî!' yan 'aferîn'.",
"serenav": "Navdêrên ku şexsiyetên ferdî nîşan didin, wek navên kes, cih an organîzasyonan nimûne 'London' yan 'Diyarbekir'.",
"gotineke pêşiyan": "Gotinên ku di nav xelkê de bi berbelavî tên bikaranîn bo nimûne 'Serê neêşe ne hewceyî destmalê ye'."
},
"genderLabels": {
"m": "mê",
"n": "nêr",
"nt": "nêtar",
"mn": "mê yan nêr",
"mnmane": "mê yan nêr li gorî maneyê",
"mndudil": "mê yan nêr bikaranîn dudil e",
"g": "giştî",
"y": "yekjimar",
"p": "pirjimar"
},
"tplDefs": {
"rastnivîs": {
"langs": [
"ku"
],
"noLang": true
},
"ku-Latn": {
"langs": [
"ku"
],
"noLang": true
},
"ku-tewîna-nav": {
"langs": [
"ku"
],
"noLang": true
},
"sdh-Arab": {
"langs": [
"sdh"
],
"noLang": true
},
"hac-Arab": {
"langs": [
"hac"
],
"noLang": true
},
"ja-romanîzekirin": {
"langs": [
"ja"
],
"noLang": true
},
"ckb-Arab": {
"langs": [
"ckb"
],
"noLang": true
},
"zza-awayê-Jacobsonê": {
"langs": [
"zza"
]
},
"awayekî din": {
"langs": null
},
"guharto": {
"langs": null
},
"hevmaneya": {
"langs": null
},
"kevnbûyî": {
"langs": null
},
"kêmpeyda": {
"langs": null
},
"kurtkirin": {
"langs": null
},
"paşnav": {
"langs": null
},
"şaşnivîs": {
"langs": null
}
},
"jederDefs": {
"jêder-kitêb": {
"label": "Kitêb",
"fields": [
{
"key": "nivîskar",
"label": "Nivîskar",
"span": 3
},
{
"key": "terciman",
"label": "Terciman",
"span": 3
},
{
"key": "amadekar",
"label": "Amadekar",
"span": 3
},
{
"key": "weşanxane",
"label": "Weşanxane",
"span": 3
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "beş",
"label": "Beş",
"span": 3,
"width": "medium"
},
{
"key": "cih",
"label": "Cih",
"span": 2,
"width": "narrow"
},
{
"key": "sal",
"label": "Sal",
"span": 1,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3,
"width": "medium"
},
{
"key": "sala-weşandinê",
"label": "Sala weşandinê",
"span": 2,
"width": "narrow"
},
{
"key": "çap",
"label": "Çap",
"span": 1,
"width": "narrow"
},
{
"key": "cild",
"label": "Cild",
"span": 2,
"width": "narrow"
},
{
"key": "rûpel",
"label": "Rûpel",
"span": 1,
"width": "narrow"
},
{
"key": "isbn",
"label": "ISBN",
"span": 2,
"width": "narrow"
},
{
"key": "url",
"label": "URL",
"span": 12,
"width": "wide"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
}
]
},
"jêder-kovar": {
"label": "Kovar",
"fields": [
{
"key": "nivîskar",
"label": "Nivîskar",
"span": 3
},
{
"key": "terciman",
"label": "Terciman",
"span": 3
},
{
"key": "amadekar",
"label": "Amadekar",
"span": 3
},
{
"key": "weşanxane",
"label": "Weşanxane",
"span": 3
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "kovar",
"label": "Kovar",
"span": 4
},
{
"key": "cild",
"label": "Cild",
"span": 2,
"width": "narrow"
},
{
"key": "hejmar",
"label": "Hejmar",
"span": 2,
"width": "narrow"
},
{
"key": "sal",
"label": "Sal",
"span": 2,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3,
"width": "medium"
},
{
"key": "rûpel",
"label": "Rûpel",
"span": 2,
"width": "narrow"
},
{
"key": "issn",
"label": "ISSN",
"span": 2,
"width": "narrow"
},
{
"key": "doi",
"label": "DOI",
"span": 2,
"width": "narrow"
},
{
"key": "url",
"label": "URL",
"span": 12,
"width": "wide"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
}
]
},
"jêder-websîte": {
"label": "Websîte",
"fields": [
{
"key": "nivîskar",
"label": "Nivîskar",
"span": 4
},
{
"key": "terciman",
"label": "Terciman",
"span": 4
},
{
"key": "websîte",
"label": "Websîte",
"span": 4
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "url",
"label": "URL",
"span": 5
},
{
"key": "urlya-arşîvê",
"label": "URLya Arşîvê",
"span": 5
},
{
"key": "roja-arşîvê",
"label": "Roja arşîvê",
"span": 3,
"width": "medium"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
},
{
"key": "sal",
"label": "Sal",
"span": 1,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3,
"width": "medium"
}
]
},
"jêder-vîdeo": {
"fields": [
{
"key": "hunermend",
"label": "Hunermend",
"span": 6
},
{
"key": "platform",
"label": "Platform",
"span": 6
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "sal",
"label": "Sal",
"span": 2,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3
},
{
"key": "dem",
"label": "Dem",
"span": 2,
"width": "narrow"
},
{
"key": "url",
"label": "URL",
"span": 12,
"width": "wide"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
}
],
"label": "Vîdeo"
}
},
"pronTpls": {
"ku-IPA": {
"desc": "IPAya otomatîk ji bo kurmancî (kontrol hewce ye)",
"snippet": "* {{ku-IPA}}",
"langs": [
"ku"
],
"noLang": true
},
"ku-kîte": {
"desc": "Hecekirina otomatîk ji bo kurmancî",
"snippet": "* {{ku-kîte}}",
"langs": [
"ku"
],
"noLang": true
},
"zza-IPA": {
"desc": "IPAya otomatîk ji bo zazakî",
"snippet": "* {{zza-IPA}}",
"langs": [
"zza"
],
"noLang": true
},
"zza-kîte": {
"desc": "Hecekirina otomatîk ji bo zazakî",
"snippet": "* {{zza-kîte}}",
"langs": [
"zza"
],
"noLang": true
},
"IPA": {
"desc": "Alfabeya fonetîk a navmiletî (IPA)",
"snippet": "* {{IPA|CODE|/…/}}"
},
"deng": {
"desc": "Nimûneya telafûzê bi dosyeya dengî",
"snippet": "* {{deng|CODE|navê_dosyayê.ogg|dever=}}"
},
"bilêv": {
"desc": "{{bilêv|herf|nerm, req|hejmar}}",
"snippet": "* {{bilêv|herf|cure|hejmar}}"
},
"kîte": {
"desc": "Şablona hecekirinê",
"snippet": "* {{kîte|CODE|he|ce}}"
},
"hevdeng": {
"desc": "Hevdeng — gotinên bi heman dengî",
"snippet": "* {{hevdeng|CODE|…}}"
}
},
"etymTpls": {
"etîmon": {
"desc": "Etîmolojiya birêkûpêk: zincîr, dar û kategorî — {{etîmon|ku|:deyn|fa:پنجه\u003Ct:dest\u003E|metn=++}}",
"snippet": "{{etîmon|CODE}}"
},
"ji": {
"desc": "Ji zimanekî din hatiye — {{ji|en|ku|anatomy|tr=|t=}}",
"snippet": "{{ji|SOURCELANG|CODE|…}}"
},
"deyn": {
"desc": "Deynkirî — {{deyn|lang|kod|kelîme}}",
"snippet": "{{deyn|SOURCELANG|CODE|…}}"
},
"mîr": {
"desc": "Mîrasmayî — {{mîr|lang|kod|kelîme}}",
"snippet": "{{mîr|SOURCELANG|CODE|…}}"
},
"qertaf": {
"desc": "Ji bo pêşgir, paşgir û hevedudanî — {{qertaf|kod|pêşgir-|reh}}",
"snippet": "{{qertaf|CODE|…|…}}"
},
"anlz": {
"desc": "Wekî qertaf lê dibêje analîza şiklî — {{anlz|kod|pêşgir-|reh}}",
"snippet": "{{anlz|CODE|…|…}}"
},
"q": {
"desc": "Referans bo rûpelekê — {{q|kod|kelîme}} navê zimanî dernakeve",
"snippet": "{{q|CODE|…}}"
},
"hv": {
"desc": "Hevreh — {{hv|lang|kelîme}} navê zimanî derdikeve",
"snippet": "{{hv|SOURCELANG|…}}"
},
"nh": {
"desc": "Nehevreh — {{nh|lang|kelîme}} navê zimanî derdikeve",
"snippet": "{{nh|SOURCELANG|…}}"
},
"cotreh": {
"desc": "Cotreh — teror {{cotreh|ku|tirs}}",
"snippet": "{{cotreh|CODE|…}}"
},
"yekser": {
"desc": "tercimeya yekser — {{yekser|lang|kod|kelîme}}",
"snippet": "{{yekser|SOURCELANG|CODE|…}}"
},
"wergirtin": {
"desc": "Wergirtina maneyê — {{wergirtin|lang|kod|kelîme}}",
"snippet": "{{wergirtin|SOURCELANG|CODE|…}}"
},
"paşvesazî": {
"desc": "Paşvesazî — greed {{paşvesazî|en|greedy}}",
"snippet": "{{paşvesazî|CODE|…}}"
},
"qusandin": {
"desc": "Qusandin — Miho {{qusandin|ku|Mihemmed}}",
"snippet": "{{qusandin|CODE|…}}"
},
"têkilkirin": {
"desc": "Têkilkirin — sormancî {{têkilkirin|ku|soranî|kurmancî}}",
"snippet": "{{têkilkirin|CODE|…}}"
},
"nyz": {
"desc": "Nayê zanîn — {{nyz|ku|hûr=1}}",
"snippet": "{{nyz|CODE}}"
},
"onom": {
"desc": "Onomatopoetîk — {{onom|ku|hûr=1}}",
"snippet": "{{onom|CODE}}"
},
"navmiletî": {
"desc": "Navmiletî — {{navmiletî|ku|hûr=1}}",
"snippet": "{{navmiletî|CODE}}"
},
"neo": {
"desc": "neolojîzm — {{neolojîzm|ku|hûr=1}}",
"snippet": "{{neolojîzm|CODE}}"
}
},
"etimon": {
"keywords": [
{
"key": "mîr",
"desc": "Kelîmeya ku ji zimanê bav û kalan maye",
"aliases": [
"mîrasmayî",
"inh"
]
},
{
"key": "deyn",
"desc": "Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin",
"aliases": [
"bor",
"borrowed"
]
},
{
"key": "deynh",
"desc": "Deynkirina hînbûyî: ne bi riya têkiliya rojane, bi qesd hatiye girtin",
"aliases": [
"lbor"
]
},
{
"key": "deynhq",
"desc": "Deynkirina hînbûyî ya ku hinekî hatiye guhertin",
"aliases": [
"slbor"
]
},
{
"key": "deynort",
"desc": "Deynkirina ortografîk",
"aliases": [
"obor"
]
},
{
"key": "deynne",
"desc": "Deynkirina neadaptekirî",
"aliases": [
"ubor"
]
},
{
"key": "drş",
"desc": "Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be",
"aliases": [
"dariştî",
"der"
]
},
{
"key": "ji",
"desc": "Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e",
"aliases": [
"from"
]
},
{
"key": "drşnd",
"desc": "Dariştin heye lê cureyê wê ne diyar e",
"aliases": [
"uder"
]
},
{
"key": "qf",
"desc": "Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e",
"aliases": [
"qertaf",
"af"
]
},
{
"key": "reh",
"desc": "Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e (\"Peyvên … yên aîdî rehê …\") û di metn û darê de xuya nabe",
"aliases": [
"root"
],
"invisible": true
},
{
"key": "yekser",
"desc": "Wergerandina yekser; zincîr li vir disekine",
"aliases": [
"cal",
"clq"
]
},
{
"key": "yekserq",
"desc": "Wergerandina yekser a qismî; zincîr li vir disekine",
"aliases": [
"yekserqismî",
"pcal"
]
},
{
"key": "wergirtin",
"desc": "Wergirtina maneyê; mana wergirtî bi \u003Cmaneid:…\u003E tê nîşankirin",
"aliases": [
"sl"
]
},
{
"key": "lihevanîn",
"desc": "Lihevanîna dengî-maneyî",
"aliases": [
"psm"
]
},
{
"key": "tesîr",
"desc": "Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine",
"aliases": [
"influence"
]
},
{
"key": "têkilkirin",
"desc": "Têkilkirina du kelîmeyan",
"aliases": [
"blend"
],
"min": 2
},
{
"key": "ûnîverbasyon",
"desc": "Ûnîverbasyon",
"aliases": [
"ûnîv",
"univ"
]
},
{
"key": "qusandin",
"desc": "Qusandin",
"aliases": [
"clip"
]
},
{
"key": "paşvesazî",
"desc": "Paşvesazî",
"aliases": [
"bf"
]
},
{
"key": "elîpsîz",
"desc": "Elîpsîz",
"aliases": [
"elîp",
"ellip"
]
},
{
"key": "nomînalîzasyon",
"desc": "Nomînalîzasyon",
"aliases": [
"nomîn",
"nom"
]
},
{
"key": "translîterasyon",
"desc": "Translîterasyon",
"aliases": [
"translît",
"translit"
]
},
{
"key": "redûblîkasyon",
"desc": "Redûblîkasyon",
"aliases": [
"redûb",
"redup"
]
},
{
"key": "kurtkirin",
"desc": "Kurtkirina kelîmeyekê",
"aliases": [
"abbr"
]
},
{
"key": "sylabbr",
"desc": "Kurtkirin li gorî kîteyan",
"aliases": [
"syllabic abbreviation",
"sylabbrev"
]
},
{
"key": "akronîm",
"desc": "Akronîm",
"aliases": [
"acro"
]
},
{
"key": "înîtîalîzm",
"desc": "Înîtîalîzm",
"aliases": [
"înît",
"init"
]
},
{
"key": "metatez",
"desc": "Metatez",
"aliases": [
"meta"
]
},
{
"key": "afeq",
"desc": "Wek :qf, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike",
"invisible": true
},
{
"key": "apheresis",
"desc": "Şiklê ku dengê destpêkê winda kiriye",
"aliases": [
"apheretic",
"aphetic"
]
},
{
"key": "denom",
"desc": "Fiîla ji îsmekê çêbûyî",
"aliases": [
"denominal"
]
},
{
"key": "deverbal",
"desc": "Kelîmeya ji fiîlekê çêbûyî"
},
{
"key": "vrd",
"desc": "Dariştina vṛddhî (sanskrîtî); bi qertaf: :vrd-af"
},
{
"key": "sa-af",
"desc": "Pêkhateya sanskrîtî",
"min": 2
}
],
"wordMods": [
{
"key": "t",
"desc": "Tercimeya kelîmeyê bi kurmancî",
"aliases": [
"w"
]
},
{
"key": "tr",
"desc": "Translîterasyon"
},
{
"key": "ts",
"desc": "Transkrîpsiyon"
},
{
"key": "cuda",
"desc": "Şiklê ku tê nîşandan, eger ne wek navê rûpelê be",
"aliases": [
"alt"
]
},
{
"key": "id",
"desc": "Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan"
},
{
"key": "crz",
"desc": "Cureyê rêzimanî yê kelîmeyê",
"aliases": [
"pos"
],
"values": [
"reh",
"kelîme",
"pêşgir",
"paşgir",
"navgir"
]
},
{
"key": "g",
"desc": "Cinsiyet: n (nêr), m (mê), nt (nêtar)",
"values": [
"n",
"m",
"nt"
]
},
{
"key": "q",
"desc": "Wesf li pêşiyê kelîmeyê"
},
{
"key": "qq",
"desc": "Wesf li pey kelîmeyê"
},
{
"key": "hrf",
"desc": "Mana herfiyen",
"aliases": [
"lit"
]
},
{
"key": "ref",
"desc": "Çavkanî; binêre #Çavkanî"
},
{
"key": "nediyar",
"desc": "Ev gav ne teqez e",
"flag": true,
"aliases": [
"unc"
]
},
{
"key": "crztip",
"desc": "Kelîme ji bo kategoriyan wek reh yan kelîme tê hesibandin",
"aliases": [
"postype"
],
"values": [
"reh",
"kelîme"
]
},
{
"key": "etimon",
"desc": "Etîmolojiya di cih de; binêre jor",
"aliases": [
"ety"
]
},
{
"key": "aftype",
"desc": "Di nav :qf de: cureyê qertafê; binêre #Cureyên qertafan",
"values": [
"pêşgir",
"paşgir",
"navgir",
"circumfix",
"infix",
"non-affix",
"root"
],
"only": [
"qf"
]
},
{
"key": "deyn",
"desc": "Di nav :qf de: ev parçe deynkirî ye",
"flag": true,
"only": [
"qf"
]
},
{
"key": "deynh",
"desc": "Di nav :qf de: ev parçe deynkirî ye",
"flag": true,
"only": [
"qf"
]
},
{
"key": "deynhq",
"desc": "Di nav :qf de: ev parçe deynkirî ye",
"flag": true,
"only": [
"qf"
]
}
],
"keywordMods": [
{
"key": "unc",
"desc": "Ev gav ne teqez e: \"Mihtemelen…\"",
"flag": true
},
{
"key": "grdk",
"desc": "Girêdeka di navbera kelîmeyên jêder de, li şûna \"yan jî\"",
"aliases": [
"conj"
]
},
{
"key": "anlz",
"desc": "Analîza şiklî",
"flag": true,
"aliases": [
"surf"
]
},
{
"key": "hrf",
"desc": "Di nav :qf de: mana herfiyen",
"aliases": [
"lit"
],
"only": [
"qf"
]
},
{
"key": "maneid",
"desc": "Di nav :wergirtin de: nasnameya maneya wergirtî",
"aliases": [
"senseid"
],
"only": [
"wergirtin"
]
},
{
"key": "metn",
"desc": "Di nav :ji û :drş de: metnekî din li şûna \"Ji\"",
"aliases": [
"text"
],
"only": [
"ji",
"drş"
]
},
{
"key": "ref",
"desc": "Çavkaniya vê gavê"
}
],
"metnChoices": [
{
"value": "++",
"desc": "Tevahiya zincîrê"
},
{
"value": "+",
"desc": "Tenê gava pêşîn"
},
{
"value": "*",
"desc": "Heta kelîmeya pêşîn a ku rûpela wê heye"
},
{
"value": "1",
"desc": "Ewqas gav (hejmarek)",
"free": true
},
{
"value": ":",
"desc": "Heta zimanê bi wê kodê (:kod)",
"free": true
},
{
"value": ":*",
"desc": "Heta wî zimanî, eger rûpela wî tune be heta ya pêşîn a heyî (:kod*)",
"free": true
}
],
"afTypes": [
{
"key": "pêşgir",
"desc": "Pêşgir"
},
{
"key": "paşgir",
"desc": "Paşgir"
},
{
"key": "navgir",
"desc": "Navgir"
},
{
"key": "circumfix",
"desc": "Dorgir"
},
{
"key": "infix",
"desc": "Nawgir (infix)"
},
{
"key": "non-affix",
"desc": "Ne qertaf"
},
{
"key": "root",
"desc": "Reh"
}
],
"params": [
{
"key": "dar",
"desc": "Bi 1 dara etîmolojiyê nîşan dide.",
"type": "flag"
},
{
"key": "id",
"desc": "Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan.",
"type": "text"
},
{
"key": "title",
"desc": "Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be.",
"type": "text"
},
{
"key": "crz",
"desc": "Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: reh, kelîme, pêşgir, paşgir, navgir.",
"type": "select",
"values": [
"reh",
"kelîme",
"pêşgir",
"paşgir",
"navgir"
]
},
{
"key": "cotreh",
"desc": "Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda.",
"type": "text"
},
{
"key": "tarîxa-etîm",
"desc": "Tarîxa peyitandina pêşîn, wek 1901, 1500s, 14c, c,1900, before,1850, r,1501,1558.",
"type": "text"
},
{
"key": "niqtena",
"desc": "Bi 1 niqteya dawiyê nayê zêdekirin.",
"type": "flag"
},
{
"key": "niqte",
"desc": "Li şûna niqteya dawiyê nîşaneke din.",
"type": "text"
},
{
"key": "katna",
"desc": "Bi 1 kategorî nayên zêdekirin. Herwiha {{para|nekat}}.",
"type": "flag"
},
{
"key": "darna",
"desc": "Bi 1 ev etîmolojî di dara rûpelên din de dernakeve.",
"type": "flag"
},
{
"key": "exnihilo",
"desc": "Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin.",
"type": "flag"
}
]
},
"metadata": {
"aa": {
"haswikt": 1,
"sc": [
"Latn",
"Ethi"
]
},
"ab": {
"haswikt": 1,
"sc": [
"Cyrl",
"Latn",
"Geor"
]
},
"aer": {
"sc": "Latn"
},
"af": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"ak": {
"haswikt": 1
},
"akk": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"sc": "Xsux"
},
"als": {
"haswikt": 1
},
"am": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1,
"sc": "Ethi"
},
"an": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"ang": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"ar": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"alt": 1,
"haswikt": 1,
"sc": "Arab"
},
"arc": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"sc": [
"Hebr",
"Syrc"
]
},
"are": {},
"arz": {
"alt": 1,
"g": [
"n",
"m",
"n-p",
"m-p"
],
"sc": "Arab"
},
"as": {
"haswikt": 1,
"sc": "Beng"
},
"ast": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"av": {
"haswikt": 1
},
"ay": {
"haswikt": 1
},
"az": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": [
"Latn",
"Cyrl",
"Arab"
]
},
"ba": {
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"bar": {},
"bat-smg": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"bbl": {
"sc": "Geor"
},
"be": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"be-x-old": {
"sc": "Cyrl"
},
"bg": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"bh": {
"haswikt": 1,
"sc": "Deva"
},
"bhb": {
"sc": "Deva"
},
"bi": {
"haswikt": 1
},
"blt": {
"sc": "Tavt"
},
"bm": {
"haswikt": 1,
"sc": [
"Latn",
"Nkoo",
"Arab"
]
},
"bn": {
"haswikt": 1,
"sc": "Beng"
},
"bo": {
"haswikt": 1,
"sc": "Tibt"
},
"br": {
"g": [
"n",
"m"
],
"haswikt": 1
},
"ca": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"cdo": {
"sc": "Hani"
},
"ce": {
"sc": "Cyrl"
},
"ch": {
"haswikt": 1
},
"chr": {
"haswikt": 1,
"sc": "Cher"
},
"cjy": {
"sc": "Hani"
},
"ckb": {
"haswikt": 1,
"sc": "Arab",
"wsc": "ku-Arab"
},
"cmn": {
"sc": "Hani",
"wiktprefix": "zh"
},
"co": {
"haswikt": 1
},
"cpx": {
"sc": "Hani"
},
"cr": {
"haswikt": 1,
"sc": "Cans"
},
"crh": {},
"cs": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"csb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"cu": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"sc": [
"Cyrs",
"Glag"
]
},
"cv": {
"sc": "Cyrl"
},
"cy": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"czh": {
"sc": "Hani"
},
"czo": {
"sc": "Hani"
},
"da": {
"g": [
"g",
"nt",
"g-p",
"nt-p",
"p"
],
"haswikt": 1
},
"dax": {},
"de": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1,
"allowCaps": 1
},
"dhg": {},
"djb": {},
"dji": {},
"djr": {},
"dng": {
"sc": "Cyrl"
},
"dsb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
]
},
"dsx": {},
"duj": {},
"dv": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Thaa"
},
"dz": {
"haswikt": 1,
"sc": "Tibt"
},
"el": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"en": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"eo": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"es": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"et": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"ett": {
"g": [
"y",
"p"
],
"sc": "Ital"
},
"eu": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"fa": {
"haswikt": 1,
"g": [
"y",
"p"
],
"sc": "Arab",
"wsc": "fa-Arab"
},
"fa-cls": {
"wiktprefix": "fa",
"sc": "Arab",
"wsc": "fa-Arab"
},
"fa-ira": {
"wiktprefix": "fa",
"sc": "Arab",
"wsc": "fa-Arab"
},
"fi": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"fil": {},
"fj": {
"haswikt": 1
},
"fo": {
"g": [
"n",
"m",
"nt"
],
"haswikt": 1
},
"fr": {
"g": [
"n",
"m",
"mnmane",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"frm": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"fro": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"fur": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"fy": {
"g": [
"g",
"nt",
"p"
],
"haswikt": 1
},
"ga": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"gan": {
"sc": "Hani"
},
"gd": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"gez": {
"sc": "Ethi"
},
"gl": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"gmw-ecg": {
"g": [
"n",
"m",
"nt",
"p"
],
"allowCaps": 1
},
"gmy": {
"sc": "Linb"
},
"gn": {
"haswikt": 1
},
"gnn": {
"sc": "Latn"
},
"got": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"sc": "Goth"
},
"grc": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
]
},
"gsw": {
"g": [
"n",
"m",
"nt",
"p"
],
"allowCaps": 1
},
"gu": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1,
"sc": "Gujr"
},
"guf": {
"sc": "Latn"
},
"gv": {
"haswikt": 1
},
"ha": {
"haswikt": 1
},
"hak": {
"sc": "Hani"
},
"har": {
"sc": "Ethi"
},
"he": {
"alt": 1,
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Hebr"
},
"hi": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Deva"
},
"hif": {
"sc": [
"Latn",
"Deva"
]
},
"hit": {
"sc": "Xsux"
},
"hrx": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"hsb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"hsn": {
"sc": "Hani"
},
"hu": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"hy": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Armn"
},
"ia": {
"haswikt": 1
},
"id": {
"haswikt": 1
},
"ie": {
"haswikt": 1
},
"ik": {
"haswikt": 1
},
"ike": {
"sc": "Cans"
},
"ikt": {
"sc": "Cans"
},
"io": {
"haswikt": 1
},
"is": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"it": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"iu": {
"haswikt": 1,
"sc": "Cans"
},
"ja": {
"haswikt": 1,
"sc": "Jpan"
},
"jay": {
"sc": "Latn"
},
"jbo": {
"haswikt": 1
},
"jv": {
"haswikt": 1
},
"ka": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"khb": {
"sc": [
"Talu",
"Lana",
"Thai"
]
},
"kjh": {
"sc": "Cyrl"
},
"kk": {
"haswikt": 1,
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"kkh": {
"sc": [
"Lana",
"Thai"
]
},
"kl": {
"haswikt": 1
},
"km": {
"haswikt": 1,
"sc": "Khmr"
},
"kn": {
"haswikt": 1,
"sc": "Knda"
},
"ku": {
"g": [
"n",
"m",
"mnmane",
"mndudil",
"n-p",
"m-p",
"p"
],
"wiktprefix": "ku"
},
"ko": {
"haswikt": 1,
"sc": "Kore"
},
"krc": {
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"ks": {
"haswikt": 1,
"sc": [
"Arab",
"Deva"
],
"wsc": "ks-Arab"
},
"kw": {
"haswikt": 1
},
"ky": {
"haswikt": 1,
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"la": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"lb": {
"g": [
"n",
"m",
"nt",
"p"
],
"haswikt": 1,
"allowCaps": 1
},
"lez": {
"sc": "Cyrl"
},
"li": {
"haswikt": 1
},
"lki": {
"wiktprefix": "ku"
},
"lld": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"lmo": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"ln": {
"haswikt": 1
},
"lo": {
"haswikt": 1,
"sc": "Laoo"
},
"lt": {
"alt": 1,
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"lv": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"lzz": {
"sc": "Geor"
},
"mg": {
"haswikt": 1
},
"mh": {
"haswikt": 1
},
"mi": {
"g": 0,
"haswikt": 1
},
"mk": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"ml": {
"haswikt": 1,
"sc": "Mlym"
},
"mn": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": [
"Cyrl",
"Mong"
]
},
"mnp": {
"sc": "Hani"
},
"mo": {
"haswikt": 1,
"sc": "Cyrl"
},
"mol": {
"sc": "Cyrl"
},
"mr": {
"g": [
"n",
"m",
"nt"
],
"haswikt": 1,
"sc": "Deva"
},
"ms": {
"haswikt": 1,
"sc": [
"Latn",
"Arab"
]
},
"mt": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"mwp": {
"sc": "Latn"
},
"my": {
"haswikt": 1,
"sc": "Mymr"
},
"na": {
"haswikt": 1
},
"nah": {
"haswikt": 1
},
"nan": {
"wiktprefix": "zh-min-nan",
"sc": "Hani"
},
"nb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"wiktprefix": "no"
},
"nds-de": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "nds"
},
"nds-nl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "nds"
},
"ne": {
"haswikt": 1,
"sc": "Deva"
},
"nl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1
},
"nn": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1
},
"no": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1
},
"nod": {
"sc": "Lana"
},
"non": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"oc": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"om": {
"haswikt": 1
},
"or": {
"haswikt": 1,
"sc": "Orya"
},
"orv": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"sc": "Cyrs"
},
"osc": {
"sc": "Ital"
},
"ota": {
"g": [
"y",
"p"
],
"sc": "Arab",
"wsc": "ota-Arab"
},
"pa": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": [
"Guru",
"Arab"
]
},
"pdt": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "nds"
},
"peo": {
"sc": "Xpeo"
},
"phn": {
"sc": "Phnx"
},
"pi": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"pjt": {
"sc": "Latn"
},
"pl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"pms": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"pox": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"împf",
"pf"
]
},
"prs": {
"wiktprefix": "fa",
"sc": "Arab",
"wsc": "fa-Arab"
},
"ps": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Arab",
"wsc": "ps-Arab"
},
"pt": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"qu": {
"haswikt": 1
},
"rgn": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"rit": {
"sc": "Latn"
},
"rm": {
"g": [
"n",
"m"
],
"haswikt": 1
},
"rn": {
"haswikt": 1
},
"ro": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1,
"sc": [
"Latn",
"Cyrl"
]
},
"roa-rup": {
"haswikt": 1
},
"ru": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"rue": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"sc": "Cyrl"
},
"ruo": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"rup": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "roa-rup"
},
"ruq": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"rw": {
"haswikt": 1
},
"sa": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1,
"sc": "Deva"
},
"sah": {
"sc": "Cyrl"
},
"sc": {
"haswikt": 1
},
"scn": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"sco": {
"sc": "Latn"
},
"sd": {
"haswikt": 1,
"sc": "Arab",
"wsc": "sd-Arab"
},
"sdh": {
"sc": "Arab",
"wiktprefix": "ku"
},
"sg": {
"haswikt": 1
},
"sh": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": [
"Latn",
"Cyrl"
]
},
"si": {
"haswikt": 1,
"sc": "Sinh"
},
"simple": {
"haswikt": 1
},
"sk": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"sl": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"sm": {
"haswikt": 1
},
"sn": {
"haswikt": 1
},
"so": {
"haswikt": 1
},
"spx": {
"sc": "Ital"
},
"sq": {
"g": [
"n",
"m"
],
"haswikt": 1
},
"ss": {
"haswikt": 1
},
"st": {
"haswikt": 1
},
"su": {
"haswikt": 1
},
"sux": {
"sc": "Xsux"
},
"sv": {
"g": [
"g",
"nt",
"g-p",
"nt-p"
],
"haswikt": 1
},
"sva": {
"sc": "Geor"
},
"sw": {
"nclass": 1,
"haswikt": 1
},
"syc": {
"sc": "Syrc"
},
"syr": {
"sc": "Syrc"
},
"szl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
]
},
"ta": {
"haswikt": 1,
"sc": "Taml"
},
"tdd": {
"sc": "Tale"
},
"te": {
"haswikt": 1,
"sc": "Telu"
},
"tg": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Cyrl"
},
"th": {
"haswikt": 1,
"sc": "Thai"
},
"ti": {
"haswikt": 1,
"sc": "Ethi"
},
"tig": {
"sc": "Ethi"
},
"tiw": {
"sc": "Latn"
},
"tk": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"tl": {
"haswikt": 1,
"sc": [
"Latn",
"Tglg"
]
},
"tmr": {
"sc": "Hebr"
},
"tn": {
"haswikt": 1
},
"to": {
"haswikt": 1
},
"tpi": {
"haswikt": 1
},
"tr": {
"g": [
"y",
"p"
],
"alt": 1,
"haswikt": 1
},
"ts": {
"haswikt": 1
},
"tt": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"tts": {
"sc": "Thai"
},
"tw": {
"haswikt": 1
},
"udi": {
"sc": [
"Cyrl",
"Latn",
"Armn",
"Geor"
]
},
"ug": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Arab",
"wsc": "ug-Arab"
},
"uga": {
"sc": "Ugar"
},
"uk": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"ulk": {
"sc": "Latn"
},
"ur": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Arab",
"wsc": "ur-Arab"
},
"uz": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"vec": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"vi": {
"haswikt": 1
},
"vls": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"vo": {
"haswikt": 1
},
"wa": {
"haswikt": 1
},
"wbp": {
"sc": "Latn"
},
"wo": {
"haswikt": 1
},
"wuu": {
"sc": "Hani"
},
"xae": {
"sc": "Ital"
},
"xcr": {
"sc": "Cari"
},
"xfa": {
"sc": "Ital"
},
"xh": {
"alt": 1,
"nclass": 1,
"haswikt": 1
},
"xlc": {
"sc": "Lyci"
},
"xld": {
"sc": "Lydi"
},
"xlu": {
"sc": "Xsux"
},
"xmf": {
"sc": "Geor"
},
"xno": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"xrr": {
"sc": "Ital"
},
"xst": {
"sc": "Ethi"
},
"xum": {
"sc": "Ital"
},
"xve": {
"sc": "Ital"
},
"xvo": {
"sc": "Ital"
},
"yi": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1,
"sc": "Hebr"
},
"yo": {
"haswikt": 1
},
"yua": {
"g": [
"y",
"p"
],
"alt": 1
},
"yue": {
"sc": "Hani"
},
"za": {
"haswikt": 1,
"sc": "Latn"
},
"zh-classical": {
"sc": "Hani"
},
"zh-min-nan": {
"haswikt": 1
},
"zh-yue": {
"sc": "Hani"
},
"zu": {
"alt": 1,
"nclass": 1,
"haswikt": 1
},
"zza": {
"g": [
"n",
"m",
"mn",
"n-p",
"m-p",
"p"
],
"wiktprefix": "diq"
}
},
"numberLabels": {
"y": {
"display": "yekjimar"
},
"d": {
"display": "hejmar dual"
},
"p": {
"display": "pirjimar"
},
"p+": {
"display": "axlebî pirjimar"
},
"tp": {
"display": "tenê pirjimar"
},
"j": {
"display": "jimarbar"
},
"j+": {
"display": "axlebî jimarbar"
},
"j/nj": {
"display": "jimarbar û nejimarbar"
},
"nj": {
"display": "nejimarbar"
},
"nj+": {
"display": "axlebî nejimarbar"
},
"hj!": {
"display": "hejmar nepeyitandî ye"
},
"hj?": {
"display": "hejmar hewce ye"
}
},
"leadingTplOrder": [
"maneid",
"K",
"e"
],
"lekturChoices": [
{
"code": "gh",
"label": "gerguhêz (îsmî mefûl digire)"
},
{
"code": "ngh",
"label": "negerguhêz (îsmî mefûl nagire)"
}
],
"lekturFormChoices": [
{
"code": "x",
"label": "xwerû"
},
{
"code": "p",
"label": "pêkhatî"
},
{
"code": "h",
"label": "hevedudanî"
}
],
"deverQuickPicks": [
"kurmanciya rojavayî",
"kurmanciya merkezî",
"kurmanciya rojhilatî",
"Badînî",
"Botî",
"Serhedî",
"Bakur",
"Amed",
"Riha"
],
"maneTags": [
"cure?",
"rêziman?",
"kat-rêziman",
"kategoriya rêzimanê?",
"bêcure"
],
"senseGroups": [
{
"key": "alt-r",
"label": "Formên alternatîv",
"field": "alternativ",
"order": 3,
"hint": "Varyantên vê kelîmeyê"
},
{
"key": "hevmane",
"label": "Hevmane",
"field": "hevmane",
"order": 1,
"hint": "Spehî hevmaneya Bedew e."
},
{
"key": "dijmane",
"label": "Dijmane",
"field": "dijmane",
"order": 2,
"hint": "Zengîn dijmaneya feqîr e."
},
{
"key": "koordîne",
"label": "Termên koordîne",
"field": "koordine",
"order": 4,
"hint": "Pisîk û kûçik termên koordîne ne çunkî Jornavên wan gelek in"
},
{
"key": "jornav",
"label": "Jornav",
"field": "jornav",
"order": 5,
"hint": "Heywan jornavê guhandar e"
},
{
"key": "jêrnav",
"label": "Jêrnav",
"field": "jernav",
"order": 6,
"hint": "Guhandar jêrnavê heywan e"
}
],
"subsectionOrder": [
"Bilêvkirin",
"Ji wêjeya klasîk",
"Ji wêjeyê",
"Tewandin",
"Notên bikaranînê",
"Bi alfabeyên din",
"Formên alternatîv",
"Kurtkirin",
"Sembol",
"Navê zanistî",
"Hevmane",
"Nêzîk",
"Dijmane",
"Jornav",
"Jêrnav",
"Jê",
"Têkildar",
"Etîmolojî",
"Dûnde",
"Bide ber",
"Herwiha binêre",
"Bêhtir bixwîne",
"Bi zaravayên din",
"Werger",
"Qafiye",
"Anagram",
"Çavkanî"
],
"templateAliases": {
"K": [
"K",
"kategorîzebike",
"mijar"
],
"alt-r": [
"alt-r",
"forma alt di rêzê de",
"herwiha-rêz",
"herwiha di rêza maneyê de"
],
"dijmane": [
"dijmane",
"dijwate",
"dijmaneyên peyvê"
],
"e": [
"e",
"etîket",
"f",
"lb"
],
"g": [
"g",
"girêdan",
"l",
"link"
],
"hevmane": [
"hevmane",
"hevwate",
"hevmaneya peyvê",
"hevmaneyên peyvê",
"synonyms"
],
"jornav": [
"jornav",
"hîpernîm"
],
"jêrnav": [
"jêrnav",
"hîponîm"
],
"koordîne": [
"koordîne",
"termên koordîne",
"peyvên koordîneyî"
],
"mane?": [
"mane?",
"wate?",
"bêmane",
"bêwate"
],
"maneid": [
"maneid",
"senseid"
],
"h-bnr": [
"h-bnr",
"bnr-h",
"bnr h",
"bnr-hrw",
"bnr herwiha",
"herwiha binêre",
"binêre herwiha"
]
},
"wordlistTemplates": [
"kol3",
"kol2",
"kol",
"col3",
"col2",
"col"
],
"templateParams": {
"deyn": {
"order": [
"1",
"2",
"3",
"4",
"5",
"tr",
"ts",
"sc",
"id"
],
"labels": {
"1": "Zimanê jêder",
"2": "Zimanê wergir",
"3": "Kelîme",
"4": "Xuyakirina alternatîv",
"5": "Maneya kelîmeyê",
"tr": "Transliterasyon",
"ts": "Transkîpsiyon",
"sc": "Koda skrîptê",
"id": "IDya maneyê"
}
},
"hv": {
"order": [
"1",
"2",
"3",
"4",
"tr",
"ts",
"sc"
],
"labels": {
"1": "Koda zimanî",
"2": "Kelîme",
"3": "Xuyakirina alternatîv",
"4": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"sc": "Koda skrîptê"
}
},
"ji": {
"order": [
"1",
"2",
"3",
"4",
"5",
"tr",
"ts",
"id",
"sc"
],
"labels": {
"1": "Zimanê jêder",
"2": "Zimanê wergir",
"3": "Kelîme",
"4": "Xuyakirina alternatîv",
"5": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"id": "IDya maneyê",
"sc": "Koda skrîptê"
}
},
"jêder-kitêb": {
"order": [
"1",
"jêgirtin",
"sc",
"tr",
"t",
"nivîskar",
"nivîskar2",
"nivîskar3",
"amadekar",
"terciman",
"sernav",
"url",
"weşanxane",
"cih",
"cild",
"sal",
"sala-weşandinê",
"çap",
"rûpel",
"isbn",
"nekat",
"nivîskar4",
"nivîskar5",
"issn",
"oclc",
"serî",
"doi"
],
"labels": {
"1": "koda zimanî",
"sc": "koda skrîptê eger hewce be",
"tr": "translîterasyon",
"t": "tercime",
"rûpel": "rûpel"
}
},
"jêder-kovar": {
"order": [
"1",
"jêgirtin",
"sc",
"tr",
"werger",
"kovar",
"sernav",
"wergêr",
"nivîskar",
"nivîskar2",
"url",
"weşanxane",
"cîld",
"hejmar",
"sal",
"tarîx",
"rûpel"
],
"labels": {
"1": "Koda zimanî",
"sc": "Koda skrîptê",
"tr": "Translîterasyon",
"werger": "Tercimeya kurmancî ya jêgirtinê"
}
},
"jêder-vîdeo": {
"order": [
"1",
"title",
"year",
"date",
"author",
"authorlink",
"actor",
"role",
"time",
"at",
"medium",
"network",
"text",
"translation",
"season",
"number",
"episode",
"publisher",
"url",
"director",
"brackets"
],
"labels": {
"1": "Language",
"title": "Title",
"year": "Year of release",
"date": "Date of release",
"author": "Writer (screenplay)",
"authorlink": "Wikipedia author page",
"actor": "Actor (speaker)",
"role": "Role",
"time": "Timecode",
"at": "Context",
"medium": "Recording medium",
"network": "Network",
"text": "Quoted line",
"translation": "Translation",
"season": "Season number (series)",
"number": "Episode number (series)",
"episode": "Episode title (series)",
"publisher": "Publisher",
"url": "URL",
"director": "Director",
"brackets": "Brackets"
}
},
"jêder-websîte": {
"order": [
"1",
"jêgirtin",
"sc",
"tr",
"t",
"nivîskar",
"terciman",
"sernav",
"url",
"urlya-arşîvê",
"websîte",
"tarîx",
"sal"
],
"labels": {
"1": "Koda zimanî",
"sc": "Koda skrîptê ya jêgirtinê",
"tr": "Translîterasyona jêgirtinê",
"t": "Tercimeya kurmancî ya jêgirtinê"
}
},
"mîr": {
"order": [
"1",
"2",
"3",
"4",
"5",
"tr",
"ts",
"id",
"sc"
],
"labels": {
"1": "Zimanê jêder",
"2": "Zimanê wergir",
"3": "Kelîme",
"4": "Xuyakirina alternatîv",
"5": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"id": "IDya maneyê",
"sc": "Koda skrîptê"
}
},
"nh": {
"order": [
"1",
"2",
"3",
"4",
"tr",
"ts",
"sc"
],
"labels": {
"1": "Koda zimanî",
"2": "Kelîme",
"3": "Xuyakirina alternatîv",
"4": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"sc": "Koda skrîptê"
}
},
"qertaf": {
"order": [
"1",
"2",
"3",
"sc",
"cuda1",
"cuda2",
"t1",
"t2",
"tr1",
"tr2"
],
"labels": {
"1": "language code",
"2": "first part",
"3": "second part",
"sc": "script code",
"cuda1": "first part alternate text",
"cuda2": "second part alternate text",
"w1": "first gloss",
"w2": "second gloss",
"tr1": "first part transliteration",
"tr2": "second part transliteration"
}
},
"yekser": {
"order": [
"1",
"2",
"3",
"hûr",
"nekat"
]
}
}
}
q2u0343ttafvbuc3x5mvjn5z8bstyf1
6532549
6532114
2026-09-19T08:52:51Z
Wikihez
7344
Etymology: keep dar= and id= in the open, below metn=
6532549
json
application/json
{
"langChoices": {
"ku": "kurmancî",
"zza": "zazakî",
"ckb": "soranî",
"sdh": "kurdiya başûrî",
"hac": "hewramî",
"de": "almanî",
"ar": "erebî",
"fa": "farisî",
"fr": "fransî",
"fi": "fînî",
"en": "îngilîzî",
"ja": "japonî",
"sv": "swêdî",
"tr": "tirkî"
},
"posExamples": {
"navdêr": "Kelîmeyên ji bo tiştan (sêv, heywan, qedeh) yan terman (dilşadî, bextiyarî hwd.) di rêzimanê de.",
"lêker": "Kelîmeyên ji bo kirin an bûyînê wekî 'nivîsîn' yan 'xeber dan'.",
"rengdêr": "Kelîmeyên ku wesfa navdêran nîşan didin wekî 'sêva sor' yan 'xwarina şîrîn'.",
"hoker": "Kelîmeyên ku dem, cih yan awayê kirinê diyar dikin wekî 'bi vî awayî' yan 'demkî'.",
"daçek": "Kelîmeyên ku cih, dem yan hereketê diyar dikin wekî 'di.. de' yan 'ji'.",
"cînav": "Kelîmeyên ku li şûna navdêran tên bikaranîn daku navdêr neyên dubarekirin wekî 'ew' yan 'em'.",
"baneşan": "Kelîmeyên ku hest, deng hwd. îfade dikin wekî 'noşî!' yan 'aferîn'.",
"serenav": "Navdêrên ku şexsiyetên ferdî nîşan didin, wek navên kes, cih an organîzasyonan nimûne 'London' yan 'Diyarbekir'.",
"gotineke pêşiyan": "Gotinên ku di nav xelkê de bi berbelavî tên bikaranîn bo nimûne 'Serê neêşe ne hewceyî destmalê ye'."
},
"genderLabels": {
"m": "mê",
"n": "nêr",
"nt": "nêtar",
"mn": "mê yan nêr",
"mnmane": "mê yan nêr li gorî maneyê",
"mndudil": "mê yan nêr bikaranîn dudil e",
"g": "giştî",
"y": "yekjimar",
"p": "pirjimar"
},
"tplDefs": {
"rastnivîs": {
"langs": [
"ku"
],
"noLang": true
},
"ku-Latn": {
"langs": [
"ku"
],
"noLang": true
},
"ku-tewîna-nav": {
"langs": [
"ku"
],
"noLang": true
},
"sdh-Arab": {
"langs": [
"sdh"
],
"noLang": true
},
"hac-Arab": {
"langs": [
"hac"
],
"noLang": true
},
"ja-romanîzekirin": {
"langs": [
"ja"
],
"noLang": true
},
"ckb-Arab": {
"langs": [
"ckb"
],
"noLang": true
},
"zza-awayê-Jacobsonê": {
"langs": [
"zza"
]
},
"awayekî din": {
"langs": null
},
"guharto": {
"langs": null
},
"hevmaneya": {
"langs": null
},
"kevnbûyî": {
"langs": null
},
"kêmpeyda": {
"langs": null
},
"kurtkirin": {
"langs": null
},
"paşnav": {
"langs": null
},
"şaşnivîs": {
"langs": null
}
},
"jederDefs": {
"jêder-kitêb": {
"label": "Kitêb",
"fields": [
{
"key": "nivîskar",
"label": "Nivîskar",
"span": 3
},
{
"key": "terciman",
"label": "Terciman",
"span": 3
},
{
"key": "amadekar",
"label": "Amadekar",
"span": 3
},
{
"key": "weşanxane",
"label": "Weşanxane",
"span": 3
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "beş",
"label": "Beş",
"span": 3,
"width": "medium"
},
{
"key": "cih",
"label": "Cih",
"span": 2,
"width": "narrow"
},
{
"key": "sal",
"label": "Sal",
"span": 1,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3,
"width": "medium"
},
{
"key": "sala-weşandinê",
"label": "Sala weşandinê",
"span": 2,
"width": "narrow"
},
{
"key": "çap",
"label": "Çap",
"span": 1,
"width": "narrow"
},
{
"key": "cild",
"label": "Cild",
"span": 2,
"width": "narrow"
},
{
"key": "rûpel",
"label": "Rûpel",
"span": 1,
"width": "narrow"
},
{
"key": "isbn",
"label": "ISBN",
"span": 2,
"width": "narrow"
},
{
"key": "url",
"label": "URL",
"span": 12,
"width": "wide"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
}
]
},
"jêder-kovar": {
"label": "Kovar",
"fields": [
{
"key": "nivîskar",
"label": "Nivîskar",
"span": 3
},
{
"key": "terciman",
"label": "Terciman",
"span": 3
},
{
"key": "amadekar",
"label": "Amadekar",
"span": 3
},
{
"key": "weşanxane",
"label": "Weşanxane",
"span": 3
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "kovar",
"label": "Kovar",
"span": 4
},
{
"key": "cild",
"label": "Cild",
"span": 2,
"width": "narrow"
},
{
"key": "hejmar",
"label": "Hejmar",
"span": 2,
"width": "narrow"
},
{
"key": "sal",
"label": "Sal",
"span": 2,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3,
"width": "medium"
},
{
"key": "rûpel",
"label": "Rûpel",
"span": 2,
"width": "narrow"
},
{
"key": "issn",
"label": "ISSN",
"span": 2,
"width": "narrow"
},
{
"key": "doi",
"label": "DOI",
"span": 2,
"width": "narrow"
},
{
"key": "url",
"label": "URL",
"span": 12,
"width": "wide"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
}
]
},
"jêder-websîte": {
"label": "Websîte",
"fields": [
{
"key": "nivîskar",
"label": "Nivîskar",
"span": 4
},
{
"key": "terciman",
"label": "Terciman",
"span": 4
},
{
"key": "websîte",
"label": "Websîte",
"span": 4
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "url",
"label": "URL",
"span": 5
},
{
"key": "urlya-arşîvê",
"label": "URLya Arşîvê",
"span": 5
},
{
"key": "roja-arşîvê",
"label": "Roja arşîvê",
"span": 3,
"width": "medium"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
},
{
"key": "sal",
"label": "Sal",
"span": 1,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3,
"width": "medium"
}
]
},
"jêder-vîdeo": {
"fields": [
{
"key": "hunermend",
"label": "Hunermend",
"span": 6
},
{
"key": "platform",
"label": "Platform",
"span": 6
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "sal",
"label": "Sal",
"span": 2,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3
},
{
"key": "dem",
"label": "Dem",
"span": 2,
"width": "narrow"
},
{
"key": "url",
"label": "URL",
"span": 12,
"width": "wide"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
}
],
"label": "Vîdeo"
}
},
"pronTpls": {
"ku-IPA": {
"desc": "IPAya otomatîk ji bo kurmancî (kontrol hewce ye)",
"snippet": "* {{ku-IPA}}",
"langs": [
"ku"
],
"noLang": true
},
"ku-kîte": {
"desc": "Hecekirina otomatîk ji bo kurmancî",
"snippet": "* {{ku-kîte}}",
"langs": [
"ku"
],
"noLang": true
},
"zza-IPA": {
"desc": "IPAya otomatîk ji bo zazakî",
"snippet": "* {{zza-IPA}}",
"langs": [
"zza"
],
"noLang": true
},
"zza-kîte": {
"desc": "Hecekirina otomatîk ji bo zazakî",
"snippet": "* {{zza-kîte}}",
"langs": [
"zza"
],
"noLang": true
},
"IPA": {
"desc": "Alfabeya fonetîk a navmiletî (IPA)",
"snippet": "* {{IPA|CODE|/…/}}"
},
"deng": {
"desc": "Nimûneya telafûzê bi dosyeya dengî",
"snippet": "* {{deng|CODE|navê_dosyayê.ogg|dever=}}"
},
"bilêv": {
"desc": "{{bilêv|herf|nerm, req|hejmar}}",
"snippet": "* {{bilêv|herf|cure|hejmar}}"
},
"kîte": {
"desc": "Şablona hecekirinê",
"snippet": "* {{kîte|CODE|he|ce}}"
},
"hevdeng": {
"desc": "Hevdeng — gotinên bi heman dengî",
"snippet": "* {{hevdeng|CODE|…}}"
}
},
"etymTpls": {
"etîmon": {
"desc": "Etîmolojiya birêkûpêk: zincîr, dar û kategorî — {{etîmon|ku|:deyn|fa:پنجه\u003Ct:dest\u003E|metn=++}}",
"snippet": "{{etîmon|CODE}}"
},
"ji": {
"desc": "Ji zimanekî din hatiye — {{ji|en|ku|anatomy|tr=|t=}}",
"snippet": "{{ji|SOURCELANG|CODE|…}}"
},
"deyn": {
"desc": "Deynkirî — {{deyn|lang|kod|kelîme}}",
"snippet": "{{deyn|SOURCELANG|CODE|…}}"
},
"mîr": {
"desc": "Mîrasmayî — {{mîr|lang|kod|kelîme}}",
"snippet": "{{mîr|SOURCELANG|CODE|…}}"
},
"qertaf": {
"desc": "Ji bo pêşgir, paşgir û hevedudanî — {{qertaf|kod|pêşgir-|reh}}",
"snippet": "{{qertaf|CODE|…|…}}"
},
"anlz": {
"desc": "Wekî qertaf lê dibêje analîza şiklî — {{anlz|kod|pêşgir-|reh}}",
"snippet": "{{anlz|CODE|…|…}}"
},
"q": {
"desc": "Referans bo rûpelekê — {{q|kod|kelîme}} navê zimanî dernakeve",
"snippet": "{{q|CODE|…}}"
},
"hv": {
"desc": "Hevreh — {{hv|lang|kelîme}} navê zimanî derdikeve",
"snippet": "{{hv|SOURCELANG|…}}"
},
"nh": {
"desc": "Nehevreh — {{nh|lang|kelîme}} navê zimanî derdikeve",
"snippet": "{{nh|SOURCELANG|…}}"
},
"cotreh": {
"desc": "Cotreh — teror {{cotreh|ku|tirs}}",
"snippet": "{{cotreh|CODE|…}}"
},
"yekser": {
"desc": "tercimeya yekser — {{yekser|lang|kod|kelîme}}",
"snippet": "{{yekser|SOURCELANG|CODE|…}}"
},
"wergirtin": {
"desc": "Wergirtina maneyê — {{wergirtin|lang|kod|kelîme}}",
"snippet": "{{wergirtin|SOURCELANG|CODE|…}}"
},
"paşvesazî": {
"desc": "Paşvesazî — greed {{paşvesazî|en|greedy}}",
"snippet": "{{paşvesazî|CODE|…}}"
},
"qusandin": {
"desc": "Qusandin — Miho {{qusandin|ku|Mihemmed}}",
"snippet": "{{qusandin|CODE|…}}"
},
"têkilkirin": {
"desc": "Têkilkirin — sormancî {{têkilkirin|ku|soranî|kurmancî}}",
"snippet": "{{têkilkirin|CODE|…}}"
},
"nyz": {
"desc": "Nayê zanîn — {{nyz|ku|hûr=1}}",
"snippet": "{{nyz|CODE}}"
},
"onom": {
"desc": "Onomatopoetîk — {{onom|ku|hûr=1}}",
"snippet": "{{onom|CODE}}"
},
"navmiletî": {
"desc": "Navmiletî — {{navmiletî|ku|hûr=1}}",
"snippet": "{{navmiletî|CODE}}"
},
"neo": {
"desc": "neolojîzm — {{neolojîzm|ku|hûr=1}}",
"snippet": "{{neolojîzm|CODE}}"
}
},
"etimon": {
"keywords": [
{
"key": "mîr",
"desc": "Kelîmeya ku ji zimanê bav û kalan maye",
"aliases": [
"mîrasmayî",
"inh"
]
},
{
"key": "deyn",
"desc": "Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin",
"aliases": [
"bor",
"borrowed"
]
},
{
"key": "deynh",
"desc": "Deynkirina hînbûyî: ne bi riya têkiliya rojane, bi qesd hatiye girtin",
"aliases": [
"lbor"
]
},
{
"key": "deynhq",
"desc": "Deynkirina hînbûyî ya ku hinekî hatiye guhertin",
"aliases": [
"slbor"
]
},
{
"key": "deynort",
"desc": "Deynkirina ortografîk",
"aliases": [
"obor"
]
},
{
"key": "deynne",
"desc": "Deynkirina neadaptekirî",
"aliases": [
"ubor"
]
},
{
"key": "drş",
"desc": "Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be",
"aliases": [
"dariştî",
"der"
]
},
{
"key": "ji",
"desc": "Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e",
"aliases": [
"from"
]
},
{
"key": "drşnd",
"desc": "Dariştin heye lê cureyê wê ne diyar e",
"aliases": [
"uder"
]
},
{
"key": "qf",
"desc": "Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e",
"aliases": [
"qertaf",
"af"
]
},
{
"key": "reh",
"desc": "Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e (\"Peyvên … yên aîdî rehê …\") û di metn û darê de xuya nabe",
"aliases": [
"root"
],
"invisible": true
},
{
"key": "yekser",
"desc": "Wergerandina yekser; zincîr li vir disekine",
"aliases": [
"cal",
"clq"
]
},
{
"key": "yekserq",
"desc": "Wergerandina yekser a qismî; zincîr li vir disekine",
"aliases": [
"yekserqismî",
"pcal"
]
},
{
"key": "wergirtin",
"desc": "Wergirtina maneyê; mana wergirtî bi \u003Cmaneid:…\u003E tê nîşankirin",
"aliases": [
"sl"
]
},
{
"key": "lihevanîn",
"desc": "Lihevanîna dengî-maneyî",
"aliases": [
"psm"
]
},
{
"key": "tesîr",
"desc": "Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine",
"aliases": [
"influence"
]
},
{
"key": "têkilkirin",
"desc": "Têkilkirina du kelîmeyan",
"aliases": [
"blend"
],
"min": 2
},
{
"key": "ûnîverbasyon",
"desc": "Ûnîverbasyon",
"aliases": [
"ûnîv",
"univ"
]
},
{
"key": "qusandin",
"desc": "Qusandin",
"aliases": [
"clip"
]
},
{
"key": "paşvesazî",
"desc": "Paşvesazî",
"aliases": [
"bf"
]
},
{
"key": "elîpsîz",
"desc": "Elîpsîz",
"aliases": [
"elîp",
"ellip"
]
},
{
"key": "nomînalîzasyon",
"desc": "Nomînalîzasyon",
"aliases": [
"nomîn",
"nom"
]
},
{
"key": "translîterasyon",
"desc": "Translîterasyon",
"aliases": [
"translît",
"translit"
]
},
{
"key": "redûblîkasyon",
"desc": "Redûblîkasyon",
"aliases": [
"redûb",
"redup"
]
},
{
"key": "kurtkirin",
"desc": "Kurtkirina kelîmeyekê",
"aliases": [
"abbr"
]
},
{
"key": "sylabbr",
"desc": "Kurtkirin li gorî kîteyan",
"aliases": [
"syllabic abbreviation",
"sylabbrev"
]
},
{
"key": "akronîm",
"desc": "Akronîm",
"aliases": [
"acro"
]
},
{
"key": "înîtîalîzm",
"desc": "Înîtîalîzm",
"aliases": [
"înît",
"init"
]
},
{
"key": "metatez",
"desc": "Metatez",
"aliases": [
"meta"
]
},
{
"key": "afeq",
"desc": "Wek :qf, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike",
"invisible": true
},
{
"key": "apheresis",
"desc": "Şiklê ku dengê destpêkê winda kiriye",
"aliases": [
"apheretic",
"aphetic"
]
},
{
"key": "denom",
"desc": "Fiîla ji îsmekê çêbûyî",
"aliases": [
"denominal"
]
},
{
"key": "deverbal",
"desc": "Kelîmeya ji fiîlekê çêbûyî"
},
{
"key": "vrd",
"desc": "Dariştina vṛddhî (sanskrîtî); bi qertaf: :vrd-af"
},
{
"key": "sa-af",
"desc": "Pêkhateya sanskrîtî",
"min": 2
}
],
"wordMods": [
{
"key": "t",
"desc": "Tercimeya kelîmeyê bi kurmancî",
"aliases": [
"w"
]
},
{
"key": "tr",
"desc": "Translîterasyon"
},
{
"key": "ts",
"desc": "Transkrîpsiyon"
},
{
"key": "cuda",
"desc": "Şiklê ku tê nîşandan, eger ne wek navê rûpelê be",
"aliases": [
"alt"
]
},
{
"key": "id",
"desc": "Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan"
},
{
"key": "crz",
"desc": "Cureyê rêzimanî yê kelîmeyê",
"aliases": [
"pos"
],
"values": [
"reh",
"kelîme",
"pêşgir",
"paşgir",
"navgir"
]
},
{
"key": "g",
"desc": "Cinsiyet: n (nêr), m (mê), nt (nêtar)",
"values": [
"n",
"m",
"nt"
]
},
{
"key": "q",
"desc": "Wesf li pêşiyê kelîmeyê"
},
{
"key": "qq",
"desc": "Wesf li pey kelîmeyê"
},
{
"key": "hrf",
"desc": "Mana herfiyen",
"aliases": [
"lit"
]
},
{
"key": "ref",
"desc": "Çavkanî; binêre #Çavkanî"
},
{
"key": "nediyar",
"desc": "Ev gav ne teqez e",
"flag": true,
"aliases": [
"unc"
]
},
{
"key": "crztip",
"desc": "Kelîme ji bo kategoriyan wek reh yan kelîme tê hesibandin",
"aliases": [
"postype"
],
"values": [
"reh",
"kelîme"
]
},
{
"key": "etimon",
"desc": "Etîmolojiya di cih de; binêre jor",
"aliases": [
"ety"
]
},
{
"key": "aftype",
"desc": "Di nav :qf de: cureyê qertafê; binêre #Cureyên qertafan",
"values": [
"pêşgir",
"paşgir",
"navgir",
"circumfix",
"infix",
"non-affix",
"root"
],
"only": [
"qf"
]
},
{
"key": "deyn",
"desc": "Di nav :qf de: ev parçe deynkirî ye",
"flag": true,
"only": [
"qf"
]
},
{
"key": "deynh",
"desc": "Di nav :qf de: ev parçe deynkirî ye",
"flag": true,
"only": [
"qf"
]
},
{
"key": "deynhq",
"desc": "Di nav :qf de: ev parçe deynkirî ye",
"flag": true,
"only": [
"qf"
]
}
],
"keywordMods": [
{
"key": "unc",
"desc": "Ev gav ne teqez e: \"Mihtemelen…\"",
"flag": true
},
{
"key": "grdk",
"desc": "Girêdeka di navbera kelîmeyên jêder de, li şûna \"yan jî\"",
"aliases": [
"conj"
]
},
{
"key": "anlz",
"desc": "Analîza şiklî",
"flag": true,
"aliases": [
"surf"
]
},
{
"key": "hrf",
"desc": "Di nav :qf de: mana herfiyen",
"aliases": [
"lit"
],
"only": [
"qf"
]
},
{
"key": "maneid",
"desc": "Di nav :wergirtin de: nasnameya maneya wergirtî",
"aliases": [
"senseid"
],
"only": [
"wergirtin"
]
},
{
"key": "metn",
"desc": "Di nav :ji û :drş de: metnekî din li şûna \"Ji\"",
"aliases": [
"text"
],
"only": [
"ji",
"drş"
]
},
{
"key": "ref",
"desc": "Çavkaniya vê gavê"
}
],
"metnChoices": [
{
"value": "++",
"desc": "Tevahiya zincîrê"
},
{
"value": "+",
"desc": "Tenê gava pêşîn"
},
{
"value": "*",
"desc": "Heta kelîmeya pêşîn a ku rûpela wê heye"
},
{
"value": "1",
"desc": "Ewqas gav (hejmarek)",
"free": true
},
{
"value": ":",
"desc": "Heta zimanê bi wê kodê (:kod)",
"free": true
},
{
"value": ":*",
"desc": "Heta wî zimanî, eger rûpela wî tune be heta ya pêşîn a heyî (:kod*)",
"free": true
}
],
"afTypes": [
{
"key": "pêşgir",
"desc": "Pêşgir"
},
{
"key": "paşgir",
"desc": "Paşgir"
},
{
"key": "navgir",
"desc": "Navgir"
},
{
"key": "circumfix",
"desc": "Dorgir"
},
{
"key": "infix",
"desc": "Nawgir (infix)"
},
{
"key": "non-affix",
"desc": "Ne qertaf"
},
{
"key": "root",
"desc": "Reh"
}
],
"params": [
{
"key": "dar",
"desc": "Bi 1 dara etîmolojiyê nîşan dide.",
"type": "flag",
"primary": true
},
{
"key": "id",
"desc": "Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan.",
"type": "text",
"primary": true
},
{
"key": "title",
"desc": "Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be.",
"type": "text"
},
{
"key": "crz",
"desc": "Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: reh, kelîme, pêşgir, paşgir, navgir.",
"type": "select",
"values": [
"reh",
"kelîme",
"pêşgir",
"paşgir",
"navgir"
]
},
{
"key": "cotreh",
"desc": "Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda.",
"type": "text"
},
{
"key": "tarîxa-etîm",
"desc": "Tarîxa peyitandina pêşîn, wek 1901, 1500s, 14c, c,1900, before,1850, r,1501,1558.",
"type": "text"
},
{
"key": "niqtena",
"desc": "Bi 1 niqteya dawiyê nayê zêdekirin.",
"type": "flag"
},
{
"key": "niqte",
"desc": "Li şûna niqteya dawiyê nîşaneke din.",
"type": "text"
},
{
"key": "katna",
"desc": "Bi 1 kategorî nayên zêdekirin. Herwiha {{para|nekat}}.",
"type": "flag"
},
{
"key": "darna",
"desc": "Bi 1 ev etîmolojî di dara rûpelên din de dernakeve.",
"type": "flag"
},
{
"key": "exnihilo",
"desc": "Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin.",
"type": "flag"
}
]
},
"metadata": {
"aa": {
"haswikt": 1,
"sc": [
"Latn",
"Ethi"
]
},
"ab": {
"haswikt": 1,
"sc": [
"Cyrl",
"Latn",
"Geor"
]
},
"aer": {
"sc": "Latn"
},
"af": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"ak": {
"haswikt": 1
},
"akk": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"sc": "Xsux"
},
"als": {
"haswikt": 1
},
"am": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1,
"sc": "Ethi"
},
"an": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"ang": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"ar": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"alt": 1,
"haswikt": 1,
"sc": "Arab"
},
"arc": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"sc": [
"Hebr",
"Syrc"
]
},
"are": {},
"arz": {
"alt": 1,
"g": [
"n",
"m",
"n-p",
"m-p"
],
"sc": "Arab"
},
"as": {
"haswikt": 1,
"sc": "Beng"
},
"ast": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"av": {
"haswikt": 1
},
"ay": {
"haswikt": 1
},
"az": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": [
"Latn",
"Cyrl",
"Arab"
]
},
"ba": {
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"bar": {},
"bat-smg": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"bbl": {
"sc": "Geor"
},
"be": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"be-x-old": {
"sc": "Cyrl"
},
"bg": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"bh": {
"haswikt": 1,
"sc": "Deva"
},
"bhb": {
"sc": "Deva"
},
"bi": {
"haswikt": 1
},
"blt": {
"sc": "Tavt"
},
"bm": {
"haswikt": 1,
"sc": [
"Latn",
"Nkoo",
"Arab"
]
},
"bn": {
"haswikt": 1,
"sc": "Beng"
},
"bo": {
"haswikt": 1,
"sc": "Tibt"
},
"br": {
"g": [
"n",
"m"
],
"haswikt": 1
},
"ca": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"cdo": {
"sc": "Hani"
},
"ce": {
"sc": "Cyrl"
},
"ch": {
"haswikt": 1
},
"chr": {
"haswikt": 1,
"sc": "Cher"
},
"cjy": {
"sc": "Hani"
},
"ckb": {
"haswikt": 1,
"sc": "Arab",
"wsc": "ku-Arab"
},
"cmn": {
"sc": "Hani",
"wiktprefix": "zh"
},
"co": {
"haswikt": 1
},
"cpx": {
"sc": "Hani"
},
"cr": {
"haswikt": 1,
"sc": "Cans"
},
"crh": {},
"cs": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"csb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"cu": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"sc": [
"Cyrs",
"Glag"
]
},
"cv": {
"sc": "Cyrl"
},
"cy": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"czh": {
"sc": "Hani"
},
"czo": {
"sc": "Hani"
},
"da": {
"g": [
"g",
"nt",
"g-p",
"nt-p",
"p"
],
"haswikt": 1
},
"dax": {},
"de": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1,
"allowCaps": 1
},
"dhg": {},
"djb": {},
"dji": {},
"djr": {},
"dng": {
"sc": "Cyrl"
},
"dsb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
]
},
"dsx": {},
"duj": {},
"dv": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Thaa"
},
"dz": {
"haswikt": 1,
"sc": "Tibt"
},
"el": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"en": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"eo": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"es": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"et": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"ett": {
"g": [
"y",
"p"
],
"sc": "Ital"
},
"eu": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"fa": {
"haswikt": 1,
"g": [
"y",
"p"
],
"sc": "Arab",
"wsc": "fa-Arab"
},
"fa-cls": {
"wiktprefix": "fa",
"sc": "Arab",
"wsc": "fa-Arab"
},
"fa-ira": {
"wiktprefix": "fa",
"sc": "Arab",
"wsc": "fa-Arab"
},
"fi": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"fil": {},
"fj": {
"haswikt": 1
},
"fo": {
"g": [
"n",
"m",
"nt"
],
"haswikt": 1
},
"fr": {
"g": [
"n",
"m",
"mnmane",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"frm": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"fro": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"fur": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"fy": {
"g": [
"g",
"nt",
"p"
],
"haswikt": 1
},
"ga": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"gan": {
"sc": "Hani"
},
"gd": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"gez": {
"sc": "Ethi"
},
"gl": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"gmw-ecg": {
"g": [
"n",
"m",
"nt",
"p"
],
"allowCaps": 1
},
"gmy": {
"sc": "Linb"
},
"gn": {
"haswikt": 1
},
"gnn": {
"sc": "Latn"
},
"got": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"sc": "Goth"
},
"grc": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
]
},
"gsw": {
"g": [
"n",
"m",
"nt",
"p"
],
"allowCaps": 1
},
"gu": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1,
"sc": "Gujr"
},
"guf": {
"sc": "Latn"
},
"gv": {
"haswikt": 1
},
"ha": {
"haswikt": 1
},
"hak": {
"sc": "Hani"
},
"har": {
"sc": "Ethi"
},
"he": {
"alt": 1,
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Hebr"
},
"hi": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Deva"
},
"hif": {
"sc": [
"Latn",
"Deva"
]
},
"hit": {
"sc": "Xsux"
},
"hrx": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"hsb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"hsn": {
"sc": "Hani"
},
"hu": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"hy": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Armn"
},
"ia": {
"haswikt": 1
},
"id": {
"haswikt": 1
},
"ie": {
"haswikt": 1
},
"ik": {
"haswikt": 1
},
"ike": {
"sc": "Cans"
},
"ikt": {
"sc": "Cans"
},
"io": {
"haswikt": 1
},
"is": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"it": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"iu": {
"haswikt": 1,
"sc": "Cans"
},
"ja": {
"haswikt": 1,
"sc": "Jpan"
},
"jay": {
"sc": "Latn"
},
"jbo": {
"haswikt": 1
},
"jv": {
"haswikt": 1
},
"ka": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"khb": {
"sc": [
"Talu",
"Lana",
"Thai"
]
},
"kjh": {
"sc": "Cyrl"
},
"kk": {
"haswikt": 1,
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"kkh": {
"sc": [
"Lana",
"Thai"
]
},
"kl": {
"haswikt": 1
},
"km": {
"haswikt": 1,
"sc": "Khmr"
},
"kn": {
"haswikt": 1,
"sc": "Knda"
},
"ku": {
"g": [
"n",
"m",
"mnmane",
"mndudil",
"n-p",
"m-p",
"p"
],
"wiktprefix": "ku"
},
"ko": {
"haswikt": 1,
"sc": "Kore"
},
"krc": {
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"ks": {
"haswikt": 1,
"sc": [
"Arab",
"Deva"
],
"wsc": "ks-Arab"
},
"kw": {
"haswikt": 1
},
"ky": {
"haswikt": 1,
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"la": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"lb": {
"g": [
"n",
"m",
"nt",
"p"
],
"haswikt": 1,
"allowCaps": 1
},
"lez": {
"sc": "Cyrl"
},
"li": {
"haswikt": 1
},
"lki": {
"wiktprefix": "ku"
},
"lld": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"lmo": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"ln": {
"haswikt": 1
},
"lo": {
"haswikt": 1,
"sc": "Laoo"
},
"lt": {
"alt": 1,
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"lv": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"lzz": {
"sc": "Geor"
},
"mg": {
"haswikt": 1
},
"mh": {
"haswikt": 1
},
"mi": {
"g": 0,
"haswikt": 1
},
"mk": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"ml": {
"haswikt": 1,
"sc": "Mlym"
},
"mn": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": [
"Cyrl",
"Mong"
]
},
"mnp": {
"sc": "Hani"
},
"mo": {
"haswikt": 1,
"sc": "Cyrl"
},
"mol": {
"sc": "Cyrl"
},
"mr": {
"g": [
"n",
"m",
"nt"
],
"haswikt": 1,
"sc": "Deva"
},
"ms": {
"haswikt": 1,
"sc": [
"Latn",
"Arab"
]
},
"mt": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"mwp": {
"sc": "Latn"
},
"my": {
"haswikt": 1,
"sc": "Mymr"
},
"na": {
"haswikt": 1
},
"nah": {
"haswikt": 1
},
"nan": {
"wiktprefix": "zh-min-nan",
"sc": "Hani"
},
"nb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"wiktprefix": "no"
},
"nds-de": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "nds"
},
"nds-nl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "nds"
},
"ne": {
"haswikt": 1,
"sc": "Deva"
},
"nl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1
},
"nn": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1
},
"no": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1
},
"nod": {
"sc": "Lana"
},
"non": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"oc": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"om": {
"haswikt": 1
},
"or": {
"haswikt": 1,
"sc": "Orya"
},
"orv": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"sc": "Cyrs"
},
"osc": {
"sc": "Ital"
},
"ota": {
"g": [
"y",
"p"
],
"sc": "Arab",
"wsc": "ota-Arab"
},
"pa": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": [
"Guru",
"Arab"
]
},
"pdt": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "nds"
},
"peo": {
"sc": "Xpeo"
},
"phn": {
"sc": "Phnx"
},
"pi": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"pjt": {
"sc": "Latn"
},
"pl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"pms": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"pox": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"împf",
"pf"
]
},
"prs": {
"wiktprefix": "fa",
"sc": "Arab",
"wsc": "fa-Arab"
},
"ps": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Arab",
"wsc": "ps-Arab"
},
"pt": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"qu": {
"haswikt": 1
},
"rgn": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"rit": {
"sc": "Latn"
},
"rm": {
"g": [
"n",
"m"
],
"haswikt": 1
},
"rn": {
"haswikt": 1
},
"ro": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1,
"sc": [
"Latn",
"Cyrl"
]
},
"roa-rup": {
"haswikt": 1
},
"ru": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"rue": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"sc": "Cyrl"
},
"ruo": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"rup": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "roa-rup"
},
"ruq": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"rw": {
"haswikt": 1
},
"sa": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1,
"sc": "Deva"
},
"sah": {
"sc": "Cyrl"
},
"sc": {
"haswikt": 1
},
"scn": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"sco": {
"sc": "Latn"
},
"sd": {
"haswikt": 1,
"sc": "Arab",
"wsc": "sd-Arab"
},
"sdh": {
"sc": "Arab",
"wiktprefix": "ku"
},
"sg": {
"haswikt": 1
},
"sh": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": [
"Latn",
"Cyrl"
]
},
"si": {
"haswikt": 1,
"sc": "Sinh"
},
"simple": {
"haswikt": 1
},
"sk": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"sl": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"sm": {
"haswikt": 1
},
"sn": {
"haswikt": 1
},
"so": {
"haswikt": 1
},
"spx": {
"sc": "Ital"
},
"sq": {
"g": [
"n",
"m"
],
"haswikt": 1
},
"ss": {
"haswikt": 1
},
"st": {
"haswikt": 1
},
"su": {
"haswikt": 1
},
"sux": {
"sc": "Xsux"
},
"sv": {
"g": [
"g",
"nt",
"g-p",
"nt-p"
],
"haswikt": 1
},
"sva": {
"sc": "Geor"
},
"sw": {
"nclass": 1,
"haswikt": 1
},
"syc": {
"sc": "Syrc"
},
"syr": {
"sc": "Syrc"
},
"szl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
]
},
"ta": {
"haswikt": 1,
"sc": "Taml"
},
"tdd": {
"sc": "Tale"
},
"te": {
"haswikt": 1,
"sc": "Telu"
},
"tg": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Cyrl"
},
"th": {
"haswikt": 1,
"sc": "Thai"
},
"ti": {
"haswikt": 1,
"sc": "Ethi"
},
"tig": {
"sc": "Ethi"
},
"tiw": {
"sc": "Latn"
},
"tk": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"tl": {
"haswikt": 1,
"sc": [
"Latn",
"Tglg"
]
},
"tmr": {
"sc": "Hebr"
},
"tn": {
"haswikt": 1
},
"to": {
"haswikt": 1
},
"tpi": {
"haswikt": 1
},
"tr": {
"g": [
"y",
"p"
],
"alt": 1,
"haswikt": 1
},
"ts": {
"haswikt": 1
},
"tt": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"tts": {
"sc": "Thai"
},
"tw": {
"haswikt": 1
},
"udi": {
"sc": [
"Cyrl",
"Latn",
"Armn",
"Geor"
]
},
"ug": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Arab",
"wsc": "ug-Arab"
},
"uga": {
"sc": "Ugar"
},
"uk": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"ulk": {
"sc": "Latn"
},
"ur": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Arab",
"wsc": "ur-Arab"
},
"uz": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"vec": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"vi": {
"haswikt": 1
},
"vls": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"vo": {
"haswikt": 1
},
"wa": {
"haswikt": 1
},
"wbp": {
"sc": "Latn"
},
"wo": {
"haswikt": 1
},
"wuu": {
"sc": "Hani"
},
"xae": {
"sc": "Ital"
},
"xcr": {
"sc": "Cari"
},
"xfa": {
"sc": "Ital"
},
"xh": {
"alt": 1,
"nclass": 1,
"haswikt": 1
},
"xlc": {
"sc": "Lyci"
},
"xld": {
"sc": "Lydi"
},
"xlu": {
"sc": "Xsux"
},
"xmf": {
"sc": "Geor"
},
"xno": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"xrr": {
"sc": "Ital"
},
"xst": {
"sc": "Ethi"
},
"xum": {
"sc": "Ital"
},
"xve": {
"sc": "Ital"
},
"xvo": {
"sc": "Ital"
},
"yi": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1,
"sc": "Hebr"
},
"yo": {
"haswikt": 1
},
"yua": {
"g": [
"y",
"p"
],
"alt": 1
},
"yue": {
"sc": "Hani"
},
"za": {
"haswikt": 1,
"sc": "Latn"
},
"zh-classical": {
"sc": "Hani"
},
"zh-min-nan": {
"haswikt": 1
},
"zh-yue": {
"sc": "Hani"
},
"zu": {
"alt": 1,
"nclass": 1,
"haswikt": 1
},
"zza": {
"g": [
"n",
"m",
"mn",
"n-p",
"m-p",
"p"
],
"wiktprefix": "diq"
}
},
"numberLabels": {
"y": {
"display": "yekjimar"
},
"d": {
"display": "hejmar dual"
},
"p": {
"display": "pirjimar"
},
"p+": {
"display": "axlebî pirjimar"
},
"tp": {
"display": "tenê pirjimar"
},
"j": {
"display": "jimarbar"
},
"j+": {
"display": "axlebî jimarbar"
},
"j/nj": {
"display": "jimarbar û nejimarbar"
},
"nj": {
"display": "nejimarbar"
},
"nj+": {
"display": "axlebî nejimarbar"
},
"hj!": {
"display": "hejmar nepeyitandî ye"
},
"hj?": {
"display": "hejmar hewce ye"
}
},
"leadingTplOrder": [
"maneid",
"K",
"e"
],
"lekturChoices": [
{
"code": "gh",
"label": "gerguhêz (îsmî mefûl digire)"
},
{
"code": "ngh",
"label": "negerguhêz (îsmî mefûl nagire)"
}
],
"lekturFormChoices": [
{
"code": "x",
"label": "xwerû"
},
{
"code": "p",
"label": "pêkhatî"
},
{
"code": "h",
"label": "hevedudanî"
}
],
"deverQuickPicks": [
"kurmanciya rojavayî",
"kurmanciya merkezî",
"kurmanciya rojhilatî",
"Badînî",
"Botî",
"Serhedî",
"Bakur",
"Amed",
"Riha"
],
"maneTags": [
"cure?",
"rêziman?",
"kat-rêziman",
"kategoriya rêzimanê?",
"bêcure"
],
"senseGroups": [
{
"key": "alt-r",
"label": "Formên alternatîv",
"field": "alternativ",
"order": 3,
"hint": "Varyantên vê kelîmeyê"
},
{
"key": "hevmane",
"label": "Hevmane",
"field": "hevmane",
"order": 1,
"hint": "Spehî hevmaneya Bedew e."
},
{
"key": "dijmane",
"label": "Dijmane",
"field": "dijmane",
"order": 2,
"hint": "Zengîn dijmaneya feqîr e."
},
{
"key": "koordîne",
"label": "Termên koordîne",
"field": "koordine",
"order": 4,
"hint": "Pisîk û kûçik termên koordîne ne çunkî Jornavên wan gelek in"
},
{
"key": "jornav",
"label": "Jornav",
"field": "jornav",
"order": 5,
"hint": "Heywan jornavê guhandar e"
},
{
"key": "jêrnav",
"label": "Jêrnav",
"field": "jernav",
"order": 6,
"hint": "Guhandar jêrnavê heywan e"
}
],
"subsectionOrder": [
"Bilêvkirin",
"Ji wêjeya klasîk",
"Ji wêjeyê",
"Tewandin",
"Notên bikaranînê",
"Bi alfabeyên din",
"Formên alternatîv",
"Kurtkirin",
"Sembol",
"Navê zanistî",
"Hevmane",
"Nêzîk",
"Dijmane",
"Jornav",
"Jêrnav",
"Jê",
"Têkildar",
"Etîmolojî",
"Dûnde",
"Bide ber",
"Herwiha binêre",
"Bêhtir bixwîne",
"Bi zaravayên din",
"Werger",
"Qafiye",
"Anagram",
"Çavkanî"
],
"templateAliases": {
"K": [
"K",
"kategorîzebike",
"mijar"
],
"alt-r": [
"alt-r",
"forma alt di rêzê de",
"herwiha-rêz",
"herwiha di rêza maneyê de"
],
"dijmane": [
"dijmane",
"dijwate",
"dijmaneyên peyvê"
],
"e": [
"e",
"etîket",
"f",
"lb"
],
"g": [
"g",
"girêdan",
"l",
"link"
],
"hevmane": [
"hevmane",
"hevwate",
"hevmaneya peyvê",
"hevmaneyên peyvê",
"synonyms"
],
"jornav": [
"jornav",
"hîpernîm"
],
"jêrnav": [
"jêrnav",
"hîponîm"
],
"koordîne": [
"koordîne",
"termên koordîne",
"peyvên koordîneyî"
],
"mane?": [
"mane?",
"wate?",
"bêmane",
"bêwate"
],
"maneid": [
"maneid",
"senseid"
],
"h-bnr": [
"h-bnr",
"bnr-h",
"bnr h",
"bnr-hrw",
"bnr herwiha",
"herwiha binêre",
"binêre herwiha"
]
},
"wordlistTemplates": [
"kol3",
"kol2",
"kol",
"col3",
"col2",
"col"
],
"templateParams": {
"deyn": {
"order": [
"1",
"2",
"3",
"4",
"5",
"tr",
"ts",
"sc",
"id"
],
"labels": {
"1": "Zimanê jêder",
"2": "Zimanê wergir",
"3": "Kelîme",
"4": "Xuyakirina alternatîv",
"5": "Maneya kelîmeyê",
"tr": "Transliterasyon",
"ts": "Transkîpsiyon",
"sc": "Koda skrîptê",
"id": "IDya maneyê"
}
},
"hv": {
"order": [
"1",
"2",
"3",
"4",
"tr",
"ts",
"sc"
],
"labels": {
"1": "Koda zimanî",
"2": "Kelîme",
"3": "Xuyakirina alternatîv",
"4": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"sc": "Koda skrîptê"
}
},
"ji": {
"order": [
"1",
"2",
"3",
"4",
"5",
"tr",
"ts",
"id",
"sc"
],
"labels": {
"1": "Zimanê jêder",
"2": "Zimanê wergir",
"3": "Kelîme",
"4": "Xuyakirina alternatîv",
"5": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"id": "IDya maneyê",
"sc": "Koda skrîptê"
}
},
"jêder-kitêb": {
"order": [
"1",
"jêgirtin",
"sc",
"tr",
"t",
"nivîskar",
"nivîskar2",
"nivîskar3",
"amadekar",
"terciman",
"sernav",
"url",
"weşanxane",
"cih",
"cild",
"sal",
"sala-weşandinê",
"çap",
"rûpel",
"isbn",
"nekat",
"nivîskar4",
"nivîskar5",
"issn",
"oclc",
"serî",
"doi"
],
"labels": {
"1": "koda zimanî",
"sc": "koda skrîptê eger hewce be",
"tr": "translîterasyon",
"t": "tercime",
"rûpel": "rûpel"
}
},
"jêder-kovar": {
"order": [
"1",
"jêgirtin",
"sc",
"tr",
"werger",
"kovar",
"sernav",
"wergêr",
"nivîskar",
"nivîskar2",
"url",
"weşanxane",
"cîld",
"hejmar",
"sal",
"tarîx",
"rûpel"
],
"labels": {
"1": "Koda zimanî",
"sc": "Koda skrîptê",
"tr": "Translîterasyon",
"werger": "Tercimeya kurmancî ya jêgirtinê"
}
},
"jêder-vîdeo": {
"order": [
"1",
"title",
"year",
"date",
"author",
"authorlink",
"actor",
"role",
"time",
"at",
"medium",
"network",
"text",
"translation",
"season",
"number",
"episode",
"publisher",
"url",
"director",
"brackets"
],
"labels": {
"1": "Language",
"title": "Title",
"year": "Year of release",
"date": "Date of release",
"author": "Writer (screenplay)",
"authorlink": "Wikipedia author page",
"actor": "Actor (speaker)",
"role": "Role",
"time": "Timecode",
"at": "Context",
"medium": "Recording medium",
"network": "Network",
"text": "Quoted line",
"translation": "Translation",
"season": "Season number (series)",
"number": "Episode number (series)",
"episode": "Episode title (series)",
"publisher": "Publisher",
"url": "URL",
"director": "Director",
"brackets": "Brackets"
}
},
"jêder-websîte": {
"order": [
"1",
"jêgirtin",
"sc",
"tr",
"t",
"nivîskar",
"terciman",
"sernav",
"url",
"urlya-arşîvê",
"websîte",
"tarîx",
"sal"
],
"labels": {
"1": "Koda zimanî",
"sc": "Koda skrîptê ya jêgirtinê",
"tr": "Translîterasyona jêgirtinê",
"t": "Tercimeya kurmancî ya jêgirtinê"
}
},
"mîr": {
"order": [
"1",
"2",
"3",
"4",
"5",
"tr",
"ts",
"id",
"sc"
],
"labels": {
"1": "Zimanê jêder",
"2": "Zimanê wergir",
"3": "Kelîme",
"4": "Xuyakirina alternatîv",
"5": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"id": "IDya maneyê",
"sc": "Koda skrîptê"
}
},
"nh": {
"order": [
"1",
"2",
"3",
"4",
"tr",
"ts",
"sc"
],
"labels": {
"1": "Koda zimanî",
"2": "Kelîme",
"3": "Xuyakirina alternatîv",
"4": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"sc": "Koda skrîptê"
}
},
"qertaf": {
"order": [
"1",
"2",
"3",
"sc",
"cuda1",
"cuda2",
"t1",
"t2",
"tr1",
"tr2"
],
"labels": {
"1": "language code",
"2": "first part",
"3": "second part",
"sc": "script code",
"cuda1": "first part alternate text",
"cuda2": "second part alternate text",
"w1": "first gloss",
"w2": "second gloss",
"tr1": "first part transliteration",
"tr2": "second part transliteration"
}
},
"yekser": {
"order": [
"1",
"2",
"3",
"hûr",
"nekat"
]
}
}
}
emnu99qcrdz1fvx2cfmo4lkwcfo9vo3
6532974
6532549
2026-09-19T10:00:46Z
Wikihez
7344
Etymology: offer the spelled-out keyword names (qertaf, mîrasmayî, dariştî) instead of their short forms
6532974
json
application/json
{
"langChoices": {
"ku": "kurmancî",
"zza": "zazakî",
"ckb": "soranî",
"sdh": "kurdiya başûrî",
"hac": "hewramî",
"de": "almanî",
"ar": "erebî",
"fa": "farisî",
"fr": "fransî",
"fi": "fînî",
"en": "îngilîzî",
"ja": "japonî",
"sv": "swêdî",
"tr": "tirkî"
},
"posExamples": {
"navdêr": "Kelîmeyên ji bo tiştan (sêv, heywan, qedeh) yan terman (dilşadî, bextiyarî hwd.) di rêzimanê de.",
"lêker": "Kelîmeyên ji bo kirin an bûyînê wekî 'nivîsîn' yan 'xeber dan'.",
"rengdêr": "Kelîmeyên ku wesfa navdêran nîşan didin wekî 'sêva sor' yan 'xwarina şîrîn'.",
"hoker": "Kelîmeyên ku dem, cih yan awayê kirinê diyar dikin wekî 'bi vî awayî' yan 'demkî'.",
"daçek": "Kelîmeyên ku cih, dem yan hereketê diyar dikin wekî 'di.. de' yan 'ji'.",
"cînav": "Kelîmeyên ku li şûna navdêran tên bikaranîn daku navdêr neyên dubarekirin wekî 'ew' yan 'em'.",
"baneşan": "Kelîmeyên ku hest, deng hwd. îfade dikin wekî 'noşî!' yan 'aferîn'.",
"serenav": "Navdêrên ku şexsiyetên ferdî nîşan didin, wek navên kes, cih an organîzasyonan nimûne 'London' yan 'Diyarbekir'.",
"gotineke pêşiyan": "Gotinên ku di nav xelkê de bi berbelavî tên bikaranîn bo nimûne 'Serê neêşe ne hewceyî destmalê ye'."
},
"genderLabels": {
"m": "mê",
"n": "nêr",
"nt": "nêtar",
"mn": "mê yan nêr",
"mnmane": "mê yan nêr li gorî maneyê",
"mndudil": "mê yan nêr bikaranîn dudil e",
"g": "giştî",
"y": "yekjimar",
"p": "pirjimar"
},
"tplDefs": {
"rastnivîs": {
"langs": [
"ku"
],
"noLang": true
},
"ku-Latn": {
"langs": [
"ku"
],
"noLang": true
},
"ku-tewîna-nav": {
"langs": [
"ku"
],
"noLang": true
},
"sdh-Arab": {
"langs": [
"sdh"
],
"noLang": true
},
"hac-Arab": {
"langs": [
"hac"
],
"noLang": true
},
"ja-romanîzekirin": {
"langs": [
"ja"
],
"noLang": true
},
"ckb-Arab": {
"langs": [
"ckb"
],
"noLang": true
},
"zza-awayê-Jacobsonê": {
"langs": [
"zza"
]
},
"awayekî din": {
"langs": null
},
"guharto": {
"langs": null
},
"hevmaneya": {
"langs": null
},
"kevnbûyî": {
"langs": null
},
"kêmpeyda": {
"langs": null
},
"kurtkirin": {
"langs": null
},
"paşnav": {
"langs": null
},
"şaşnivîs": {
"langs": null
}
},
"jederDefs": {
"jêder-kitêb": {
"label": "Kitêb",
"fields": [
{
"key": "nivîskar",
"label": "Nivîskar",
"span": 3
},
{
"key": "terciman",
"label": "Terciman",
"span": 3
},
{
"key": "amadekar",
"label": "Amadekar",
"span": 3
},
{
"key": "weşanxane",
"label": "Weşanxane",
"span": 3
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "beş",
"label": "Beş",
"span": 3,
"width": "medium"
},
{
"key": "cih",
"label": "Cih",
"span": 2,
"width": "narrow"
},
{
"key": "sal",
"label": "Sal",
"span": 1,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3,
"width": "medium"
},
{
"key": "sala-weşandinê",
"label": "Sala weşandinê",
"span": 2,
"width": "narrow"
},
{
"key": "çap",
"label": "Çap",
"span": 1,
"width": "narrow"
},
{
"key": "cild",
"label": "Cild",
"span": 2,
"width": "narrow"
},
{
"key": "rûpel",
"label": "Rûpel",
"span": 1,
"width": "narrow"
},
{
"key": "isbn",
"label": "ISBN",
"span": 2,
"width": "narrow"
},
{
"key": "url",
"label": "URL",
"span": 12,
"width": "wide"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
}
]
},
"jêder-kovar": {
"label": "Kovar",
"fields": [
{
"key": "nivîskar",
"label": "Nivîskar",
"span": 3
},
{
"key": "terciman",
"label": "Terciman",
"span": 3
},
{
"key": "amadekar",
"label": "Amadekar",
"span": 3
},
{
"key": "weşanxane",
"label": "Weşanxane",
"span": 3
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "kovar",
"label": "Kovar",
"span": 4
},
{
"key": "cild",
"label": "Cild",
"span": 2,
"width": "narrow"
},
{
"key": "hejmar",
"label": "Hejmar",
"span": 2,
"width": "narrow"
},
{
"key": "sal",
"label": "Sal",
"span": 2,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3,
"width": "medium"
},
{
"key": "rûpel",
"label": "Rûpel",
"span": 2,
"width": "narrow"
},
{
"key": "issn",
"label": "ISSN",
"span": 2,
"width": "narrow"
},
{
"key": "doi",
"label": "DOI",
"span": 2,
"width": "narrow"
},
{
"key": "url",
"label": "URL",
"span": 12,
"width": "wide"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
}
]
},
"jêder-websîte": {
"label": "Websîte",
"fields": [
{
"key": "nivîskar",
"label": "Nivîskar",
"span": 4
},
{
"key": "terciman",
"label": "Terciman",
"span": 4
},
{
"key": "websîte",
"label": "Websîte",
"span": 4
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "url",
"label": "URL",
"span": 5
},
{
"key": "urlya-arşîvê",
"label": "URLya Arşîvê",
"span": 5
},
{
"key": "roja-arşîvê",
"label": "Roja arşîvê",
"span": 3,
"width": "medium"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
},
{
"key": "sal",
"label": "Sal",
"span": 1,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3,
"width": "medium"
}
]
},
"jêder-vîdeo": {
"fields": [
{
"key": "hunermend",
"label": "Hunermend",
"span": 6
},
{
"key": "platform",
"label": "Platform",
"span": 6
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "sal",
"label": "Sal",
"span": 2,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3
},
{
"key": "dem",
"label": "Dem",
"span": 2,
"width": "narrow"
},
{
"key": "url",
"label": "URL",
"span": 12,
"width": "wide"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
}
],
"label": "Vîdeo"
}
},
"pronTpls": {
"ku-IPA": {
"desc": "IPAya otomatîk ji bo kurmancî (kontrol hewce ye)",
"snippet": "* {{ku-IPA}}",
"langs": [
"ku"
],
"noLang": true
},
"ku-kîte": {
"desc": "Hecekirina otomatîk ji bo kurmancî",
"snippet": "* {{ku-kîte}}",
"langs": [
"ku"
],
"noLang": true
},
"zza-IPA": {
"desc": "IPAya otomatîk ji bo zazakî",
"snippet": "* {{zza-IPA}}",
"langs": [
"zza"
],
"noLang": true
},
"zza-kîte": {
"desc": "Hecekirina otomatîk ji bo zazakî",
"snippet": "* {{zza-kîte}}",
"langs": [
"zza"
],
"noLang": true
},
"IPA": {
"desc": "Alfabeya fonetîk a navmiletî (IPA)",
"snippet": "* {{IPA|CODE|/…/}}"
},
"deng": {
"desc": "Nimûneya telafûzê bi dosyeya dengî",
"snippet": "* {{deng|CODE|navê_dosyayê.ogg|dever=}}"
},
"bilêv": {
"desc": "{{bilêv|herf|nerm, req|hejmar}}",
"snippet": "* {{bilêv|herf|cure|hejmar}}"
},
"kîte": {
"desc": "Şablona hecekirinê",
"snippet": "* {{kîte|CODE|he|ce}}"
},
"hevdeng": {
"desc": "Hevdeng — gotinên bi heman dengî",
"snippet": "* {{hevdeng|CODE|…}}"
}
},
"etymTpls": {
"etîmon": {
"desc": "Etîmolojiya birêkûpêk: zincîr, dar û kategorî — {{etîmon|ku|:deyn|fa:پنجه\u003Ct:dest\u003E|metn=++}}",
"snippet": "{{etîmon|CODE}}"
},
"ji": {
"desc": "Ji zimanekî din hatiye — {{ji|en|ku|anatomy|tr=|t=}}",
"snippet": "{{ji|SOURCELANG|CODE|…}}"
},
"deyn": {
"desc": "Deynkirî — {{deyn|lang|kod|kelîme}}",
"snippet": "{{deyn|SOURCELANG|CODE|…}}"
},
"mîr": {
"desc": "Mîrasmayî — {{mîr|lang|kod|kelîme}}",
"snippet": "{{mîr|SOURCELANG|CODE|…}}"
},
"qertaf": {
"desc": "Ji bo pêşgir, paşgir û hevedudanî — {{qertaf|kod|pêşgir-|reh}}",
"snippet": "{{qertaf|CODE|…|…}}"
},
"anlz": {
"desc": "Wekî qertaf lê dibêje analîza şiklî — {{anlz|kod|pêşgir-|reh}}",
"snippet": "{{anlz|CODE|…|…}}"
},
"q": {
"desc": "Referans bo rûpelekê — {{q|kod|kelîme}} navê zimanî dernakeve",
"snippet": "{{q|CODE|…}}"
},
"hv": {
"desc": "Hevreh — {{hv|lang|kelîme}} navê zimanî derdikeve",
"snippet": "{{hv|SOURCELANG|…}}"
},
"nh": {
"desc": "Nehevreh — {{nh|lang|kelîme}} navê zimanî derdikeve",
"snippet": "{{nh|SOURCELANG|…}}"
},
"cotreh": {
"desc": "Cotreh — teror {{cotreh|ku|tirs}}",
"snippet": "{{cotreh|CODE|…}}"
},
"yekser": {
"desc": "tercimeya yekser — {{yekser|lang|kod|kelîme}}",
"snippet": "{{yekser|SOURCELANG|CODE|…}}"
},
"wergirtin": {
"desc": "Wergirtina maneyê — {{wergirtin|lang|kod|kelîme}}",
"snippet": "{{wergirtin|SOURCELANG|CODE|…}}"
},
"paşvesazî": {
"desc": "Paşvesazî — greed {{paşvesazî|en|greedy}}",
"snippet": "{{paşvesazî|CODE|…}}"
},
"qusandin": {
"desc": "Qusandin — Miho {{qusandin|ku|Mihemmed}}",
"snippet": "{{qusandin|CODE|…}}"
},
"têkilkirin": {
"desc": "Têkilkirin — sormancî {{têkilkirin|ku|soranî|kurmancî}}",
"snippet": "{{têkilkirin|CODE|…}}"
},
"nyz": {
"desc": "Nayê zanîn — {{nyz|ku|hûr=1}}",
"snippet": "{{nyz|CODE}}"
},
"onom": {
"desc": "Onomatopoetîk — {{onom|ku|hûr=1}}",
"snippet": "{{onom|CODE}}"
},
"navmiletî": {
"desc": "Navmiletî — {{navmiletî|ku|hûr=1}}",
"snippet": "{{navmiletî|CODE}}"
},
"neo": {
"desc": "neolojîzm — {{neolojîzm|ku|hûr=1}}",
"snippet": "{{neolojîzm|CODE}}"
}
},
"etimon": {
"keywords": [
{
"key": "mîrasmayî",
"desc": "Kelîmeya ku ji zimanê bav û kalan maye",
"aliases": [
"mîr",
"inh"
]
},
{
"key": "deyn",
"desc": "Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin",
"aliases": [
"bor",
"borrowed"
]
},
{
"key": "deynh",
"desc": "Deynkirina hînbûyî: ne bi riya têkiliya rojane, bi qesd hatiye girtin",
"aliases": [
"lbor"
]
},
{
"key": "deynhq",
"desc": "Deynkirina hînbûyî ya ku hinekî hatiye guhertin",
"aliases": [
"slbor"
]
},
{
"key": "deynort",
"desc": "Deynkirina ortografîk",
"aliases": [
"obor"
]
},
{
"key": "deynne",
"desc": "Deynkirina neadaptekirî",
"aliases": [
"ubor"
]
},
{
"key": "dariştî",
"desc": "Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be",
"aliases": [
"drş",
"der"
]
},
{
"key": "ji",
"desc": "Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e",
"aliases": [
"from"
]
},
{
"key": "drşnd",
"desc": "Dariştin heye lê cureyê wê ne diyar e",
"aliases": [
"uder"
]
},
{
"key": "qertaf",
"desc": "Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e",
"aliases": [
"qf",
"af"
]
},
{
"key": "reh",
"desc": "Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e (\"Peyvên … yên aîdî rehê …\") û di metn û darê de xuya nabe",
"aliases": [
"root"
],
"invisible": true
},
{
"key": "yekser",
"desc": "Wergerandina yekser; zincîr li vir disekine",
"aliases": [
"cal",
"clq"
]
},
{
"key": "yekserqismî",
"desc": "Wergerandina yekser a qismî; zincîr li vir disekine",
"aliases": [
"yekserq",
"pcal"
]
},
{
"key": "wergirtin",
"desc": "Wergirtina maneyê; mana wergirtî bi \u003Cmaneid:…\u003E tê nîşankirin",
"aliases": [
"sl"
]
},
{
"key": "lihevanîn",
"desc": "Lihevanîna dengî-maneyî",
"aliases": [
"psm"
]
},
{
"key": "tesîr",
"desc": "Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine",
"aliases": [
"influence"
]
},
{
"key": "têkilkirin",
"desc": "Têkilkirina du kelîmeyan",
"aliases": [
"blend"
],
"min": 2
},
{
"key": "ûnîverbasyon",
"desc": "Ûnîverbasyon",
"aliases": [
"ûnîv",
"univ"
]
},
{
"key": "qusandin",
"desc": "Qusandin",
"aliases": [
"clip"
]
},
{
"key": "paşvesazî",
"desc": "Paşvesazî",
"aliases": [
"bf"
]
},
{
"key": "elîpsîz",
"desc": "Elîpsîz",
"aliases": [
"elîp",
"ellip"
]
},
{
"key": "nomînalîzasyon",
"desc": "Nomînalîzasyon",
"aliases": [
"nomîn",
"nom"
]
},
{
"key": "translîterasyon",
"desc": "Translîterasyon",
"aliases": [
"translît",
"translit"
]
},
{
"key": "redûblîkasyon",
"desc": "Redûblîkasyon",
"aliases": [
"redûb",
"redup"
]
},
{
"key": "kurtkirin",
"desc": "Kurtkirina kelîmeyekê",
"aliases": [
"abbr"
]
},
{
"key": "sylabbr",
"desc": "Kurtkirin li gorî kîteyan",
"aliases": [
"syllabic abbreviation",
"sylabbrev"
]
},
{
"key": "akronîm",
"desc": "Akronîm",
"aliases": [
"acro"
]
},
{
"key": "înîtîalîzm",
"desc": "Înîtîalîzm",
"aliases": [
"înît",
"init"
]
},
{
"key": "metatez",
"desc": "Metatez",
"aliases": [
"meta"
]
},
{
"key": "afeq",
"desc": "Wek :qf, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike",
"invisible": true
},
{
"key": "apheresis",
"desc": "Şiklê ku dengê destpêkê winda kiriye",
"aliases": [
"apheretic",
"aphetic"
]
},
{
"key": "denominal",
"desc": "Fiîla ji îsmekê çêbûyî",
"aliases": [
"denom"
]
},
{
"key": "deverbal",
"desc": "Kelîmeya ji fiîlekê çêbûyî"
},
{
"key": "vrd",
"desc": "Dariştina vṛddhî (sanskrîtî); bi qertaf: :vrd-af"
},
{
"key": "sa-af",
"desc": "Pêkhateya sanskrîtî",
"min": 2
}
],
"wordMods": [
{
"key": "t",
"desc": "Tercimeya kelîmeyê bi kurmancî",
"aliases": [
"w"
]
},
{
"key": "tr",
"desc": "Translîterasyon"
},
{
"key": "ts",
"desc": "Transkrîpsiyon"
},
{
"key": "cuda",
"desc": "Şiklê ku tê nîşandan, eger ne wek navê rûpelê be",
"aliases": [
"alt"
]
},
{
"key": "id",
"desc": "Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan"
},
{
"key": "crz",
"desc": "Cureyê rêzimanî yê kelîmeyê",
"aliases": [
"pos"
],
"values": [
"reh",
"kelîme",
"pêşgir",
"paşgir",
"navgir"
]
},
{
"key": "g",
"desc": "Cinsiyet: n (nêr), m (mê), nt (nêtar)",
"values": [
"n",
"m",
"nt"
]
},
{
"key": "q",
"desc": "Wesf li pêşiyê kelîmeyê"
},
{
"key": "qq",
"desc": "Wesf li pey kelîmeyê"
},
{
"key": "hrf",
"desc": "Mana herfiyen",
"aliases": [
"lit"
]
},
{
"key": "ref",
"desc": "Çavkanî; binêre #Çavkanî"
},
{
"key": "nediyar",
"desc": "Ev gav ne teqez e",
"flag": true,
"aliases": [
"unc"
]
},
{
"key": "crztip",
"desc": "Kelîme ji bo kategoriyan wek reh yan kelîme tê hesibandin",
"aliases": [
"postype"
],
"values": [
"reh",
"kelîme"
]
},
{
"key": "etimon",
"desc": "Etîmolojiya di cih de; binêre jor",
"aliases": [
"ety"
]
},
{
"key": "aftype",
"desc": "Di nav :qf de: cureyê qertafê; binêre #Cureyên qertafan",
"values": [
"pêşgir",
"paşgir",
"navgir",
"circumfix",
"infix",
"non-affix",
"root"
],
"only": [
"qertaf"
]
},
{
"key": "deyn",
"desc": "Di nav :qf de: ev parçe deynkirî ye",
"flag": true,
"only": [
"qertaf"
]
},
{
"key": "deynh",
"desc": "Di nav :qf de: ev parçe deynkirî ye",
"flag": true,
"only": [
"qertaf"
]
},
{
"key": "deynhq",
"desc": "Di nav :qf de: ev parçe deynkirî ye",
"flag": true,
"only": [
"qertaf"
]
}
],
"keywordMods": [
{
"key": "unc",
"desc": "Ev gav ne teqez e: \"Mihtemelen…\"",
"flag": true
},
{
"key": "grdk",
"desc": "Girêdeka di navbera kelîmeyên jêder de, li şûna \"yan jî\"",
"aliases": [
"conj"
]
},
{
"key": "anlz",
"desc": "Analîza şiklî",
"flag": true,
"aliases": [
"surf"
]
},
{
"key": "hrf",
"desc": "Di nav :qf de: mana herfiyen",
"aliases": [
"lit"
],
"only": [
"qertaf"
]
},
{
"key": "maneid",
"desc": "Di nav :wergirtin de: nasnameya maneya wergirtî",
"aliases": [
"senseid"
],
"only": [
"wergirtin"
]
},
{
"key": "metn",
"desc": "Di nav :ji û :drş de: metnekî din li şûna \"Ji\"",
"aliases": [
"text"
],
"only": [
"ji",
"dariştî"
]
},
{
"key": "ref",
"desc": "Çavkaniya vê gavê"
}
],
"metnChoices": [
{
"value": "++",
"desc": "Tevahiya zincîrê"
},
{
"value": "+",
"desc": "Tenê gava pêşîn"
},
{
"value": "*",
"desc": "Heta kelîmeya pêşîn a ku rûpela wê heye"
},
{
"value": "1",
"desc": "Ewqas gav (hejmarek)",
"free": true
},
{
"value": ":",
"desc": "Heta zimanê bi wê kodê (:kod)",
"free": true
},
{
"value": ":*",
"desc": "Heta wî zimanî, eger rûpela wî tune be heta ya pêşîn a heyî (:kod*)",
"free": true
}
],
"afTypes": [
{
"key": "pêşgir",
"desc": "Pêşgir"
},
{
"key": "paşgir",
"desc": "Paşgir"
},
{
"key": "navgir",
"desc": "Navgir"
},
{
"key": "circumfix",
"desc": "Dorgir"
},
{
"key": "infix",
"desc": "Nawgir (infix)"
},
{
"key": "non-affix",
"desc": "Ne qertaf"
},
{
"key": "root",
"desc": "Reh"
}
],
"params": [
{
"key": "dar",
"desc": "Bi 1 dara etîmolojiyê nîşan dide.",
"type": "flag",
"primary": true
},
{
"key": "id",
"desc": "Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan.",
"type": "text",
"primary": true
},
{
"key": "title",
"desc": "Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be.",
"type": "text"
},
{
"key": "crz",
"desc": "Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: reh, kelîme, pêşgir, paşgir, navgir.",
"type": "select",
"values": [
"reh",
"kelîme",
"pêşgir",
"paşgir",
"navgir"
]
},
{
"key": "cotreh",
"desc": "Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda.",
"type": "text"
},
{
"key": "tarîxa-etîm",
"desc": "Tarîxa peyitandina pêşîn, wek 1901, 1500s, 14c, c,1900, before,1850, r,1501,1558.",
"type": "text"
},
{
"key": "niqtena",
"desc": "Bi 1 niqteya dawiyê nayê zêdekirin.",
"type": "flag"
},
{
"key": "niqte",
"desc": "Li şûna niqteya dawiyê nîşaneke din.",
"type": "text"
},
{
"key": "katna",
"desc": "Bi 1 kategorî nayên zêdekirin. Herwiha {{para|nekat}}.",
"type": "flag"
},
{
"key": "darna",
"desc": "Bi 1 ev etîmolojî di dara rûpelên din de dernakeve.",
"type": "flag"
},
{
"key": "exnihilo",
"desc": "Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin.",
"type": "flag"
}
]
},
"metadata": {
"aa": {
"haswikt": 1,
"sc": [
"Latn",
"Ethi"
]
},
"ab": {
"haswikt": 1,
"sc": [
"Cyrl",
"Latn",
"Geor"
]
},
"aer": {
"sc": "Latn"
},
"af": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"ak": {
"haswikt": 1
},
"akk": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"sc": "Xsux"
},
"als": {
"haswikt": 1
},
"am": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1,
"sc": "Ethi"
},
"an": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"ang": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"ar": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"alt": 1,
"haswikt": 1,
"sc": "Arab"
},
"arc": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"sc": [
"Hebr",
"Syrc"
]
},
"are": {},
"arz": {
"alt": 1,
"g": [
"n",
"m",
"n-p",
"m-p"
],
"sc": "Arab"
},
"as": {
"haswikt": 1,
"sc": "Beng"
},
"ast": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"av": {
"haswikt": 1
},
"ay": {
"haswikt": 1
},
"az": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": [
"Latn",
"Cyrl",
"Arab"
]
},
"ba": {
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"bar": {},
"bat-smg": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"bbl": {
"sc": "Geor"
},
"be": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"be-x-old": {
"sc": "Cyrl"
},
"bg": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"bh": {
"haswikt": 1,
"sc": "Deva"
},
"bhb": {
"sc": "Deva"
},
"bi": {
"haswikt": 1
},
"blt": {
"sc": "Tavt"
},
"bm": {
"haswikt": 1,
"sc": [
"Latn",
"Nkoo",
"Arab"
]
},
"bn": {
"haswikt": 1,
"sc": "Beng"
},
"bo": {
"haswikt": 1,
"sc": "Tibt"
},
"br": {
"g": [
"n",
"m"
],
"haswikt": 1
},
"ca": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"cdo": {
"sc": "Hani"
},
"ce": {
"sc": "Cyrl"
},
"ch": {
"haswikt": 1
},
"chr": {
"haswikt": 1,
"sc": "Cher"
},
"cjy": {
"sc": "Hani"
},
"ckb": {
"haswikt": 1,
"sc": "Arab",
"wsc": "ku-Arab"
},
"cmn": {
"sc": "Hani",
"wiktprefix": "zh"
},
"co": {
"haswikt": 1
},
"cpx": {
"sc": "Hani"
},
"cr": {
"haswikt": 1,
"sc": "Cans"
},
"crh": {},
"cs": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"csb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"cu": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"sc": [
"Cyrs",
"Glag"
]
},
"cv": {
"sc": "Cyrl"
},
"cy": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"czh": {
"sc": "Hani"
},
"czo": {
"sc": "Hani"
},
"da": {
"g": [
"g",
"nt",
"g-p",
"nt-p",
"p"
],
"haswikt": 1
},
"dax": {},
"de": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1,
"allowCaps": 1
},
"dhg": {},
"djb": {},
"dji": {},
"djr": {},
"dng": {
"sc": "Cyrl"
},
"dsb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
]
},
"dsx": {},
"duj": {},
"dv": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Thaa"
},
"dz": {
"haswikt": 1,
"sc": "Tibt"
},
"el": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"en": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"eo": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"es": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"et": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"ett": {
"g": [
"y",
"p"
],
"sc": "Ital"
},
"eu": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"fa": {
"haswikt": 1,
"g": [
"y",
"p"
],
"sc": "Arab",
"wsc": "fa-Arab"
},
"fa-cls": {
"wiktprefix": "fa",
"sc": "Arab",
"wsc": "fa-Arab"
},
"fa-ira": {
"wiktprefix": "fa",
"sc": "Arab",
"wsc": "fa-Arab"
},
"fi": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"fil": {},
"fj": {
"haswikt": 1
},
"fo": {
"g": [
"n",
"m",
"nt"
],
"haswikt": 1
},
"fr": {
"g": [
"n",
"m",
"mnmane",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"frm": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"fro": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"fur": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"fy": {
"g": [
"g",
"nt",
"p"
],
"haswikt": 1
},
"ga": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"gan": {
"sc": "Hani"
},
"gd": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"gez": {
"sc": "Ethi"
},
"gl": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"gmw-ecg": {
"g": [
"n",
"m",
"nt",
"p"
],
"allowCaps": 1
},
"gmy": {
"sc": "Linb"
},
"gn": {
"haswikt": 1
},
"gnn": {
"sc": "Latn"
},
"got": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"sc": "Goth"
},
"grc": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
]
},
"gsw": {
"g": [
"n",
"m",
"nt",
"p"
],
"allowCaps": 1
},
"gu": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1,
"sc": "Gujr"
},
"guf": {
"sc": "Latn"
},
"gv": {
"haswikt": 1
},
"ha": {
"haswikt": 1
},
"hak": {
"sc": "Hani"
},
"har": {
"sc": "Ethi"
},
"he": {
"alt": 1,
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Hebr"
},
"hi": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Deva"
},
"hif": {
"sc": [
"Latn",
"Deva"
]
},
"hit": {
"sc": "Xsux"
},
"hrx": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"hsb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"hsn": {
"sc": "Hani"
},
"hu": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"hy": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Armn"
},
"ia": {
"haswikt": 1
},
"id": {
"haswikt": 1
},
"ie": {
"haswikt": 1
},
"ik": {
"haswikt": 1
},
"ike": {
"sc": "Cans"
},
"ikt": {
"sc": "Cans"
},
"io": {
"haswikt": 1
},
"is": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"it": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"iu": {
"haswikt": 1,
"sc": "Cans"
},
"ja": {
"haswikt": 1,
"sc": "Jpan"
},
"jay": {
"sc": "Latn"
},
"jbo": {
"haswikt": 1
},
"jv": {
"haswikt": 1
},
"ka": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"khb": {
"sc": [
"Talu",
"Lana",
"Thai"
]
},
"kjh": {
"sc": "Cyrl"
},
"kk": {
"haswikt": 1,
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"kkh": {
"sc": [
"Lana",
"Thai"
]
},
"kl": {
"haswikt": 1
},
"km": {
"haswikt": 1,
"sc": "Khmr"
},
"kn": {
"haswikt": 1,
"sc": "Knda"
},
"ku": {
"g": [
"n",
"m",
"mnmane",
"mndudil",
"n-p",
"m-p",
"p"
],
"wiktprefix": "ku"
},
"ko": {
"haswikt": 1,
"sc": "Kore"
},
"krc": {
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"ks": {
"haswikt": 1,
"sc": [
"Arab",
"Deva"
],
"wsc": "ks-Arab"
},
"kw": {
"haswikt": 1
},
"ky": {
"haswikt": 1,
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"la": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"lb": {
"g": [
"n",
"m",
"nt",
"p"
],
"haswikt": 1,
"allowCaps": 1
},
"lez": {
"sc": "Cyrl"
},
"li": {
"haswikt": 1
},
"lki": {
"wiktprefix": "ku"
},
"lld": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"lmo": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"ln": {
"haswikt": 1
},
"lo": {
"haswikt": 1,
"sc": "Laoo"
},
"lt": {
"alt": 1,
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"lv": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"lzz": {
"sc": "Geor"
},
"mg": {
"haswikt": 1
},
"mh": {
"haswikt": 1
},
"mi": {
"g": 0,
"haswikt": 1
},
"mk": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"ml": {
"haswikt": 1,
"sc": "Mlym"
},
"mn": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": [
"Cyrl",
"Mong"
]
},
"mnp": {
"sc": "Hani"
},
"mo": {
"haswikt": 1,
"sc": "Cyrl"
},
"mol": {
"sc": "Cyrl"
},
"mr": {
"g": [
"n",
"m",
"nt"
],
"haswikt": 1,
"sc": "Deva"
},
"ms": {
"haswikt": 1,
"sc": [
"Latn",
"Arab"
]
},
"mt": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"mwp": {
"sc": "Latn"
},
"my": {
"haswikt": 1,
"sc": "Mymr"
},
"na": {
"haswikt": 1
},
"nah": {
"haswikt": 1
},
"nan": {
"wiktprefix": "zh-min-nan",
"sc": "Hani"
},
"nb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"wiktprefix": "no"
},
"nds-de": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "nds"
},
"nds-nl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "nds"
},
"ne": {
"haswikt": 1,
"sc": "Deva"
},
"nl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1
},
"nn": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1
},
"no": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1
},
"nod": {
"sc": "Lana"
},
"non": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"oc": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"om": {
"haswikt": 1
},
"or": {
"haswikt": 1,
"sc": "Orya"
},
"orv": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"sc": "Cyrs"
},
"osc": {
"sc": "Ital"
},
"ota": {
"g": [
"y",
"p"
],
"sc": "Arab",
"wsc": "ota-Arab"
},
"pa": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": [
"Guru",
"Arab"
]
},
"pdt": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "nds"
},
"peo": {
"sc": "Xpeo"
},
"phn": {
"sc": "Phnx"
},
"pi": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"pjt": {
"sc": "Latn"
},
"pl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"pms": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"pox": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"împf",
"pf"
]
},
"prs": {
"wiktprefix": "fa",
"sc": "Arab",
"wsc": "fa-Arab"
},
"ps": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Arab",
"wsc": "ps-Arab"
},
"pt": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"qu": {
"haswikt": 1
},
"rgn": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"rit": {
"sc": "Latn"
},
"rm": {
"g": [
"n",
"m"
],
"haswikt": 1
},
"rn": {
"haswikt": 1
},
"ro": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1,
"sc": [
"Latn",
"Cyrl"
]
},
"roa-rup": {
"haswikt": 1
},
"ru": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"rue": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"sc": "Cyrl"
},
"ruo": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"rup": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "roa-rup"
},
"ruq": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"rw": {
"haswikt": 1
},
"sa": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1,
"sc": "Deva"
},
"sah": {
"sc": "Cyrl"
},
"sc": {
"haswikt": 1
},
"scn": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"sco": {
"sc": "Latn"
},
"sd": {
"haswikt": 1,
"sc": "Arab",
"wsc": "sd-Arab"
},
"sdh": {
"sc": "Arab",
"wiktprefix": "ku"
},
"sg": {
"haswikt": 1
},
"sh": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": [
"Latn",
"Cyrl"
]
},
"si": {
"haswikt": 1,
"sc": "Sinh"
},
"simple": {
"haswikt": 1
},
"sk": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"sl": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"sm": {
"haswikt": 1
},
"sn": {
"haswikt": 1
},
"so": {
"haswikt": 1
},
"spx": {
"sc": "Ital"
},
"sq": {
"g": [
"n",
"m"
],
"haswikt": 1
},
"ss": {
"haswikt": 1
},
"st": {
"haswikt": 1
},
"su": {
"haswikt": 1
},
"sux": {
"sc": "Xsux"
},
"sv": {
"g": [
"g",
"nt",
"g-p",
"nt-p"
],
"haswikt": 1
},
"sva": {
"sc": "Geor"
},
"sw": {
"nclass": 1,
"haswikt": 1
},
"syc": {
"sc": "Syrc"
},
"syr": {
"sc": "Syrc"
},
"szl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
]
},
"ta": {
"haswikt": 1,
"sc": "Taml"
},
"tdd": {
"sc": "Tale"
},
"te": {
"haswikt": 1,
"sc": "Telu"
},
"tg": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Cyrl"
},
"th": {
"haswikt": 1,
"sc": "Thai"
},
"ti": {
"haswikt": 1,
"sc": "Ethi"
},
"tig": {
"sc": "Ethi"
},
"tiw": {
"sc": "Latn"
},
"tk": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"tl": {
"haswikt": 1,
"sc": [
"Latn",
"Tglg"
]
},
"tmr": {
"sc": "Hebr"
},
"tn": {
"haswikt": 1
},
"to": {
"haswikt": 1
},
"tpi": {
"haswikt": 1
},
"tr": {
"g": [
"y",
"p"
],
"alt": 1,
"haswikt": 1
},
"ts": {
"haswikt": 1
},
"tt": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"tts": {
"sc": "Thai"
},
"tw": {
"haswikt": 1
},
"udi": {
"sc": [
"Cyrl",
"Latn",
"Armn",
"Geor"
]
},
"ug": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Arab",
"wsc": "ug-Arab"
},
"uga": {
"sc": "Ugar"
},
"uk": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"ulk": {
"sc": "Latn"
},
"ur": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Arab",
"wsc": "ur-Arab"
},
"uz": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"vec": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"vi": {
"haswikt": 1
},
"vls": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"vo": {
"haswikt": 1
},
"wa": {
"haswikt": 1
},
"wbp": {
"sc": "Latn"
},
"wo": {
"haswikt": 1
},
"wuu": {
"sc": "Hani"
},
"xae": {
"sc": "Ital"
},
"xcr": {
"sc": "Cari"
},
"xfa": {
"sc": "Ital"
},
"xh": {
"alt": 1,
"nclass": 1,
"haswikt": 1
},
"xlc": {
"sc": "Lyci"
},
"xld": {
"sc": "Lydi"
},
"xlu": {
"sc": "Xsux"
},
"xmf": {
"sc": "Geor"
},
"xno": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"xrr": {
"sc": "Ital"
},
"xst": {
"sc": "Ethi"
},
"xum": {
"sc": "Ital"
},
"xve": {
"sc": "Ital"
},
"xvo": {
"sc": "Ital"
},
"yi": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1,
"sc": "Hebr"
},
"yo": {
"haswikt": 1
},
"yua": {
"g": [
"y",
"p"
],
"alt": 1
},
"yue": {
"sc": "Hani"
},
"za": {
"haswikt": 1,
"sc": "Latn"
},
"zh-classical": {
"sc": "Hani"
},
"zh-min-nan": {
"haswikt": 1
},
"zh-yue": {
"sc": "Hani"
},
"zu": {
"alt": 1,
"nclass": 1,
"haswikt": 1
},
"zza": {
"g": [
"n",
"m",
"mn",
"n-p",
"m-p",
"p"
],
"wiktprefix": "diq"
}
},
"numberLabels": {
"y": {
"display": "yekjimar"
},
"d": {
"display": "hejmar dual"
},
"p": {
"display": "pirjimar"
},
"p+": {
"display": "axlebî pirjimar"
},
"tp": {
"display": "tenê pirjimar"
},
"j": {
"display": "jimarbar"
},
"j+": {
"display": "axlebî jimarbar"
},
"j/nj": {
"display": "jimarbar û nejimarbar"
},
"nj": {
"display": "nejimarbar"
},
"nj+": {
"display": "axlebî nejimarbar"
},
"hj!": {
"display": "hejmar nepeyitandî ye"
},
"hj?": {
"display": "hejmar hewce ye"
}
},
"leadingTplOrder": [
"maneid",
"K",
"e"
],
"lekturChoices": [
{
"code": "gh",
"label": "gerguhêz (îsmî mefûl digire)"
},
{
"code": "ngh",
"label": "negerguhêz (îsmî mefûl nagire)"
}
],
"lekturFormChoices": [
{
"code": "x",
"label": "xwerû"
},
{
"code": "p",
"label": "pêkhatî"
},
{
"code": "h",
"label": "hevedudanî"
}
],
"deverQuickPicks": [
"kurmanciya rojavayî",
"kurmanciya merkezî",
"kurmanciya rojhilatî",
"Badînî",
"Botî",
"Serhedî",
"Bakur",
"Amed",
"Riha"
],
"maneTags": [
"cure?",
"rêziman?",
"kat-rêziman",
"kategoriya rêzimanê?",
"bêcure"
],
"senseGroups": [
{
"key": "alt-r",
"label": "Formên alternatîv",
"field": "alternativ",
"order": 3,
"hint": "Varyantên vê kelîmeyê"
},
{
"key": "hevmane",
"label": "Hevmane",
"field": "hevmane",
"order": 1,
"hint": "Spehî hevmaneya Bedew e."
},
{
"key": "dijmane",
"label": "Dijmane",
"field": "dijmane",
"order": 2,
"hint": "Zengîn dijmaneya feqîr e."
},
{
"key": "koordîne",
"label": "Termên koordîne",
"field": "koordine",
"order": 4,
"hint": "Pisîk û kûçik termên koordîne ne çunkî Jornavên wan gelek in"
},
{
"key": "jornav",
"label": "Jornav",
"field": "jornav",
"order": 5,
"hint": "Heywan jornavê guhandar e"
},
{
"key": "jêrnav",
"label": "Jêrnav",
"field": "jernav",
"order": 6,
"hint": "Guhandar jêrnavê heywan e"
}
],
"subsectionOrder": [
"Bilêvkirin",
"Ji wêjeya klasîk",
"Ji wêjeyê",
"Tewandin",
"Notên bikaranînê",
"Bi alfabeyên din",
"Formên alternatîv",
"Kurtkirin",
"Sembol",
"Navê zanistî",
"Hevmane",
"Nêzîk",
"Dijmane",
"Jornav",
"Jêrnav",
"Jê",
"Têkildar",
"Etîmolojî",
"Dûnde",
"Bide ber",
"Herwiha binêre",
"Bêhtir bixwîne",
"Bi zaravayên din",
"Werger",
"Qafiye",
"Anagram",
"Çavkanî"
],
"templateAliases": {
"K": [
"K",
"kategorîzebike",
"mijar"
],
"alt-r": [
"alt-r",
"forma alt di rêzê de",
"herwiha-rêz",
"herwiha di rêza maneyê de"
],
"dijmane": [
"dijmane",
"dijwate",
"dijmaneyên peyvê"
],
"e": [
"e",
"etîket",
"f",
"lb"
],
"g": [
"g",
"girêdan",
"l",
"link"
],
"hevmane": [
"hevmane",
"hevwate",
"hevmaneya peyvê",
"hevmaneyên peyvê",
"synonyms"
],
"jornav": [
"jornav",
"hîpernîm"
],
"jêrnav": [
"jêrnav",
"hîponîm"
],
"koordîne": [
"koordîne",
"termên koordîne",
"peyvên koordîneyî"
],
"mane?": [
"mane?",
"wate?",
"bêmane",
"bêwate"
],
"maneid": [
"maneid",
"senseid"
],
"h-bnr": [
"h-bnr",
"bnr-h",
"bnr h",
"bnr-hrw",
"bnr herwiha",
"herwiha binêre",
"binêre herwiha"
]
},
"wordlistTemplates": [
"kol3",
"kol2",
"kol",
"col3",
"col2",
"col"
],
"templateParams": {
"deyn": {
"order": [
"1",
"2",
"3",
"4",
"5",
"tr",
"ts",
"sc",
"id"
],
"labels": {
"1": "Zimanê jêder",
"2": "Zimanê wergir",
"3": "Kelîme",
"4": "Xuyakirina alternatîv",
"5": "Maneya kelîmeyê",
"tr": "Transliterasyon",
"ts": "Transkîpsiyon",
"sc": "Koda skrîptê",
"id": "IDya maneyê"
}
},
"hv": {
"order": [
"1",
"2",
"3",
"4",
"tr",
"ts",
"sc"
],
"labels": {
"1": "Koda zimanî",
"2": "Kelîme",
"3": "Xuyakirina alternatîv",
"4": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"sc": "Koda skrîptê"
}
},
"ji": {
"order": [
"1",
"2",
"3",
"4",
"5",
"tr",
"ts",
"id",
"sc"
],
"labels": {
"1": "Zimanê jêder",
"2": "Zimanê wergir",
"3": "Kelîme",
"4": "Xuyakirina alternatîv",
"5": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"id": "IDya maneyê",
"sc": "Koda skrîptê"
}
},
"jêder-kitêb": {
"order": [
"1",
"jêgirtin",
"sc",
"tr",
"t",
"nivîskar",
"nivîskar2",
"nivîskar3",
"amadekar",
"terciman",
"sernav",
"url",
"weşanxane",
"cih",
"cild",
"sal",
"sala-weşandinê",
"çap",
"rûpel",
"isbn",
"nekat",
"nivîskar4",
"nivîskar5",
"issn",
"oclc",
"serî",
"doi"
],
"labels": {
"1": "koda zimanî",
"sc": "koda skrîptê eger hewce be",
"tr": "translîterasyon",
"t": "tercime",
"rûpel": "rûpel"
}
},
"jêder-kovar": {
"order": [
"1",
"jêgirtin",
"sc",
"tr",
"werger",
"kovar",
"sernav",
"wergêr",
"nivîskar",
"nivîskar2",
"url",
"weşanxane",
"cîld",
"hejmar",
"sal",
"tarîx",
"rûpel"
],
"labels": {
"1": "Koda zimanî",
"sc": "Koda skrîptê",
"tr": "Translîterasyon",
"werger": "Tercimeya kurmancî ya jêgirtinê"
}
},
"jêder-vîdeo": {
"order": [
"1",
"title",
"year",
"date",
"author",
"authorlink",
"actor",
"role",
"time",
"at",
"medium",
"network",
"text",
"translation",
"season",
"number",
"episode",
"publisher",
"url",
"director",
"brackets"
],
"labels": {
"1": "Language",
"title": "Title",
"year": "Year of release",
"date": "Date of release",
"author": "Writer (screenplay)",
"authorlink": "Wikipedia author page",
"actor": "Actor (speaker)",
"role": "Role",
"time": "Timecode",
"at": "Context",
"medium": "Recording medium",
"network": "Network",
"text": "Quoted line",
"translation": "Translation",
"season": "Season number (series)",
"number": "Episode number (series)",
"episode": "Episode title (series)",
"publisher": "Publisher",
"url": "URL",
"director": "Director",
"brackets": "Brackets"
}
},
"jêder-websîte": {
"order": [
"1",
"jêgirtin",
"sc",
"tr",
"t",
"nivîskar",
"terciman",
"sernav",
"url",
"urlya-arşîvê",
"websîte",
"tarîx",
"sal"
],
"labels": {
"1": "Koda zimanî",
"sc": "Koda skrîptê ya jêgirtinê",
"tr": "Translîterasyona jêgirtinê",
"t": "Tercimeya kurmancî ya jêgirtinê"
}
},
"mîr": {
"order": [
"1",
"2",
"3",
"4",
"5",
"tr",
"ts",
"id",
"sc"
],
"labels": {
"1": "Zimanê jêder",
"2": "Zimanê wergir",
"3": "Kelîme",
"4": "Xuyakirina alternatîv",
"5": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"id": "IDya maneyê",
"sc": "Koda skrîptê"
}
},
"nh": {
"order": [
"1",
"2",
"3",
"4",
"tr",
"ts",
"sc"
],
"labels": {
"1": "Koda zimanî",
"2": "Kelîme",
"3": "Xuyakirina alternatîv",
"4": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"sc": "Koda skrîptê"
}
},
"qertaf": {
"order": [
"1",
"2",
"3",
"sc",
"cuda1",
"cuda2",
"t1",
"t2",
"tr1",
"tr2"
],
"labels": {
"1": "language code",
"2": "first part",
"3": "second part",
"sc": "script code",
"cuda1": "first part alternate text",
"cuda2": "second part alternate text",
"w1": "first gloss",
"w2": "second gloss",
"tr1": "first part transliteration",
"tr2": "second part transliteration"
}
},
"yekser": {
"order": [
"1",
"2",
"3",
"hûr",
"nekat"
]
}
}
}
j4njrkz0my1aquhha40j6bfgz54a320
6533217
6532974
2026-09-19T10:38:27Z
Wikihez
7344
Etymology: gender is c in the builder, with z and g as aliases
6533217
json
application/json
{
"langChoices": {
"ku": "kurmancî",
"zza": "zazakî",
"ckb": "soranî",
"sdh": "kurdiya başûrî",
"hac": "hewramî",
"de": "almanî",
"ar": "erebî",
"fa": "farisî",
"fr": "fransî",
"fi": "fînî",
"en": "îngilîzî",
"ja": "japonî",
"sv": "swêdî",
"tr": "tirkî"
},
"posExamples": {
"navdêr": "Kelîmeyên ji bo tiştan (sêv, heywan, qedeh) yan terman (dilşadî, bextiyarî hwd.) di rêzimanê de.",
"lêker": "Kelîmeyên ji bo kirin an bûyînê wekî 'nivîsîn' yan 'xeber dan'.",
"rengdêr": "Kelîmeyên ku wesfa navdêran nîşan didin wekî 'sêva sor' yan 'xwarina şîrîn'.",
"hoker": "Kelîmeyên ku dem, cih yan awayê kirinê diyar dikin wekî 'bi vî awayî' yan 'demkî'.",
"daçek": "Kelîmeyên ku cih, dem yan hereketê diyar dikin wekî 'di.. de' yan 'ji'.",
"cînav": "Kelîmeyên ku li şûna navdêran tên bikaranîn daku navdêr neyên dubarekirin wekî 'ew' yan 'em'.",
"baneşan": "Kelîmeyên ku hest, deng hwd. îfade dikin wekî 'noşî!' yan 'aferîn'.",
"serenav": "Navdêrên ku şexsiyetên ferdî nîşan didin, wek navên kes, cih an organîzasyonan nimûne 'London' yan 'Diyarbekir'.",
"gotineke pêşiyan": "Gotinên ku di nav xelkê de bi berbelavî tên bikaranîn bo nimûne 'Serê neêşe ne hewceyî destmalê ye'."
},
"genderLabels": {
"m": "mê",
"n": "nêr",
"nt": "nêtar",
"mn": "mê yan nêr",
"mnmane": "mê yan nêr li gorî maneyê",
"mndudil": "mê yan nêr bikaranîn dudil e",
"g": "giştî",
"y": "yekjimar",
"p": "pirjimar"
},
"tplDefs": {
"rastnivîs": {
"langs": [
"ku"
],
"noLang": true
},
"ku-Latn": {
"langs": [
"ku"
],
"noLang": true
},
"ku-tewîna-nav": {
"langs": [
"ku"
],
"noLang": true
},
"sdh-Arab": {
"langs": [
"sdh"
],
"noLang": true
},
"hac-Arab": {
"langs": [
"hac"
],
"noLang": true
},
"ja-romanîzekirin": {
"langs": [
"ja"
],
"noLang": true
},
"ckb-Arab": {
"langs": [
"ckb"
],
"noLang": true
},
"zza-awayê-Jacobsonê": {
"langs": [
"zza"
]
},
"awayekî din": {
"langs": null
},
"guharto": {
"langs": null
},
"hevmaneya": {
"langs": null
},
"kevnbûyî": {
"langs": null
},
"kêmpeyda": {
"langs": null
},
"kurtkirin": {
"langs": null
},
"paşnav": {
"langs": null
},
"şaşnivîs": {
"langs": null
}
},
"jederDefs": {
"jêder-kitêb": {
"label": "Kitêb",
"fields": [
{
"key": "nivîskar",
"label": "Nivîskar",
"span": 3
},
{
"key": "terciman",
"label": "Terciman",
"span": 3
},
{
"key": "amadekar",
"label": "Amadekar",
"span": 3
},
{
"key": "weşanxane",
"label": "Weşanxane",
"span": 3
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "beş",
"label": "Beş",
"span": 3,
"width": "medium"
},
{
"key": "cih",
"label": "Cih",
"span": 2,
"width": "narrow"
},
{
"key": "sal",
"label": "Sal",
"span": 1,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3,
"width": "medium"
},
{
"key": "sala-weşandinê",
"label": "Sala weşandinê",
"span": 2,
"width": "narrow"
},
{
"key": "çap",
"label": "Çap",
"span": 1,
"width": "narrow"
},
{
"key": "cild",
"label": "Cild",
"span": 2,
"width": "narrow"
},
{
"key": "rûpel",
"label": "Rûpel",
"span": 1,
"width": "narrow"
},
{
"key": "isbn",
"label": "ISBN",
"span": 2,
"width": "narrow"
},
{
"key": "url",
"label": "URL",
"span": 12,
"width": "wide"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
}
]
},
"jêder-kovar": {
"label": "Kovar",
"fields": [
{
"key": "nivîskar",
"label": "Nivîskar",
"span": 3
},
{
"key": "terciman",
"label": "Terciman",
"span": 3
},
{
"key": "amadekar",
"label": "Amadekar",
"span": 3
},
{
"key": "weşanxane",
"label": "Weşanxane",
"span": 3
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "kovar",
"label": "Kovar",
"span": 4
},
{
"key": "cild",
"label": "Cild",
"span": 2,
"width": "narrow"
},
{
"key": "hejmar",
"label": "Hejmar",
"span": 2,
"width": "narrow"
},
{
"key": "sal",
"label": "Sal",
"span": 2,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3,
"width": "medium"
},
{
"key": "rûpel",
"label": "Rûpel",
"span": 2,
"width": "narrow"
},
{
"key": "issn",
"label": "ISSN",
"span": 2,
"width": "narrow"
},
{
"key": "doi",
"label": "DOI",
"span": 2,
"width": "narrow"
},
{
"key": "url",
"label": "URL",
"span": 12,
"width": "wide"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
}
]
},
"jêder-websîte": {
"label": "Websîte",
"fields": [
{
"key": "nivîskar",
"label": "Nivîskar",
"span": 4
},
{
"key": "terciman",
"label": "Terciman",
"span": 4
},
{
"key": "websîte",
"label": "Websîte",
"span": 4
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "url",
"label": "URL",
"span": 5
},
{
"key": "urlya-arşîvê",
"label": "URLya Arşîvê",
"span": 5
},
{
"key": "roja-arşîvê",
"label": "Roja arşîvê",
"span": 3,
"width": "medium"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
},
{
"key": "sal",
"label": "Sal",
"span": 1,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3,
"width": "medium"
}
]
},
"jêder-vîdeo": {
"fields": [
{
"key": "hunermend",
"label": "Hunermend",
"span": 6
},
{
"key": "platform",
"label": "Platform",
"span": 6
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "sal",
"label": "Sal",
"span": 2,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3
},
{
"key": "dem",
"label": "Dem",
"span": 2,
"width": "narrow"
},
{
"key": "url",
"label": "URL",
"span": 12,
"width": "wide"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
}
],
"label": "Vîdeo"
}
},
"pronTpls": {
"ku-IPA": {
"desc": "IPAya otomatîk ji bo kurmancî (kontrol hewce ye)",
"snippet": "* {{ku-IPA}}",
"langs": [
"ku"
],
"noLang": true
},
"ku-kîte": {
"desc": "Hecekirina otomatîk ji bo kurmancî",
"snippet": "* {{ku-kîte}}",
"langs": [
"ku"
],
"noLang": true
},
"zza-IPA": {
"desc": "IPAya otomatîk ji bo zazakî",
"snippet": "* {{zza-IPA}}",
"langs": [
"zza"
],
"noLang": true
},
"zza-kîte": {
"desc": "Hecekirina otomatîk ji bo zazakî",
"snippet": "* {{zza-kîte}}",
"langs": [
"zza"
],
"noLang": true
},
"IPA": {
"desc": "Alfabeya fonetîk a navmiletî (IPA)",
"snippet": "* {{IPA|CODE|/…/}}"
},
"deng": {
"desc": "Nimûneya telafûzê bi dosyeya dengî",
"snippet": "* {{deng|CODE|navê_dosyayê.ogg|dever=}}"
},
"bilêv": {
"desc": "{{bilêv|herf|nerm, req|hejmar}}",
"snippet": "* {{bilêv|herf|cure|hejmar}}"
},
"kîte": {
"desc": "Şablona hecekirinê",
"snippet": "* {{kîte|CODE|he|ce}}"
},
"hevdeng": {
"desc": "Hevdeng — gotinên bi heman dengî",
"snippet": "* {{hevdeng|CODE|…}}"
}
},
"etymTpls": {
"etîmon": {
"desc": "Etîmolojiya birêkûpêk: zincîr, dar û kategorî — {{etîmon|ku|:deyn|fa:پنجه\u003Ct:dest\u003E|metn=++}}",
"snippet": "{{etîmon|CODE}}"
},
"ji": {
"desc": "Ji zimanekî din hatiye — {{ji|en|ku|anatomy|tr=|t=}}",
"snippet": "{{ji|SOURCELANG|CODE|…}}"
},
"deyn": {
"desc": "Deynkirî — {{deyn|lang|kod|kelîme}}",
"snippet": "{{deyn|SOURCELANG|CODE|…}}"
},
"mîr": {
"desc": "Mîrasmayî — {{mîr|lang|kod|kelîme}}",
"snippet": "{{mîr|SOURCELANG|CODE|…}}"
},
"qertaf": {
"desc": "Ji bo pêşgir, paşgir û hevedudanî — {{qertaf|kod|pêşgir-|reh}}",
"snippet": "{{qertaf|CODE|…|…}}"
},
"anlz": {
"desc": "Wekî qertaf lê dibêje analîza şiklî — {{anlz|kod|pêşgir-|reh}}",
"snippet": "{{anlz|CODE|…|…}}"
},
"q": {
"desc": "Referans bo rûpelekê — {{q|kod|kelîme}} navê zimanî dernakeve",
"snippet": "{{q|CODE|…}}"
},
"hv": {
"desc": "Hevreh — {{hv|lang|kelîme}} navê zimanî derdikeve",
"snippet": "{{hv|SOURCELANG|…}}"
},
"nh": {
"desc": "Nehevreh — {{nh|lang|kelîme}} navê zimanî derdikeve",
"snippet": "{{nh|SOURCELANG|…}}"
},
"cotreh": {
"desc": "Cotreh — teror {{cotreh|ku|tirs}}",
"snippet": "{{cotreh|CODE|…}}"
},
"yekser": {
"desc": "tercimeya yekser — {{yekser|lang|kod|kelîme}}",
"snippet": "{{yekser|SOURCELANG|CODE|…}}"
},
"wergirtin": {
"desc": "Wergirtina maneyê — {{wergirtin|lang|kod|kelîme}}",
"snippet": "{{wergirtin|SOURCELANG|CODE|…}}"
},
"paşvesazî": {
"desc": "Paşvesazî — greed {{paşvesazî|en|greedy}}",
"snippet": "{{paşvesazî|CODE|…}}"
},
"qusandin": {
"desc": "Qusandin — Miho {{qusandin|ku|Mihemmed}}",
"snippet": "{{qusandin|CODE|…}}"
},
"têkilkirin": {
"desc": "Têkilkirin — sormancî {{têkilkirin|ku|soranî|kurmancî}}",
"snippet": "{{têkilkirin|CODE|…}}"
},
"nyz": {
"desc": "Nayê zanîn — {{nyz|ku|hûr=1}}",
"snippet": "{{nyz|CODE}}"
},
"onom": {
"desc": "Onomatopoetîk — {{onom|ku|hûr=1}}",
"snippet": "{{onom|CODE}}"
},
"navmiletî": {
"desc": "Navmiletî — {{navmiletî|ku|hûr=1}}",
"snippet": "{{navmiletî|CODE}}"
},
"neo": {
"desc": "neolojîzm — {{neolojîzm|ku|hûr=1}}",
"snippet": "{{neolojîzm|CODE}}"
}
},
"etimon": {
"keywords": [
{
"key": "mîrasmayî",
"desc": "Kelîmeya ku ji zimanê bav û kalan maye",
"aliases": [
"mîr",
"inh"
]
},
{
"key": "deyn",
"desc": "Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin",
"aliases": [
"bor",
"borrowed"
]
},
{
"key": "deynh",
"desc": "Deynkirina hînbûyî: ne bi riya têkiliya rojane, bi qesd hatiye girtin",
"aliases": [
"lbor"
]
},
{
"key": "deynhq",
"desc": "Deynkirina hînbûyî ya ku hinekî hatiye guhertin",
"aliases": [
"slbor"
]
},
{
"key": "deynort",
"desc": "Deynkirina ortografîk",
"aliases": [
"obor"
]
},
{
"key": "deynne",
"desc": "Deynkirina neadaptekirî",
"aliases": [
"ubor"
]
},
{
"key": "dariştî",
"desc": "Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be",
"aliases": [
"drş",
"der"
]
},
{
"key": "ji",
"desc": "Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e",
"aliases": [
"from"
]
},
{
"key": "drşnd",
"desc": "Dariştin heye lê cureyê wê ne diyar e",
"aliases": [
"uder"
]
},
{
"key": "qertaf",
"desc": "Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e",
"aliases": [
"qf",
"af"
]
},
{
"key": "reh",
"desc": "Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e (\"Peyvên … yên aîdî rehê …\") û di metn û darê de xuya nabe",
"aliases": [
"root"
],
"invisible": true
},
{
"key": "yekser",
"desc": "Wergerandina yekser; zincîr li vir disekine",
"aliases": [
"cal",
"clq"
]
},
{
"key": "yekserqismî",
"desc": "Wergerandina yekser a qismî; zincîr li vir disekine",
"aliases": [
"yekserq",
"pcal"
]
},
{
"key": "wergirtin",
"desc": "Wergirtina maneyê; mana wergirtî bi \u003Cmaneid:…\u003E tê nîşankirin",
"aliases": [
"sl"
]
},
{
"key": "lihevanîn",
"desc": "Lihevanîna dengî-maneyî",
"aliases": [
"psm"
]
},
{
"key": "tesîr",
"desc": "Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine",
"aliases": [
"influence"
]
},
{
"key": "têkilkirin",
"desc": "Têkilkirina du kelîmeyan",
"aliases": [
"blend"
],
"min": 2
},
{
"key": "ûnîverbasyon",
"desc": "Ûnîverbasyon",
"aliases": [
"ûnîv",
"univ"
]
},
{
"key": "qusandin",
"desc": "Qusandin",
"aliases": [
"clip"
]
},
{
"key": "paşvesazî",
"desc": "Paşvesazî",
"aliases": [
"bf"
]
},
{
"key": "elîpsîz",
"desc": "Elîpsîz",
"aliases": [
"elîp",
"ellip"
]
},
{
"key": "nomînalîzasyon",
"desc": "Nomînalîzasyon",
"aliases": [
"nomîn",
"nom"
]
},
{
"key": "translîterasyon",
"desc": "Translîterasyon",
"aliases": [
"translît",
"translit"
]
},
{
"key": "redûblîkasyon",
"desc": "Redûblîkasyon",
"aliases": [
"redûb",
"redup"
]
},
{
"key": "kurtkirin",
"desc": "Kurtkirina kelîmeyekê",
"aliases": [
"abbr"
]
},
{
"key": "sylabbr",
"desc": "Kurtkirin li gorî kîteyan",
"aliases": [
"syllabic abbreviation",
"sylabbrev"
]
},
{
"key": "akronîm",
"desc": "Akronîm",
"aliases": [
"acro"
]
},
{
"key": "înîtîalîzm",
"desc": "Înîtîalîzm",
"aliases": [
"înît",
"init"
]
},
{
"key": "metatez",
"desc": "Metatez",
"aliases": [
"meta"
]
},
{
"key": "afeq",
"desc": "Wek :qf, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike",
"invisible": true
},
{
"key": "apheresis",
"desc": "Şiklê ku dengê destpêkê winda kiriye",
"aliases": [
"apheretic",
"aphetic"
]
},
{
"key": "denominal",
"desc": "Fiîla ji îsmekê çêbûyî",
"aliases": [
"denom"
]
},
{
"key": "deverbal",
"desc": "Kelîmeya ji fiîlekê çêbûyî"
},
{
"key": "vrd",
"desc": "Dariştina vṛddhî (sanskrîtî); bi qertaf: :vrd-af"
},
{
"key": "sa-af",
"desc": "Pêkhateya sanskrîtî",
"min": 2
}
],
"wordMods": [
{
"key": "t",
"desc": "Tercimeya kelîmeyê bi kurmancî",
"aliases": [
"w"
]
},
{
"key": "tr",
"desc": "Translîterasyon"
},
{
"key": "ts",
"desc": "Transkrîpsiyon"
},
{
"key": "cuda",
"desc": "Şiklê ku tê nîşandan, eger ne wek navê rûpelê be",
"aliases": [
"alt"
]
},
{
"key": "id",
"desc": "Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan"
},
{
"key": "crz",
"desc": "Cureyê rêzimanî yê kelîmeyê",
"aliases": [
"pos"
],
"values": [
"reh",
"kelîme",
"pêşgir",
"paşgir",
"navgir"
]
},
{
"key": "c",
"desc": "Cinsiyet: n (nêr), m (mê), nt (nêtar)",
"values": [
"n",
"m",
"nt"
],
"aliases": [
"z",
"g"
]
},
{
"key": "q",
"desc": "Wesf li pêşiyê kelîmeyê"
},
{
"key": "qq",
"desc": "Wesf li pey kelîmeyê"
},
{
"key": "hrf",
"desc": "Mana herfiyen",
"aliases": [
"lit"
]
},
{
"key": "ref",
"desc": "Çavkanî; binêre #Çavkanî"
},
{
"key": "nediyar",
"desc": "Ev gav ne teqez e",
"flag": true,
"aliases": [
"unc"
]
},
{
"key": "crztip",
"desc": "Kelîme ji bo kategoriyan wek reh yan kelîme tê hesibandin",
"aliases": [
"postype"
],
"values": [
"reh",
"kelîme"
]
},
{
"key": "etimon",
"desc": "Etîmolojiya di cih de; binêre jor",
"aliases": [
"ety"
]
},
{
"key": "aftype",
"desc": "Di nav :qf de: cureyê qertafê; binêre #Cureyên qertafan",
"values": [
"pêşgir",
"paşgir",
"navgir",
"circumfix",
"infix",
"non-affix",
"root"
],
"only": [
"qertaf"
]
},
{
"key": "deyn",
"desc": "Di nav :qf de: ev parçe deynkirî ye",
"flag": true,
"only": [
"qertaf"
]
},
{
"key": "deynh",
"desc": "Di nav :qf de: ev parçe deynkirî ye",
"flag": true,
"only": [
"qertaf"
]
},
{
"key": "deynhq",
"desc": "Di nav :qf de: ev parçe deynkirî ye",
"flag": true,
"only": [
"qertaf"
]
}
],
"keywordMods": [
{
"key": "unc",
"desc": "Ev gav ne teqez e: \"Mihtemelen…\"",
"flag": true
},
{
"key": "grdk",
"desc": "Girêdeka di navbera kelîmeyên jêder de, li şûna \"yan jî\"",
"aliases": [
"conj"
]
},
{
"key": "anlz",
"desc": "Analîza şiklî",
"flag": true,
"aliases": [
"surf"
]
},
{
"key": "hrf",
"desc": "Di nav :qf de: mana herfiyen",
"aliases": [
"lit"
],
"only": [
"qertaf"
]
},
{
"key": "maneid",
"desc": "Di nav :wergirtin de: nasnameya maneya wergirtî",
"aliases": [
"senseid"
],
"only": [
"wergirtin"
]
},
{
"key": "metn",
"desc": "Di nav :ji û :drş de: metnekî din li şûna \"Ji\"",
"aliases": [
"text"
],
"only": [
"ji",
"dariştî"
]
},
{
"key": "ref",
"desc": "Çavkaniya vê gavê"
}
],
"metnChoices": [
{
"value": "++",
"desc": "Tevahiya zincîrê"
},
{
"value": "+",
"desc": "Tenê gava pêşîn"
},
{
"value": "*",
"desc": "Heta kelîmeya pêşîn a ku rûpela wê heye"
},
{
"value": "1",
"desc": "Ewqas gav (hejmarek)",
"free": true
},
{
"value": ":",
"desc": "Heta zimanê bi wê kodê (:kod)",
"free": true
},
{
"value": ":*",
"desc": "Heta wî zimanî, eger rûpela wî tune be heta ya pêşîn a heyî (:kod*)",
"free": true
}
],
"afTypes": [
{
"key": "pêşgir",
"desc": "Pêşgir"
},
{
"key": "paşgir",
"desc": "Paşgir"
},
{
"key": "navgir",
"desc": "Navgir"
},
{
"key": "circumfix",
"desc": "Dorgir"
},
{
"key": "infix",
"desc": "Nawgir (infix)"
},
{
"key": "non-affix",
"desc": "Ne qertaf"
},
{
"key": "root",
"desc": "Reh"
}
],
"params": [
{
"key": "dar",
"desc": "Bi 1 dara etîmolojiyê nîşan dide.",
"type": "flag",
"primary": true
},
{
"key": "id",
"desc": "Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan.",
"type": "text",
"primary": true
},
{
"key": "title",
"desc": "Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be.",
"type": "text"
},
{
"key": "crz",
"desc": "Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: reh, kelîme, pêşgir, paşgir, navgir.",
"type": "select",
"values": [
"reh",
"kelîme",
"pêşgir",
"paşgir",
"navgir"
]
},
{
"key": "cotreh",
"desc": "Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda.",
"type": "text"
},
{
"key": "tarîxa-etîm",
"desc": "Tarîxa peyitandina pêşîn, wek 1901, 1500s, 14c, c,1900, before,1850, r,1501,1558.",
"type": "text"
},
{
"key": "niqtena",
"desc": "Bi 1 niqteya dawiyê nayê zêdekirin.",
"type": "flag"
},
{
"key": "niqte",
"desc": "Li şûna niqteya dawiyê nîşaneke din.",
"type": "text"
},
{
"key": "katna",
"desc": "Bi 1 kategorî nayên zêdekirin. Herwiha {{para|nekat}}.",
"type": "flag"
},
{
"key": "darna",
"desc": "Bi 1 ev etîmolojî di dara rûpelên din de dernakeve.",
"type": "flag"
},
{
"key": "exnihilo",
"desc": "Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin.",
"type": "flag"
}
]
},
"metadata": {
"aa": {
"haswikt": 1,
"sc": [
"Latn",
"Ethi"
]
},
"ab": {
"haswikt": 1,
"sc": [
"Cyrl",
"Latn",
"Geor"
]
},
"aer": {
"sc": "Latn"
},
"af": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"ak": {
"haswikt": 1
},
"akk": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"sc": "Xsux"
},
"als": {
"haswikt": 1
},
"am": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1,
"sc": "Ethi"
},
"an": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"ang": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"ar": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"alt": 1,
"haswikt": 1,
"sc": "Arab"
},
"arc": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"sc": [
"Hebr",
"Syrc"
]
},
"are": {},
"arz": {
"alt": 1,
"g": [
"n",
"m",
"n-p",
"m-p"
],
"sc": "Arab"
},
"as": {
"haswikt": 1,
"sc": "Beng"
},
"ast": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"av": {
"haswikt": 1
},
"ay": {
"haswikt": 1
},
"az": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": [
"Latn",
"Cyrl",
"Arab"
]
},
"ba": {
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"bar": {},
"bat-smg": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"bbl": {
"sc": "Geor"
},
"be": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"be-x-old": {
"sc": "Cyrl"
},
"bg": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"bh": {
"haswikt": 1,
"sc": "Deva"
},
"bhb": {
"sc": "Deva"
},
"bi": {
"haswikt": 1
},
"blt": {
"sc": "Tavt"
},
"bm": {
"haswikt": 1,
"sc": [
"Latn",
"Nkoo",
"Arab"
]
},
"bn": {
"haswikt": 1,
"sc": "Beng"
},
"bo": {
"haswikt": 1,
"sc": "Tibt"
},
"br": {
"g": [
"n",
"m"
],
"haswikt": 1
},
"ca": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"cdo": {
"sc": "Hani"
},
"ce": {
"sc": "Cyrl"
},
"ch": {
"haswikt": 1
},
"chr": {
"haswikt": 1,
"sc": "Cher"
},
"cjy": {
"sc": "Hani"
},
"ckb": {
"haswikt": 1,
"sc": "Arab",
"wsc": "ku-Arab"
},
"cmn": {
"sc": "Hani",
"wiktprefix": "zh"
},
"co": {
"haswikt": 1
},
"cpx": {
"sc": "Hani"
},
"cr": {
"haswikt": 1,
"sc": "Cans"
},
"crh": {},
"cs": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"csb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"cu": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"sc": [
"Cyrs",
"Glag"
]
},
"cv": {
"sc": "Cyrl"
},
"cy": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"czh": {
"sc": "Hani"
},
"czo": {
"sc": "Hani"
},
"da": {
"g": [
"g",
"nt",
"g-p",
"nt-p",
"p"
],
"haswikt": 1
},
"dax": {},
"de": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1,
"allowCaps": 1
},
"dhg": {},
"djb": {},
"dji": {},
"djr": {},
"dng": {
"sc": "Cyrl"
},
"dsb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
]
},
"dsx": {},
"duj": {},
"dv": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Thaa"
},
"dz": {
"haswikt": 1,
"sc": "Tibt"
},
"el": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"en": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"eo": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"es": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"et": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"ett": {
"g": [
"y",
"p"
],
"sc": "Ital"
},
"eu": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"fa": {
"haswikt": 1,
"g": [
"y",
"p"
],
"sc": "Arab",
"wsc": "fa-Arab"
},
"fa-cls": {
"wiktprefix": "fa",
"sc": "Arab",
"wsc": "fa-Arab"
},
"fa-ira": {
"wiktprefix": "fa",
"sc": "Arab",
"wsc": "fa-Arab"
},
"fi": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"fil": {},
"fj": {
"haswikt": 1
},
"fo": {
"g": [
"n",
"m",
"nt"
],
"haswikt": 1
},
"fr": {
"g": [
"n",
"m",
"mnmane",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"frm": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"fro": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"fur": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"fy": {
"g": [
"g",
"nt",
"p"
],
"haswikt": 1
},
"ga": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"gan": {
"sc": "Hani"
},
"gd": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"gez": {
"sc": "Ethi"
},
"gl": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"gmw-ecg": {
"g": [
"n",
"m",
"nt",
"p"
],
"allowCaps": 1
},
"gmy": {
"sc": "Linb"
},
"gn": {
"haswikt": 1
},
"gnn": {
"sc": "Latn"
},
"got": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"sc": "Goth"
},
"grc": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
]
},
"gsw": {
"g": [
"n",
"m",
"nt",
"p"
],
"allowCaps": 1
},
"gu": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1,
"sc": "Gujr"
},
"guf": {
"sc": "Latn"
},
"gv": {
"haswikt": 1
},
"ha": {
"haswikt": 1
},
"hak": {
"sc": "Hani"
},
"har": {
"sc": "Ethi"
},
"he": {
"alt": 1,
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Hebr"
},
"hi": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Deva"
},
"hif": {
"sc": [
"Latn",
"Deva"
]
},
"hit": {
"sc": "Xsux"
},
"hrx": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"hsb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"hsn": {
"sc": "Hani"
},
"hu": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"hy": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Armn"
},
"ia": {
"haswikt": 1
},
"id": {
"haswikt": 1
},
"ie": {
"haswikt": 1
},
"ik": {
"haswikt": 1
},
"ike": {
"sc": "Cans"
},
"ikt": {
"sc": "Cans"
},
"io": {
"haswikt": 1
},
"is": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"it": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"iu": {
"haswikt": 1,
"sc": "Cans"
},
"ja": {
"haswikt": 1,
"sc": "Jpan"
},
"jay": {
"sc": "Latn"
},
"jbo": {
"haswikt": 1
},
"jv": {
"haswikt": 1
},
"ka": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"khb": {
"sc": [
"Talu",
"Lana",
"Thai"
]
},
"kjh": {
"sc": "Cyrl"
},
"kk": {
"haswikt": 1,
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"kkh": {
"sc": [
"Lana",
"Thai"
]
},
"kl": {
"haswikt": 1
},
"km": {
"haswikt": 1,
"sc": "Khmr"
},
"kn": {
"haswikt": 1,
"sc": "Knda"
},
"ku": {
"g": [
"n",
"m",
"mnmane",
"mndudil",
"n-p",
"m-p",
"p"
],
"wiktprefix": "ku"
},
"ko": {
"haswikt": 1,
"sc": "Kore"
},
"krc": {
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"ks": {
"haswikt": 1,
"sc": [
"Arab",
"Deva"
],
"wsc": "ks-Arab"
},
"kw": {
"haswikt": 1
},
"ky": {
"haswikt": 1,
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"la": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"lb": {
"g": [
"n",
"m",
"nt",
"p"
],
"haswikt": 1,
"allowCaps": 1
},
"lez": {
"sc": "Cyrl"
},
"li": {
"haswikt": 1
},
"lki": {
"wiktprefix": "ku"
},
"lld": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"lmo": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"ln": {
"haswikt": 1
},
"lo": {
"haswikt": 1,
"sc": "Laoo"
},
"lt": {
"alt": 1,
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"lv": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"lzz": {
"sc": "Geor"
},
"mg": {
"haswikt": 1
},
"mh": {
"haswikt": 1
},
"mi": {
"g": 0,
"haswikt": 1
},
"mk": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"ml": {
"haswikt": 1,
"sc": "Mlym"
},
"mn": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": [
"Cyrl",
"Mong"
]
},
"mnp": {
"sc": "Hani"
},
"mo": {
"haswikt": 1,
"sc": "Cyrl"
},
"mol": {
"sc": "Cyrl"
},
"mr": {
"g": [
"n",
"m",
"nt"
],
"haswikt": 1,
"sc": "Deva"
},
"ms": {
"haswikt": 1,
"sc": [
"Latn",
"Arab"
]
},
"mt": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"mwp": {
"sc": "Latn"
},
"my": {
"haswikt": 1,
"sc": "Mymr"
},
"na": {
"haswikt": 1
},
"nah": {
"haswikt": 1
},
"nan": {
"wiktprefix": "zh-min-nan",
"sc": "Hani"
},
"nb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"wiktprefix": "no"
},
"nds-de": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "nds"
},
"nds-nl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "nds"
},
"ne": {
"haswikt": 1,
"sc": "Deva"
},
"nl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1
},
"nn": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1
},
"no": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1
},
"nod": {
"sc": "Lana"
},
"non": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"oc": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"om": {
"haswikt": 1
},
"or": {
"haswikt": 1,
"sc": "Orya"
},
"orv": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"sc": "Cyrs"
},
"osc": {
"sc": "Ital"
},
"ota": {
"g": [
"y",
"p"
],
"sc": "Arab",
"wsc": "ota-Arab"
},
"pa": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": [
"Guru",
"Arab"
]
},
"pdt": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "nds"
},
"peo": {
"sc": "Xpeo"
},
"phn": {
"sc": "Phnx"
},
"pi": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"pjt": {
"sc": "Latn"
},
"pl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"pms": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"pox": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"împf",
"pf"
]
},
"prs": {
"wiktprefix": "fa",
"sc": "Arab",
"wsc": "fa-Arab"
},
"ps": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Arab",
"wsc": "ps-Arab"
},
"pt": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"qu": {
"haswikt": 1
},
"rgn": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"rit": {
"sc": "Latn"
},
"rm": {
"g": [
"n",
"m"
],
"haswikt": 1
},
"rn": {
"haswikt": 1
},
"ro": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1,
"sc": [
"Latn",
"Cyrl"
]
},
"roa-rup": {
"haswikt": 1
},
"ru": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"rue": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"sc": "Cyrl"
},
"ruo": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"rup": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "roa-rup"
},
"ruq": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"rw": {
"haswikt": 1
},
"sa": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1,
"sc": "Deva"
},
"sah": {
"sc": "Cyrl"
},
"sc": {
"haswikt": 1
},
"scn": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"sco": {
"sc": "Latn"
},
"sd": {
"haswikt": 1,
"sc": "Arab",
"wsc": "sd-Arab"
},
"sdh": {
"sc": "Arab",
"wiktprefix": "ku"
},
"sg": {
"haswikt": 1
},
"sh": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": [
"Latn",
"Cyrl"
]
},
"si": {
"haswikt": 1,
"sc": "Sinh"
},
"simple": {
"haswikt": 1
},
"sk": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"sl": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"sm": {
"haswikt": 1
},
"sn": {
"haswikt": 1
},
"so": {
"haswikt": 1
},
"spx": {
"sc": "Ital"
},
"sq": {
"g": [
"n",
"m"
],
"haswikt": 1
},
"ss": {
"haswikt": 1
},
"st": {
"haswikt": 1
},
"su": {
"haswikt": 1
},
"sux": {
"sc": "Xsux"
},
"sv": {
"g": [
"g",
"nt",
"g-p",
"nt-p"
],
"haswikt": 1
},
"sva": {
"sc": "Geor"
},
"sw": {
"nclass": 1,
"haswikt": 1
},
"syc": {
"sc": "Syrc"
},
"syr": {
"sc": "Syrc"
},
"szl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
]
},
"ta": {
"haswikt": 1,
"sc": "Taml"
},
"tdd": {
"sc": "Tale"
},
"te": {
"haswikt": 1,
"sc": "Telu"
},
"tg": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Cyrl"
},
"th": {
"haswikt": 1,
"sc": "Thai"
},
"ti": {
"haswikt": 1,
"sc": "Ethi"
},
"tig": {
"sc": "Ethi"
},
"tiw": {
"sc": "Latn"
},
"tk": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"tl": {
"haswikt": 1,
"sc": [
"Latn",
"Tglg"
]
},
"tmr": {
"sc": "Hebr"
},
"tn": {
"haswikt": 1
},
"to": {
"haswikt": 1
},
"tpi": {
"haswikt": 1
},
"tr": {
"g": [
"y",
"p"
],
"alt": 1,
"haswikt": 1
},
"ts": {
"haswikt": 1
},
"tt": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"tts": {
"sc": "Thai"
},
"tw": {
"haswikt": 1
},
"udi": {
"sc": [
"Cyrl",
"Latn",
"Armn",
"Geor"
]
},
"ug": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Arab",
"wsc": "ug-Arab"
},
"uga": {
"sc": "Ugar"
},
"uk": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"ulk": {
"sc": "Latn"
},
"ur": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Arab",
"wsc": "ur-Arab"
},
"uz": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"vec": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"vi": {
"haswikt": 1
},
"vls": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"vo": {
"haswikt": 1
},
"wa": {
"haswikt": 1
},
"wbp": {
"sc": "Latn"
},
"wo": {
"haswikt": 1
},
"wuu": {
"sc": "Hani"
},
"xae": {
"sc": "Ital"
},
"xcr": {
"sc": "Cari"
},
"xfa": {
"sc": "Ital"
},
"xh": {
"alt": 1,
"nclass": 1,
"haswikt": 1
},
"xlc": {
"sc": "Lyci"
},
"xld": {
"sc": "Lydi"
},
"xlu": {
"sc": "Xsux"
},
"xmf": {
"sc": "Geor"
},
"xno": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"xrr": {
"sc": "Ital"
},
"xst": {
"sc": "Ethi"
},
"xum": {
"sc": "Ital"
},
"xve": {
"sc": "Ital"
},
"xvo": {
"sc": "Ital"
},
"yi": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1,
"sc": "Hebr"
},
"yo": {
"haswikt": 1
},
"yua": {
"g": [
"y",
"p"
],
"alt": 1
},
"yue": {
"sc": "Hani"
},
"za": {
"haswikt": 1,
"sc": "Latn"
},
"zh-classical": {
"sc": "Hani"
},
"zh-min-nan": {
"haswikt": 1
},
"zh-yue": {
"sc": "Hani"
},
"zu": {
"alt": 1,
"nclass": 1,
"haswikt": 1
},
"zza": {
"g": [
"n",
"m",
"mn",
"n-p",
"m-p",
"p"
],
"wiktprefix": "diq"
}
},
"numberLabels": {
"y": {
"display": "yekjimar"
},
"d": {
"display": "hejmar dual"
},
"p": {
"display": "pirjimar"
},
"p+": {
"display": "axlebî pirjimar"
},
"tp": {
"display": "tenê pirjimar"
},
"j": {
"display": "jimarbar"
},
"j+": {
"display": "axlebî jimarbar"
},
"j/nj": {
"display": "jimarbar û nejimarbar"
},
"nj": {
"display": "nejimarbar"
},
"nj+": {
"display": "axlebî nejimarbar"
},
"hj!": {
"display": "hejmar nepeyitandî ye"
},
"hj?": {
"display": "hejmar hewce ye"
}
},
"leadingTplOrder": [
"maneid",
"K",
"e"
],
"lekturChoices": [
{
"code": "gh",
"label": "gerguhêz (îsmî mefûl digire)"
},
{
"code": "ngh",
"label": "negerguhêz (îsmî mefûl nagire)"
}
],
"lekturFormChoices": [
{
"code": "x",
"label": "xwerû"
},
{
"code": "p",
"label": "pêkhatî"
},
{
"code": "h",
"label": "hevedudanî"
}
],
"deverQuickPicks": [
"kurmanciya rojavayî",
"kurmanciya merkezî",
"kurmanciya rojhilatî",
"Badînî",
"Botî",
"Serhedî",
"Bakur",
"Amed",
"Riha"
],
"maneTags": [
"cure?",
"rêziman?",
"kat-rêziman",
"kategoriya rêzimanê?",
"bêcure"
],
"senseGroups": [
{
"key": "alt-r",
"label": "Formên alternatîv",
"field": "alternativ",
"order": 3,
"hint": "Varyantên vê kelîmeyê"
},
{
"key": "hevmane",
"label": "Hevmane",
"field": "hevmane",
"order": 1,
"hint": "Spehî hevmaneya Bedew e."
},
{
"key": "dijmane",
"label": "Dijmane",
"field": "dijmane",
"order": 2,
"hint": "Zengîn dijmaneya feqîr e."
},
{
"key": "koordîne",
"label": "Termên koordîne",
"field": "koordine",
"order": 4,
"hint": "Pisîk û kûçik termên koordîne ne çunkî Jornavên wan gelek in"
},
{
"key": "jornav",
"label": "Jornav",
"field": "jornav",
"order": 5,
"hint": "Heywan jornavê guhandar e"
},
{
"key": "jêrnav",
"label": "Jêrnav",
"field": "jernav",
"order": 6,
"hint": "Guhandar jêrnavê heywan e"
}
],
"subsectionOrder": [
"Bilêvkirin",
"Ji wêjeya klasîk",
"Ji wêjeyê",
"Tewandin",
"Notên bikaranînê",
"Bi alfabeyên din",
"Formên alternatîv",
"Kurtkirin",
"Sembol",
"Navê zanistî",
"Hevmane",
"Nêzîk",
"Dijmane",
"Jornav",
"Jêrnav",
"Jê",
"Têkildar",
"Etîmolojî",
"Dûnde",
"Bide ber",
"Herwiha binêre",
"Bêhtir bixwîne",
"Bi zaravayên din",
"Werger",
"Qafiye",
"Anagram",
"Çavkanî"
],
"templateAliases": {
"K": [
"K",
"kategorîzebike",
"mijar"
],
"alt-r": [
"alt-r",
"forma alt di rêzê de",
"herwiha-rêz",
"herwiha di rêza maneyê de"
],
"dijmane": [
"dijmane",
"dijwate",
"dijmaneyên peyvê"
],
"e": [
"e",
"etîket",
"f",
"lb"
],
"g": [
"g",
"girêdan",
"l",
"link"
],
"hevmane": [
"hevmane",
"hevwate",
"hevmaneya peyvê",
"hevmaneyên peyvê",
"synonyms"
],
"jornav": [
"jornav",
"hîpernîm"
],
"jêrnav": [
"jêrnav",
"hîponîm"
],
"koordîne": [
"koordîne",
"termên koordîne",
"peyvên koordîneyî"
],
"mane?": [
"mane?",
"wate?",
"bêmane",
"bêwate"
],
"maneid": [
"maneid",
"senseid"
],
"h-bnr": [
"h-bnr",
"bnr-h",
"bnr h",
"bnr-hrw",
"bnr herwiha",
"herwiha binêre",
"binêre herwiha"
]
},
"wordlistTemplates": [
"kol3",
"kol2",
"kol",
"col3",
"col2",
"col"
],
"templateParams": {
"deyn": {
"order": [
"1",
"2",
"3",
"4",
"5",
"tr",
"ts",
"sc",
"id"
],
"labels": {
"1": "Zimanê jêder",
"2": "Zimanê wergir",
"3": "Kelîme",
"4": "Xuyakirina alternatîv",
"5": "Maneya kelîmeyê",
"tr": "Transliterasyon",
"ts": "Transkîpsiyon",
"sc": "Koda skrîptê",
"id": "IDya maneyê"
}
},
"hv": {
"order": [
"1",
"2",
"3",
"4",
"tr",
"ts",
"sc"
],
"labels": {
"1": "Koda zimanî",
"2": "Kelîme",
"3": "Xuyakirina alternatîv",
"4": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"sc": "Koda skrîptê"
}
},
"ji": {
"order": [
"1",
"2",
"3",
"4",
"5",
"tr",
"ts",
"id",
"sc"
],
"labels": {
"1": "Zimanê jêder",
"2": "Zimanê wergir",
"3": "Kelîme",
"4": "Xuyakirina alternatîv",
"5": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"id": "IDya maneyê",
"sc": "Koda skrîptê"
}
},
"jêder-kitêb": {
"order": [
"1",
"jêgirtin",
"sc",
"tr",
"t",
"nivîskar",
"nivîskar2",
"nivîskar3",
"amadekar",
"terciman",
"sernav",
"url",
"weşanxane",
"cih",
"cild",
"sal",
"sala-weşandinê",
"çap",
"rûpel",
"isbn",
"nekat",
"nivîskar4",
"nivîskar5",
"issn",
"oclc",
"serî",
"doi"
],
"labels": {
"1": "koda zimanî",
"sc": "koda skrîptê eger hewce be",
"tr": "translîterasyon",
"t": "tercime",
"rûpel": "rûpel"
}
},
"jêder-kovar": {
"order": [
"1",
"jêgirtin",
"sc",
"tr",
"werger",
"kovar",
"sernav",
"wergêr",
"nivîskar",
"nivîskar2",
"url",
"weşanxane",
"cîld",
"hejmar",
"sal",
"tarîx",
"rûpel"
],
"labels": {
"1": "Koda zimanî",
"sc": "Koda skrîptê",
"tr": "Translîterasyon",
"werger": "Tercimeya kurmancî ya jêgirtinê"
}
},
"jêder-vîdeo": {
"order": [
"1",
"title",
"year",
"date",
"author",
"authorlink",
"actor",
"role",
"time",
"at",
"medium",
"network",
"text",
"translation",
"season",
"number",
"episode",
"publisher",
"url",
"director",
"brackets"
],
"labels": {
"1": "Language",
"title": "Title",
"year": "Year of release",
"date": "Date of release",
"author": "Writer (screenplay)",
"authorlink": "Wikipedia author page",
"actor": "Actor (speaker)",
"role": "Role",
"time": "Timecode",
"at": "Context",
"medium": "Recording medium",
"network": "Network",
"text": "Quoted line",
"translation": "Translation",
"season": "Season number (series)",
"number": "Episode number (series)",
"episode": "Episode title (series)",
"publisher": "Publisher",
"url": "URL",
"director": "Director",
"brackets": "Brackets"
}
},
"jêder-websîte": {
"order": [
"1",
"jêgirtin",
"sc",
"tr",
"t",
"nivîskar",
"terciman",
"sernav",
"url",
"urlya-arşîvê",
"websîte",
"tarîx",
"sal"
],
"labels": {
"1": "Koda zimanî",
"sc": "Koda skrîptê ya jêgirtinê",
"tr": "Translîterasyona jêgirtinê",
"t": "Tercimeya kurmancî ya jêgirtinê"
}
},
"mîr": {
"order": [
"1",
"2",
"3",
"4",
"5",
"tr",
"ts",
"id",
"sc"
],
"labels": {
"1": "Zimanê jêder",
"2": "Zimanê wergir",
"3": "Kelîme",
"4": "Xuyakirina alternatîv",
"5": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"id": "IDya maneyê",
"sc": "Koda skrîptê"
}
},
"nh": {
"order": [
"1",
"2",
"3",
"4",
"tr",
"ts",
"sc"
],
"labels": {
"1": "Koda zimanî",
"2": "Kelîme",
"3": "Xuyakirina alternatîv",
"4": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"sc": "Koda skrîptê"
}
},
"qertaf": {
"order": [
"1",
"2",
"3",
"sc",
"cuda1",
"cuda2",
"t1",
"t2",
"tr1",
"tr2"
],
"labels": {
"1": "language code",
"2": "first part",
"3": "second part",
"sc": "script code",
"cuda1": "first part alternate text",
"cuda2": "second part alternate text",
"w1": "first gloss",
"w2": "second gloss",
"tr1": "first part transliteration",
"tr2": "second part transliteration"
}
},
"yekser": {
"order": [
"1",
"2",
"3",
"hûr",
"nekat"
]
}
}
}
oht8ebq2yw5xs1xmonu1ym66p79j5et
Bikarhêner:Wikihez/Gadget-test/dsb-panels.js
2
1358909
6532017
6531987
2026-09-18T14:32:07Z
Wikihez
7344
DefSideBoxes: fix the add-subsection form refusing to save with an empty-name error
6532017
javascript
text/javascript
// <nowiki>
/*
* Page: [[MediaWiki:Gadget-wikt.dsb-panels.js]]
*
* Everything DefSideBoxes shows once you click: the per-sense advanced panel, the subsection editors,
* the part-of-speech picker, the template dialogs, the preview and the queued save.
*
* Loaded on demand by wikt.dsb, never on a plain page view. It exports only what that half calls.
*/
(function () {
"use strict";
var sections = require("ext.gadget.wikt.core").sections;
var edit = require("ext.gadget.wikt.edit");
var cite = require("ext.gadget.wikt.cite");
var util = edit.util;
var posparams = edit.posparams;
var wt = edit.wt;
var startData = edit.data;
var langs = edit.langs;
var escapeRegExp = util.escapeRegExp;
// Local names for the shared wikitext layer, so every call site below reads as it always did.
var langHeaderSource = wt.langHeaderSource;
var canonicalTemplateKey = wt.canonicalTemplateKey;
var aliasPattern = wt.aliasPattern;
var splitLeadingCalls = wt.splitLeadingCalls;
var splitTemplateParams = wt.splitTemplateParams;
var parseTemplateCalls = wt.parseTemplateCalls;
var splitCallParams = wt.splitCallParams;
var buildTemplateCall = wt.buildTemplateCall;
var tdText = wt.tdText;
var fetchTemplateData = wt.fetchTemplateData;
var parseWordListCall = wt.parseWordListCall;
var parseWordListCalls = wt.parseWordListCalls;
var namedParam = wt.namedParam;
var withNamedParam = wt.withNamedParam;
var buildWordListCall = wt.buildWordListCall;
var parseBulletWordList = wt.parseBulletWordList;
var sectionNames = sections.sectionNames;
var MANE_SECTION = sections.MANE_SECTION;
var PAGE_SUBSECTIONS = sections.PAGE_SUBSECTIONS;
var headingOuter = sections.headingOuter;
var headingText = sections.headingText;
var isManeHeading = sections.isManeHeading;
var sectionTypeOf = sections.sectionTypeOf;
var sectionOrdinalWithinLanguage = sections.sectionOrdinalWithinLanguage;
var isFormOfWrapper = sections.isFormOfWrapper;
var eachLeafDefinition = sections.eachLeafDefinition;
var api = new mw.Api();
// metadata[lang].g, minus the grammatical-number codes start.js filters out with isNumberCode(), rendered
// the way its genderLabel() does ("m-p" -> "mê (pirjimar)").
// start.js asks transitivity and structural form as two questions and joins them as "<form>-<base>", so
// "gerguhêz" alone is "gh" and "xwerû" + "gerguhêz" is "x-gh".
// Template call convertSectionToPos() drops under a newly-chosen POS heading, e.g. "Hoker" -> "{{hoker|ku}}".
// A "Formeke X" (form-of) heading uses the unchanged base pos template. Doubles as the list of template
// calls a conversion may find under the OLD heading and replace, rather than leave stacked beside the new one.
// A section's template call. "Formeke Xê" uses X's own template with form=erê. Biwêj is recognised so a
// conversion can replace its {{biwêj}}, but never written: no new ones.
function posTemplateFor(header) {
var form = /^Formeke (.+)ê$/.exec(header || "");
if (form && startData.posChoices[form[1]] && sections.hasFormHeading(form[1])) {
return { name: form[1], params: ["form=erê"] };
}
var key = util.decapitalize(header || "");
return startData.posChoices[key] ? { name: key, params: [] } : null;
}
// convertSectionToPos() drops whichever of the tag's names is actually present.
var MANE_TAG_REGEX = wt.MANE_TAG_REGEX;
// The six per-sense groups start.js writes as "#: {{tpl|lang|word1|word2}}" sub-lines under a "#" definition.
// Array order controls where a new group line lands relative to existing ones. Every group lives behind the
// quick row's "Hevmane û Bêhtir" dropdown; only the gloss and Nimûne/jêgirtin links sit in the row itself.
var SENSE_GROUPS = startData.senseGroups;
// The column word-list template new sections are written with; the rest of wordlistTemplates are
// spellings the parser also accepts.
var WORDLIST_TEMPLATE = startData.wordlistTemplates[0];
// ---- {{werger-ser}} / {{werger-bin}}: one translation box ----
// The pair brackets the rows; the translation editor gadget writes the rows themselves onto the
// rendered page, so this only ever builds (and reads back) the opening call.
// Parameters, from [[Şablon:werger-ser]]: 1 = the sense shown in the box head, 2 = a note in
// parentheses after it, id = anchor override (defaults to 1), stûn = column count, firehî = column
// width (default 26em), bgcolor, valign (default top), align (default left).
var WERGER_NAMED = ["id", "stûn", "firehî", "bgcolor", "valign", "align"];
function buildWergerBlock(params) {
var parts = ["werger-ser"];
// Positional slots: 2 can only be reached past 1, so an empty 1 still has to be written.
if (params["1"] || params["2"]) {
parts.push(params["1"] || "");
}
if (params["2"]) {
parts.push(params["2"]);
}
WERGER_NAMED.forEach(function (key) {
if (params[key]) {
parts.push(key + "=" + params[key]);
}
});
return "{{" + parts.join("|") + "}}\n{{werger-bin}}";
}
// The opening call of the first block in `text`, as the same {1, 2, id, ...} object. Empty object when
// there is none, so a half-typed draft restores as an empty form rather than throwing.
function parseWergerBlock(text) {
var out = {};
var body = wergerSerBody(String(text || ""));
if (!body) {
return out;
}
var positional = 0;
splitTemplateArgs(body).forEach(function (arg) {
var eq = arg.indexOf("=");
var name = eq === -1 ? "" : $.trim(arg.slice(0, eq));
if (eq !== -1 && WERGER_NAMED.indexOf(name) !== -1) {
out[name] = $.trim(arg.slice(eq + 1));
} else {
out[String(++positional)] = $.trim(arg);
}
});
return out;
}
// Everything after "{{werger-ser|" up to the "}}" that closes it, or "" when there is no call or it
// takes no parameters. Scans for the matching close rather than the first one: a gloss can hold a
// template of its own, and a lazy regex would stop inside it.
function wergerSerBody(text) {
var m = /\{\{\s*werger-ser\s*(?=[|}])/.exec(text);
if (!m) {
return "";
}
var depth = 1;
var start = m.index + m[0].length;
for (var i = start; i < text.length - 1; i++) {
var two = text.substr(i, 2);
if (two === "{{") {
depth++; i++;
} else if (two === "}}") {
depth--; i++;
if (!depth) {
return text.charAt(start) === "|" ? text.slice(start + 1, i - 1) : "";
}
}
}
return "";
}
// Splits on "|" at brace/bracket depth 0, so a value containing a template or a link stays whole.
function splitTemplateArgs(body) {
var args = [];
var depth = 0;
var current = "";
for (var i = 0; i < body.length; i++) {
var two = body.substr(i, 2);
if (two === "{{" || two === "[[") {
depth++; current += two; i++; continue;
}
if (two === "}}" || two === "]]") {
depth--; current += two; i++; continue;
}
if (body[i] === "|" && depth <= 0) {
args.push(current); current = ""; continue;
}
current += body[i];
}
args.push(current);
return args;
}
// Canonical ku.wiktionary "====" subsection order, used only as insertPageSubsection()'s insertion rank
// (see subsectionRankForHeader()). Wider than PAGE_SUBSECTIONS: it also covers subsections the gadget
// cannot create but still has to order around.
var SUBSECTION_ORDER = startData.subsectionOrder;
// ---- searchable <select> ----------------------------------------------------------------------------
// Same widget start.js gets from its util.js wrapNativeSelect(): the native <select> stays as the value
// holder (so .val() and "change" handlers keep working) but is hidden behind a text input that filters an
// overlay list. Ported rather than required() because util.js is a file inside start.js's package module,
// which another gadget cannot reach; the template-row decoration start.js uses is left out.
// util.js's wrapNativeSelect(): the native <select> stays the value holder behind a filtering text input.
// It reads its own placeholder off data-placeholder, and its wiktku-* styles ship in start.css, so both
// gadgets get the identical widget instead of two lookalikes.
function makeSearchable($select, placeholder) {
$select.attr("data-placeholder", placeholder || "Lê bigere…");
return util.wrapNativeSelect($select);
}
// ---- small shared utilities ----
// The readable half of an mw.Api rejection.
var apiErrorMessage = util.apiErrorMessage;
// Thrown from inside an edit() transform to bail out with a specific message.
var SubmitAbort = util.SubmitAbort;
// A gloss is one field on the page: the sense, then {{îzah|…}} explaining it when there is one.
function joinGloss(mane, izah) {
return izah ? $.trim(mane + " {{îzah|" + izah + "}}") : $.trim(mane);
}
// The two halves are linked separately, never joined first: linkify leaves template calls alone by
// design, so anything inside {{îzah|…}} would never be looked at.
//
// A half is skipped when there is nothing in it worth looking up, and -- when onlyUnlinked is set --
// when it already carries a link. Someone who has linked a word by hand has made that half theirs, and
// a save must not go on linking the rest of it behind their back; "Oto-lînk bike" leaves the flag off
// and still links on demand.
function linkifyGlossParts(mane, izah, done, onlyUnlinked) {
function needsLinking(text) {
if (!$.trim(text) || !util.hasLinkableText(text)) {
return false;
}
return !(onlyUnlinked && text.indexOf("[[") !== -1);
}
function step(text, next) {
if (!needsLinking(text)) {
next(text, null);
return;
}
util.linkifyText(text, function (linked, error) {
// An empty answer would wipe what the user typed, so only real text is taken.
next(typeof linked === "string" && $.trim(linked) ? $.trim(linked) : text, error || null);
});
}
step(mane, function (linkedMane, maneError) {
step(izah, function (linkedIzah, izahError) {
done(linkedMane, linkedIzah, maneError || izahError);
});
});
}
// Runs transformFn(content) inside mw.Api().edit()'s own transform callback so one fetch covers both the
// edit-conflict check and the content, preventing a stale overwrite of someone else's edit.
//
// No badtoken retry here on purpose: edit() posts through postWithEditToken -> postWithToken, which
// already throws the cached token away and repeats the request once when the wiki says "badtoken".
// A second retry of our own would only double it.
function editPage(summary, transformFn, onSuccess, onError) {
api.edit(mw.config.get("wgPageName"), function (revision) {
return { text: transformFn(revision.content), summary: summary };
}).then(onSuccess, function (codeOrAbort, result) {
if (codeOrAbort instanceof SubmitAbort) {
onError(codeOrAbort.message);
} else {
onError(util.msg.saveFailed + apiErrorMessage(codeOrAbort, result));
}
});
}
// ---- rendered preview: wikitext through the parse API, so a preview shows what the templates
// actually produce rather than a plain list standing in for them ----
// Same text is usually asked for twice (open the preview, close it, open it again), so the promise is
// kept rather than the call repeated.
var renderCache = {};
/**
* Renders wikitext as this page would render it. Resolves with an HTML string.
*
* pst: 1 applies pre-save transform, so ~~~~ and subst: behave as they will once saved. The
* modulestyles/modules the parse reports are loaded before resolving: without them TemplateStyles is
* missing and the preview would show the right markup in the wrong clothes.
*/
function renderWikitext(wikitext) {
if (renderCache[wikitext]) {
return renderCache[wikitext];
}
renderCache[wikitext] = api.post({
action: "parse",
format: "json",
formatversion: 2,
title: mw.config.get("wgPageName"),
text: wikitext,
contentmodel: "wikitext",
prop: "text|modules|jsconfigvars",
pst: 1,
disablelimitreport: 1,
disableeditsection: 1,
disabletoc: 1
}).then(function (data) {
var parsed = (data && data.parse) || {};
if (parsed.modulestyles && parsed.modulestyles.length) {
mw.loader.load(parsed.modulestyles);
}
if (parsed.modules && parsed.modules.length) {
mw.loader.load(parsed.modules);
}
return parsed.text || "";
}, function () {
// A failed render must not be remembered, or the next attempt gets the rejection back.
delete renderCache[wikitext];
return $.Deferred().reject().promise();
});
return renderCache[wikitext];
}
/**
* Puts rendered wikitext into $target, replacing whatever placeholder is there.
*
* The site's own gadgets are told about it through the "wikipage.content" hook, the same way
* MediaWiki announces real content, so collapsible lists and the like behave in the preview too.
*/
// MediaWiki warns when the hook is fired on content that is not in the document, and a gadget that
// listens to it can do nothing useful with nodes nobody can see.
function announceContent($el) {
if ($el.closest("html").length) {
mw.hook("wikipage.content").fire($el);
}
}
function fillWithRendered($target, wikitext, onFail) {
return renderWikitext(wikitext).then(function (html) {
if (!$target.closest("body").length) {
return; // the preview was dropped while the parse was in flight
}
$target.empty().append($("<div class='mw-parser-output'></div>").html(html));
announceContent($target);
}, function () {
if (onFail) onFail();
});
}
/**
* Puts a rendered sense in place of the one on the page, keeping this gadget's own furniture (the
* pencil's toolbar, the quick row, any open panel) where it is. The page's own nodes are detached
* rather than dropped, so the returned function can put them straight back when the change is
* cancelled or superseded.
*
* Nothing labels the result: the change is shown by the sense simply reading the way it will read,
* and the queue box is what says nothing is saved yet.
*/
function replaceSenseInPlace($li, item) {
var html = item.html;
var $anchor = $li.children(".dsb-toolbar").last();
// class/id/data-* off the parsed <li>, so a queued maneid shows its pill here exactly as it will
// once saved. The old values are kept for the restore below.
var node = $li.get(0);
var before = {};
$.each(node.attributes, function (_, attr) {
before[attr.name] = attr.value;
});
$.each(item.attrs, function (name, value) {
if (name !== "class") {
$li.attr(name, value);
}
});
var addedClasses = (item.attrs["class"] || "").split(/\s+/).filter(function (c) {
return c && !$li.hasClass(c);
});
$li.addClass(addedClasses.join(" "));
// add-examples hangs its own <ul> off the sense and opens its form as that <ul>'s next sibling.
// Detaching those leaves the form to open into a tree nobody can see -- "+ Nimune/jegirtin" takes
// the click and shows nothing -- so they stay where they are. Only the rows already in that <ul>
// are hidden, since the preview draws the examples itself; the tool's own title line stays.
var $keep = $li.children("ul, .add-example-form");
var $hiddenRows = $keep.filter("ul").children("li").filter(function () {
return !$(this).find(".add-example-form-title").length;
});
$hiddenRows.addClass("dsb-preview-hidden");
var originals = $li.contents().filter(function () {
return !$(this).is(".dsb-toolbar, .dsb-quick-row, .dsb-subsection-panel, .dsb-preview-block, .dsb-sense-preview");
}).not($keep).get();
// Where the sense's own nodes sat, so cancelling puts them back there rather than above the quick
// row -- the row belongs between the sense and its examples.
var backAfter = originals.length ? originals[0].previousSibling : null;
var $rendered = $("<span class='dsb-sense-preview'></span>").html(html);
if ($anchor.length) {
$anchor.after($rendered);
} else {
$li.prepend($rendered);
}
$(originals).detach();
announceContent($rendered);
// The id pill is drawn by the same code a page load uses, so a queued maneid looks like a saved
// one rather than like something this gadget invented.
if (window.wikt && wikt.showIDs && wikt.showIDs.process) {
wikt.showIDs.process($li);
}
// dsb.js puts the example pencils back on the redrawn examples. The originals keep theirs.
$li.triggerHandler("dsbSenseRedrawn");
return function () {
$hiddenRows.removeClass("dsb-preview-hidden");
$li.removeClass(addedClasses.join(" "));
$.each(item.attrs, function (name) {
if (name === "class") {
return;
}
if (Object.prototype.hasOwnProperty.call(before, name)) {
$li.attr(name, before[name]);
} else {
$li.removeAttr(name);
}
});
$li.children(".senseid-displayed, .etymid-displayed, .etymonid-displayed").remove();
if (backAfter && backAfter.parentNode === node) {
$(backAfter).after(originals);
} else if ($anchor.length) {
$anchor.after(originals);
} else {
$li.prepend(originals);
}
$rendered.remove();
};
}
/**
* The <li> out of a parsed "#" block, and the attributes it carries.
*
* The parse wraps it in its own <ol>, which must not reach the page: the sense already has a number
* from the list it lives in. A leading {{maneid}} also makes the parser emit an empty
* "li.mw-empty-elt" ahead of the real one, so the first <li> is not necessarily the sense.
*
* The attributes matter as much as the content: {{maneid|ku|x}} renders as class="senseid"
* data-id="x" on the <li> itself, which is what wikt.showids draws its pill from.
*/
function parsedSenseItem(html, depth) {
var $item = $("<div></div>").html(html).find("ol > li").filter(function () {
return !$(this).hasClass("mw-empty-elt");
}).first();
// A sub-sense parsed on its own comes back one <ol> deeper per "#": "##" is a list inside a list.
// Descend as far as the sense's own depth, or its number would be drawn inside a second list --
// "2." with a "1." under it.
for (var level = 1; level < (depth || 1) && $item.length; level++) {
var $inner = $item.children("ol").children("li").filter(function () {
return !$(this).hasClass("mw-empty-elt");
}).first();
if (!$inner.length) {
break;
}
$item = $inner;
}
if (!$item.length) {
return { html: html, attrs: {} };
}
var attrs = {};
$.each($item.get(0).attributes, function (_, attr) {
attrs[attr.name] = attr.value;
});
return { html: $item.html(), attrs: attrs };
}
// This gadget's own save queue + floating widget, separate from the shared Gadget-Editor queue.
// Each entry keeps its own transformFn so saveQueueNow() can re-run all of them against one fresh fetch.
var dsbQueue = {
// [{key, summary, transformFn, runLast, removePreview}]; transformFn: baseContent -> {content, warnings}.
// removePreview lives on the entry so replacing one entry takes its own live DOM preview with it.
entries: []
};
var $queueBox = null;
function dropPreview(entry) {
if (typeof entry.removePreview === "function") {
try {
entry.removePreview();
} catch (e) { /* a preview failing to clean up should never block the queue itself */ }
entry.removePreview = null;
}
}
function clearAllPreviews() {
dsbQueue.entries.forEach(dropPreview);
}
function clearQueue() {
clearAllPreviews();
dsbQueue.entries = [];
if ($queueBox) {
$queueBox.$list.empty();
$queueBox.$box.hide();
}
}
// Closes every editor UI on the page. Each open box's own "x" clears its getter, restores its picker
// link and updates the counter, so those are triggered rather than repeating that work here; hiding a
// row alone would leave its fields populated and the next pencil click would reopen them half-filled.
function closeAllPanels() {
$(".dsb-open-boxes .dsb-box-remove").trigger("click");
$(".dsb-quick-note").hide().text("");
$(".dsb-more-menu").hide();
$(".dsb-subsection-panel, .dsb-convert-pos-panel").hide();
// dsb.js owns each pencil's pinned state; tell it rather than hiding behind its back, or the next
// click on the pencil would only toggle "pinned" off and appear to do nothing.
$(".dsb-quick-row").trigger("dsbCancel");
}
function ensureQueueBox() {
if ($queueBox) {
return $queueBox;
}
var $box = $("<div class='dsb-queue-box'></div>").hide();
var $close = $("<a href='#' class='dsb-queue-close' title='Veşêre'>×</a>");
var $title = $("<div class='dsb-queue-title'></div>").text("Guhartinên li benda qeydkirinê");
var $list = $("<ul class='dsb-queue-list'></ul>");
var $empty = $("<div class='dsb-queue-empty'></div>").text(
"Guhartinên te dê li vir werin rêzkirin. Heta ku tu pêl «Guhartinan qeyd bike» nekî, "
+ "tiştek li ser rûpelê nayê weşandin."
);
var $status = $("<div class='dsb-queue-status'></div>");
var $save = $("<button type='button' class='dsb-queue-save'>Guhartinan qeyd bike</button>");
var $cancel = $("<button type='button' class='dsb-queue-cancel'></button>").text(util.msg.cancel);
var $actions = $("<div class='dsb-queue-actions'></div>").append($save, $cancel);
$close.on("click", function (e) {
e.preventDefault();
$box.hide();
});
$cancel.on("click", function () {
clearQueue();
closeAllPanels();
});
$save.on("click", function () {
saveQueueNow();
});
$box.append($close, $title, $empty, $list, $actions, $status);
$(document.body).append($box);
$queueBox = { $box: $box, $list: $list, $empty: $empty, $status: $status, $save: $save, $cancel: $cancel };
return $queueBox;
}
// Takes one change out of the queue and puts the page back as it was before it, its in-place preview
// included. The queue is the only record of what "Guhartinan qeyd bike" will write, so every line in it
// has to be removable on its own -- closing the panel that made a change does not unmake it.
// Each preview draws the page the whole queue would save, so one entry leaving changes what all the
// others should show. They are taken down and drawn again from what is left.
function redrawPreviews() {
dsbQueue.entries.forEach(function (entry) {
if (typeof entry.previewFn !== "function") {
return;
}
dropPreview(entry);
try {
var removePreview = entry.previewFn();
if (typeof removePreview === "function") {
entry.removePreview = removePreview;
}
} catch (e) { /* a broken preview never stops the queue */ }
});
}
function dropQueueEntry(entry) {
var at = dsbQueue.entries.indexOf(entry);
if (at === -1) {
return;
}
dropPreview(entry);
dsbQueue.entries.splice(at, 1);
redrawPreviews();
renderQueueBox();
hideQueueIfIdle();
}
function renderQueueBox() {
var box = ensureQueueBox();
box.$list.empty();
dsbQueue.entries.forEach(function (entry) {
var $drop = $("<button type='button' class='dsb-queue-drop'>×</button>")
.attr("title", "Vê guhartinê ji rêzê derxe");
$drop.on("click", function () {
dropQueueEntry(entry);
});
box.$list.append($("<li></li>").text(entry.summary).append($drop));
});
box.$empty.toggle(!dsbQueue.entries.length);
box.$status.removeClass("dsb-status-ok dsb-status-error").text("");
box.$save.prop("disabled", !dsbQueue.entries.length);
box.$box.show();
}
// Shown the moment a panel opens, empty, so it is clear before anything is typed that a change waits
// for "Guhartinan qeyd bike" rather than publishing itself.
function openQueueBox() {
renderQueueBox();
}
// Nothing queued and no form left open means nothing to save, so the box goes away rather than
// lingering on an empty state.
function hideQueueIfIdle() {
if (dsbQueue.entries.length || !$queueBox) {
return;
}
if ($(".dsb-quick-row:visible, .dsb-subsection-panel:visible, .dsb-convert-pos-panel:visible").length) {
return;
}
$queueBox.$box.hide();
}
// Asks core's postEdit module to show its toast on the next load (dsb.js loads it there), then reloads.
// Loaded here rather than declared as a dependency, so a reload happens even if it fails.
function reloadWithPostEditNotice() {
mw.loader.using("mediawiki.action.view.postEdit").then(function (require) {
require("mediawiki.action.view.postEdit").fireHookOnPageReload("saved");
}).always(function () {
location.reload();
});
}
// A transform returns either the new page text or {content, warnings}; both shapes are accepted.
// One that returns neither stops the save, named, rather than writing a broken page.
function transformedContent(entry, pageContent) {
var result = entry.transformFn(pageContent);
var next = typeof result === "string" ? result : (result && result.content);
if (typeof next !== "string") {
throw new SubmitAbort("Guhartin nehate sepandin: " + entry.summary);
}
return next;
}
// Queue order, except that runLast entries move to the end: converting "=== Mane ===" into a real POS
// heading renames the very heading every other queued change locates itself by.
// Those run from the bottom of the page up: a rename changes the ordinals of the sections after it
// ("Mane 2" becomes "Mane 1"), never of the ones before.
function orderedEntries() {
var normal = [];
var last = [];
dsbQueue.entries.forEach(function (entry) {
(entry.runLast ? last : normal).push(entry);
});
last.sort(function (a, b) {
return b.pagePosition - a.pagePosition;
});
return normal.concat(last);
}
/**
* The pending page as previews and example lookups need it: every queued transform, in save order,
* except the runLast section renames. Those callers find their section under the heading it has on
* the page now, which a queued "Mane" -> "Navdêr" would take away, and a rename leaves the senses as
* they are. An entry that cannot apply is skipped -- the save reports that properly, and a preview
* must not shout.
*/
function queuedContent(pageContent) {
var content = pageContent;
orderedEntries().filter(function (entry) {
return !entry.runLast;
}).forEach(function (entry) {
try {
content = transformedContent(entry, content);
} catch (e) {
// Left out of the preview; the save reports it properly. Named, so a change that fails to
// draw is distinguishable from one with nothing to draw.
mw.log.warn("wikt.dsb: pêşdîtin bêyî vê guhartinê hate xêzkirin — " + entry.summary, e);
}
});
return content;
}
/**
* Redraws one sense where it sits, from the page the queue would save -- so a queued gloss edit, a
* queued example and everything else pending on that sense are shown together, rendered by the parser
* rather than described in a box. Returns the queue's own "take the preview down" function.
*
* One preview per sense: a second queued change takes the first drawing down and draws the queue.
*/
function previewSense($li, language, sectionType, sectionOrdinal, definitionLevel) {
var cancelled = false;
var restore = null;
function undo() {
cancelled = true;
if (restore) {
restore();
restore = null;
}
if ($li.data("dsbPreview") === undo) {
$li.removeData("dsbPreview");
}
}
var previous = $li.data("dsbPreview");
if (typeof previous === "function") {
previous();
}
$li.data("dsbPreview", undo);
fetchPageContent().then(function (pageContent) {
if (cancelled) {
return;
}
var wikitext;
try {
wikitext = senseBlockWikitext(queuedContent(pageContent), language, sectionType,
sectionOrdinal, definitionLevel);
} catch (e) {
return;
}
renderWikitext(wikitext).then(function (html) {
if (cancelled || $li.data("dsbPreview") !== undo || !$li.closest("body").length) {
return;
}
restore = replaceSenseInPlace($li, parsedSenseItem(html, definitionLevel.length - 1));
});
});
return undo;
}
// The real save: re-runs every queued transformFn, in order, against one freshly-fetched revision and
// posts the result as a single edit with a combined summary.
function saveQueueNow() {
if (!dsbQueue.entries.length) {
return;
}
var box = ensureQueueBox();
box.$save.prop("disabled", true);
box.$cancel.prop("disabled", true);
box.$status.removeClass("dsb-status-ok dsb-status-error").text("Tê qeydkirin…");
var entries = orderedEntries();
// Grouped by place, in the order the places were first queued: several changes to one section read
// as "Kurmancî/Navdêr 2: a, b, c" rather than repeating the section name in front of each of them.
var order = [];
var byPlace = {};
entries.forEach(function (entry) {
if (!Object.prototype.hasOwnProperty.call(byPlace, entry.place)) {
byPlace[entry.place] = [];
order.push(entry.place);
}
byPlace[entry.place].push(entry.action);
});
var combinedSummary = order.map(function (place) {
var actions = byPlace[place].join(", ");
return place ? place + ": " + actions : actions;
}).join("; ") + " (DefSideBoxes)";
editPage(
combinedSummary,
function (pageContent) {
var content = pageContent;
entries.forEach(function (entry) {
content = transformedContent(entry, content);
});
return content;
},
function (data) {
forgetPageContent();
clearAllPreviews();
dsbQueue.entries = [];
box.$list.empty();
box.$status
.removeClass("dsb-status-error")
.addClass("dsb-status-ok")
.text("✓ Hemû guhartin hatin qeydkirin.");
box.$save.prop("disabled", true);
box.$cancel.prop("disabled", false);
// A real edit reloads the page and gets MediaWiki's own "Guhartina te hat weşandin." toast, the
// one a normal save shows. A null edit changed nothing, so the page stays as it is.
if (data && data.newrevid) {
reloadWithPostEditNotice();
}
},
function (message) {
box.$save.prop("disabled", false);
box.$cancel.prop("disabled", false);
box.$status.removeClass("dsb-status-ok").addClass("dsb-status-error").text(message);
}
);
}
// "Kurmancî/Navdêr" -- where a queued change lands, for its summary. The language name comes from the
// shipped list; an unknown code is left as the code itself.
// "Kurmancî/Navdêr", or "Kurmancî/Navdêr 2" where the language has more than one section of that
// type. Without the number a summary on a page with two Navdêr sections named neither of them.
// Numbered only when it disambiguates: on the usual page "Navdêr 1" would just be noise.
function placeLabel(language, sectionType, $h3) {
return langLabel(language) + "/" + sectionLabel(sectionType, $h3);
}
// Bilêvkirin sits above the parts of speech and belongs to the whole language, so naming the section
// it was opened from would say something untrue about what the edit touches.
function subsectionPlaceLabel(subsection, language, sectionType, $h3) {
if (subsection && subsection.free) {
return langLabel(language) + "/" + subsection.header;
}
return subsection && subsection.place === "pron"
? langLabel(language)
: placeLabel(language, sectionType, $h3);
}
function sectionLabel(sectionType, $h3) {
if ($h3 && $h3.length && sections.sectionTypeCountWithinLanguage($h3) > 1) {
return sectionType + " " + sections.sectionOrdinalWithinLanguage($h3);
}
return sectionType;
}
// Capitalised because it opens the summary; Kurdish otherwise writes language names lower-case.
function langLabel(language) {
var names = langs.names();
return util.capitalize(names[language] || language);
}
// The parts of a sense the form actually changed, so the summary lists them instead of saying nothing.
function senseChangeLabels(changes) {
var parts = [];
var changed = changes.changed || {};
if (changes.gloss) {
parts.push("mane");
}
if (changes.newSense) {
parts.push("maneyeke nû");
}
SENSE_GROUPS.forEach(function (group) {
if (changed["word:" + group.key]) {
parts.push(group.label.toLowerCase());
}
});
if (changed.maneid) {
parts.push("id");
}
if (changed.etiket) {
parts.push("etîket");
}
if (changed.kategori) {
parts.push("kategorî");
}
return parts;
}
// Queues transformFn(baseWikitext) -> {content, warnings} for the real save to run later against fresh
// content (see saveQueueNow()); nothing here touches the page yet. Also runs previewFn(), which drops a
// small "not saved yet" preview into the live DOM at the change's own spot on the page. Shared by every
// panel that queues a wikitext change: buildAdvancedPanel, buildSubsectionPanel, buildConvertPosPanel.
// place is what the change is being made to ("Kurmancî/Navdêr 2"), action is what is being done to it.
// Kept apart rather than pre-joined so saveQueueNow() can name a section once and list everything
// queued against it after it, instead of repeating the place before every item.
function queueChange(place, action, transformFn, $save, $status, previewFn, opts) {
opts = opts || {};
var entry = {
key: opts.key || null,
place: place || "",
action: action,
summary: place ? place + ": " + action : action,
transformFn: transformFn,
runLast: !!opts.runLast,
pagePosition: opts.pagePosition || 0,
// Kept, not just run: redrawPreviews() calls it again when another entry leaves the queue.
previewFn: typeof previewFn === "function" ? previewFn : null,
removePreview: null
};
// Queuing the same target twice replaces the pending change rather than stacking a second one --
// two "+Têkildar" entries would both run, and the second would abort on "Ev beş jixwe heye".
var superseded = false;
if (entry.key) {
for (var i = dsbQueue.entries.length - 1; i >= 0; i--) {
if (dsbQueue.entries[i].key === entry.key) {
dropPreview(dsbQueue.entries[i]);
dsbQueue.entries.splice(i, 1);
superseded = true;
}
}
}
dsbQueue.entries.push(entry);
$status.removeClass("dsb-status-error").addClass("dsb-status-ok").text(
"✓ li rêza guhartinan hate zêdekirin — pêl «Guhartinan qeyd bike» bike da ku bi cih bibe."
);
$save.prop("disabled", false);
if (previewFn) {
try {
var removePreview = previewFn();
if (typeof removePreview === "function") {
entry.removePreview = removePreview;
}
} catch (e) { /* a broken preview should never stop the change from being queued */ }
}
// What the superseded entry drew is gone from the queue, so whatever else is drawn from it is stale.
if (superseded) {
dsbQueue.entries.forEach(function (other) {
if (other !== entry) {
dropPreview(other);
}
});
redrawPreviews();
}
renderQueueBox();
}
// Runs text through the ext.gadget.linkify gadget ($.kuLinkify) and calls back with the linkified result.
// Passes the text through unchanged if the gadget can't be loaded, so it never blocks a save.
var linkifyText = util.linkifyText;
// ---- wikitext location ----
//
// One copy for both editing gadgets, in wikt.edit: add-examples writes into the same places.
var langSectionRange = wt.langSectionRange;
var locateSection = wt.locateSection;
var findDefinitionLine = wt.findDefinitionLine;
/**
* The wikitext of one sense's own block: its "#" line plus everything nested under it -- the "#:" word
* lines, the "#*" citations and any sub-senses -- stopping at the next line of the same depth that
* starts a new sense. Parsed on its own that block renders as exactly the <li> the page shows.
*/
function senseBlockWikitext(pageContent, language, sectionType, sectionOrdinal, definitionLevel) {
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel);
var depth = definitionLevel.length - 1;
var out = [lines[defLine]];
for (var i = defLine + 1; i < lines.length; i++) {
var m = /^(#+)([:*]?)/.exec(lines[i]);
if (!m || m[1].length < depth) {
break;
}
// Same depth and no ":" or "*" after the hashes is the next sense, not part of this one.
if (m[1].length === depth && !m[2]) {
break;
}
out.push(lines[i]);
}
return out.join("\n");
}
// Inserts or extends a "#: {{tplKey|lang|word1|word2}}" sub-line for one sense (start.js's wordLine()
// format). If a line for this tplKey already exists under the definition, missing words are appended to
// it; otherwise a new line lands after the last existing group line, always before any "#*" citation lines.
function insertSenseWords(pageContent, language, sectionType, sectionOrdinal, definitionLevel, tplKey, words, opts) {
opts = opts || {};
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel);
var marker = new Array(definitionLevel.length).join("#"); // definitionLevel.length - 1 "#" characters
// Group 1 is the spelling the page uses, group 2 the parameters: an existing {{hevwate}} stays
// {{hevwate}} rather than being silently renamed to {{hevmane}}.
var tplLineRegex = new RegExp("^" + marker + ":\\s*\\{\\{\\s*(" + aliasPattern(tplKey) + ")\\s*\\|([^}]*)\\}\\}\\s*$");
var groupKeysPattern = SENSE_GROUPS.map(function (g) { return aliasPattern(g.key); }).join("|");
var groupLineRegex = new RegExp("^" + marker + ":\\s*\\{\\{\\s*(" + groupKeysPattern + ")\\s*\\|");
var anyBlockLineRegex = new RegExp("^" + marker + "[:*]");
var lastGroupLine = -1;
for (var i = defLine + 1; i < lines.length; i++) {
if (!anyBlockLineRegex.test(lines[i])) {
break;
}
var tplMatch = tplLineRegex.exec(lines[i]);
if (tplMatch) {
var foundKey = tplMatch[1];
if (opts.replace) {
// Editing an existing list: an empty result means the user cleared it, so drop the line.
if (words.length) {
lines[i] = marker + ": {{" + foundKey + "|" + language + "|" + words.join("|") + "}}";
} else {
lines.splice(i, 1);
}
return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n");
}
var params = tplMatch[2].split("|"); // [lang, word1, word2, ...]
var existingWords = params.slice(1);
words.forEach(function (w) {
if (existingWords.indexOf(w) === -1) {
existingWords.push(w);
}
});
lines[i] = marker + ": {{" + foundKey + "|" + language + "|" + existingWords.join("|") + "}}";
return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n");
}
if (groupLineRegex.test(lines[i])) {
lastGroupLine = i;
}
}
var insertAt = lastGroupLine >= 0 ? lastGroupLine + 1 : defLine + 1;
lines.splice(insertAt, 0, marker + ": {{" + tplKey + "|" + language + "|" + words.join("|") + "}}");
return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n");
}
// Canonical left-to-right order of the small templates that can prefix a definition line's gloss text:
// maneid, then kategori (K), then etîket (e).
var LEADING_TPL_ORDER = startData.leadingTplOrder;
// True for a leading call the advanced panel edits in a box of its own -- those are kept out of the
// gloss box so the same template is never editable in two places at once. Redirect spellings count:
// {{f}} and {{etîket}} are {{e}}.
function hasOwnFieldBox(key) {
return LEADING_TPL_ORDER.indexOf(canonicalTemplateKey(key)) !== -1;
}
// Inserts, extends, or (with opts.replace) overwrites one of the small templates that prefix a definition
// line's gloss text -- {{maneid|lang|id}}, {{K|lang|kat1|...}} or {{e|lang|etîket1|...}}. Under
// opts.replace an empty values list removes the call rather than writing an empty one.
function insertLeadingSenseTpl(pageContent, language, sectionType, sectionOrdinal, definitionLevel, tplKey, values, opts) {
opts = opts || {};
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel);
var marker = /^#+/.exec(lines[defLine])[0];
var afterMarker = lines[defLine].slice(marker.length).replace(/^\s+/, "");
// Collecting the whole leading-call run means an existing tplKey call is found and merged wherever it
// already sits, not just when it happens to be first.
var split = splitLeadingCalls(afterMarker);
var calls = split.calls;
var rest = split.rest;
var existing = null;
calls.forEach(function (c) {
if (canonicalTemplateKey(c.key) === tplKey) {
existing = c;
}
});
if (existing) {
if (opts.replace) {
// Editing an existing call: an empty result means the user cleared it, so drop the call.
if (values.length) {
existing.params = [language].concat(values);
} else {
calls = calls.filter(function (c) { return c !== existing; });
}
} else {
var existingVals = existing.params.slice(1);
values.forEach(function (v) {
if (existingVals.indexOf(v) === -1) {
existingVals.push(v);
}
});
existing.params = [language].concat(existingVals);
}
} else if (!values.length) {
return pageContent; // nothing to add, and nothing there to clear
} else {
// Not present yet -- insert right before the first existing call that outranks tplKey in
// LEADING_TPL_ORDER (an unrecognized call always outranks everything), or at the end of the run.
var myRank = LEADING_TPL_ORDER.indexOf(tplKey);
var insertAt = calls.length;
for (var i = 0; i < calls.length; i++) {
var otherRank = LEADING_TPL_ORDER.indexOf(canonicalTemplateKey(calls[i].key));
if (otherRank === -1 || otherRank > myRank) {
insertAt = i;
break;
}
}
calls.splice(insertAt, 0, { key: tplKey, params: [language].concat(values) });
}
var rebuilt = calls.map(function (c) {
return "{{" + c.key + "|" + c.params.join("|") + "}}";
}).join(" ");
lines[defLine] = marker + " " + (rebuilt ? rebuilt + " " : "") + rest;
return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n");
}
// Replaces just the gloss text of a definition line, leaving any leading template calls untouched --
// the save half of "Maneyê biguhêre" (edit sense).
function updateSenseGloss(pageContent, language, sectionType, sectionOrdinal, definitionLevel, newGloss) {
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel);
var marker = /^#+/.exec(lines[defLine])[0];
var afterMarker = lines[defLine].slice(marker.length).replace(/^\s+/, "");
// The box holds everything except the calls with their own field, so those are put back in front.
// Dropping "{{mane?}}" here is what clears start.js's placeholder once a real gloss is written.
var kept = splitLeadingCalls(afterMarker).calls.filter(function (c) {
return hasOwnFieldBox(c.key);
});
var leadingText = kept.map(function (c) {
return "{{" + c.key + "|" + c.params.join("|") + "}}";
}).join(" ");
lines[defLine] = marker + " " + (leadingText ? leadingText + " " : "") + newGloss;
return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n");
}
// Deletes one sense: its definition line plus everything indented under it (its "#:" groups, "#*"
// citations, any sub-senses). Refuses to empty a section, since a POS heading with no senses is worse
// than the sense the user wanted gone.
// A new sense goes directly below the one whose pencil asked for it -- after the lines that sense owns
// (its "#:" examples, "#*" citations and "##" sub-senses), so it reads as the next sense rather than
// landing at the foot of the section. It takes the same marker depth as its neighbour, so asking from
// a "##" sub-sense adds a sibling sub-sense.
function insertNewSense(pageContent, language, sectionType, sectionOrdinal, definitionLevel, text) {
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel);
var marker = /^#+/.exec(lines[defLine])[0];
var end = defLine + 1;
var ownedRegex = new RegExp("^" + marker + "[#:*]");
while (end < lines.length && ownedRegex.test(lines[end])) {
end++;
}
lines.splice(end, 0, marker + " " + text);
return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n");
}
function removeSense(pageContent, language, sectionType, sectionOrdinal, definitionLevel) {
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel);
var marker = /^#+/.exec(lines[defLine])[0];
var end = defLine + 1;
var ownedRegex = new RegExp("^" + marker + "[#:*]");
while (end < lines.length && ownedRegex.test(lines[end])) {
end++;
}
// Top-level senses of this section only -- "##" sub-senses go with their parent either way.
if (definitionLevel.length === 2) {
var siblings = 0;
for (var i = loc.posLineIndex + 1; i < lines.length && !/^==/.test(lines[i]); i++) {
if (/^#[^*#:]/.test(lines[i])) {
siblings++;
}
}
if (siblings < 2) {
throw new SubmitAbort("Ev maneya dawî ya vê beşê ye. Ji bo rakirinê divê tu tevahiya beşê rakî.");
}
}
lines.splice(defLine, end - defLine);
return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n");
}
// Fetches the page's current wikitext and pulls out just this sense's gloss text to prefill the "Maneyê
// biguhêre" form. A plain read, not part of the hardened save path -- the actual save still re-fetches
// fresh content, so only the prefilled text itself could be a little stale.
// Current contents of one existing subsection, for prefilling the edit form.
// This page's current wikitext.
// One fetch for the whole queue: every preview reads the same revision, and asking per preview meant
// downloading the page again for each queued change. Dropped after a save, when the page has moved on.
var pageContentPromise = null;
function forgetPageContent() {
pageContentPromise = null;
}
function fetchPageContent() {
if (pageContentPromise) {
return pageContentPromise;
}
pageContentPromise = rawPageContent();
// A failed read must not be remembered as the answer.
pageContentPromise.fail(forgetPageContent);
return pageContentPromise;
}
function rawPageContent() {
return api.get({
action: "query",
prop: "revisions",
rvprop: "content",
titles: mw.config.get("wgPageName"),
formatversion: 2
}).then(function (data) {
var page = data.query && data.query.pages && data.query.pages[0];
var content = page && !page.missing && page.revisions && page.revisions[0] && page.revisions[0].content;
if (!content) {
throw new SubmitAbort("Nikare muhtewaya rûpelê bixwîne.");
}
return content;
});
}
function fetchPageSubsection(language, sectionType, sectionOrdinal, subsection) {
return fetchPageContent().then(function (content) {
return readPageSubsection(content, language, sectionType, sectionOrdinal, subsection);
});
}
function fetchSenseFields(language, sectionType, sectionOrdinal, definitionLevel) {
return fetchPageContent().then(function (content) {
return readSenseFields(content, language, sectionType, sectionOrdinal, definitionLevel);
});
}
// Everything the advanced panel can edit about one sense, read off its definition line and the "#:" lines
// under it: the raw gloss (templates included), the leading maneid/K/e values, and each word-list group.
function readSenseFields(pageContent, language, sectionType, sectionOrdinal, definitionLevel) {
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel);
var defMarker = /^#+/.exec(lines[defLine])[0];
var afterMarker = lines[defLine].slice(defMarker.length).replace(/^\s+/, "");
var leading = {};
splitLeadingCalls(afterMarker).calls.forEach(function (c) {
leading[canonicalTemplateKey(c.key)] = c.params.slice(1);
});
// Only start.js's "{{mane?|lang}}" placeholder is hidden; every other template stays visible so it can
// be edited by hand in the gloss box.
// The gloss box shows the line minus the calls that have their own box ({{maneid}}, {{K}}, {{e}} and
// their redirects) and minus start.js's "{{mane?}}" placeholder. Everything else -- a {{g}} link, a
// {{guharto}} -- stays visible and editable there.
var split = splitLeadingCalls(afterMarker);
var glossCalls = split.calls.filter(function (c) {
return !hasOwnFieldBox(c.key) && canonicalTemplateKey(c.key) !== "mane?";
});
var glossLead = glossCalls.map(function (c) {
return "{{" + c.key + "|" + c.params.join("|") + "}}";
}).join(" ");
var gloss = $.trim((glossLead ? glossLead + " " : "") + split.rest);
var marker = new Array(definitionLevel.length).join("#");
var groupKeysPattern = SENSE_GROUPS.map(function (g) { return aliasPattern(g.key); }).join("|");
var groupLineRegex = new RegExp("^" + marker + ":\\s*\\{\\{\\s*(" + groupKeysPattern + ")\\s*\\|([^}]*)\\}\\}\\s*$");
var anyBlockLineRegex = new RegExp("^" + marker + "[:*]");
var words = {};
for (var i = defLine + 1; i < lines.length; i++) {
if (!anyBlockLineRegex.test(lines[i])) {
break;
}
var m = groupLineRegex.exec(lines[i]);
if (m) {
words[canonicalTemplateKey(m[1])] = m[2].split("|").slice(1);
}
}
return {
gloss: gloss,
maneid: leading.maneid ? leading.maneid[0] : "",
etiket: leading.e || [],
kategori: leading.K || [],
words: words
};
}
// Finds a POS block's body range (up to, but not including, the next heading of level <= 3), and the
// header text + line index of any "====" subsections it already contains.
// depth is the part-of-speech heading's own ("===" on most entries, "====" where the senses are
// grouped under numbered etymologies). Its block runs to the next heading at that depth or shallower,
// and its subsections are the headings one deeper.
function posBlockBounds(lines, posLineIndex, depth) {
depth = depth || 3;
var blockEnd = wt.headingAtOrAbove(depth);
var subsectionHeading = wt.headingAtDepth(depth + 1);
var end = lines.length;
var existingHeaders = [];
for (var i = posLineIndex + 1; i < lines.length; i++) {
if (blockEnd.test(lines[i])) {
end = i;
break;
}
var sub = subsectionHeading.exec(lines[i]);
if (sub) {
existingHeaders.push({ header: $.trim(sub[1]), lineIndex: i });
}
}
return { end: end, existingHeaders: existingHeaders, depth: depth };
}
// Looks up a header's rank in SUBSECTION_ORDER. -1 for a header that isn't one of ours; such a header is
// never used as an insertion anchor.
function subsectionRankForHeader(header) {
return SUBSECTION_ORDER.indexOf(header);
}
// Body line range of one "====" subsection inside a POS block: everything after its heading up to the next
// "====" heading, or the end of the block. Null if the block has no such subsection.
function subsectionBodyRange(bounds, header) {
var headers = bounds.existingHeaders;
for (var i = 0; i < headers.length; i++) {
if (headers[i].header === header) {
return {
start: headers[i].lineIndex + 1,
end: i + 1 < headers.length ? headers[i + 1].lineIndex : bounds.end
};
}
}
return null;
}
// ---- template-parameter editing -------------------------------------------------------------------
// A gloss that is nothing but one template call gets a labelled box per parameter instead of a raw
// wikitext line, the way VisualEditor's template dialog works.
// The single template call a gloss is made of, or null when the line is anything less tidy. {{g|...}} is a
// link inside the gloss rather than the gloss itself, so it neither disqualifies the line nor gets a form.
function glossTemplateTarget(gloss) {
var parsed = parseTemplateCalls(gloss || "");
if (parsed.otherContent) {
return null;
}
var editable = parsed.calls.filter(function (c) {
return canonicalTemplateKey(c.name) !== "g";
});
return editable.length === 1 ? editable[0] : null;
}
// ---- the three places that carry no "====" heading of their own ----------------------------------
// Bilêvkirin is a "===" section above the POS blocks, images sit at the top of a POS block, and the
// h-bnr hatnote goes above the first language heading. Each is located here and then read, written or
// inserted through the same three lines of splice, so nothing below needs to know about them.
var IMAGE_LINE = /^\[\[\s*(?:Wêne|File|Image|Dosya)\s*:/i;
/**
* {lines, langSectionIndex, exists, start, end, insertAt} for a subsection carrying a "place", or null
* for an ordinary one. start..end is the body as it stands; insertAt is where a missing one goes.
*/
function locateLoosePlace(pageContent, language, sectionType, sectionOrdinal, subsection) {
var place = subsection.place;
if (!place) {
return null;
}
var i, end;
if (place === "page-top") {
// Above every language section, so the whole page is the search space. The call is found under
// any of its names, and its own name is carried back so a save never renames it.
var pageLines = pageContent.split("\n");
var call = wt.findHbnrCall(pageContent);
if (call) {
return { lines: pageLines, langSectionIndex: 0, exists: true, call: call,
start: call.lineIndex, end: call.lineIndex + 1, insertAt: call.lineIndex };
}
return { lines: pageLines, langSectionIndex: 0, exists: false, start: 0, end: 0, insertAt: 0 };
}
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
if (place === "pron") {
// One per language, not one per part of speech, so it is looked for above the POS heading.
for (i = 0; i < loc.posLineIndex; i++) {
var h3 = /^===\s*([^=]+?)\s*===/.exec(lines[i]);
if (h3 && $.trim(h3[1]) === subsection.header) {
end = i + 1;
while (end < lines.length && !/^==/.test(lines[end])) {
end++;
}
return { lines: lines, langSectionIndex: loc.langSectionIndex, exists: true,
start: i + 1, end: end, insertAt: i };
}
}
// Straight after the language heading, which puts it before every POS block.
return { lines: lines, langSectionIndex: loc.langSectionIndex, exists: false,
start: 1, end: 1, insertAt: 1 };
}
if (place === "pos-top") {
// Between the conjugation line and the headword template -- where the wizard writes them.
var at = loc.posLineIndex + 1;
while (at < lines.length && /^\{\{\s*ku-tewîn/.test($.trim(lines[at]))) {
at++;
}
var from = at;
while (at < lines.length && IMAGE_LINE.test($.trim(lines[at]))) {
at++;
}
return { lines: lines, langSectionIndex: loc.langSectionIndex, exists: at > from,
start: from, end: at, insertAt: from };
}
return null;
}
// The wikitext a "place" section's content becomes. A word list there is one template call, not a
// {{kol3}} block, so the words are joined into it -- and any ⊕ modifier a row picked up is dropped,
// since a page name is all the call can carry.
function loosePlaceBody(subsection, content, language) {
if (subsection.kind === "images") {
return $.grep($.map(content || [], function (image) {
return wt.buildImageLine({
file: image.file,
caption: wt.captionForLang(image.caption, language),
alt: image.alt,
size: image.size,
extra: image.extra
});
}), Boolean).join("\n");
}
return content;
}
// The words a "place" word list holds, flattened out of its single group. Any ⊕ modifier a row picked
// up is dropped: a page name is all the call can carry.
function loosePlaceWords(content) {
var words = [];
$.each(content || [], function (_, group) {
$.each(group.words || [], function (_, raw) {
var plain = $.trim(util.parseWordValue(raw).word);
if (plain && $.inArray(plain, words) === -1) {
words.push(plain);
}
});
});
return words;
}
// Writes one of those places, inserting it when it is not there yet and replacing it when it is. Only
// Bilêvkirin carries a heading; the other two are bare lines.
function writeLoosePlace(pageContent, language, sectionType, sectionOrdinal, subsection, content) {
var at = locateLoosePlace(pageContent, language, sectionType, sectionOrdinal, subsection);
if (!at) {
throw new SubmitAbort("Cih nehate dîtin: " + subsection.header);
}
// A call naming a subpage -- "{{h-bnr/-ane}}" -- holds a list shared by every page transcluding
// it. Writing here would change this page alone and desync the rest, so the edit is refused and
// the template that actually owns the list is named instead.
if (at.call && at.call.subpage) {
throw new SubmitAbort("Ev rûpel «{{" + at.call.name + "}}» bi kar tîne — lîste li " +
"[[Şablon:" + at.call.subpage + "]] ye, lê wê zêde bike, ne li vê rûpelê.");
}
// A word list here is one template call, so it is built where the existing call's own name is
// known -- editing "{{bnr-h|...}}" must not turn it into "{{h-bnr|...}}".
var body = subsection.kind === "wordlist"
? wt.buildHbnrCall(loosePlaceWords(content), at.call && at.call.name)
: $.trim(content || "");
// A "===" section is separated from what is above and below it by a blank line, the way the rest
// of an entry is written. The other two places are bare lines inside a block and take none.
var heading = subsection.place === "pron";
function blank(index) {
return $.trim(at.lines[index] || "") === "";
}
if (at.exists) {
if (body) {
var replacement = [body];
// end is the next "==" heading; the blank line before it is inside the range being replaced.
if (heading && /^==/.test(at.lines[at.end] || "")) {
replacement.push("");
}
at.lines.splice.apply(at.lines, [at.start, at.end - at.start].concat(replacement));
} else {
// Emptying the box removes the section rather than leaving an empty heading behind.
at.lines.splice(at.start, at.end - at.start);
if (heading) {
at.lines.splice(at.insertAt, 1);
// The blank line that separated it goes with it, rather than doubling up.
if (blank(at.insertAt) && blank(at.insertAt - 1)) {
at.lines.splice(at.insertAt, 1);
}
}
}
} else {
if (!body) {
throw new SubmitAbort("Tiştek nehate nivîsandin.");
}
var block = heading ? ["=== " + subsection.header + " ===", body] : [body];
if (heading) {
if (!blank(at.insertAt - 1)) {
block.unshift("");
}
if (!blank(at.insertAt)) {
block.push("");
}
}
at.lines.splice.apply(at.lines, [at.insertAt, 0].concat(block));
}
return pageContent.slice(0, at.langSectionIndex) + at.lines.join("\n");
}
// What a section body holds: its {{kol3}} groups, the plain bullet list that stands in for them, or
// the raw wikitext when it is neither. A free section is read this way before its kind is known.
function readSubsectionBody(body, subsection) {
if (subsection.kind === "wordlist" || subsection.free) {
var calls = parseWordListCalls(body);
if (calls.length) {
return {
kind: "wordlist",
groups: calls.map(function (call) {
return { sernav: namedParam(call.named, "sernav"), words: call.words };
})
};
}
var bullets = parseBulletWordList(body);
if (bullets) {
// Editable as a word list; saving rewrites the bullets as {{kol3}}.
return { kind: "wordlist", groups: [{ sernav: "", words: bullets }], fromBullets: true };
}
}
return { kind: "text", text: $.trim(body) };
}
// The wikitext a section body becomes after an edit. A wordlist keeps its own template name, language
// and named params ("cure=Jê", ...) and only has its positional words replaced; a text one is
// replaced whole.
function rewriteSubsectionBody(body, language, subsection, content) {
if (subsection.kind !== "wordlist") {
// Replacing the body wholesale drops that separator, so put it back.
return content + (/\n\s*$/.test(body) ? "\n" : "");
}
var calls = parseWordListCalls(body);
if (calls.length) {
// Each call is rewritten where it stands, so text between and around them survives untouched.
// Last to first, so the offsets of the earlier ones stay valid as we go.
var replacement = body;
for (var gi = calls.length - 1; gi >= 0; gi--) {
var call = calls[gi];
var group = content[gi];
// A group emptied in the form drops its call entirely rather than leaving "{{kol3|ku}}".
var rebuilt = group && group.words.length
? buildWordListCall(call.name, call.lang, withNamedParam(call.named, "sernav", group.sernav), group.words)
: "";
replacement = replacement.slice(0, call.start) + rebuilt + replacement.slice(call.end);
}
// Groups the form added beyond the ones already there go after the last of them.
var added = content.slice(calls.length).filter(function (group) {
return group.words.length;
}).map(function (group) {
return buildWordListCall(WORDLIST_TEMPLATE, language,
withNamedParam(["cure=" + subsection.header], "sernav", group.sernav), group.words);
});
if (added.length) {
replacement = replacement.replace(/\s*$/, "") + "\n\n" + added.join("\n\n") + "\n";
}
return replacement.replace(/\n{3,}/g, "\n\n"); // gaps left by any dropped call
}
if (parseBulletWordList(body)) {
// A plain bullet list is replaced wholesale by a real {{kol3}} on its first edit.
return content.map(function (group) {
return buildWordListCall(WORDLIST_TEMPLATE, language,
withNamedParam(["cure=" + subsection.header], "sernav", group.sernav), group.words);
}).join("\n\n") + (/\n\s*$/.test(body) ? "\n" : "");
}
throw new SubmitAbort("Nikare lîsteya vê beşê bixwîne: " + subsection.header);
}
// ---- sections that are not subsections of a part of speech ----
// A "=== Etîmolojî ===" that the parts of speech hang under, a "=== Çavkanî ===" at the foot of a
// language, a heading nobody planned for. Located by its own text, and edited as the wikitext under
// it -- or as a {{kol3}} list when that is what it holds.
function freeSectionBody(pageContent, language, subsection) {
var loc = wt.locateHeadingByText(pageContent, language, subsection.header, subsection.free.ordinal);
return { loc: loc, body: loc.lines.slice(loc.bodyStart, loc.bodyEnd).join("\n") };
}
function readFreeSection(pageContent, language, subsection) {
var at = freeSectionBody(pageContent, language, subsection);
return readSubsectionBody(at.body, subsection);
}
function updateFreeSection(pageContent, language, subsection, content) {
var at = freeSectionBody(pageContent, language, subsection);
at.loc.lines.splice(at.loc.bodyStart, at.loc.bodyEnd - at.loc.bodyStart,
rewriteSubsectionBody(at.body, language, subsection, content));
return pageContent.slice(0, at.loc.langSectionIndex) + at.loc.lines.join("\n");
}
// ---- removing and renaming a heading ----
// A subsection's heading line and the end of what it owns, as {loc, heading, end, depth, bounds}. A
// "====" subsection runs to the next one, taking deeper headings with it. A free section owns only its
// own text: what sits under it belongs to the parts of speech (see removeSubsection).
function headingSpan(pageContent, language, sectionType, sectionOrdinal, subsection) {
if (subsection.free) {
var free = wt.locateHeadingByText(pageContent, language, subsection.header, subsection.free.ordinal);
return { loc: free, heading: free.headingLineIndex, end: free.bodyEnd, depth: free.depth };
}
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var bounds = posBlockBounds(loc.lines, loc.posLineIndex, loc.depth);
var range = subsectionBodyRange(bounds, subsection.header);
if (!range) {
throw new SubmitAbort(util.msg.sectionMissing + subsection.header);
}
return { loc: loc, heading: range.start - 1, end: range.end, depth: bounds.depth + 1, bounds: bounds };
}
// A free section with deeper headings under it is refused: removing it would leave them under the
// section before, and taking them along would remove whole parts of speech.
function hasDeeperHeadingAfter(lines, index, depth) {
var m = /^(=+)[^=]/.exec(lines[index] || "");
return !!m && m[1].length > depth;
}
function removeSubsection(pageContent, language, sectionType, sectionOrdinal, subsection) {
var span = headingSpan(pageContent, language, sectionType, sectionOrdinal, subsection);
var lines = span.loc.lines;
if (subsection.free && hasDeeperHeadingAfter(lines, span.end, span.depth)) {
throw new SubmitAbort("Di bin «" + subsection.header + "» de beşên din hene; pêşî wan jê bibe.");
}
lines.splice(span.heading, span.end - span.heading);
// The blank line that separated it goes with it, rather than doubling up.
if (span.heading > 0 && !$.trim(lines[span.heading - 1]) && !$.trim(lines[span.heading] || "x")) {
lines.splice(span.heading, 1);
}
return pageContent.slice(0, span.loc.langSectionIndex) + lines.join("\n");
}
function renameSubsection(pageContent, language, sectionType, sectionOrdinal, subsection, newHeader) {
var span = headingSpan(pageContent, language, sectionType, sectionOrdinal, subsection);
var lines = span.loc.lines;
if (span.bounds && span.bounds.existingHeaders.some(function (h) {
return h.header === newHeader;
})) {
throw new SubmitAbort("Ev beş jixwe heye: " + newHeader);
}
var marks = wt.headingMarks(span.depth);
lines[span.heading] = marks + " " + newHeader + " " + marks;
// A {{kol3}} names its section in cure=, which follows the heading. Read across lines: a call is
// often written one parameter per line.
var cure = new RegExp("(\\|\\s*cure\\s*=\\s*)" + escapeRegExp(subsection.header) + "(\\s*[|}])", "g");
var body = lines.slice(span.heading + 1, span.end).join("\n").replace(cure, "$1" + newHeader + "$2");
lines.splice.apply(lines, [span.heading + 1, span.end - span.heading - 1].concat(body.split("\n")));
return pageContent.slice(0, span.loc.langSectionIndex) + lines.join("\n");
}
// Current contents of an existing "====" subsection. A wordlist one whose template can't be parsed comes
// back as {kind: "text"} so the caller can still edit it as raw wikitext instead of refusing outright.
function readPageSubsection(pageContent, language, sectionType, sectionOrdinal, subsection) {
if (subsection.free) {
return readFreeSection(pageContent, language, subsection);
}
var loose = locateLoosePlace(pageContent, language, sectionType, sectionOrdinal, subsection);
if (loose) {
if (!loose.exists) {
return null;
}
if (loose.call) {
return { kind: "wordlist", groups: [{ sernav: "", words: loose.call.words }] };
}
var looseBody = $.trim(loose.lines.slice(loose.start, loose.end).join("\n"));
if (subsection.kind === "images") {
return {
kind: "images",
images: $.grep($.map(looseBody.split("\n"), wt.parseImageLine), Boolean)
};
}
if (subsection.kind !== "wordlist") {
return { kind: "text", text: looseBody };
}
// One template call rather than a {{kol3}} block: its positional parameters are the words.
var looseCall = parseTemplateCalls(looseBody).calls[0];
return { kind: "wordlist", groups: [{ sernav: "", words: (looseCall && looseCall.params) || [] }] };
}
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var bounds = posBlockBounds(loc.lines, loc.posLineIndex, loc.depth);
var range = subsectionBodyRange(bounds, subsection.header);
if (!range) {
return null;
}
return readSubsectionBody(loc.lines.slice(range.start, range.end).join("\n"), subsection);
}
// Rewrites an existing "====" subsection in place. A wordlist one keeps its own template name, language and
// named params ("cure=Jê", ...) and only has its positional words replaced; a text one is replaced whole.
function updatePageSubsection(pageContent, language, sectionType, sectionOrdinal, subsection, content) {
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var bounds = posBlockBounds(lines, loc.posLineIndex, loc.depth);
var range = subsectionBodyRange(bounds, subsection.header);
if (!range) {
throw new SubmitAbort(util.msg.sectionMissing + subsection.header);
}
var body = lines.slice(range.start, range.end).join("\n");
lines.splice(range.start, range.end - range.start,
rewriteSubsectionBody(body, language, subsection, content));
return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n");
}
// Inserts a new "==== Header ====" subsection into its SUBSECTION_ORDER position within a POS block, right
// before the first ranked subsection that outranks it, or at the end if none does. Either a
// {{kol3|...}} word list or a plain paragraph, matching start.js's own subsection formats.
function insertPageSubsection(pageContent, language, sectionType, sectionOrdinal, subsection, content) {
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var bounds = posBlockBounds(lines, loc.posLineIndex, loc.depth);
var alreadyThere = false;
bounds.existingHeaders.forEach(function (h) {
if (h.header === subsection.header) {
alreadyThere = true;
}
});
if (alreadyThere) {
throw new SubmitAbort("Ev beş jixwe heye: " + subsection.header);
}
var body = subsection.kind === "wordlist"
? content.map(function (group) {
return buildWordListCall(WORDLIST_TEMPLATE, language,
withNamedParam(["cure=" + subsection.header], "sernav", group.sernav), group.words);
}).join("\n\n")
: content;
var myRank = subsectionRankForHeader(subsection.header);
var headers = bounds.existingHeaders;
var insertAt = bounds.end;
for (var i = 0; i < headers.length; i++) {
var otherRank = subsectionRankForHeader(headers[i].header);
if (otherRank !== -1 && otherRank > myRank) {
insertAt = headers[i].lineIndex;
break;
}
}
// Exactly one blank line on each side: the line before the insertion point is normally already blank
// (it separated the previous subsection from the next heading), so only add one where there isn't one.
var block = [];
if (insertAt > 0 && $.trim(lines[insertAt - 1]) !== "") {
block.push("");
}
var marks = wt.headingMarks(bounds.depth + 1);
block.push(marks + " " + subsection.header + " " + marks, body);
if (insertAt < lines.length) {
block.push("");
}
lines.splice.apply(lines, [insertAt, 0].concat(block));
return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n");
}
// ---- converting an unclassified "=== Mane ===" placeholder heading into a real POS heading ----
// Some pages carry a heading literally named "Mane" (optionally "Mane 2" etc.) instead of a real
// part-of-speech name, tagged right below with {{cure?|<lang>}} (ku.wiktionary's "part of speech not yet
// determined" maintenance flag). It is a section key of its own (sections.MANE_SECTION), so the shared
// locator finds it like any other heading; only the rewriting below is particular to it.
// Renames the "=== Mane ===" placeholder to the chosen POS heading, drops the maintenance tag line right
// after it if present (MANE_TAG_REGEX -- cure? or any of its known aliases), and inserts the matching
// "{{<pos>|<lang>}}" call in its place (skipped when the section has no template of its own).
// Other content under the heading is left untouched.
/**
* Where a section's own headword template sits, as {index, text}, or {index: -1} when it has none.
*
* Not always the line under the heading: a "{{ku-tewîn-lk}}" line and any number of "[[Wêne:...]]"
* images can come first. Everything down to the first definition line is searched, and index doubles
* as the slot a new call belongs in when there is no old one.
*/
function findPosTemplateLine(lines, headingLine, sectionType) {
var oldSpec = posTemplateFor(sectionType);
var oldTemplate = oldSpec ? oldSpec.name : (sectionType === "Biwêj" ? "biwêj" : null);
var oldTemplateRegex = oldTemplate &&
new RegExp("^\\{\\{\\s*" + escapeRegExp(oldTemplate) + "\\s*[|}]");
var at = headingLine + 1;
while (at < lines.length && !/^#/.test(lines[at]) && !/^==/.test(lines[at])) {
if (MANE_TAG_REGEX.test(lines[at]) ||
(oldTemplateRegex && oldTemplateRegex.test(lines[at]))) {
return { index: at, text: lines[at], end: at };
}
at++;
}
return { index: -1, text: "", end: at };
}
// Named parameters merged in order, each written once: a later value replaces an earlier one of the
// same name. Positional values are kept as they come.
function mergeCallParams() {
var out = [];
var seen = {};
$.each(Array.prototype.slice.call(arguments), function (_, list) {
$.each(list || [], function (__, param) {
var m = /^\s*([^=|]+?)\s*=([\s\S]*)$/.exec(param);
if (!m) {
out.push(param);
return;
}
// "z" and "c" are one name to Modul:rêziman, so the form's "c=m" meets the page's "z=".
var key = wt.canonicalParamName(m[1]);
if (!Object.prototype.hasOwnProperty.call(seen, key)) {
seen[key] = out.length;
out.push(param);
return;
}
// The page's own spelling stays when it carried a value; an empty one gives way entirely.
var earlier = /^\s*([^=|]+?)\s*=([\s\S]*)$/.exec(out[seen[key]]);
// "?" asks for a value, so it never replaces one the page already has.
if ($.trim(earlier[2]) && $.trim(m[2]) === "?") {
return;
}
out[seen[key]] =$.trim(earlier[2]) ? earlier[1] + "=" + m[2] : param;
});
});
return out;
}
// What the call on the page already says, minus its language. Carried over only when the new section
// uses that same template -- "z=m" survives Navdêr becoming Formeke navdêrê, while a verb's "c=h-gh"
// has no meaning on a noun and is left behind.
function keptCallParams(line, templateName) {
var call = parseTemplateCalls($.trim(line || "")).calls[0];
if (!call || canonicalTemplateKey(call.name) !== canonicalTemplateKey(templateName)) {
return [];
}
return call.params.slice(1).filter(function (param) {
return /=/.test(param);
});
}
// The headword call a converted section gets, or "" when the new section has none. What the old call
// (found, from findPosTemplateLine) said keeps its place, then the section's own defaults, then what the
// form was filled in with -- each name written once, the last value winning, so a converted call reads
// as small a change from the old one as it can.
function posCallLine(found, language, newSectionType, posParams) {
var spec = posTemplateFor(newSectionType);
if (!spec) {
return "";
}
var kept = found.index !== -1 ? keptCallParams(found.text, spec.name) : [];
// A lemma is not an inflected form, so the old section's form=erê stays behind.
if (spec.params.indexOf("form=erê") === -1) {
kept = kept.filter(function (param) {
return !/^\s*form\s*=\s*erê\s*$/.test(param);
});
}
var params = mergeCallParams(kept, spec.params, posParams ? posParams.split("|") : []);
return "{{" + spec.name + "|" + language + (params.length ? "|" + params.join("|") : "") + "}}";
}
function convertSectionToPos(pageContent, language, sectionType, sectionOrdinal, newSectionType, posParams) {
if (!sectionNames[newSectionType]) {
throw new SubmitAbort("Navê cureyê rêzimanî yê hilbijartî nediyar e.");
}
// locateSection() already handles the "Mane" placeholder as a section type of its own.
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var headingLine = loc.posLineIndex;
var depth = loc.depth;
// A section straight under a numbered group heading takes that heading's place: the group heading
// held nothing but its gloss.
var group = depth > 3 ? wt.numberedGroupAbove(lines, headingLine, depth) : -1;
if (group !== -1) {
lines.splice(group, headingLine - group);
headingLine = group;
depth--;
}
// At the heading's own depth. Written without a number: the renumbering pass below decides every
// number in this language section at once, so one carried over from the old name would just be
// overwritten.
var marks = wt.headingMarks(depth);
lines[headingLine] = marks + " " + newSectionType + " " + marks;
// The line under the heading is either the old section's own template call ("{{biwêj|ku}}") or, for a
// Mane placeholder, the "needs a POS" maintenance tag. Both are replaced by the new POS's call.
// The new call takes the old one's own place -- or, when there was none, the slot just above the
// definitions, which is where the wizard writes it.
var found = findPosTemplateLine(lines, headingLine, sectionType);
var insertAt = found.index !== -1 ? found.index : found.end;
if (found.index !== -1) {
lines.splice(found.index, 1);
}
var call = posCallLine(found, language, newSectionType, posParams);
if (call) {
lines.splice(insertAt, 0, call);
}
// Renaming a section can make it repeat one the page already had, and can equally leave a name that
// is no longer repeated. Both are settled by renumbering the whole language section: a "Rengdêr"
// beside a new "Rengdêr" becomes "Rengdêr 1" and "Rengdêr 2", and a number left behind by a name
// that is now unique is dropped.
var body = lines.join("\n");
var nextLang = body.indexOf("\n== ", 1);
var end = nextLang === -1 ? body.length : nextLang;
body = wt.numberRepeatedPosHeadings(body.slice(0, end)) + body.slice(end);
return pageContent.slice(0, loc.langSectionIndex) + body;
}
// ---- "guhartina pêşketî" (advanced editing): combine several independent per-sense edits into ONE save ----
// Threads pageContent through the same pure functions every single-field form uses, applying only the
// pieces the caller actually filled in. A piece that conflicts with the page (maneid already set, a
// subsection that's already there) is skipped with a warning rather than failing the whole save. Throws
// SubmitAbort if nothing was filled in, so this can never turn into a no-op save.
function applyAdvancedChanges(pageContent, language, sectionType, sectionOrdinal, definitionLevel, changes) {
var content = pageContent;
var warnings = [];
var appliedAnything = false;
if (changes.gloss) {
content = updateSenseGloss(content, language, sectionType, sectionOrdinal, definitionLevel, changes.gloss);
appliedAnything = true;
}
if (changes.newSense) {
content = insertNewSense(content, language, sectionType, sectionOrdinal, definitionLevel, changes.newSense);
appliedAnything = true;
}
// Every box below is prefilled with what the sense already has, so a save replaces that value rather
// than merging into it -- and clearing a box removes the template. changes.changed marks the boxes
// whose contents actually differ from the page, so an opened-but-untouched box writes nothing.
var replace = { replace: true };
if (changes.changed.maneid) {
content = insertLeadingSenseTpl(content, language, sectionType, sectionOrdinal, definitionLevel, "maneid", changes.maneid ? [changes.maneid] : [], replace);
appliedAnything = true;
}
if (changes.changed.etiket) {
content = insertLeadingSenseTpl(content, language, sectionType, sectionOrdinal, definitionLevel, "e", changes.etiket, replace);
appliedAnything = true;
}
if (changes.changed.kategori) {
content = insertLeadingSenseTpl(content, language, sectionType, sectionOrdinal, definitionLevel, "K", changes.kategori, replace);
appliedAnything = true;
}
SENSE_GROUPS.forEach(function (group) {
if (changes.changed["word:" + group.key]) {
content = insertSenseWords(content, language, sectionType, sectionOrdinal, definitionLevel, group.key, changes.words[group.key], replace);
appliedAnything = true;
}
});
if (!appliedAnything) {
throw new SubmitAbort("Tiştek nehat guhartin.");
}
return { content: content, warnings: warnings };
}
// ---- per-definition UI: a small always-visible "+" toggle (no hover, so it works on mobile/touch too) ----
// A growing list of word rows. The row itself is util.js's, shared with the wizard; this owns the list:
// typing in the last row appends a fresh empty one, so there is always somewhere to type.
var WORDLIST_COLUMN_THRESHOLD = 6;
function buildWordListField(placeholder, opts) {
opts = opts || {};
var $list = $("<ol class='dsb-wordlist'></ol>");
// One column is a long scroll once a list gets past a handful of words. The class only asks for
// two; the stylesheet still gives one on a narrow screen. Two columns inside the panel's usual
// 520px would leave each word about 250px, so the panel drops its width cap for as long as any
// list in it is in two columns -- checked across the whole panel, since a "Herwiha binêre" holds
// several groups and one of them going wide settles it for all.
function updateColumns() {
$list.toggleClass("dsb-wordlist-2col",
$list.children("li").length > WORDLIST_COLUMN_THRESHOLD);
var $panel = $list.closest(".dsb-subsection-panel");
$panel.toggleClass("dsb-panel-wide", !!$panel.find(".dsb-wordlist-2col").length);
}
function makeRow() {
var row = util.makeModifierRow({
prefix: "dsb-",
placeholder: placeholder,
modTitle: util.msg.addModifier,
removeTitle: util.msg.removeWord,
removeModTitle: util.msg.removeModifier,
modifiers: opts.modifiers,
// "bixe qutiyan" puts each comma-separated word in a row of its own, right after the row it
// was typed in, and the caret follows to the last of them. One word per row is also one
// word per template parameter, which both {{hevmane}} and {{kol3}} read the same way --
// a comma left inside a parameter would not be.
onSplit: function (rest) {
var $after = row.$li;
var last = null;
rest.forEach(function (raw) {
var extra = makeRow();
$after.after(extra.$li);
$after = extra.$li;
if (raw) extra.setRaw(raw);
last = extra;
});
// Always an empty row at the end to type the next word into.
var $tail = $list.children("li").last();
if ($.trim($tail.data("row").getRaw())) {
last = makeRow();
$list.append(last.$li);
}
updateColumns();
if (last) last.focus();
},
// raw === null means the row removed itself, so the count has changed either way.
onChange: function (raw) {
if (raw !== null) {
var isLast = row.$li.is($list.children("li").last());
if (isLast && raw) $list.append(makeRow().$li);
}
updateColumns();
}
});
row.$li.data("row", row);
return row;
}
$list.append(makeRow().$li);
return {
$element: $list,
values: function () {
var vals = [];
$list.children("li").each(function () {
var raw = $(this).data("row").getRaw();
if (raw) vals.push(raw);
});
return vals;
},
// Replaces the whole list, keeping one empty trailing row to type into.
setValues: function (raws) {
$list.empty();
raws.forEach(function (raw) {
var row = makeRow();
$list.append(row.$li);
row.setRaw(raw);
});
$list.append(makeRow().$li);
updateColumns();
},
focus: function () {
$list.children("li").first().data("row").focus();
}
};
}
// Plain removable-tag field, used for Etîket and Kategorî (simple value lists with no per-word modifiers).
// Enter or "," commits the current text as a tag; Backspace on an empty input removes the last tag;
// values() also commits whatever is still typed but not yet confirmed.
function buildTagField(placeholder) {
var $input = $("<input type='text' class='dsb-input dsb-tag-input'>").attr("placeholder", placeholder);
var $element = $("<span class='dsb-tagfield'></span>").append($input);
function currentValues() {
var vals = [];
$element.children(".dsb-tag").each(function () {
vals.push($(this).data("value"));
});
return vals;
}
function addTag(val) {
val = $.trim(val || "");
if (!val || currentValues().indexOf(val) !== -1) {
return;
}
var $tag = $("<span class='dsb-tag'></span>").text(val).data("value", val);
var $remove = $("<button type='button' class='dsb-tag-remove' title='Jê bibe'>×</button>");
$remove.on("click", function () {
$tag.remove();
$input.trigger("focus");
});
$tag.append($remove);
$tag.insertBefore($input);
}
$input.on("keydown", function (e) {
if (e.which === 13 || e.which === 188) { // Enter or comma
e.preventDefault();
addTag($input.val());
$input.val("");
} else if (e.which === 8 && !$input.val()) {
$element.children(".dsb-tag").last().remove();
}
});
$input.on("blur", function () {
addTag($input.val());
$input.val("");
});
return {
$element: $element,
// Replaces every tag, for prefilling from what the sense already has.
setValues: function (vals) {
$element.children(".dsb-tag").remove();
vals.forEach(function (v) {
addTag(v);
});
$input.val("");
},
values: function () {
addTag($input.val());
$input.val("");
return currentValues();
},
focus: function () {
$input.trigger("focus");
}
};
}
// The wizard's own etymology templates, straight out of data-main.json's "etymTpls" -- the same list start.js's
// insert menu offers, so the two can never drift apart. CODE/SOURCELANG are its placeholders.
// The wizard's own template lists, straight out of data-main.json, so both gadgets offer the same
// templates in the same order. A pronunciation template names the languages it is for; one that names
// none is offered everywhere.
function templateChoices(pool, language) {
var defs = startData[pool] || {};
return Object.keys(defs).filter(function (name) {
var langs = defs[name].langs;
return !langs || !langs.length || $.inArray(language, langs) !== -1;
}).map(function (name) {
return { name: name, desc: defs[name].desc, snippet: defs[name].snippet };
});
}
// One template call inside the surface: shown as its own wikitext, but atomic -- contenteditable="false"
// keeps the caret out of it, so it can only be changed through the dialog.
function makeTemplateChip(wikitext) {
// The × is its own element rather than the chip's only way out: on a phone there is no reliable
// backspace onto a contenteditable="false" span, so without it the dialog is the only way to take
// a call off the line. readChipSurface() reads chips from data-wikitext, so the extra child does
// not reach the saved text.
var $remove = $("<span class='dsb-tpl-chip-remove' contenteditable='false'>×</span>")
.attr("title", "Vê şablonê jê bibe");
return $("<span class='dsb-tpl-chip' contenteditable='false' role='button' tabindex='0'></span>")
.attr("data-wikitext", wikitext)
.attr("title", "Bitikîne da ku parametreyan biguhêrî")
.text(wikitext)
.append($remove);
}
// wikitext -> surface DOM: template calls become chips, everything else stays plain editable text.
function renderChipSurface($surface, wikitext) {
var text = wikitext || "";
var calls = parseTemplateCalls(text).calls;
var pos = 0;
$surface.empty();
calls.forEach(function (call) {
if (call.start > pos) {
$surface.append(document.createTextNode(text.slice(pos, call.start)));
}
$surface.append(makeTemplateChip(text.slice(call.start, call.end)));
pos = call.end;
});
if (pos < text.length) {
$surface.append(document.createTextNode(text.slice(pos)));
}
}
// surface DOM -> wikitext. Chips give back their stored call; anything the browser inserted while typing
// (a <br>, a wrapper <div>) degrades to its text, so the result is always plain wikitext.
function readChipSurface(node) {
var out = "";
$(node).contents().each(function () {
if (this.nodeType === 3) {
out += this.nodeValue;
return;
}
var $el = $(this);
if ($el.hasClass("dsb-tpl-chip")) {
out += $el.attr("data-wikitext");
return;
}
if (this.nodeName === "BR") {
out += "\n";
return;
}
if (this.nodeName === "DIV" || this.nodeName === "P") {
out += "\n" + readChipSurface(this);
return;
}
out += readChipSurface(this);
});
return out;
}
// Drops a node in at the caret, or at the end when the caret is not inside the surface.
function insertAtCaret($surface, node) {
var sel = window.getSelection();
if (sel && sel.rangeCount && $.contains($surface.get(0), sel.getRangeAt(0).commonAncestorContainer)) {
var range = sel.getRangeAt(0);
range.deleteContents();
range.insertNode(node);
range.setStartAfter(node);
range.collapse(true);
sel.removeAllRanges();
sel.addRange(range);
} else {
$surface.append(node);
}
}
// The template-param dialog (openTemplateDialog/buildTemplateParamForm) moved to wikt.cite, shared with
// start.js's own Etîmolojî and Çavkanî pickers: cite.openTemplateDialog / cite.buildTemplateParamForm.
// Each new example queued is its own entry, so several can be waiting at once.
var exampleSeq = 0;
// Takes the save over from add-examples while its form is open for one sense: its "Qeyd bike" becomes
// "Lê zêde bike" and the edit joins the pending queue instead of publishing on its own, so examples and
// whatever else is queued go up as one edit. Installed on every open, so the handler always closes over
// the sense whose form is actually open. ctx: {$li, $h3, language, sectionType, sectionOrdinal,
// definitionLevel, $save, $status, afterQueue}.
function takeOverExampleSave(ctx) {
if (!(wikt.addExamples && wikt.addExamples.setSubmitHandler)) {
return; // older add-examples: it publishes on its own, as before
}
// Lets the form read an example as the queue has already changed it.
wikt.addExamples.pendingContent = queuedContent;
wikt.addExamples.setSubmitHandler(function (job) {
exampleSeq++;
queueChange(
placeLabel(ctx.language, ctx.sectionType, ctx.$h3),
// add-examples' own summary, so the combined edit still credits the tool and names its
// version. The trailing stop goes: this is one item in a list, not a sentence of its own.
(job.summary || "nimûne/jêgirtin hate zêdekirin").replace(/\.\s*$/, ""),
function (pageContent) {
// add-examples builds against a revision object, and returns {text, summary}.
var built = job.transform({ content: pageContent });
return { content: built.text, warnings: [] };
},
ctx.$save,
ctx.$status,
// Drawn like any other queued change, in the sense it belongs to.
function () {
return previewSense(ctx.$li, ctx.language, ctx.sectionType, ctx.sectionOrdinal, ctx.definitionLevel);
},
// An edit to an example already on the page brings its own key, so editing it again replaces it.
{ key: job.key || ("example:" + ctx.sectionType + "|" + ctx.sectionOrdinal + "|" +
ctx.definitionLevel.join(".") + "|" + exampleSeq) }
);
job.done();
if (ctx.afterQueue) {
ctx.afterQueue();
}
});
}
// Opens add-examples' form on one example already under a sense -- dsb.js's pencil on it. Its save joins
// the queue like any other change.
function editExample($li, $h3, language, sectionType, sectionOrdinal, definitionLevel, itemEl) {
takeOverExampleSave({ $li: $li, $h3: $h3, language: language, sectionType: sectionType,
sectionOrdinal: sectionOrdinal, definitionLevel: definitionLevel, $save: $(), $status: $(),
afterQueue: openQueueBox });
if (!(wikt.addExamples && wikt.addExamples.editFor && wikt.addExamples.editFor($li.get(0), itemEl))) {
mw.notify("Amûra nimûneyan li vê maneyê nehat dîtin.");
}
}
// Builds the whole "guhartina pêşketî" panel into $quickRow: gloss and the two most-used word lists
// (Hevmane/Dijmane) sit directly in the picker row; the remaining word lists, maneid, etîket, kategorî
// and Nimûne/jêgirtin live behind a "Hevmane û Bêhtir" dropdown; one shared "Lê zêde bike" queues everything the
// user filled in as a single edit via applyAdvancedChanges() and queueChange(). Nimûne/jêgirtin is an
// immediate proxy-click into a different gadget's own form, not part of this combined save.
function buildAdvancedPanel($quickRow, $li, $h3, language, sectionType, sectionOrdinal, definitionLevel, isLastSense) {
// "+" marks the actions that add something, matching the dropdown's own "+ Hevmane" labels.
var $nimune = $("<a href='#' class='dsb-quick-link'></a>").text("+ Nimûne/jêgirtin");
$nimune.on("click", function (e) {
e.preventDefault();
takeOverExampleSave({ $li: $li, $h3: $h3, language: language, sectionType: sectionType,
sectionOrdinal: sectionOrdinal, definitionLevel: definitionLevel, $save: $save, $status: $status });
// Toggle, so clicking this a second time closes the form again. add-examples builds nothing
// on the page of its own, so this is the only way its form opens.
var drive = wikt.addExamples.toggleFor || wikt.addExamples.openFor;
if (!(drive && drive($li.get(0)))) {
mw.notify("Amûra nimûneyan li vê maneyê nehat dîtin.");
}
$moreMenu.slideUp();
});
// getters holds one function per currently-open box (key -> () => value); collectChanges() only ever
// reads from a box the user actually clicked to open.
var getters = {};
// What the sense currently holds, fetched once and shared by every box that prefills from it.
// collectChanges() also diffs against it, so an untouched box never queues a change.
var original = null;
var sensePromise = null;
function loadSense() {
if (!sensePromise) {
sensePromise = fetchSenseFields(language, sectionType, sectionOrdinal, definitionLevel).then(function (fields) {
original = fields;
return fields;
});
}
return sensePromise;
}
function sameList(a, b) {
return (a || []).join("\u0000") === (b || []).join("\u0000");
}
// -- gloss ("Maneyê biguhêre" -- the one box that EDITS the sense's wording; everything else here only ADDS) --
function addGlossField() {
var $fields = $("<div class='dsb-gloss-fields'></div>");
var $textarea = $("<textarea class='dsb-input dsb-edit-gloss' rows='2'></textarea>")
.attr("placeholder", util.msg.loading).prop("disabled", true);
var $autoLink = $("<button type='button' class='dsb-autolink'>Oto-lînk bike</button>").prop("disabled", true);
var $toRaw = $("<a href='#' class='dsb-quick-link dsb-gloss-raw'>Wekî wîkîtekst biguhêre</a>").hide();
var $status = $("<span class='dsb-status'></span>");
var originalGloss = null;
var tplForm = null; // set while the parameter boxes are showing instead of the raw line
var tplCall = null;
// The gloss of a non-Kurdish entry is a translation followed by {{îzah|…}} explaining it. That
// is one field on the page, so it stays one box here; the explanation opens beside it only when
// asked for, and the two are joined back into a single gloss on save. A Kurdish sense is its
// own definition, so it is never offered one -- though a ku gloss that somehow already carries
// an {{îzah}} still opens its box below, rather than being edited blind.
var offerIzah = language !== "ku";
var $izah = $("<textarea class='dsb-input dsb-edit-izah' rows='2'></textarea>")
.attr("placeholder", "Îzaha maneyî… ji bo school-a îngilîzî 'cihê tehsîlgirtinê'");
// A non-Kurdish gloss is a translation and its explanation, so both boxes open together. A Kurdish
// sense is its own definition and gets no îzah box, unless its gloss already carries one.
var $izahWrap = $("<div class='dsb-izah-wrap'></div>")
.append($("<label class='dsb-adv-label'>Îzaha maneyî</label>").append($izah))
.toggle(offerIzah);
$fields.append($textarea);
// The template form edits one call inside the line, so its result is spliced back into the rest.
function currentGloss() {
if (tplForm) {
return $.trim(originalGloss.slice(0, tplCall.start) + tplForm.values() + originalGloss.slice(tplCall.end));
}
return joinGloss($.trim($textarea.val()), $.trim($izah.val()));
}
function showRaw() {
tplForm = null;
tplCall = null;
$fields.empty().append($textarea);
$autoLink.show();
$toRaw.hide();
}
loadSense().then(
function (fields) {
originalGloss = fields.gloss;
// An existing gloss that already ends in {{îzah|…}} comes apart into the two boxes, so
// editing it does not mean editing template syntax by hand.
var parts = util.splitTercimeIzah(fields.gloss);
$textarea.val(parts ? $.trim(parts.tercime) : fields.gloss)
.prop("disabled", false)
// A non-Kurdish gloss is a translation; the box under it takes the explanation.
.attr("placeholder", offerIzah ? util.msg.tercimePrompt : "Maneyê binivîse…");
if (parts) {
$izah.val($.trim(parts.izah));
$izahWrap.show();
}
$autoLink.prop("disabled", false);
var target = glossTemplateTarget(fields.gloss);
if (!target) {
return;
}
fetchTemplateData(target.name).then(function (td) {
// The fetch is async; leave the raw box alone if it has already been typed into.
if ($.trim($textarea.val()) !== $.trim(originalGloss)) {
return;
}
tplCall = target;
tplForm = cite.buildTemplateParamForm(target, td);
$fields.empty().append(tplForm.$element);
$autoLink.hide(); // linkifying a bare template call makes no sense
// A gloss that is one template call carries no separate explanation.
$izahWrap.hide();
$toRaw.show();
});
},
function (codeOrAbort, result) {
$textarea.attr("placeholder", "");
var message = codeOrAbort instanceof SubmitAbort ? codeOrAbort.message : "Nikare maneya heyî bar bike: " + apiErrorMessage(codeOrAbort, result);
$status.removeClass("dsb-status-ok").addClass("dsb-status-error").text(message);
}
);
$autoLink.on("click", function () {
var mane = $.trim($textarea.val());
var izah = $.trim($izah.val());
if (!mane && !izah) {
return;
}
$autoLink.prop("disabled", true);
$status.removeClass("dsb-status-ok dsb-status-error").text("Tê lînkkirin…");
linkifyGlossParts(mane, izah, function (linkedMane, linkedIzah, error) {
$textarea.val(linkedMane);
$izah.val(linkedIzah);
$autoLink.prop("disabled", false);
if (error) {
$status.addClass("dsb-status-error").text(error);
} else {
$status.text("");
}
});
});
$toRaw.on("click", function (e) {
e.preventDefault();
$textarea.val(currentGloss()); // read the form before showRaw() discards it
showRaw();
});
getters.gloss = function () {
var v = currentGloss();
return (v && v !== originalGloss) ? v : null;
};
return $("<div class='dsb-adv-group'></div>").append(
$("<div class='dsb-adv-label'></div>").text("Mane"),
$fields,
$izahWrap,
$("<div class='dsb-form-actions'></div>").append($autoLink, $toRaw, $status)
);
}
// -- one SENSE_GROUPS word-list box (Hevmane/Dijmane/etc.) --
function addWordField(group) {
var field = buildWordListField(group.label + "…");
loadSense().then(function (fields) {
var current = fields.words[group.key];
if (current && current.length) {
field.setValues(current);
}
});
getters["word:" + group.key] = function () {
return field.values();
};
// The hint is senseGroups' own, so the box carries the same example sentence the wizard puts
// beside its copy of this list.
var $label = $("<div class='dsb-adv-label'></div>").text(group.label);
if (group.hint) {
$label.append($("<span class='dsb-adv-hint'></span>").text(group.hint));
}
return $("<div class='dsb-adv-group'></div>").append($label, field.$element);
}
// -- maneid (single value; re-adding one that already exists is rejected -- see applyAdvancedChanges) --
function addNewSenseField() {
var $textarea = $("<textarea class='dsb-input' rows='2'></textarea>").attr("placeholder", "Maneya nû binivîse…");
getters.newSense = function () {
return $.trim($textarea.val());
};
return $("<div class='dsb-adv-group'></div>").append(
$("<div class='dsb-adv-label'></div>").text(util.msg.anotherSense),
$textarea
);
}
function addManeidField() {
var $input = $("<input type='text' class='dsb-input' placeholder='id…'>");
loadSense().then(function (fields) {
$input.val(fields.maneid);
});
getters.maneid = function () {
return $.trim($input.val());
};
return $("<div class='dsb-adv-group'></div>").append($("<div class='dsb-adv-label'></div>").text("Maneid"), $input);
}
// -- etîket / kategorî --
function addEtiketField() {
var field = buildTagField("Etîket…");
loadSense().then(function (fields) {
field.setValues(fields.etiket);
});
getters.etiket = function () {
return field.values();
};
return $("<div class='dsb-adv-group'></div>").append($("<div class='dsb-adv-label'></div>").text("Etîket"), field.$element);
}
function addKategoriField() {
var field = buildTagField("Kategorî…");
loadSense().then(function (fields) {
field.setValues(fields.kategori);
});
getters.kategori = function () {
return field.values();
};
return $("<div class='dsb-adv-group'></div>").append($("<div class='dsb-adv-label'></div>").text("Kategorî"), field.$element);
}
// -- the picker row: the gloss and Nimûne/jêgirtin links sit directly in the row; every word group and
// the rest live behind a "Hevmane û Bêhtir" dropdown. Clicking any link builds and appends its box
// to $openBoxes and hides that link; the box's own "×" removes it, clears its getter, and un-hides the
// link -- several boxes can be open at once. No "Beşek (====)" entry here: buildSubsectionPanel()'s
// own "+ Beşek lê zêde bike" trigger already covers page-level subsections. ----
var FIELD_DEFS = [{ key: "gloss", label: "Maneyê biguhêre", build: addGlossField, primary: true }]
.concat(SENSE_GROUPS.map(function (group) {
return { key: "word:" + group.key, label: group.label, build: function () { return addWordField(group); }, primary: false };
}))
.concat([
{ key: "maneid", label: "Maneid", build: addManeidField, primary: false },
{ key: "etiket", label: "Etîket", build: addEtiketField, primary: false },
{ key: "kategori", label: "Kategorî", build: addKategoriField, primary: false }
]);
// Every sense offers this: the new one lands directly below whichever sense asked for it (see
// insertNewSense), so it is no longer only the last one that can add to the end.
FIELD_DEFS.push({ key: "newSense", label: util.msg.addAnotherSense, build: addNewSenseField, primary: false });
var $picker = $("<div class='dsb-field-picker'></div>");
var $moreMenu = $("<div class='dsb-more-menu'></div>").hide();
var $openBoxes = $("<div class='dsb-open-boxes'></div>");
// $actions (built below) stays hidden until at least one field box is actually open -- otherwise
// "Lê zêde bike" sits there enabled with nothing to queue, which just produces an empty no-op change.
var openBoxCount = 0;
function updateActionsVisibility() {
$actions.toggle(openBoxCount > 0);
}
function makeFieldLink(def) {
var $link = $("<a href='#' class='dsb-quick-link dsb-field-pick'></a>").text(def.key === "gloss" ? def.label : "+ " + def.label);
$link.on("click", function (e) {
e.preventDefault();
openQueueBox();
var $box = def.build();
var $remove = $("<a href='#' class='dsb-box-remove' title='Rake'>×</a>");
$remove.on("click", function (e2) {
e2.preventDefault();
delete getters[def.key];
$box.remove();
$link.show();
openBoxCount--;
updateActionsVisibility();
});
$box.prepend($remove);
$openBoxes.append($box);
util.initManualResize($box);
$link.hide();
$moreMenu.slideUp();
openBoxCount++;
updateActionsVisibility();
});
return $link;
}
// Destructive, so it lives at the bottom of the dropdown behind a confirmation, and shares the
// sense's queue key: deleting supersedes any edit still pending on the same sense.
function makeDeleteLink() {
var $link = $("<a href='#' class='dsb-quick-link dsb-field-delete'>Maneyê rake</a>");
$link.on("click", function (e) {
e.preventDefault();
$moreMenu.slideUp();
OO.ui.confirm("Ev mane û hemû rêzên bin wê dê werin rakirin. Dewam bike?").done(function (ok) {
if (!ok) {
return;
}
queueChange(
placeLabel(language, sectionType, $h3),
"maneyek hate rakirin",
function (baseContent) {
return removeSense(baseContent, language, sectionType, sectionOrdinal, definitionLevel);
},
$save,
$note,
function () {
$li.addClass("dsb-sense-doomed");
return function () {
$li.removeClass("dsb-sense-doomed");
};
},
{ key: senseQueueKey() }
);
$note.show();
});
});
return $link;
}
// Only the links the row actually shows are built now; the dropdown's nine are 43% of the work and
// nobody sees them until "Hevmane û Bêhtir" is clicked, so buildMenuLinks() waits for that.
FIELD_DEFS.forEach(function (def) {
if (!def.primary) {
return;
}
$picker.append(makeFieldLink(def));
if (def.key === "gloss") {
$picker.append($nimune); // directly after "Maneyê biguhêre"
}
});
// Three sections, ruled apart: what labels this sense, the word lists that hang off it, and adding
// another sense. "Maneyê rake" is appended after these by makeDeleteLink() and so closes the last
// one. The word lists follow senseGroups' "order" -- that array's own order is the order the "#:"
// lines are written to the page in, which is not a reading order; the wizard's boxes read the same
// field, so both gadgets list them alike. Anything not named here still appears, after these, so a
// field added later is never silently dropped from the menu.
var MENU_GROUPS = [
["etiket", "kategori", "maneid"],
SENSE_GROUPS.slice().sort(function (a, b) {
return (a.order || 0) - (b.order || 0);
}).map(function (g) {
return "word:" + g.key;
}),
["newSense"]
];
var menuBuilt = false;
function buildMenuLinks() {
if (menuBuilt) {
return;
}
menuBuilt = true;
var byKey = {};
FIELD_DEFS.forEach(function (def) {
if (!def.primary) {
byKey[def.key] = def;
}
});
var placed = {};
MENU_GROUPS.forEach(function (group, groupIndex) {
var defs = group.map(function (key) {
return byKey[key];
}).filter(Boolean);
defs.forEach(function (def, i) {
placed[def.key] = true;
var $link = makeFieldLink(def);
// The rule goes on the first entry of every group after the first.
if (groupIndex > 0 && i === 0) {
$link.addClass("dsb-menu-group-start");
}
$moreMenu.append($link);
});
});
FIELD_DEFS.forEach(function (def) {
if (!def.primary && !placed[def.key]) {
$moreMenu.append(makeFieldLink(def));
}
});
$moreMenu.append(makeDeleteLink());
}
// Lives inside $picker (not appended straight to $quickRow) so .dsb-more-menu's CSS can position it as
// an overlay anchored to $picker, instead of pushing $openBoxes/the rest of the page down when it opens.
var $moreArrow = $("<span class='dsb-more-arrow'></span>").text("▸");
var $moreToggle = $("<a href='#' class='dsb-quick-link dsb-more-toggle'></a>")
.text(util.msg.moreMenu + " ").append($moreArrow);
$moreToggle.on("click", function (e) {
e.preventDefault();
buildMenuLinks();
$moreMenu.slideToggle(function () {
$moreArrow.text($moreMenu.is(":visible") ? "▾" : "▸");
});
});
$picker.append($moreToggle, $moreMenu);
// Outside clicks are handled by one shared document listener (see closeMoreMenus), not one per panel:
// hovering a sense builds its panel, so a long entry would otherwise accumulate dozens of them.
$moreMenu.data("dsbArrow", $moreArrow);
// -- combined save: whatever boxes are open right now, queued together via queueChange(); the actual
// save happens when the user clicks "Guhartinan qeyd bike" on the floating queue box. ----
// Small "not saved yet" preview of everything this queued change will do, appended right under the
// sense's gloss (plain text, not a real render of {{hevmane}}/etc.).
function collectChanges() {
var base = original || { maneid: "", etiket: [], kategori: [], words: {} };
var changed = {};
var words = {};
SENSE_GROUPS.forEach(function (group) {
var getter = getters["word:" + group.key];
words[group.key] = getter ? getter() : [];
if (getter && !sameList(words[group.key], base.words[group.key])) {
changed["word:" + group.key] = true;
}
});
var maneid = getters.maneid ? getters.maneid() : "";
var etiket = getters.etiket ? getters.etiket() : [];
var kategori = getters.kategori ? getters.kategori() : [];
if (getters.maneid && maneid !== (base.maneid || "")) {
changed.maneid = true;
}
if (getters.etiket && !sameList(etiket, base.etiket)) {
changed.etiket = true;
}
if (getters.kategori && !sameList(kategori, base.kategori)) {
changed.kategori = true;
}
return {
gloss: getters.gloss ? getters.gloss() : null,
newSense: getters.newSense ? getters.newSense() : null,
maneid: maneid,
etiket: etiket,
kategori: kategori,
words: words,
changed: changed
};
}
// Both the field save and "Maneyê rake" queue under this, so the later one supersedes the earlier.
function senseQueueKey() {
return "sense:" + sectionType + "|" + sectionOrdinal + "|" + definitionLevel.join(".");
}
var $save = $("<button type='button' class='dsb-save'></button>").text(util.msg.add);
// Where queueChange() writes its confirmation for actions that have no box of their own.
var $note = $("<div class='dsb-status dsb-quick-note'></div>").hide();
var $cancel = $("<button type='button' class='dsb-cancel'></button>").text(util.msg.cancel);
var $status = $("<span class='dsb-status'></span>");
var $actions = $("<div class='dsb-form-actions'></div>").append($save, $cancel, $status).hide();
$cancel.on("click", function () {
// Close the boxes too, not just the row. Hiding alone left every field still open with its
// text in it, so the next click on the pencil reopened the half-filled panel that had just
// been cancelled. Each box's own "x" already clears its getter, restores its link and updates
// the counter, so those are triggered rather than repeating the teardown here.
$openBoxes.find(".dsb-box-remove").trigger("click");
$note.hide().text("");
// dsb.js owns the pencil's pinned state; tell it rather than hiding behind its back, or the
// next click on the pencil would only toggle "pinned" off and appear to do nothing.
$quickRow.trigger("dsbCancel");
hideQueueIfIdle();
});
$save.on("click", function () {
var changes = collectChanges();
function afterLinkify() {
var parts = senseChangeLabels(changes);
queueChange(
placeLabel(language, sectionType, $h3),
parts.length
? parts.join(", ") + (parts.length > 1 ? " hatin guhartin" : " hate guhartin")
: "mane hate guhartin",
function (baseContent) {
return applyAdvancedChanges(baseContent, language, sectionType, sectionOrdinal, definitionLevel, changes);
},
$save,
$status,
function () {
var undoPreview = previewSense($li, language, sectionType, sectionOrdinal,
definitionLevel);
// A new sense has no place on the page yet, so it gets a row of its own directly
// after this one -- the list numbers it, so where it will land is visible.
var $newSense = null;
if (changes.newSense) {
$newSense = $("<li class='dsb-sense-preview'></li>");
$li.after($newSense);
fillWithRendered($newSense, changes.newSense, function () {
$newSense.text(changes.newSense);
});
}
return function () {
undoPreview();
if ($newSense) {
$newSense.remove();
}
};
},
// Re-saving this same sense supersedes its pending change rather than queuing another.
{ key: senseQueueKey() }
);
}
$save.prop("disabled", true);
// Auto-linkify the gloss as part of this save, but only a half nobody has linked by hand.
// Split back into its two halves first, so the explanation is linked on its own rather than
// sitting unseen inside {{îzah|…}}.
if (changes.gloss) {
$status.removeClass("dsb-status-ok dsb-status-error").text("Tê lînkkirin…");
var glossParts = util.splitTercimeIzah(changes.gloss);
linkifyGlossParts(
glossParts ? $.trim(glossParts.tercime) : changes.gloss,
glossParts ? $.trim(glossParts.izah) : "",
function (linkedMane, linkedIzah, error) {
// The change is queued either way, so a gloss that came back empty is not written
// back -- that would save the sense with its wording gone.
var joined = joinGloss(linkedMane, linkedIzah);
if ($.trim(joined)) {
changes.gloss = joined;
}
if (error) {
$status.removeClass("dsb-status-ok").addClass("dsb-status-error").text(error);
}
afterLinkify();
},
true
);
} else {
afterLinkify();
}
});
// The links sit under the buttons, so each open box pushes them down rather than leaving them far above.
$quickRow.empty().append($openBoxes, $actions, $picker, $note);
}
// Attaches the pencil toggle to one leaf definition <li> -- clicking it reveals the "guhartina pêşketî"
// (advanced editing) panel built by buildAdvancedPanel() above.
// ---- per-section UI: "+ Beşek lê zêde bike" after a POS block's own content ----
// Reads the header text of "====" subsections already rendered under this POS heading, straight from the DOM.
// The subsections of a part of speech are the headings one deeper than it is.
function subsectionDepthFor($h3) {
return (sections.headingDepth($h3) || 3) + 1;
}
function isSubsectionHeading($el, depth) {
return sections.headingDepth($el) === depth;
}
function existingSubsectionHeadersInDom($h3) {
var depth = subsectionDepthFor($h3);
var headers = [];
for (var $cursor = headingOuter($h3).next(); $cursor.length; $cursor = $cursor.next()) {
var here = sections.headingDepth($cursor);
if (here && here < depth) {
break; // out of this part of speech
}
if (isSubsectionHeading($cursor, depth)) {
var $hh = $cursor.is("h2, h3, h4, h5, h6") ? $cursor : $cursor.find("h2, h3, h4, h5, h6").first();
headers.push(headingText($hh));
}
}
return headers;
}
// Finds where a new "====" subsection preview belongs in the live DOM, using the same SUBSECTION_ORDER rank
// insertPageSubsection() uses. Returns {insertBefore: $el} (a ranked subsection that outranks this one) or
// {insertAfter: $el} (goes at the end of the block).
function domSubsectionInsertAnchor($h3, header) {
var depth = subsectionDepthFor($h3);
var myRank = subsectionRankForHeader(header);
var $last = headingOuter($h3);
for (var $cursor = headingOuter($h3).next(); $cursor.length; $cursor = $cursor.next()) {
var here = sections.headingDepth($cursor);
if (here && here < depth) {
break; // out of this part of speech
}
if (isSubsectionHeading($cursor, depth)) {
var $hh = $cursor.is("h2, h3, h4, h5, h6") ? $cursor : $cursor.find("h2, h3, h4, h5, h6").first();
var otherRank = subsectionRankForHeader(headingText($hh));
if (otherRank !== -1 && otherRank > myRank) {
return { insertBefore: $cursor };
}
}
$last = $cursor;
}
return { insertAfter: $last };
}
// The wikitext one subsection's content becomes, exactly as insertPageSubsection() writes it -- so the
// preview parses the same string the save will produce.
function subsectionBodyWikitext(language, s, content) {
if (s.kind !== "wordlist") {
return content;
}
return content.filter(function (group) {
return group.words.length;
}).map(function (group) {
return buildWordListCall(WORDLIST_TEMPLATE, language,
withNamedParam(["cure=" + s.header], "sernav", group.sernav), group.words);
}).join("\n\n");
}
// The plain word list this preview falls back to when the parse fails: the values that were typed,
// without the template around them. Right, but not what the page will look like.
function subsectionPlainDom($wrap, s, content) {
if (s.kind !== "wordlist") {
$wrap.append($("<p class='dsb-preview-text'></p>").text(content));
return;
}
content.forEach(function (group) {
if (group.sernav) {
$wrap.append($("<div class='dsb-preview-subheading'></div>").text(group.sernav));
}
var $list = $("<ul class='dsb-preview-list'></ul>");
group.words.forEach(function (w) {
$list.append($("<li></li>").text(w.replace(/<[^<>]*>/g, "")));
});
$wrap.append($list);
});
}
// A "not saved yet" preview of a page-level "====" subsection, dropped into the live page at the
// position the save will put it, with its body rendered the way the page renders it -- real {{kol3}}
// columns and real links, not a list of the words that went into them. Returns the inserted element so
// the caller can remove it again.
function buildSubsectionPreviewDom($h3, s, content, language) {
var $wrap = $("<div class='dsb-preview-block'></div>");
// A styled <div>, not a real <h4>, so existingSubsectionHeadersInDom() never mistakes this live-only
// preview for an actual subsection already on the page.
$wrap.append($("<div class='dsb-preview-heading' role='heading' aria-level='4'></div>").text(s.header));
$wrap.append($("<span class='dsb-preview-badge'></span>").text("nû — hîn nehatiye qeydkirin"));
// Placed before it is filled: a cached render resolves almost at once, and filling a wrap that is
// still detached would announce content nobody can see.
var anchor = domSubsectionInsertAnchor($h3, s.header);
if (anchor.insertBefore) {
anchor.insertBefore.before($wrap);
} else {
anchor.insertAfter.after($wrap);
}
var wikitext = language ? subsectionBodyWikitext(language, s, content) : "";
if ($.trim(wikitext)) {
var $body = $("<div class='dsb-preview-rendered'></div>").appendTo($wrap);
fillWithRendered($body, wikitext, function () {
$body.remove();
subsectionPlainDom($wrap, s, content);
});
} else {
subsectionPlainDom($wrap, s, content);
}
return $wrap;
}
// A free section owns what lies between its own heading and the next heading of any depth, matching
// the range locateHeadingByText() edits. Returns a function that puts the page back, or null.
function replaceFreeSectionInPlace($heading, wikitext) {
var $start = headingOuter($heading);
var body = [];
for (var $cursor = $start.next(); $cursor.length; $cursor = $cursor.next()) {
if (sections.headingDepth($cursor)) {
break;
}
if (!isOwnFurniture($cursor)) {
body.push($cursor.get(0));
}
}
if (!body.length) {
return null;
}
var $slot = $("<div class='dsb-sense-preview'></div>").insertAfter($start);
var $body = $(body).detach();
fillWithRendered($slot, wikitext, function () {
$slot.remove();
$slot = null;
$body.insertAfter($start);
});
return function () {
if ($slot) {
$body.insertAfter($start);
$slot.remove();
$slot = null;
}
};
}
/**
* Redraws a subsection that is already on the page with the content this edit would give it.
*
* The section's own nodes -- everything between its heading and the next heading of the same rank or
* higher -- are detached rather than dropped, so the returned function puts the page back exactly as it
* was when the change is cancelled or superseded.
*/
function replaceSubsectionInPlace($h3, header, wikitext) {
var depth = subsectionDepthFor($h3);
// Walked the same way existingSubsectionHeadersInDom() walks it, so "which nodes are this
// subsection" is decided once and the same way everywhere.
var $start = null;
var body = [];
for (var $cursor = headingOuter($h3).next(); $cursor.length; $cursor = $cursor.next()) {
var here = sections.headingDepth($cursor);
if (here && here < depth) {
break; // out of this part of speech
}
if (isSubsectionHeading($cursor, depth)) {
if ($start) {
break; // the next subsection starts here
}
var $hh = $cursor.is("h2, h3, h4, h5, h6") ? $cursor : $cursor.find("h2, h3, h4, h5, h6").first();
if (headingText($hh) === header) {
$start = $cursor;
}
continue;
}
// This gadget's own furniture stays where it is: the subsection's editing panel is the sibling
// right after its heading, so sweeping it into the body would detach the very panel the change
// was made in and leave the pencil toggling an element that is no longer on the page.
if ($start && !isOwnFurniture($cursor)) {
body.push($cursor.get(0));
}
}
if (!$start || !body.length) {
return null;
}
var $slot = $("<div class='dsb-sense-preview'></div>").insertAfter($start);
var $body = $(body).detach();
fillWithRendered($slot, wikitext, function () {
$slot.remove();
$slot = null;
$body.insertAfter($start);
});
return function () {
if ($slot) {
$body.insertAfter($start);
$slot.remove();
$slot = null;
}
};
}
/**
* The live DOM one "place" section occupies: {nodes, insert}. nodes are what a render replaces --
* empty when the section is not on the page yet -- and insert() puts an element where the section
* belongs, so a new one appears exactly where the save will put it.
*/
// This gadget's own panels sit between a heading and the page's content, so every walk steps over
// them rather than counting one as content.
function isOwnFurniture($el) {
return $el.is(".dsb-toolbar, .dsb-quick-row, .dsb-subsection-panel, .dsb-convert-pos-panel," +
" .dsb-preview-block, .dsb-sense-preview, .dsb-preview-inline");
}
// A heading's place in the page, which orders queued renames and removals bottom-up.
function headingPosition($el) {
var $h = $el.is("h2, h3, h4, h5, h6") ? $el : $el.find("h2, h3, h4, h5, h6").first();
return $("h2, h3, h4, h5, h6").index($h);
}
// One subsection's own nodes on the page, read the way headingSpan() reads the wikitext: a "===="
// subsection down to the next heading at its depth or shallower, a free section ($h3 is its heading)
// down to the next heading of any depth. hasDeeper says a free section has headings under it.
function subsectionDom($h3, s) {
var $start = null;
var depth;
if (s.free) {
$start = headingOuter($h3);
depth = sections.headingDepth($start) || sections.headingDepth($h3);
} else {
depth = subsectionDepthFor($h3);
for (var $c = headingOuter($h3).next(); $c.length; $c = $c.next()) {
var d = sections.headingDepth($c);
if (d && d < depth) {
break;
}
if (d === depth) {
var $hh = $c.is("h2, h3, h4, h5, h6") ? $c : $c.find("h2, h3, h4, h5, h6").first();
if (headingText($hh) === s.header) {
$start = $c;
break;
}
}
}
}
if (!$start) {
return null;
}
var body = [];
var hasDeeper = false;
for (var $cursor = $start.next(); $cursor.length; $cursor = $cursor.next()) {
var here = sections.headingDepth($cursor);
if (here && (s.free || here <= depth)) {
hasDeeper = !!s.free && here > depth;
break;
}
if (!isOwnFurniture($cursor)) {
body.push($cursor.get(0));
}
}
return { $heading: $start, $body: $(body), hasDeeper: hasDeeper };
}
function loosePlaceDom($h3, subsection) {
var place = subsection.place;
var nodes = [];
var $cursor;
if (place === "page-top") {
// Şablon:herwiha binêre renders as <div class="rellink binere"> at the head of the content.
var $out = $("#mw-content-text .mw-parser-output").first();
var $hat = $out.children(".binere, .rellink").first();
if ($hat.length) {
return { nodes: $hat.get(), insert: function ($el) { $hat.before($el); } };
}
return { nodes: [], insert: function ($el) { $out.prepend($el); } };
}
var $start = headingOuter($h3);
if (place === "pron") {
// A "===" heading above this POS block, under the language one.
for (var $back = $start.prev(); $back.length; $back = $back.prev()) {
if ($back.is(".mw-heading2, h2")) {
break;
}
if ($back.is(".mw-heading3, h3")) {
var $hh = $back.is("h3") ? $back : $back.find("h3").first();
if (headingText($hh) === subsection.header) {
for ($cursor = $back.next();
$cursor.length && !$cursor.is(".mw-heading2, .mw-heading3, h2, h3");
$cursor = $cursor.next()) {
if (!isOwnFurniture($cursor)) {
nodes.push($cursor.get(0));
}
}
return { nodes: nodes, insert: function ($el) { $back.after($el); } };
}
}
}
return { nodes: [], insert: function ($el) { $start.before($el); } };
}
if (place === "pos-top") {
// The thumbnails between the heading and the headword line.
for ($cursor = $start.next(); $cursor.length; $cursor = $cursor.next()) {
if (isOwnFurniture($cursor)) {
continue;
}
if (!$cursor.is(".thumb, figure, .floatright, .floatleft")) {
break;
}
nodes.push($cursor.get(0));
}
return { nodes: nodes, insert: function ($el) { $start.after($el); } };
}
return null;
}
// The wikitext a "place" section's pending content renders as. A word list is its one call; everything
// else is already the body that will be written.
function loosePlacePreviewWikitext(subsection, content, language) {
return subsection.kind === "wordlist"
? wt.buildHbnrCall(loosePlaceWords(content))
: loosePlaceBody(subsection, content, language);
}
// Draws a section's headword line from wikitext where the page's own line stands, or above the
// definitions when the section has none. The page's line is detached rather than dropped, so the
// returned function puts it back.
function replaceHeadwordInPlace($h3, wikitext) {
if (!$.trim(wikitext || "")) {
return null;
}
var $old = $();
var $at = $();
for (var $cursor = headingOuter($h3).next(); $cursor.length; $cursor = $cursor.next()) {
if ($cursor.is("p")) {
$old = $cursor;
break;
}
if (sections.headingDepth($cursor) || $cursor.is("ol")) {
$at = $cursor;
break;
}
}
var $slot = $("<div class='dsb-sense-preview'></div>");
if ($old.length) {
$old.before($slot);
} else if ($at.length) {
$at.before($slot);
} else {
return null;
}
var $body = $old.detach();
function restore() {
if (!$slot) {
return;
}
$body.insertBefore($slot);
$slot.remove();
$slot = null;
}
fillWithRendered($slot, wikitext, restore);
return restore;
}
// Redraws one of those places where it stands, the same way replaceSubsectionInPlace() redraws a
// "====" one. The page's own nodes are detached rather than dropped, so cancelling puts them back.
function replaceLoosePlaceInPlace($h3, subsection, wikitext) {
if (!$.trim(wikitext || "")) {
return null;
}
var at = loosePlaceDom($h3, subsection);
if (!at) {
return null;
}
var $slot = $("<div class='dsb-sense-preview'></div>");
at.insert($slot);
var $body = $(at.nodes).detach();
function restore() {
if (!$slot) {
return;
}
$body.insertBefore($slot);
$slot.remove();
$slot = null;
}
fillWithRendered($slot, wikitext, restore);
return restore;
}
// Builds the subsection picker + its word-list/text field. A subsection that isn't on the page yet is saved
// via insertPageSubsection(); one that already is gets prefilled and saved via updatePageSubsection().
// onlyHeader pins the panel to a single subsection (the per-heading pencil); omit it for the full picker.
// free pins the panel to a heading that is not a subsection of a part of speech, located by its own
// text: {header, ordinal}.
function buildSubsectionPanel($panel, $h3, language, sectionType, sectionOrdinal, onlyHeader, free) {
var existing = existingSubsectionHeadersInDom($h3);
// A heading the data does not name is still editable. It is declared a word list so the reader
// tries, in order, its {{kol3}} calls and then a plain bullet list; anything else falls through to
// raw wikitext, which is what prefill() does with a list it cannot read.
// Hidden counts as unknown here: the picker does not offer to build a Werger box, but one already
// on the page still opens, as the wikitext it is.
var unknown = onlyHeader && !PAGE_SUBSECTIONS.some(function (s) {
return s.header === onlyHeader && !s.hidden;
});
// A free section starts as wikitext: what it holds is only known once it has been read, and
// prefill() swaps in the {{kol3}} form there if it turns out to be a list.
var available = free ? [{
header: onlyHeader,
id: "free",
kind: "text",
free: free,
existing: true
}] : unknown ? [{
header: onlyHeader,
id: "unknown",
kind: "wordlist",
unknown: true,
existing: true
}] : PAGE_SUBSECTIONS.filter(function (s) {
// "hidden" takes a section out of the picker without removing it: Werger waits for the
// translation tools it belongs to, and offering a box those cannot yet fill misleads.
// Werger also carries lang: "ku" -- it is a Kurdish-entry section, so it is not offered
// elsewhere either.
return !s.hidden && (!s.lang || s.lang === language) &&
(!onlyHeader || s.header === onlyHeader);
}).map(function (s) {
return $.extend({}, s, { existing: existing.indexOf(s.header) !== -1 });
});
if (!available.length) {
$panel.text("Ji bo vê beşê guhartin tune.");
return;
}
var $select = $("<select class='dsb-subsection-select'></select>");
if (!onlyHeader) {
// Label-less on purpose: it holds the "nothing chosen yet" value without becoming a row in the
// list (makeSearchable() skips a blank option that has no label), so the prompt lives in the
// input's placeholder instead.
$select.append($("<option value=''></option>"));
}
available.forEach(function (s) {
// A "place" entry has no "====" heading of its own, so it is marked rather than left looking
// like the subsections around it.
var label = s.place ? s.header + " (ne binebeş e)"
: (s.existing ? s.header + " (biguhêre)" : s.header);
$select.append($("<option></option>").val(s.id).text(label));
});
var $selectWrap = makeSearchable($select, "Binebeşek hilbijêre");
if (onlyHeader) {
$selectWrap.hide(); // pinned to one subsection: nothing to choose
}
var $fieldWrap = $("<div class='dsb-subsection-field'></div>");
var $save = $("<button type='button' class='dsb-save'></button>").text(util.msg.add);
var $cancel = $("<button type='button' class='dsb-cancel'></button>").text(util.msg.cancel);
var $status = $("<span class='dsb-status'></span>");
var $actions = $("<div class='dsb-form-actions'></div>").append($save, $cancel, $status);
$cancel.on("click", function () {
resetForm();
$panel.hide();
hideQueueIfIdle();
});
// A panel pinned to a heading on the page can rename or remove it. Bilêvkirin and the other places
// have no heading of their own to change.
var headingEditable = !!onlyHeader && available.length === 1 && available[0].existing && !available[0].place;
var $nameWrap = null;
// Only a panel pinned to one heading renames it; elsewhere the name is the picked subsection's own.
var readName = function (s) {
return s.header;
};
if (headingEditable) {
var subject = available[0];
var $nameLabel = $("<div class='dsb-adv-label'>Nav</div>");
if (subject.free) {
var $nameInput = $("<input type='text' class='dsb-input dsb-heading-name'>").val(onlyHeader);
readName = function () {
return $.trim($nameInput.val());
};
$nameWrap = $("<div class='dsb-heading-name-wrap'></div>").append($nameLabel, $nameInput);
} else {
// The names the gadget knows, for a subsection of a part of speech; one this part of speech
// already has is left out.
var $nameSelect = $("<select class='dsb-heading-name'></select>");
var names = [onlyHeader];
PAGE_SUBSECTIONS.forEach(function (s) {
if (!s.place && !s.hidden && (!s.lang || s.lang === language) &&
names.indexOf(s.header) === -1 && existing.indexOf(s.header) === -1) {
names.push(s.header);
}
});
names.forEach(function (name) {
$nameSelect.append($("<option></option>").val(name).text(name));
});
var $nameSearch = makeSearchable($nameSelect, "Nav");
$nameSelect.val(onlyHeader).trigger("wiktku:refresh");
readName = function () {
return $nameSelect.val() || onlyHeader;
};
$nameWrap = $("<div class='dsb-heading-name-wrap'></div>").append($nameLabel, $nameSearch);
}
var subjectDom = subsectionDom($h3, subject);
if (!(subjectDom && subjectDom.hasDeeper)) {
var $delete = $("<button type='button' class='dsb-delete'>Beşê jê bibe</button>");
$cancel.after($delete);
$delete.on("click", function () {
OO.ui.confirm("Beşa «" + subject.header + "» dê were rakirin. Dewam bike?").done(function (ok) {
if (!ok) {
return;
}
queueHeadingChange(subject, "beşa «" + subject.header + "» hate rakirin",
function (pageContent) {
return removeSubsection(pageContent, language, sectionType, sectionOrdinal, subject);
},
function () {
var dom = subsectionDom($h3, subject);
if (!dom) {
return null;
}
var $doomed = dom.$heading.add(dom.$body).addClass("dsb-preview-removed");
return function () {
$doomed.removeClass("dsb-preview-removed");
};
});
});
});
}
}
// Renaming and removing share one queue key, so the later choice replaces the earlier one. Both run
// last and bottom-up, since other queued changes find the section by the heading they change.
function queueHeadingChange(s, action, transform, previewFn) {
var dom = subsectionDom($h3, s);
queueChange(subsectionPlaceLabel(s, language, sectionType, $h3), action,
function (pageContent) {
return { content: transform(pageContent), warnings: [] };
},
$save, $status, previewFn,
{
runLast: true,
key: "heading:" + (s.free ? s.header + "|" + s.free.ordinal
: sectionType + "|" + sectionOrdinal + "|" + s.header),
pagePosition: dom ? headingPosition(dom.$heading) : 0
});
}
function queueRename(s, newName) {
queueHeadingChange(s, "beşa «" + s.header + "» bû «" + newName + "»",
function (pageContent) {
return renameSubsection(pageContent, language, sectionType, sectionOrdinal, s, newName);
},
function () {
var dom = subsectionDom($h3, s);
if (!dom) {
return null;
}
var $note = $("<div class='dsb-preview-inline dsb-preview-heading-note'></div>")
.text("→ " + newName + " — nû, hîn nehatiye qeydkirin");
dom.$heading.after($note);
return function () {
$note.remove();
};
});
}
// Undefined while the placeholder option is selected.
function currentSubsection() {
var id = $select.val();
return id ? available.filter(function (s) {
return s.id === id;
})[0] : undefined;
}
// One entry per "{{kol3}}" group in the current wordlist section; empty for any other kind.
var groupFields = [];
var $groups = null;
var editAsText = false; // set when an existing wordlist section turns out to be unparseable
// Whatever has been typed into each subsection's box, so switching the picker away and back restores it
// instead of rebuilding an empty field. Keyed by subsection id; lastId is whichever box is on screen.
var drafts = {};
var lastId = null;
// Called before renderField() rebuilds, while the group fields still hold the outgoing box.
function captureDraft() {
if (!lastId) {
return;
}
drafts[lastId] = imagesField
? { asText: false, images: imagesField.values() }
: (groupFields.length
? { asText: false, groups: readGroups() }
: { asText: editAsText, text: fieldText() });
}
function restoreDraft(s, draft) {
// An existing wordlist we previously fell back to raw wikitext for stays in that mode.
if (draft.asText && s.kind === "wordlist") {
editAsText = true;
groupFields = [];
renderTextArea(s, 6);
}
if (imagesField) {
imagesField.setValues(draft.images);
} else if (groupFields.length) {
setGroups(s, draft.groups);
} else {
setFieldText(draft.text);
}
}
// Etîmolojî is edited on a live surface (see renderChipSurface) rather than in a textarea, so every
// read and write of the field goes through these two instead of touching .dsb-subsection-text.
var chipSurface = null;
function fieldText() {
if (wergerForm) {
return buildWergerBlock(wergerForm.read());
}
return chipSurface
? $.trim(readChipSurface(chipSurface.get(0)))
: $.trim($fieldWrap.find(".dsb-subsection-text").val() || "");
}
function setFieldText(value) {
if (wergerForm) {
wergerForm.set(parseWergerBlock(value));
return;
}
if (chipSurface) {
renderChipSurface(chipSurface, value || "");
var schedule = chipSurface.data("dsbSchedulePreview");
if (schedule) {
schedule(); // show what the loaded etymology renders as
}
} else {
$fieldWrap.find(".dsb-subsection-text").val(value || "");
}
}
// The contenteditable surface: text typed directly, template calls as chips that open the dialog,
// plus start.js's etymology templates in a searchable insert menu.
// A live surface where a template shows as a chip, with a menu that inserts one. Etîmolojî and
// Bilêvkirin are both written this way; they differ only in which templates the menu offers.
function renderTemplateEditor(s, templates) {
$fieldWrap.empty();
var $select = $("<select class='dsb-subsection-select'></select>");
$select.append($("<option value=''></option>"));
templates.forEach(function (t) {
$select.append($("<option></option>").val(t.snippet).text(t.name + " — " + t.desc));
});
var $surface = $("<div class='dsb-tpl-surface' contenteditable='true'></div>")
.attr("role", "textbox")
.attr("aria-multiline", "true");
chipSurface = $surface;
// Clicking the insert menu moves focus out of the surface and the browser forgets the caret, so
// the last caret position inside the surface is kept and restored before inserting -- otherwise
// focus() drops it back to the very start and every template lands at the beginning of the line.
var savedRange = null;
function rememberCaret() {
var sel = window.getSelection();
if (!sel || !sel.rangeCount) {
return;
}
var range = sel.getRangeAt(0);
var root = $surface.get(0);
if (range.commonAncestorContainer === root || $.contains(root, range.commonAncestorContainer)) {
savedRange = range.cloneRange();
}
}
$surface.on("keyup mouseup focusout", rememberCaret);
function restoreCaret() {
if (!savedRange) {
return;
}
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(savedRange);
}
$select.on("change", function () {
var snippet = $select.val();
if (!snippet) {
return;
}
// Same substitution start.js makes: CODE is this section's language, SOURCELANG is left for
// the user to fill in.
snippet = snippet.replace(/CODE/g, language).replace(/SOURCELANG/g, "?");
// A pronunciation template is a bullet of its own ("* {{ku-IPA}}"), so it starts a line
// rather than landing in the middle of one.
var ownLine = /^\*\s/.test(snippet);
if (ownLine) {
snippet = $.trim(snippet.replace(/^\*\s*/, ""));
}
$surface.focus();
restoreCaret();
var $chip = makeTemplateChip(snippet);
var piece = document.createDocumentFragment();
if (ownLine) {
// The bullet, and a line of its own unless the caret already starts one.
var at = caretOffset();
var before = at >= 0 ? readChipSurface($surface.get(0)).slice(0, at) : "";
piece.appendChild(document.createTextNode(!before || /\n$/.test(before) ? "* " : "\n* "));
}
piece.appendChild($chip.get(0));
insertAtCaret($surface, piece);
rememberCaret(); // so a second insert lands after the first, not back at the old spot
$select.val("");
// Straight into the dialog: the snippet is placeholders ("?", "…") until someone fills it in.
cite.openTemplateDialog(snippet).then(function (edited) {
applyChipEdit($chip, edited);
syncPanelWidth();
});
});
// Paste as plain text: pasted markup would otherwise become real nodes in the surface.
$surface.on("paste", function (e) {
var clip = e.originalEvent && e.originalEvent.clipboardData;
if (!clip) {
return;
}
e.preventDefault();
document.execCommand("insertText", false, clip.getData("text/plain"));
});
// The chip the dialog was opened for, or the one that has taken its place. renderChipSurface()
// rebuilds the surface from its wikitext whenever a call is typed in as text, which throws away
// the element this closure is holding; without this, "Jê bibe" would remove a node that is no
// longer on screen and appear to do nothing.
function liveChip($chip, wikitext) {
if ($.contains($surface.get(0), $chip.get(0))) {
return $chip;
}
return $surface.find(".dsb-tpl-chip").filter(function () {
return $(this).attr("data-wikitext") === wikitext;
}).first();
}
function applyChipEdit($chip, edited) {
if (edited === null || !$chip.length) {
return;
}
if (!$.trim(edited)) {
$chip.remove();
return;
}
// Edited into something that is no longer one template call: let it fall back to plain text
// rather than keeping a chip that lies about its contents.
var call = parseTemplateCalls(edited);
if (call.otherContent || call.calls.length !== 1) {
$chip.replaceWith(document.createTextNode(edited));
return;
}
$chip.replaceWith(makeTemplateChip(edited));
}
// Double-click edits the call's wikitext in place; single click opens the parameter dialog. The
// click is held back briefly so the first of a double-click does not open the dialog underneath.
var chipClickTimer = null;
var lastChipTap = 0;
var lastChipNode = null;
var DOUBLE_TAP_MS = 300;
// Double-tap drops the chip back to plain wikitext in the surface, rather than making the chip
// itself editable: a contenteditable inside a contenteditable gives Android a selection handle and
// no usable caret. As plain text the browser's own editing works, and chipifyTyped() puts the chip
// back once the caret leaves the call.
// A collapsed caret inside the text just inserted: at the character tapped where the browser can
// say which that is, otherwise just inside the closing braces so the caret stays within the call
// (which is what stops chipifyTyped putting the chip straight back).
function caretRangeIn(node, event) {
var range;
var x = event && event.clientX;
var y = event && event.clientY;
if (x !== undefined && document.caretRangeFromPoint) {
range = document.caretRangeFromPoint(x, y);
} else if (x !== undefined && document.caretPositionFromPoint) {
var pos = document.caretPositionFromPoint(x, y);
if (pos) {
range = document.createRange();
range.setStart(pos.offsetNode, pos.offset);
}
}
if (range && range.startContainer === node) {
range.collapse(true);
return range;
}
var text = node.nodeValue;
range = document.createRange();
range.setStart(node, /\}\}$/.test(text) ? text.length - 2 : text.length);
range.collapse(true);
return range;
}
function startInlineEdit($chip, event) {
if (!$.contains($surface.get(0), $chip.get(0))) {
return; // the tap timer and dblclick can both fire; only the first one has a chip left
}
var node = document.createTextNode($chip.attr("data-wikitext"));
$chip.replaceWith(node);
$surface.get(0).focus();
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(caretRangeIn(node, event));
}
// Bound before the chip's own handler and stopping there, so removing a call never opens the
// dialog for it on the way out.
$surface.on("click", ".dsb-tpl-chip-remove", function (e) {
e.preventDefault();
e.stopImmediatePropagation();
clearTimeout(chipClickTimer);
lastChipNode = null;
$(this).closest(".dsb-tpl-chip").remove();
syncPanelWidth();
});
$surface.on("click keydown", ".dsb-tpl-chip", function (e) {
if (e.type === "keydown" && e.which !== 13 && e.which !== 32) {
return;
}
e.preventDefault();
var $chip = $(this);
clearTimeout(chipClickTimer);
// A second tap on the same chip edits it inline. Timed here rather than left to "dblclick",
// which mobile browsers fire unreliably or not at all for a double-tap.
var now = new Date().getTime();
if (lastChipNode === this && now - lastChipTap < DOUBLE_TAP_MS) {
lastChipNode = null;
startInlineEdit($chip, e);
return;
}
lastChipTap = now;
lastChipNode = this;
var wikitext = $chip.attr("data-wikitext");
chipClickTimer = setTimeout(function () {
cite.openTemplateDialog(wikitext).then(function (edited) {
applyChipEdit(liveChip($chip, wikitext), edited);
syncPanelWidth();
});
}, DOUBLE_TAP_MS);
});
$surface.on("dblclick", ".dsb-tpl-chip", function (e) {
e.preventDefault();
clearTimeout(chipClickTimer);
startInlineEdit($(this), e);
});
// A long etymology cannot be read in the panel's usual 520px column, so the panel drops its
// width cap once there is enough text to need it. What it will look like is shown by the
// in-place render on the page itself, not by a second copy inside the form.
var WIDE_AT = 240; // characters
function syncPanelWidth() {
var wikitext = readChipSurface($surface.get(0));
if (wikitext.length > WIDE_AT || wikitext.indexOf("\n") !== -1) {
$surface.closest(".dsb-subsection-panel").addClass("dsb-panel-wide");
}
}
// A template typed by hand becomes a chip once typing settles, so it behaves like an inserted one:
// click for the parameter dialog, double-click for its raw wikitext.
var composing = false;
// The caret as an offset into the surface's wikitext, which is what survives rebuilding the DOM.
function caretOffset() {
var sel = window.getSelection();
var root = $surface.get(0);
if (!sel || !sel.rangeCount) {
return -1;
}
var range = sel.getRangeAt(0);
if (range.startContainer !== root && !$.contains(root, range.startContainer)) {
return -1; // caret is somewhere else on the page
}
var pre = document.createRange();
pre.selectNodeContents(root);
pre.setEnd(range.startContainer, range.startOffset);
var holder = document.createElement("div");
holder.appendChild(pre.cloneContents());
return readChipSurface(holder).length;
}
// Puts the caret back at that wikitext offset. Only runs straight after a rebuild, so the surface
// holds nothing but text nodes and chips.
function placeCaret(offset) {
var root = $surface.get(0);
var range = document.createRange();
var nodes = root.childNodes;
root.focus();
for (var i = 0; i < nodes.length; i++) {
var node = nodes[i];
var len = node.nodeType === 3
? node.nodeValue.length
: ($(node).attr("data-wikitext") || $(node).text()).length;
if (offset <= len) {
if (node.nodeType === 3) {
range.setStart(node, offset);
} else {
range.setStartAfter(node); // a chip is atomic; the caret goes after it
}
break;
}
offset -= len;
}
if (!range.startContainer || range.startContainer === document) {
range.selectNodeContents(root);
}
range.collapse(true);
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
}
// True when the selection overlaps the inside of a template call. A caret resting exactly at the
// closing "}}" does not count -- that is someone who has just finished typing one.
function selectionTouchesCall(wikitext) {
var sel = window.getSelection();
if (!sel || !sel.rangeCount) {
return false;
}
var range = sel.getRangeAt(0);
var root = $surface.get(0);
if (range.startContainer !== root && !$.contains(root, range.startContainer)) {
return false;
}
var from = caretOffset();
var to = from;
if (!range.collapsed) {
var pre = document.createRange();
pre.selectNodeContents(root);
pre.setEnd(range.endContainer, range.endOffset);
var holder = document.createElement("div");
holder.appendChild(pre.cloneContents());
to = readChipSurface(holder).length;
}
return parseTemplateCalls(wikitext).calls.some(function (call) {
return from < call.end && to > call.start;
});
}
function chipifyTyped() {
if (composing) {
return; // never rebuild under an IME
}
var wikitext = readChipSurface($surface.get(0));
// Chips already hold one call each, so a higher call count means one was typed in as text.
if (parseTemplateCalls(wikitext).calls.length <= $surface.find(".dsb-tpl-chip").length) {
return;
}
var offset = caretOffset();
if (selectionTouchesCall(wikitext)) {
return; // still inside a call: leave it as text until the caret moves out
}
renderChipSurface($surface, wikitext);
savedRange = null; // the old range points at nodes that no longer exist
if (offset >= 0) {
placeCaret(offset);
rememberCaret();
}
}
$surface.on("compositionstart", function () {
composing = true;
});
$surface.on("compositionend", function () {
composing = false;
schedulePreview();
});
var previewTimer = null;
function schedulePreview() {
clearTimeout(previewTimer);
previewTimer = setTimeout(function () {
chipifyTyped();
syncPanelWidth();
}, 700);
}
$surface.on("input", schedulePreview);
$surface.data("dsbSchedulePreview", schedulePreview);
$fieldWrap.append(makeSearchable($select, util.msg.addTemplate), $surface);
// Bilêvkirin is written in IPA, so it gets the same character palette the wizard shows. Its
// characters go in as text and its two template buttons as chips, which is what the rest of
// this surface is made of.
if (s.place === "pron") {
$fieldWrap.append(util.buildIpaPalette({
insertText: function (text) {
$surface.focus();
restoreCaret();
insertAtCaret($surface, document.createTextNode(text));
rememberCaret();
schedulePreview();
},
insertTemplate: function (snippet) {
$surface.focus();
restoreCaret();
var $chip = makeTemplateChip(snippet.replace(/\|\s*\}\}$/, "}}"));
insertAtCaret($surface, $chip.get(0));
rememberCaret();
cite.openTemplateDialog($chip.attr("data-wikitext")).then(function (edited) {
applyChipEdit($chip, edited);
syncPanelWidth();
});
}
}));
}
}
// The three "place" sections are wikitext with a shape worth spelling out, since nothing on screen
// says what belongs in the box.
var PLACE_PLACEHOLDERS = {
"page-top": "{{h-bnr|Kelîme|Kelîmeyeke din}} an jî {{herwiha binêre/ane}}",
"pos-top": "[[Wêne:Navê pelî.jpg|thumb|Binnivîs]]",
"pron": "* {{ku-IPA}}"
};
function renderTextArea(s, rows) {
$fieldWrap.empty().append(
$("<textarea class='dsb-input dsb-subsection-text'></textarea>")
.attr("rows", rows)
.attr("placeholder", PLACE_PLACEHOLDERS[s.place] || (s.header + "…"))
);
util.initManualResize($fieldWrap);
}
// A translation box: the {{werger-ser}}/{{werger-bin}} pair, with the sense it covers and the
// layout parameters that template accepts. The rows in between are left to the translation editor
// gadget, which is what edits them on the rendered page.
// Reads and writes through fieldText()/setFieldText() as wikitext, so drafts, save and the queue
// need no special case beyond the append below.
var wergerForm = null;
var imagesField = null;
function renderWergerField(s) {
var inputs = {};
// Its own row class rather than .dsb-tpl-param-row: that one is styled in cite.css, which is
// only on the page when wikt.cite happens to be loaded, and without it the label falls back to
// sitting inline and a short one ("id") is overlapped by its own box.
function row(key, label, placeholder) {
inputs[key] = $("<input type='text' class='dsb-input'>").attr("placeholder", placeholder || "");
return $("<div class='dsb-werger-row'></div>").append(
$("<label class='dsb-adv-label'></label>").text(label).append(inputs[key])
);
}
// {{werger-ser}} also takes stûn, firehî, bgcolor, valign and align, but they only restyle the
// box and its defaults are what these pages use, so the form does not offer them. They are
// still in WERGER_NAMED, so a block that already sets one is read back correctly.
var $main = $("<div class='dsb-werger-main'></div>").append(
row("1", "Mane", "ava vexwarinê"),
row("2", "Mane no", "ne mecbûrî — di parantezê de xuya dike"),
row("id", "id", "ne mecbûrî — IDya tercimeyê")
);
var $note = $("<p class='dsb-werger-note'></p>").text(
"Qutiyeke Wergerê ya vala lê zêde dikî. Tercimeyan bi amûra wergerê dûre binivîse."
);
wergerForm = {
read: function () {
var out = {};
$.each(inputs, function (key, $input) {
var value = $.trim($input.val() || "");
if (value) {
out[key] = value;
}
});
return out;
},
set: function (params) {
$.each(inputs, function (key, $input) {
$input.val((params && params[key]) || "");
});
}
};
$fieldWrap.empty().append($note, $main);
}
// Same [[Kategorî:Çavkanî]] search widget start.js's own picker uses: choosing an entry inserts
// "* {{Target}}" at the cursor. The field itself stays the plain ".dsb-subsection-text" textarea
// every other "kind: text" subsection already uses, so save/prefill/drafts need no changes.
function renderCavkaniField(s) {
var $ta = $("<textarea class='dsb-input dsb-subsection-text'></textarea>")
.attr("rows", 4)
.attr("placeholder", util.msg.pickOrTypeTemplate);
var picker = cite.buildCategoryTemplateSearch({
placeholder: util.msg.addTemplate,
describe: true,
// Same param dialog Etîmolojî opens on a fresh insert: filled from the picked template's own
// TemplateData, so the user adds "rûpel=", "sernav=", ... before anything lands in the field
// rather than typing a bare {{Target}} and going back to fill params in by hand.
onPick: function (entry) {
cite.openTemplateDialog("{{" + entry.target + "}}").then(function (edited) {
if (!edited) {
return; // cancelled, or "Jê bibe" on a call that was never inserted
}
util.insertAtCursor($ta.get(0), "* " + edited + "\n");
$ta.trigger("focus");
});
}
});
var $picker = $("<div class='dsb-cavkani-picker'></div>").append(picker.$element);
$fieldWrap.empty().append($picker, $ta);
}
// One "{{kol3}}" group: its "sernav=" heading and its words. Several of these make up one section --
// "Herwiha binêre" typically carries an unheaded list plus a few headed ones.
function addGroup(s, group) {
var $sernav = $("<input type='text' class='dsb-input'>").attr("placeholder", "ne mecbûrî…");
// {{h-bnr}} takes bare page names, so its rows carry no ⊕: there is nowhere in the call for a
// modifier to go.
var words = buildWordListField(s.header + "…", { modifiers: !s.single });
var $remove = $("<a href='#' class='dsb-quick-link dsb-group-remove'>Komê rake</a>");
var $element = $("<div class='dsb-wordgroup'></div>").append(
// Label beside the box, not above it: stacked, "Sernav" read as a heading for the whole
// group rather than as the name of the field under it. The input is nested in the label so
// clicking the word focuses the box, without needing an id per group.
// A single-call list has no "sernav=" to carry, so the row is built (readGroups still reads
// it) but never shown. Hidden here rather than in renderField: setGroups() rebuilds every
// group on prefill, which would put a visible one back.
$("<div class='dsb-tpl-param-row dsb-param-row-inline'></div>").append(
$("<label class='dsb-adv-label'></label>").text("Sernav").append($sernav)
).toggle(!s.single),
words.$element,
$remove
);
var field = {
$element: $element,
read: function () {
return { sernav: $.trim($sernav.val()), words: words.values() };
},
set: function (g) {
$sernav.val((g && g.sernav) || "");
words.setValues((g && g.words) || []);
}
};
$remove.on("click", function (e) {
e.preventDefault();
var at = $.inArray(field, groupFields);
if (at !== -1) {
groupFields.splice(at, 1);
}
$element.remove();
updateGroupChrome();
});
field.set(group);
groupFields.push(field);
$groups.append($element);
updateGroupChrome();
return field;
}
// With a single group there is nothing to tell apart, so it needs neither a remove link nor a label.
function updateGroupChrome() {
var many = groupFields.length > 1;
$groups.toggleClass("dsb-wordgroups-many", many);
$groups.find(".dsb-group-remove").toggle(many);
}
function readGroups() {
return groupFields.map(function (field) {
return field.read();
});
}
// Rebuilds the blocks to match what the page (or the draft) holds, always leaving at least one.
function setGroups(s, groups) {
groupFields = [];
$groups.empty();
(groups && groups.length ? groups : [null]).forEach(function (group) {
addGroup(s, group);
});
}
// Loads what the page already has into the form, so an edit starts from the current list rather than
// from an empty one. A wordlist section we can't parse degrades to raw wikitext editing.
function prefill(s) {
$status.removeClass("dsb-status-error dsb-status-ok").text("Tê barkirin…");
$save.prop("disabled", true);
fetchPageSubsection(language, sectionType, sectionOrdinal, s).then(function (current) {
$save.prop("disabled", false);
$status.text("");
if (!current) {
return;
}
// A "place" section has no heading of its own, so whether the page already has one cannot
// be seen in the DOM the way a "====" subsection can -- it is known only once its content
// has been read. That is what decides "nûkirin" or "zêdekirin" in the edit summary.
if (s.place) {
s.existing = !!(current.images ? current.images.length : $.trim(current.text || ""));
// The label was set before this content arrived, when nothing yet said one was there.
$save.text(s.existing && s.kind !== "werger" ? util.msg.edit : util.msg.add);
}
if (current.kind === "images" && imagesField) {
imagesField.setValues(current.images);
return;
}
// A free section's field was built before its content was known: a list turns it into the
// {{kol3}} form, anything else leaves it the wikitext box it already is.
if (s.free && current.kind === "wordlist" && !groupFields.length) {
s.kind = "wordlist";
renderWordListField(s);
setGroups(s, current.groups);
if (current.fromBullets) {
$status.text("Ev lîste made bi made hatiye nivîsîn — bi qeydkirinê dibe {{kol3}}.");
}
return;
}
if (current.kind === "wordlist" && groupFields.length) {
setGroups(s, current.groups);
if (current.fromBullets) {
$status.text("Ev lîste made bi made hatiye nivîsîn — bi qeydkirinê dibe {{kol3}}.");
}
return;
}
if (s.kind === "wordlist") {
editAsText = true;
groupFields = [];
renderTextArea(s, 6);
$status.text(s.unknown
? "Ev beş nayê naskirin — wekî wîkîtekst tê guhartin."
: "Şablona vê lîsteyê nehate naskirin — wekî wîkîtekst biguhêre.");
}
setFieldText(current.text);
}, function () {
$save.prop("disabled", false);
$status.addClass("dsb-status-error").text("Nikare muhtewaya heyî bixwîne.");
}).then(function () {
if (currentSubsection() === s) {
loadedSnapshot = contentSnapshot();
}
});
}
// What the box held when the page's content was put in it, so a save that changed nothing queues
// nothing -- renaming a heading does not also rewrite its body.
var loadedSnapshot = null;
function contentSnapshot() {
if (imagesField) {
return JSON.stringify(imagesField.values());
}
return JSON.stringify(groupFields.length ? readGroups() : fieldText());
}
// One "{{kol3}}" group per block, plus a way out to raw wikitext for a list no row can express --
// a shared subpage list like {{herwiha binêre/ane}}, say.
function renderWordListField(s) {
$fieldWrap.empty();
chipSurface = null;
editAsText = false;
var $addGroup = $("<a href='#' class='dsb-quick-link'>+ Komek lê zêde bike</a>");
$addGroup.on("click", function (e) {
e.preventDefault();
addGroup(s, null);
});
$groups = $("<div class='dsb-wordgroups'></div>");
$fieldWrap.append($groups, $addGroup);
addGroup(s, null);
// One call takes one flat list of names, so there is no second group to add.
if (s.single) {
$addGroup.hide();
}
var $toRaw = $("<a href='#' class='dsb-quick-link'>Wekî wîkîtext biguhêre</a>");
$toRaw.on("click", function (e) {
e.preventDefault();
var current = s.place
? wt.buildHbnrCall(loosePlaceWords(readGroups()))
: subsectionBodyWikitext(language, s, readGroups());
editAsText = true;
groupFields = [];
$groups = null;
renderTextArea(s, 3);
setFieldText(current);
util.initManualResize($fieldWrap);
});
$fieldWrap.append($toRaw);
util.initManualResize($fieldWrap);
}
function renderField() {
var s = currentSubsection();
loadedSnapshot = null;
$fieldWrap.empty();
groupFields = [];
$groups = null;
editAsText = false;
chipSurface = null;
wergerForm = null;
imagesField = null;
$status.removeClass("dsb-status-error dsb-status-ok").text("");
// Save stays disabled (but "Betal bike" usable) until something is actually chosen.
$save.prop("disabled", !s);
if (!s) {
$save.text(util.msg.add);
lastId = null;
return; // still on "Binebeşekê hilbijêre"
}
if (s.kind === "wordlist") {
renderWordListField(s);
} else if (s.kind === "images") {
imagesField = util.buildImageListField({
prefix: "dsb-",
rowClass: "dsb-tpl-param-row dsb-param-row-inline",
inputClass: "dsb-input",
addClass: "dsb-quick-link",
pageName: mw.config.get("wgTitle")
});
$fieldWrap.append(imagesField.$element);
} else if (s.header === "Etîmolojî") {
renderTemplateEditor(s, templateChoices("etymTpls", language));
} else if (s.place === "pron") {
renderTemplateEditor(s, templateChoices("pronTpls", language));
} else if (s.kind === "werger") {
renderWergerField(s);
} else if (s.header === "Çavkanî") {
renderCavkaniField(s);
} else {
renderTextArea(s, 3);
}
// Werger always adds a box, even to a section that is already there, so its button never says
// "Biguhêre".
$save.text(s.existing && s.kind !== "werger" ? util.msg.edit : util.msg.add);
// Covers whichever branch above built the field. Idempotent, so a textarea already carrying a
// grip is skipped.
util.initManualResize($fieldWrap);
lastId = s.id;
// A draft always wins over re-reading the page: it is the newer, unsaved state.
if (drafts[s.id]) {
restoreDraft(s, drafts[s.id]);
} else if ((s.existing || s.place) && s.kind !== "werger") {
prefill(s);
}
}
$select.on("change", function () {
captureDraft();
renderField();
});
renderField();
// Back to the state a fresh open would show: no draft, no picked subsection. Called directly
// rather than through the "change" handler above, so the discarded draft is never captured first.
function resetForm() {
drafts = {};
if (!onlyHeader) {
$select.val("").trigger("wiktku:refresh");
}
renderField();
}
$save.on("click", function () {
var s = currentSubsection();
if (!s) {
return;
}
var newName = readName(s);
if (!newName) {
$status.removeClass("dsb-status-ok").addClass("dsb-status-error").text("Navê beşê vala ye.");
return;
}
var asText = editAsText || (s.kind !== "wordlist" && s.kind !== "images");
var effective = asText ? $.extend({}, s, { kind: "text" }) : s;
var content;
var hasContent;
if (asText) {
content = fieldText();
hasContent = !!content;
} else if (s.kind === "images") {
content = imagesField ? imagesField.values() : [];
hasContent = content.length > 0;
} else {
content = readGroups();
hasContent = content.some(function (group) { return group.words.length; });
}
var renaming = newName !== s.header;
if (renaming) {
queueRename(s, newName);
}
var unchanged = loadedSnapshot !== null && contentSnapshot() === loadedSnapshot;
if (!hasContent || unchanged) {
if (unchanged && !renaming) {
$status.removeClass("dsb-status-ok").addClass("dsb-status-error").text("Tiştek nehatiye guhartin.");
}
return;
}
$save.prop("disabled", true);
// A Werger section holds any number of boxes, so an existing one is appended to rather than
// replaced; every other kind edits the single body it owns.
var appending = s.kind === "werger" && s.existing;
queueChange(
subsectionPlaceLabel(s, language, sectionType, $h3),
s.kind === "werger"
? "qutiyeke wergerê hate zêdekirin"
: "beşa «" + s.header + "» hate " + (s.existing ? "nûkirin" : "zêdekirin"),
function (pageContent) {
var body = content;
if (appending) {
var current = readPageSubsection(pageContent, language, sectionType, sectionOrdinal, effective);
var existingText = current ? $.trim(current.text || "") : "";
body = existingText ? existingText + "\n\n" + content : content;
}
return {
content: s.free
? updateFreeSection(pageContent, language, effective, body)
: (s.place
? writeLoosePlace(pageContent, language, sectionType, sectionOrdinal, effective,
loosePlaceBody(effective, body, language))
: (s.existing
? updatePageSubsection(pageContent, language, sectionType, sectionOrdinal, effective, body)
: insertPageSubsection(pageContent, language, sectionType, sectionOrdinal, effective, body))),
warnings: []
};
},
$save,
$status,
// Werger is a box the translation tools fill in afterwards, so there is nothing to draw for
// it. A new subsection gets a block of its own at the position it will land in; one already
// on the page is redrawn where it stands.
s.kind === "werger" ? null : function () {
// A free section is redrawn under its own heading, which is the element the panel hangs
// on.
if (s.free) {
var restoreFree = replaceFreeSectionInPlace($h3,
subsectionBodyWikitext(language, effective, content));
return function () {
if (restoreFree) {
restoreFree();
restoreFree = null;
}
};
}
// A "place" section has no heading to redraw between, so it is found in the DOM by what
// it renders as and replaced there.
if (s.place) {
var restoreLoose = replaceLoosePlaceInPlace($h3, effective,
loosePlacePreviewWikitext(effective, content, language));
return function () {
if (restoreLoose) {
restoreLoose();
restoreLoose = null;
}
};
}
if (!s.existing) {
var $preview = buildSubsectionPreviewDom($h3, s, content, language);
return function () {
$preview.remove();
};
}
var restore = replaceSubsectionInPlace($h3, effective.header,
subsectionBodyWikitext(language, effective, content));
return function () {
if (restore) {
restore();
restore = null;
}
};
},
{ key: s.free
? "section:" + s.header + "|" + s.free.ordinal
: "subsection:" + sectionType + "|" + sectionOrdinal + "|" + s.header }
);
});
$panel.empty().append($selectWrap, $nameWrap, $fieldWrap, $actions);
}
// Builds the "choose a part of speech" picker that reclassifies a section -- an unclassified
// "=== Mane ===" placeholder, or a "=== Biwêj ===" that turns out to be a real part of speech. Saved via
// convertSectionToPos(); lists every name from sectionNames except the one the section already is.
function buildConvertPosPanel($panel, $h3, language, sectionType, sectionOrdinal) {
var $select = $("<select class='dsb-convert-pos-select'></select>");
// Label-less, like the subsection picker's: it holds the "nothing chosen yet" value without showing
// up as a row, so the prompt lives in the input's placeholder instead.
$select.append($("<option value=''></option>"));
Object.keys(sectionNames).forEach(function (name) {
// The section's own part of speech is listed too, marked: picking it changes nothing about the
// heading and leaves the parameters below to be edited on their own.
$select.append($("<option></option>").val(name)
.text(name === sectionType ? name + " (ya niha)" : name));
});
var $selectWrap = makeSearchable($select, "Li cureyekî rêzimanî bigere");
// Opens on the section's own part of speech, so editing only its parameters needs no pick.
if (sectionNames[sectionType]) {
$select.val(sectionType).trigger("wiktku:refresh");
}
// The same card the entry wizard shows under its part-of-speech question -- gender, transitivity,
// the transliteration boxes and everything behind "Tercîhên pêşketî". Shared from
// wikt.edit/posparams.js, so reclassifying a section here offers exactly what creating one in the
// wizard does.
var card = posparams.build({ lang: language, pos: "" });
// Opened on the call the section already has, so this edits the current template rather than
// starting from a blank line. setContext() rebuilds the line whenever the part of speech moves,
// so the prefill is only the starting point.
var spec0 = posTemplateFor(sectionType);
card.setContext(language, spec0 ? spec0.name : "", /^Formeke /.test(sectionType));
fetchPageContent().then(function (pageContent) {
try {
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var found = findPosTemplateLine(loc.lines, loc.posLineIndex, sectionType);
if (found.index !== -1 && ($select.val() || sectionType) === sectionType) {
card.setWikitext(found.text);
}
} catch (e) { /* an unreadable section just leaves the card as it was */ }
});
$select.on("change", function () {
var spec = posTemplateFor($select.val());
card.setContext(language, spec ? spec.name : "", /^Formeke /.test($select.val() || ""));
});
// "gh" on its own, or "<form>-<base>" once a structural form is picked -- start.js's own composition.
// convertSectionToPos() writes the template itself, so only what follows "{{pos|lang" is wanted
// from the card's line.
function posParams() {
var m = /^\{\{[^|}]*\|[^|}]*\|?([\s\S]*)\}\}$/.exec(card.wikitext());
return m ? m[1] : "";
}
var $save = $("<button type='button' class='dsb-save'></button>").text(util.msg.add);
var $cancel = $("<button type='button' class='dsb-cancel'></button>").text(util.msg.cancel);
var $status = $("<span class='dsb-status'></span>");
var $actions = $("<div class='dsb-form-actions'></div>").append($save, $cancel, $status);
// dsb.js owns the pencil and the panel's built state, so it does the closing.
$cancel.on("click", function () {
$panel.trigger("dsbCancel");
hideQueueIfIdle();
});
$save.on("click", function () {
var chosen = $select.val();
if (!chosen) {
$status.removeClass("dsb-status-ok").addClass("dsb-status-error").text("Pêşî cureyekî rêzimanî hilbijêre.");
return;
}
var params = posParams();
$save.prop("disabled", true);
$status.removeClass("dsb-status-error").text("");
queueChange(
langLabel(language),
"beşa «" + sectionLabel(sectionType, $h3) + "» bû «" + chosen + "»",
function (pageContent) {
return { content: convertSectionToPos(pageContent, language, sectionType, sectionOrdinal, chosen, params), warnings: [] };
},
$save,
$status,
function () {
// The heading keeps its text, which every other queued change finds the section by; a
// note under it names the new one. The headword line is drawn as the save will write it.
var $note = $("<div class='dsb-preview-inline dsb-preview-heading-note'></div>")
.text("→ " + chosen + (params ? " (" + params + ")" : "") + " — nû, hîn nehatiye qeydkirin");
headingOuter($h3).after($note);
var dropped = false;
var restoreHeadword = null;
fetchPageContent().then(function (pageContent) {
if (dropped) {
return;
}
var call;
try {
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
call = posCallLine(findPosTemplateLine(loc.lines, loc.posLineIndex, sectionType),
language, chosen, params);
} catch (e) {
return;
}
restoreHeadword = replaceHeadwordInPlace($h3, call);
});
return function () {
dropped = true;
$note.remove();
if (restoreHeadword) {
restoreHeadword();
restoreHeadword = null;
}
};
},
// Runs after every other queued change: it renames the "Mane" heading those changes locate
// themselves by, so anything edited on this section has to be applied first.
{ runLast: true, key: "convert:" + sectionType + "|" + sectionOrdinal, pagePosition: headingPosition($h3) }
);
});
$panel.empty().append($selectWrap, card.$element, $actions);
}
// Attaches the "+ Beşek lê zêde bike" trigger right after a POS block's own last element.
// Puts the same pencil the definitions use on every existing "====" subsection heading the gadget knows how
// to edit, opening buildSubsectionPanel() pinned to that one subsection.
module.exports = {
buildAdvancedPanel: buildAdvancedPanel,
buildSubsectionPanel: buildSubsectionPanel,
buildConvertPosPanel: buildConvertPosPanel,
editExample: editExample,
clearQueue: clearQueue,
closeAllPanels: closeAllPanels,
openQueueBox: openQueueBox
};
}());
// </nowiki>
fynxq22uwjg4hvllodyqzzjbn8dxcd1
Bikarhêner:Wikihez/Gadget-test/dsb-panels.css
2
1358910
6532599
6531986
2026-09-19T09:00:27Z
Wikihez
7344
DefSideBoxes: keep the pending-changes box under an open dialog
6532599
css
text/css
/* <nowiki> */
/*
* Page: [[MediaWiki:Gadget-wikt.dsb-panels.css]]
*/
/* ── Searchable select ───────────────────────────────────────────────
The native <select> is hidden inside the wrapper and still holds the value; the input filters the list. */
.dsb-ac-wrap {
position: relative;
display: block;
}
.dsb-ac-input {
width: 100%;
box-sizing: border-box;
}
.dsb-ac-results {
position: absolute;
z-index: 30;
top: 100%;
left: 0;
right: 0;
max-height: 260px;
margin: 2px 0 0;
padding: 4px;
overflow-y: auto;
list-style: none;
font-family: var(--wikt-sans);
font-size: 13px;
background: var(--wikt-field-bg);
border: 1px solid var(--wikt-field-edge);
border-radius: var(--wikt-r-field);
box-shadow: 0 6px 18px rgba(0, 0, 0, 0.12);
}
.dsb-ac-results li {
padding: 6px 8px;
border-radius: 6px;
cursor: pointer;
}
.dsb-ac-results li:hover,
.dsb-ac-results li.dsb-ac-active {
background: var(--wikt-accent-tint);
}
/* ── Etîmolojî editing surface ───────────────────────────────────────
A contenteditable line of wikitext: text is typed straight into it, template calls sit in it as chips. */
.dsb-tpl-surface {
min-height: 72px;
margin-top: 6px;
padding: 8px 10px;
font-family: var(--wikt-sans);
font-size: 14px;
line-height: 1.6;
color: var(--wikt-ink);
white-space: pre-wrap;
word-wrap: break-word;
background: var(--wikt-field-bg);
border: 1px solid var(--wikt-field-edge);
border-radius: var(--wikt-r-field);
}
.dsb-tpl-surface:focus {
outline: none;
border-color: var(--wikt-accent);
box-shadow: 0 0 0 2px var(--wikt-accent-tint);
}
/* The chips: visibly not prose, and atomic to the caret. */
/* Takes the call off the line without going through the parameter dialog -- on a phone there is no
reliable backspace onto a contenteditable="false" chip. */
.dsb-tpl-chip-remove {
position: relative;
margin-left: 5px;
padding: 0 2px;
font-family: var(--wikt-sans);
font-size: 13px;
line-height: 1;
color: var(--wikt-accent-deep);
opacity: 0.6;
cursor: pointer;
}
.dsb-tpl-chip-remove:hover {
color: var(--wikt-danger);
opacity: 1;
}
/* The glyph stays small; the tap target grows invisibly around it. */
@media (max-width: 720px), (pointer: coarse) {
.dsb-tpl-chip-remove {
opacity: 1;
}
.dsb-tpl-chip-remove::after {
content: "";
position: absolute;
inset: -10px -8px;
}
}
.dsb-tpl-chip {
display: inline-block;
margin: 0 1px;
padding: 1px 6px;
font-family: var(--wikt-mono);
font-size: 12.5px;
color: var(--wikt-accent-deep);
max-width: 100%;
white-space: normal;
overflow-wrap: anywhere;
vertical-align: baseline;
background: var(--wikt-accent-tint);
border: 1px solid var(--wikt-accent-edge);
border-radius: var(--wikt-r-pill);
touch-action: manipulation;
cursor: pointer;
user-select: none;
}
.dsb-tpl-chip:hover,
.dsb-tpl-chip:focus {
background: var(--wikt-field-bg);
border-color: var(--wikt-accent);
outline: none;
}
/* ── Template parameter form ─────────────────────────────────────────
.dsb-tpl-name/-desc/-param-row/-help/-undocumented/-modifier-list and the deprecated-label override now
live in cite.css (wikt.cite's own stylesheet): buildTemplateParamForm() moved there so start.js's own
Etîmolojî/Çavkanî pickers can open the same dialog. */
/* One-line variant: label beside its box rather than above it, for a single field whose name would
otherwise read as a heading for everything below it (the word groups' "Sernav"). */
.dsb-param-row-inline > .dsb-adv-label {
display: flex;
gap: 8px;
align-items: center;
}
/* Sernav is optional and names the group; the word boxes under it are what the form is actually for.
Letting it stretch to the full row made the one thing you may leave blank the widest box on the
card, so it takes only the space its own content needs. */
.dsb-param-row-inline .dsb-input {
flex: 0 1 auto;
width: 12em;
max-width: 40%;
/* .dsb-input's own 16em floor would win over the width above and make this the widest box on the
card, which is the opposite of the point. */
min-width: 0;
max-width: 100%;
min-width: 0;
}
.dsb-gloss-raw {
font-size: 12px;
}
/* Disclosure arrow on "Hevmane û Bêhtir", flipped when the menu is open. */
.dsb-more-arrow {
font-size: 10px;
vertical-align: 1px;
}
/* The POS panel's follow-up questions (cinsiyet / lektur): label above its select, like the field boxes. */
.dsb-pos-param-row {
display: flex;
flex-direction: column;
gap: 4px;
margin-top: 8px;
}
/* ── "Guhartina pêşketî" (advanced editing) panel ──────────────────────
Revealed by the pencil toggle above: every per-sense action this gadget offers, queued together with one
"Lê zêde bike". A plain inline row, not a bordered/background card. */
.dsb-quick-row {
display: flex;
flex-direction: column;
align-items: stretch;
gap: 4px;
box-sizing: border-box;
max-width: 520px;
margin: 4px 0 0 16px;
font-family: var(--wikt-sans);
font-size: 12px;
color: var(--wikt-ink-2);
}
.dsb-quick-link {
align-self: flex-start;
margin-bottom: 10px;
font-size: 12px;
color: var(--wikt-accent);
text-decoration: none;
white-space: nowrap;
cursor: pointer;
}
/* The links under a word list ("+ Komek lê zêde bike", "Wekî wîkîtext biguhêre") sit in the field wrap
rather than in a flex column, so they need their own spacing or they run together. */
.dsb-subsection-field > .dsb-quick-link {
display: inline-block;
margin-right: 14px;
}
.dsb-quick-link:hover,
.dsb-quick-link:focus {
color: var(--wikt-accent-deep);
text-decoration: underline;
}
/* The picker row: gloss + the two primary word groups as direct "+ <field>" links, plus a "Hevmane û Bêhtir" toggle
for the rest -- clicking a link opens its box above the buttons and hides the link; .dsb-box-remove un-hides it.
position: relative anchors .dsb-more-menu's overlay below (see there). */
.dsb-field-picker {
position: relative;
display: flex;
flex-wrap: wrap;
align-items: baseline;
gap: 4px 14px;
}
.dsb-field-picker .dsb-quick-link {
margin-bottom: 0;
}
/* Under the buttons once a box is open: a little space so the links do not read as part of the buttons. */
.dsb-open-boxes:not(:empty) ~ .dsb-field-picker {
margin-top: 8px;
}
/* The "Hevmane û Bêhtir" dropdown: every non-primary field link (plus Nimûne/jêgirtin, which sits first) stacked as a
plain vertical list. Floats over the page as an overlay (positioned against .dsb-field-picker) instead of
pushing $openBoxes/the rest of the definition down when it opens. */
.dsb-more-menu {
position: absolute;
top: 100%;
left: 0;
z-index: 10;
display: flex;
flex-direction: column;
align-items: flex-start;
width: max-content;
max-width: min(320px, calc(100vw - 40px));
gap: 6px;
margin: 2px 0 0 4px;
padding: 8px 12px;
background: var(--wikt-card);
border: 1px solid var(--wikt-rule);
border-radius: var(--wikt-r-field);
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.06);
}
.dsb-more-menu .dsb-quick-link {
margin-bottom: 0;
}
/* Boxes the user has actually opened, stacked in the order they were added -- several can be open at once. */
.dsb-open-boxes {
display: flex;
flex-direction: column;
}
/* Nothing open: take it out of the flow so the links do not sit above an empty gap. */
.dsb-open-boxes:empty {
display: none;
}
/* One field (its label + input) within the panel -- always a currently-open, removable box. */
.dsb-adv-group {
position: relative;
margin-bottom: 14px;
padding-right: 20px;
}
.dsb-adv-label {
margin-bottom: 4px;
font-size: 12px;
font-weight: 600;
color: var(--wikt-ink-3);
}
/* The example sentence beside a word list's name: same text the wizard shows, so it reads as the
quieter half of the label rather than a second heading. */
.dsb-adv-hint {
margin-left: 6px;
font-weight: 400;
font-style: italic;
color: var(--wikt-muted);
}
/* The shared image rows (util.js's buildImageListField): one label + box per line, like the parameter
rows above them. Three identical boxes twice over is unreadable without a break between them, so each
image is its own block with its own name. */
.dsb-resim-list {
margin: 0;
padding-left: 0;
}
.dsb-resim-item {
list-style: none;
margin-top: 12px;
padding-top: 12px;
border-top: 1px solid var(--wikt-rule-soft);
}
.dsb-resim-item:first-child {
margin-top: 0;
padding-top: 0;
border-top: 0;
}
.dsb-resim-index {
margin-bottom: 6px;
font-size: 12px;
font-weight: 600;
color: var(--wikt-ink-3);
}
.dsb-box-remove {
position: absolute;
top: 0;
right: 0;
color: var(--wikt-ink-3);
text-decoration: none;
font-size: 14px;
line-height: 1;
cursor: pointer;
}
.dsb-box-remove:hover,
.dsb-box-remove:focus {
color: var(--wikt-accent-deep);
}
.dsb-form-actions {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
}
.dsb-input {
box-sizing: border-box;
min-width: 16em;
padding: 6px 10px;
font-family: var(--wikt-sans);
font-size: 13px;
color: var(--wikt-ink);
background: var(--wikt-field-bg);
border: 1px solid var(--wikt-field-edge);
border-radius: var(--wikt-r-field);
transition: border-color 0.12s ease, box-shadow 0.12s ease;
}
/* The native corner is replaced by util.js's grip (see wikt-edit.css), which drags vertically only and
remembers the height. */
.dsb-subsection-panel textarea.dsb-input,
.dsb-adv-group textarea.dsb-input {
resize: none;
}
.dsb-input::placeholder {
color: var(--wikt-placeholder);
opacity: 1;
}
.dsb-input:focus {
border-color: var(--wikt-accent);
box-shadow: 0 0 0 3px var(--wikt-accent-tint);
outline: 0;
}
/* ── Plain tag field (Etîket, Kategorî) ────────────────────────────────
Plain type-and-commit tags with no suggestion panel; unlike Hevmane/Dijmane/etc., these carry no modifiers. */
.dsb-tagfield {
box-sizing: border-box;
display: inline-flex;
flex-wrap: wrap;
align-items: center;
gap: 6px;
min-width: 16em;
padding: 4px 6px;
background: var(--wikt-field-bg);
border: 1px solid var(--wikt-field-edge);
border-radius: var(--wikt-r-field);
transition: border-color 0.12s ease, box-shadow 0.12s ease;
}
.dsb-tagfield:focus-within {
border-color: var(--wikt-accent);
box-shadow: 0 0 0 3px var(--wikt-accent-tint);
}
.dsb-tag {
display: inline-flex;
align-items: center;
gap: 6px;
background: var(--wikt-accent-tint);
color: var(--wikt-accent-deep);
border: 1px solid var(--wikt-accent-edge);
border-radius: var(--wikt-r-pill);
font-size: 12px;
padding: 3px 6px 3px 10px;
}
.dsb-tag-remove {
border: 0;
background: transparent;
color: var(--wikt-muted);
font-size: 13px;
line-height: 1;
cursor: pointer;
padding: 0 2px;
}
.dsb-tag-remove:hover {
color: var(--wikt-danger);
}
.dsb-tagfield .dsb-input {
flex: 1 1 8em;
min-width: 8em;
border: 0;
padding: 3px 2px;
background: transparent;
box-shadow: none;
}
.dsb-tagfield .dsb-input:focus {
box-shadow: none;
}
.dsb-save,
.dsb-cancel,
.dsb-delete,
.dsb-autolink {
font-family: var(--wikt-sans);
font-size: 13px;
font-weight: 500;
padding: 6px 14px;
border-radius: var(--wikt-r-pill);
cursor: pointer;
transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease;
}
/* One filled pill per row — the same rule the form's footer follows. */
.dsb-save {
background: var(--wikt-accent);
border: 1px solid var(--wikt-accent);
color: #fff;
}
.dsb-save:hover {
background: var(--wikt-accent-deep);
border-color: var(--wikt-accent-deep);
}
.dsb-save:disabled {
opacity: 0.55;
cursor: progress;
}
.dsb-cancel {
background: transparent;
border: 1px solid transparent;
color: var(--wikt-ink-3);
}
.dsb-cancel:hover {
border-color: var(--wikt-field-edge);
color: var(--wikt-ink);
}
/* Removing a heading: plain like Betal bike, in the danger colour, pushed to the far end of the row. */
.dsb-delete {
margin-left: auto;
background: transparent;
border: 1px solid transparent;
color: var(--wikt-danger);
}
.dsb-delete:hover {
border-color: var(--wikt-danger);
}
/* The heading's name, above the section's own box. */
.dsb-heading-name-wrap {
margin-bottom: 10px;
}
/* A heading queued for removal, with everything it owns, until the queue is saved or the change dropped. */
.dsb-preview-removed {
opacity: 0.5;
text-decoration: line-through;
text-decoration-color: var(--wikt-danger);
}
/* An outline pill, distinct from both the filled .dsb-save and the plain-text .dsb-cancel -- a secondary
utility action, not the primary save nor a dismissal. */
.dsb-autolink {
background: transparent;
border: 1px solid var(--wikt-accent-edge);
color: var(--wikt-accent);
}
.dsb-autolink:hover {
border-color: var(--wikt-accent);
color: var(--wikt-accent-deep);
}
.dsb-autolink:disabled {
opacity: 0.55;
cursor: progress;
}
/* Status line. Color comes from .dsb-status-ok/.dsb-status-error (added by the .js on success/failure)
rather than an inline style, so these tokens (and dark mode) apply. */
.dsb-status {
font-family: var(--wikt-sans);
font-size: 12.5px;
color: var(--wikt-muted);
}
.dsb-status-ok { color: var(--wikt-ok); }
.dsb-status-error { color: var(--wikt-danger); }
/* ── "+ Beşek lê zêde bike" ──────────────────────────────────────────
An accent-coloured action link, like the form's .wiktku-adv-toggle:
it opens something, so it is not muted grey. */
/* iOS Safari zooms the page in whenever a field it focuses has text under 16px, and everything here is
12-13px for density. On touch the form controls go up to the size that stops it; the pointer query
leaves the desktop layout alone. */
@media (pointer: coarse) {
.dsb-input,
.dsb-tag-input,
.dsb-subsection-select,
.dsb-convert-pos-select {
font-size: 16px;
}
/* Full width, whatever the viewport reports: a phone asked to render the desktop site says ~980px and
would otherwise leave these at their desktop size. */
.dsb-subsection-panel .dsb-input,
.dsb-subsection-panel .dsb-subsection-select,
.dsb-convert-pos-panel .dsb-convert-pos-select {
width: 100%;
max-width: 100%;
}
/* Sernav is the exception: it names the group, so it stays visibly smaller than the boxes it heads.
The cap matters more than the em width -- at 16px, 12em came out the same size as a word box. */
.dsb-subsection-panel .dsb-param-row-inline .dsb-input {
width: 8em;
max-width: 40%;
}
}
/* The image rows reuse the inline row, but nothing here is optional the way a group's "Sernav" is:
a file name and a caption want the whole row. */
.dsb-resim-list .dsb-param-row-inline > .dsb-adv-label,
.dsb-resim-list .dsb-tpl-param-row > label {
display: flex;
gap: 8px;
align-items: center;
}
.dsb-resim-list .dsb-param-row-inline .dsb-input,
.dsb-resim-list .dsb-tpl-param-row .dsb-input {
flex: 1 1 auto;
width: auto;
max-width: 100%;
}
/* ── Subsection panel ────────────────────────────────────────────────
A sunken card rather than a grey utility box; fields stack so the
picker and its input are not competing for one narrow row. */
.dsb-subsection-select,
.dsb-convert-pos-select {
box-sizing: border-box;
width: 100%;
max-width: 100%;
padding: 6px 10px;
font-family: var(--wikt-sans);
font-size: 13px;
color: var(--wikt-ink);
background: var(--wikt-field-bg);
border: 1px solid var(--wikt-field-edge);
border-radius: var(--wikt-r-field);
}
.dsb-subsection-select:focus,
.dsb-convert-pos-select:focus {
border-color: var(--wikt-accent);
box-shadow: 0 0 0 3px var(--wikt-accent-tint);
outline: 0;
}
/* The template-insert picker sits above the Çavkanî textarea, not in place of it -- a little breathing
room so the two don't read as one control. */
.dsb-cavkani-picker {
margin-bottom: 6px;
}
.dsb-subsection-field {
min-width: 0;
}
.dsb-subsection-words,
.dsb-subsection-text {
box-sizing: border-box;
width: 100%;
min-width: 0;
}
.dsb-subsection-text {
line-height: 1.6;
resize: vertical;
}
/* ── Gloss field inside the advanced-editing panel ────────────────────
Same shape as .dsb-subsection-text. */
.dsb-edit-gloss {
width: 100%;
line-height: 1.6;
resize: vertical;
}
/* ── Live "not saved yet" previews ─────────────────────────────────────
Dropped into the rendered page at the change's own spot. Dashed edge + a small badge mark them as
pending, not real content; they disappear on "Betal bike" or once the real save lands. */
.dsb-preview-block,
.dsb-preview-inline {
margin: 8px 0;
padding: 8px 12px;
font-family: var(--wikt-sans);
font-size: 13px;
color: var(--wikt-ink-2);
background: var(--wikt-accent-tint);
border: 1px dashed var(--wikt-accent-edge);
border-radius: var(--wikt-r-field);
}
.dsb-preview-inline {
margin-left: 26px;
max-width: 520px;
}
.dsb-preview-heading {
margin: 0 0 4px;
font-size: 15px;
font-weight: 600;
color: var(--wikt-ink);
}
.dsb-preview-badge {
display: inline-block;
margin-bottom: 6px;
padding: 1px 8px;
font-size: 11px;
font-weight: 500;
color: var(--wikt-accent-deep);
background: var(--wikt-card);
border: 1px solid var(--wikt-accent-edge);
border-radius: var(--wikt-r-pill);
}
/* Parser output goes in here, so it drops the panel's own font and colour and takes the page's \u2014 the
point of the box is that what is inside it looks exactly like what will be saved. */
.dsb-preview-rendered,
.dsb-preview-rendered-inline {
font-family: inherit;
font-size: 14px;
color: var(--wikt-ink);
}
.dsb-preview-rendered-inline {
display: inline;
}
.dsb-preview-rendered-inline .mw-parser-output,
.dsb-preview-rendered-inline .mw-parser-output > p {
display: inline;
}
.dsb-preview-list,
.dsb-preview-text {
margin: 0;
padding-left: 18px;
}
.dsb-preview-text {
padding-left: 0;
}
/* ── Floating save-queue widget ─────────────────────────────────────
This gadget's own small floating box. One "Lê zêde bike" click anywhere on the page adds a line here;
"Guhertinan qeyd bike" makes the one real save; "Betal bike" drops everything queued without touching the page. */
.dsb-queue-box {
position: fixed;
top: 60px;
right: 16px;
/* Under an OOUI dialog (z-index 450), which on a phone fills the screen: above it, this box sat over
the form it belongs to. Still over everything in the article. */
z-index: 400;
box-sizing: border-box;
width: 280px;
max-width: calc(100vw - 32px);
max-height: calc(100vh - 90px);
overflow-y: auto;
padding: 12px 14px;
font-family: var(--wikt-sans);
font-size: 13px;
color: var(--wikt-ink-2);
background: var(--wikt-card);
border: 1px solid var(--wikt-accent);
border-radius: var(--wikt-r-card);
box-shadow: 0 4px 18px rgba(0, 0, 0, 0.16);
}
.dsb-queue-title {
margin-right: 20px;
font-size: 13px;
font-weight: 600;
color: var(--wikt-ink);
}
.dsb-queue-close {
float: right;
color: var(--wikt-ink-3);
text-decoration: none;
font-size: 14px;
line-height: 1;
cursor: pointer;
}
.dsb-queue-close:hover,
.dsb-queue-close:focus {
color: var(--wikt-accent-deep);
}
/* Stands in for the list before anything is queued, saying what the save button is for. */
.dsb-queue-empty {
margin: 8px 0;
font-size: 12px;
line-height: 1.5;
color: var(--wikt-ink-3);
}
.dsb-queue-list {
margin: 8px 0;
padding-left: 18px;
max-height: 160px;
overflow-y: auto;
}
.dsb-queue-list li {
margin-bottom: 4px;
}
/* Drops one queued change. Dim until its line is hovered, so the list stays a list and not a row of
buttons. */
.dsb-queue-drop {
margin-left: 6px;
padding: 0 3px;
border: 0;
background: transparent;
color: var(--wikt-muted);
font-size: 13px;
line-height: 1;
cursor: pointer;
opacity: 0;
transition: opacity 0.12s ease, color 0.12s ease;
}
.dsb-queue-list li:hover .dsb-queue-drop,
.dsb-queue-drop:focus {
opacity: 1;
}
.dsb-queue-drop:hover {
color: var(--wikt-danger);
opacity: 1;
}
/* No hover on touch, so the button is simply there. */
@media (hover: none), (pointer: coarse) {
.dsb-queue-drop {
opacity: 1;
}
}
.dsb-queue-actions {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 4px;
}
.dsb-queue-save,
.dsb-queue-cancel {
font-family: var(--wikt-sans);
font-size: 13px;
font-weight: 500;
padding: 6px 14px;
border-radius: var(--wikt-r-pill);
cursor: pointer;
transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease;
}
.dsb-queue-save {
background: var(--wikt-accent);
border: 1px solid var(--wikt-accent);
color: #fff;
}
.dsb-queue-save:hover {
background: var(--wikt-accent-deep);
border-color: var(--wikt-accent-deep);
}
.dsb-queue-save:disabled {
opacity: 0.55;
cursor: progress;
}
.dsb-queue-cancel {
background: transparent;
border: 1px solid var(--wikt-field-edge);
color: var(--wikt-ink-3);
}
.dsb-queue-cancel:hover {
border-color: var(--wikt-ink-3);
color: var(--wikt-ink);
}
.dsb-queue-status {
margin-top: 6px;
font-size: 12.5px;
color: var(--wikt-muted);
}
.dsb-queue-status.dsb-status-ok { color: var(--wikt-ok); }
.dsb-queue-status.dsb-status-error { color: var(--wikt-danger); }
/* ── Minerva (mobile) ────────────────────────────────────────────────
Narrower viewport: keep the panel on screen and give every tap
target the form's 44px minimum. */
@media (max-width: 720px), (pointer: coarse) {
.dsb-quick-row {
font-size: 13px;
margin-left: 20px;
}
.dsb-input,
.dsb-subsection-select,
.dsb-convert-pos-select {
min-height: 40px;
/* >=16px stops iOS Safari zooming the page on focus. */
font-size: 16px;
}
.dsb-tagfield .dsb-input {
min-height: 32px;
}
.dsb-tag-remove {
padding: 0 6px;
}
.dsb-save,
.dsb-cancel,
.dsb-autolink,
.dsb-queue-save,
.dsb-queue-cancel {
min-height: 40px;
padding: 8px 16px;
}
.dsb-queue-box {
top: auto;
bottom: 8px;
right: 8px;
left: 8px;
width: auto;
}
}
/* ── Dark mode ───────────────────────────────────────────────────────
Same warm dark palette and same explicit-signal-only rule as the
form's stylesheet: no bare prefers-color-scheme fallback, since
legacy Vector sets no theme class and would go dark on its own. */
html.skin-theme-clientpref-night .dsb-save,
html.skin-nightmode .dsb-save,
html.skin-theme-clientpref-night .dsb-queue-save,
html.skin-nightmode .dsb-queue-save {
color: #14213a;
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .dsb-save,
html.skin-theme-clientpref-os .dsb-queue-save {
color: #14213a;
}
}
/* Rules the menu's three sections apart (see MENU_GROUPS). */
.dsb-more-menu .dsb-menu-group-start {
margin-top: 7px;
padding-top: 7px;
border-top: 1px solid var(--wikt-rule-soft);
}
/* Deleting a sense is destructive, so it reads in the danger colour -- but it shares the last section
with "Maneyeke din zêde bike" (both act on the sense itself), so it carries no rule of its own. */
.dsb-more-menu .dsb-field-delete {
color: var(--wikt-danger);
}
.dsb-more-menu .dsb-field-delete:hover,
.dsb-more-menu .dsb-field-delete:focus {
color: var(--wikt-danger);
text-decoration: underline;
}
/* A sense queued for deletion, struck through until the queue is saved or the change dropped. */
li.dsb-sense-doomed {
text-decoration: line-through;
text-decoration-color: var(--wikt-danger);
}
li.dsb-sense-doomed .dsb-quick-row {
text-decoration: none;
}
/* Queue confirmation for row actions that have no field box of their own. */
.dsb-quick-note {
display: block;
margin-top: 6px;
}
/* Dropped by anything that cannot live in a 520px column: a long etymology, and a word list wide
enough to have gone to two columns. */
.dsb-subsection-panel.dsb-panel-wide {
max-width: none;
}
/* Word-list groups: one "{{kol3}}" per block, told apart only when there is more than one. */
.dsb-wordgroups-many .dsb-wordgroup {
padding-top: 10px;
border-top: 1px solid var(--wikt-rule-soft);
}
.dsb-wordgroups-many .dsb-wordgroup:first-child {
padding-top: 0;
border-top: 0;
}
.dsb-group-remove {
color: var(--wikt-danger);
}
/* A sernav-headed group inside an unsaved-section preview. */
.dsb-preview-subheading {
margin-top: 6px;
font-weight: 600;
}
/* ── Werger box form ──
The {{werger-ser}} parameters. Reuses .dsb-input / .dsb-adv-label from the other panels; only the
note and the disclosure body need anything of their own. */
.dsb-werger-note {
margin: 0 0 10px;
color: var(--wikt-muted);
font-size: 12px;
line-height: 1.5;
}
.dsb-werger-main {
display: flex;
flex-direction: column;
gap: 10px;
}
/* The box is nested inside its label, so it is made a block to sit under the label text instead of
beside it -- inline, a short label like "id" ends up behind its own box. */
.dsb-werger-row .dsb-adv-label {
display: block;
margin-bottom: 0;
}
.dsb-werger-row .dsb-input {
display: block;
width: 100%;
margin-top: 4px;
}
/* ── Îzaha maneyî ──
Opens under the Mane box; the two are one gloss, so it sits tight against it. */
.dsb-izah-wrap {
margin-top: 6px;
}
.dsb-izah-wrap .dsb-adv-label {
display: block;
}
.dsb-izah-wrap .dsb-input {
display: block;
width: 100%;
margin-top: 4px;
}
/* A sense redrawn from the change that is queued for it, or a whole new sense waiting in the list's own
numbering. No badge and no frame: the point is that it reads the way it will read once saved. The tint
is the only sign, and the queue box is what actually says nothing is published yet. */
.dsb-sense-preview {
background: var(--wikt-accent-tint);
box-shadow: -3px 0 0 var(--wikt-accent-edge);
}
/* Kept in the tree so another gadget's form still has somewhere to open, but out of sight while the
preview above draws the same content. */
.dsb-preview-hidden {
display: none !important;
}
li.dsb-sense-preview {
display: list-item;
padding-left: 4px;
}
/* </nowiki> */
p8dbwob7q5n7bkiq7k6vrcu3ejrxemk
6532616
6532599
2026-09-19T09:02:47Z
Wikihez
7344
DefSideBoxes: hide the pending-changes box while a dialog is open
6532616
css
text/css
/* <nowiki> */
/*
* Page: [[MediaWiki:Gadget-wikt.dsb-panels.css]]
*/
/* ── Searchable select ───────────────────────────────────────────────
The native <select> is hidden inside the wrapper and still holds the value; the input filters the list. */
.dsb-ac-wrap {
position: relative;
display: block;
}
.dsb-ac-input {
width: 100%;
box-sizing: border-box;
}
.dsb-ac-results {
position: absolute;
z-index: 30;
top: 100%;
left: 0;
right: 0;
max-height: 260px;
margin: 2px 0 0;
padding: 4px;
overflow-y: auto;
list-style: none;
font-family: var(--wikt-sans);
font-size: 13px;
background: var(--wikt-field-bg);
border: 1px solid var(--wikt-field-edge);
border-radius: var(--wikt-r-field);
box-shadow: 0 6px 18px rgba(0, 0, 0, 0.12);
}
.dsb-ac-results li {
padding: 6px 8px;
border-radius: 6px;
cursor: pointer;
}
.dsb-ac-results li:hover,
.dsb-ac-results li.dsb-ac-active {
background: var(--wikt-accent-tint);
}
/* ── Etîmolojî editing surface ───────────────────────────────────────
A contenteditable line of wikitext: text is typed straight into it, template calls sit in it as chips. */
.dsb-tpl-surface {
min-height: 72px;
margin-top: 6px;
padding: 8px 10px;
font-family: var(--wikt-sans);
font-size: 14px;
line-height: 1.6;
color: var(--wikt-ink);
white-space: pre-wrap;
word-wrap: break-word;
background: var(--wikt-field-bg);
border: 1px solid var(--wikt-field-edge);
border-radius: var(--wikt-r-field);
}
.dsb-tpl-surface:focus {
outline: none;
border-color: var(--wikt-accent);
box-shadow: 0 0 0 2px var(--wikt-accent-tint);
}
/* The chips: visibly not prose, and atomic to the caret. */
/* Takes the call off the line without going through the parameter dialog -- on a phone there is no
reliable backspace onto a contenteditable="false" chip. */
.dsb-tpl-chip-remove {
position: relative;
margin-left: 5px;
padding: 0 2px;
font-family: var(--wikt-sans);
font-size: 13px;
line-height: 1;
color: var(--wikt-accent-deep);
opacity: 0.6;
cursor: pointer;
}
.dsb-tpl-chip-remove:hover {
color: var(--wikt-danger);
opacity: 1;
}
/* The glyph stays small; the tap target grows invisibly around it. */
@media (max-width: 720px), (pointer: coarse) {
.dsb-tpl-chip-remove {
opacity: 1;
}
.dsb-tpl-chip-remove::after {
content: "";
position: absolute;
inset: -10px -8px;
}
}
.dsb-tpl-chip {
display: inline-block;
margin: 0 1px;
padding: 1px 6px;
font-family: var(--wikt-mono);
font-size: 12.5px;
color: var(--wikt-accent-deep);
max-width: 100%;
white-space: normal;
overflow-wrap: anywhere;
vertical-align: baseline;
background: var(--wikt-accent-tint);
border: 1px solid var(--wikt-accent-edge);
border-radius: var(--wikt-r-pill);
touch-action: manipulation;
cursor: pointer;
user-select: none;
}
.dsb-tpl-chip:hover,
.dsb-tpl-chip:focus {
background: var(--wikt-field-bg);
border-color: var(--wikt-accent);
outline: none;
}
/* ── Template parameter form ─────────────────────────────────────────
.dsb-tpl-name/-desc/-param-row/-help/-undocumented/-modifier-list and the deprecated-label override now
live in cite.css (wikt.cite's own stylesheet): buildTemplateParamForm() moved there so start.js's own
Etîmolojî/Çavkanî pickers can open the same dialog. */
/* One-line variant: label beside its box rather than above it, for a single field whose name would
otherwise read as a heading for everything below it (the word groups' "Sernav"). */
.dsb-param-row-inline > .dsb-adv-label {
display: flex;
gap: 8px;
align-items: center;
}
/* Sernav is optional and names the group; the word boxes under it are what the form is actually for.
Letting it stretch to the full row made the one thing you may leave blank the widest box on the
card, so it takes only the space its own content needs. */
.dsb-param-row-inline .dsb-input {
flex: 0 1 auto;
width: 12em;
max-width: 40%;
/* .dsb-input's own 16em floor would win over the width above and make this the widest box on the
card, which is the opposite of the point. */
min-width: 0;
max-width: 100%;
min-width: 0;
}
.dsb-gloss-raw {
font-size: 12px;
}
/* Disclosure arrow on "Hevmane û Bêhtir", flipped when the menu is open. */
.dsb-more-arrow {
font-size: 10px;
vertical-align: 1px;
}
/* The POS panel's follow-up questions (cinsiyet / lektur): label above its select, like the field boxes. */
.dsb-pos-param-row {
display: flex;
flex-direction: column;
gap: 4px;
margin-top: 8px;
}
/* ── "Guhartina pêşketî" (advanced editing) panel ──────────────────────
Revealed by the pencil toggle above: every per-sense action this gadget offers, queued together with one
"Lê zêde bike". A plain inline row, not a bordered/background card. */
.dsb-quick-row {
display: flex;
flex-direction: column;
align-items: stretch;
gap: 4px;
box-sizing: border-box;
max-width: 520px;
margin: 4px 0 0 16px;
font-family: var(--wikt-sans);
font-size: 12px;
color: var(--wikt-ink-2);
}
.dsb-quick-link {
align-self: flex-start;
margin-bottom: 10px;
font-size: 12px;
color: var(--wikt-accent);
text-decoration: none;
white-space: nowrap;
cursor: pointer;
}
/* The links under a word list ("+ Komek lê zêde bike", "Wekî wîkîtext biguhêre") sit in the field wrap
rather than in a flex column, so they need their own spacing or they run together. */
.dsb-subsection-field > .dsb-quick-link {
display: inline-block;
margin-right: 14px;
}
.dsb-quick-link:hover,
.dsb-quick-link:focus {
color: var(--wikt-accent-deep);
text-decoration: underline;
}
/* The picker row: gloss + the two primary word groups as direct "+ <field>" links, plus a "Hevmane û Bêhtir" toggle
for the rest -- clicking a link opens its box above the buttons and hides the link; .dsb-box-remove un-hides it.
position: relative anchors .dsb-more-menu's overlay below (see there). */
.dsb-field-picker {
position: relative;
display: flex;
flex-wrap: wrap;
align-items: baseline;
gap: 4px 14px;
}
.dsb-field-picker .dsb-quick-link {
margin-bottom: 0;
}
/* Under the buttons once a box is open: a little space so the links do not read as part of the buttons. */
.dsb-open-boxes:not(:empty) ~ .dsb-field-picker {
margin-top: 8px;
}
/* The "Hevmane û Bêhtir" dropdown: every non-primary field link (plus Nimûne/jêgirtin, which sits first) stacked as a
plain vertical list. Floats over the page as an overlay (positioned against .dsb-field-picker) instead of
pushing $openBoxes/the rest of the definition down when it opens. */
.dsb-more-menu {
position: absolute;
top: 100%;
left: 0;
z-index: 10;
display: flex;
flex-direction: column;
align-items: flex-start;
width: max-content;
max-width: min(320px, calc(100vw - 40px));
gap: 6px;
margin: 2px 0 0 4px;
padding: 8px 12px;
background: var(--wikt-card);
border: 1px solid var(--wikt-rule);
border-radius: var(--wikt-r-field);
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.06);
}
.dsb-more-menu .dsb-quick-link {
margin-bottom: 0;
}
/* Boxes the user has actually opened, stacked in the order they were added -- several can be open at once. */
.dsb-open-boxes {
display: flex;
flex-direction: column;
}
/* Nothing open: take it out of the flow so the links do not sit above an empty gap. */
.dsb-open-boxes:empty {
display: none;
}
/* One field (its label + input) within the panel -- always a currently-open, removable box. */
.dsb-adv-group {
position: relative;
margin-bottom: 14px;
padding-right: 20px;
}
.dsb-adv-label {
margin-bottom: 4px;
font-size: 12px;
font-weight: 600;
color: var(--wikt-ink-3);
}
/* The example sentence beside a word list's name: same text the wizard shows, so it reads as the
quieter half of the label rather than a second heading. */
.dsb-adv-hint {
margin-left: 6px;
font-weight: 400;
font-style: italic;
color: var(--wikt-muted);
}
/* The shared image rows (util.js's buildImageListField): one label + box per line, like the parameter
rows above them. Three identical boxes twice over is unreadable without a break between them, so each
image is its own block with its own name. */
.dsb-resim-list {
margin: 0;
padding-left: 0;
}
.dsb-resim-item {
list-style: none;
margin-top: 12px;
padding-top: 12px;
border-top: 1px solid var(--wikt-rule-soft);
}
.dsb-resim-item:first-child {
margin-top: 0;
padding-top: 0;
border-top: 0;
}
.dsb-resim-index {
margin-bottom: 6px;
font-size: 12px;
font-weight: 600;
color: var(--wikt-ink-3);
}
.dsb-box-remove {
position: absolute;
top: 0;
right: 0;
color: var(--wikt-ink-3);
text-decoration: none;
font-size: 14px;
line-height: 1;
cursor: pointer;
}
.dsb-box-remove:hover,
.dsb-box-remove:focus {
color: var(--wikt-accent-deep);
}
.dsb-form-actions {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
}
.dsb-input {
box-sizing: border-box;
min-width: 16em;
padding: 6px 10px;
font-family: var(--wikt-sans);
font-size: 13px;
color: var(--wikt-ink);
background: var(--wikt-field-bg);
border: 1px solid var(--wikt-field-edge);
border-radius: var(--wikt-r-field);
transition: border-color 0.12s ease, box-shadow 0.12s ease;
}
/* The native corner is replaced by util.js's grip (see wikt-edit.css), which drags vertically only and
remembers the height. */
.dsb-subsection-panel textarea.dsb-input,
.dsb-adv-group textarea.dsb-input {
resize: none;
}
.dsb-input::placeholder {
color: var(--wikt-placeholder);
opacity: 1;
}
.dsb-input:focus {
border-color: var(--wikt-accent);
box-shadow: 0 0 0 3px var(--wikt-accent-tint);
outline: 0;
}
/* ── Plain tag field (Etîket, Kategorî) ────────────────────────────────
Plain type-and-commit tags with no suggestion panel; unlike Hevmane/Dijmane/etc., these carry no modifiers. */
.dsb-tagfield {
box-sizing: border-box;
display: inline-flex;
flex-wrap: wrap;
align-items: center;
gap: 6px;
min-width: 16em;
padding: 4px 6px;
background: var(--wikt-field-bg);
border: 1px solid var(--wikt-field-edge);
border-radius: var(--wikt-r-field);
transition: border-color 0.12s ease, box-shadow 0.12s ease;
}
.dsb-tagfield:focus-within {
border-color: var(--wikt-accent);
box-shadow: 0 0 0 3px var(--wikt-accent-tint);
}
.dsb-tag {
display: inline-flex;
align-items: center;
gap: 6px;
background: var(--wikt-accent-tint);
color: var(--wikt-accent-deep);
border: 1px solid var(--wikt-accent-edge);
border-radius: var(--wikt-r-pill);
font-size: 12px;
padding: 3px 6px 3px 10px;
}
.dsb-tag-remove {
border: 0;
background: transparent;
color: var(--wikt-muted);
font-size: 13px;
line-height: 1;
cursor: pointer;
padding: 0 2px;
}
.dsb-tag-remove:hover {
color: var(--wikt-danger);
}
.dsb-tagfield .dsb-input {
flex: 1 1 8em;
min-width: 8em;
border: 0;
padding: 3px 2px;
background: transparent;
box-shadow: none;
}
.dsb-tagfield .dsb-input:focus {
box-shadow: none;
}
.dsb-save,
.dsb-cancel,
.dsb-delete,
.dsb-autolink {
font-family: var(--wikt-sans);
font-size: 13px;
font-weight: 500;
padding: 6px 14px;
border-radius: var(--wikt-r-pill);
cursor: pointer;
transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease;
}
/* One filled pill per row — the same rule the form's footer follows. */
.dsb-save {
background: var(--wikt-accent);
border: 1px solid var(--wikt-accent);
color: #fff;
}
.dsb-save:hover {
background: var(--wikt-accent-deep);
border-color: var(--wikt-accent-deep);
}
.dsb-save:disabled {
opacity: 0.55;
cursor: progress;
}
.dsb-cancel {
background: transparent;
border: 1px solid transparent;
color: var(--wikt-ink-3);
}
.dsb-cancel:hover {
border-color: var(--wikt-field-edge);
color: var(--wikt-ink);
}
/* Removing a heading: plain like Betal bike, in the danger colour, pushed to the far end of the row. */
.dsb-delete {
margin-left: auto;
background: transparent;
border: 1px solid transparent;
color: var(--wikt-danger);
}
.dsb-delete:hover {
border-color: var(--wikt-danger);
}
/* The heading's name, above the section's own box. */
.dsb-heading-name-wrap {
margin-bottom: 10px;
}
/* A heading queued for removal, with everything it owns, until the queue is saved or the change dropped. */
.dsb-preview-removed {
opacity: 0.5;
text-decoration: line-through;
text-decoration-color: var(--wikt-danger);
}
/* An outline pill, distinct from both the filled .dsb-save and the plain-text .dsb-cancel -- a secondary
utility action, not the primary save nor a dismissal. */
.dsb-autolink {
background: transparent;
border: 1px solid var(--wikt-accent-edge);
color: var(--wikt-accent);
}
.dsb-autolink:hover {
border-color: var(--wikt-accent);
color: var(--wikt-accent-deep);
}
.dsb-autolink:disabled {
opacity: 0.55;
cursor: progress;
}
/* Status line. Color comes from .dsb-status-ok/.dsb-status-error (added by the .js on success/failure)
rather than an inline style, so these tokens (and dark mode) apply. */
.dsb-status {
font-family: var(--wikt-sans);
font-size: 12.5px;
color: var(--wikt-muted);
}
.dsb-status-ok { color: var(--wikt-ok); }
.dsb-status-error { color: var(--wikt-danger); }
/* ── "+ Beşek lê zêde bike" ──────────────────────────────────────────
An accent-coloured action link, like the form's .wiktku-adv-toggle:
it opens something, so it is not muted grey. */
/* iOS Safari zooms the page in whenever a field it focuses has text under 16px, and everything here is
12-13px for density. On touch the form controls go up to the size that stops it; the pointer query
leaves the desktop layout alone. */
@media (pointer: coarse) {
.dsb-input,
.dsb-tag-input,
.dsb-subsection-select,
.dsb-convert-pos-select {
font-size: 16px;
}
/* Full width, whatever the viewport reports: a phone asked to render the desktop site says ~980px and
would otherwise leave these at their desktop size. */
.dsb-subsection-panel .dsb-input,
.dsb-subsection-panel .dsb-subsection-select,
.dsb-convert-pos-panel .dsb-convert-pos-select {
width: 100%;
max-width: 100%;
}
/* Sernav is the exception: it names the group, so it stays visibly smaller than the boxes it heads.
The cap matters more than the em width -- at 16px, 12em came out the same size as a word box. */
.dsb-subsection-panel .dsb-param-row-inline .dsb-input {
width: 8em;
max-width: 40%;
}
}
/* The image rows reuse the inline row, but nothing here is optional the way a group's "Sernav" is:
a file name and a caption want the whole row. */
.dsb-resim-list .dsb-param-row-inline > .dsb-adv-label,
.dsb-resim-list .dsb-tpl-param-row > label {
display: flex;
gap: 8px;
align-items: center;
}
.dsb-resim-list .dsb-param-row-inline .dsb-input,
.dsb-resim-list .dsb-tpl-param-row .dsb-input {
flex: 1 1 auto;
width: auto;
max-width: 100%;
}
/* ── Subsection panel ────────────────────────────────────────────────
A sunken card rather than a grey utility box; fields stack so the
picker and its input are not competing for one narrow row. */
.dsb-subsection-select,
.dsb-convert-pos-select {
box-sizing: border-box;
width: 100%;
max-width: 100%;
padding: 6px 10px;
font-family: var(--wikt-sans);
font-size: 13px;
color: var(--wikt-ink);
background: var(--wikt-field-bg);
border: 1px solid var(--wikt-field-edge);
border-radius: var(--wikt-r-field);
}
.dsb-subsection-select:focus,
.dsb-convert-pos-select:focus {
border-color: var(--wikt-accent);
box-shadow: 0 0 0 3px var(--wikt-accent-tint);
outline: 0;
}
/* The template-insert picker sits above the Çavkanî textarea, not in place of it -- a little breathing
room so the two don't read as one control. */
.dsb-cavkani-picker {
margin-bottom: 6px;
}
.dsb-subsection-field {
min-width: 0;
}
.dsb-subsection-words,
.dsb-subsection-text {
box-sizing: border-box;
width: 100%;
min-width: 0;
}
.dsb-subsection-text {
line-height: 1.6;
resize: vertical;
}
/* ── Gloss field inside the advanced-editing panel ────────────────────
Same shape as .dsb-subsection-text. */
.dsb-edit-gloss {
width: 100%;
line-height: 1.6;
resize: vertical;
}
/* ── Live "not saved yet" previews ─────────────────────────────────────
Dropped into the rendered page at the change's own spot. Dashed edge + a small badge mark them as
pending, not real content; they disappear on "Betal bike" or once the real save lands. */
.dsb-preview-block,
.dsb-preview-inline {
margin: 8px 0;
padding: 8px 12px;
font-family: var(--wikt-sans);
font-size: 13px;
color: var(--wikt-ink-2);
background: var(--wikt-accent-tint);
border: 1px dashed var(--wikt-accent-edge);
border-radius: var(--wikt-r-field);
}
.dsb-preview-inline {
margin-left: 26px;
max-width: 520px;
}
.dsb-preview-heading {
margin: 0 0 4px;
font-size: 15px;
font-weight: 600;
color: var(--wikt-ink);
}
.dsb-preview-badge {
display: inline-block;
margin-bottom: 6px;
padding: 1px 8px;
font-size: 11px;
font-weight: 500;
color: var(--wikt-accent-deep);
background: var(--wikt-card);
border: 1px solid var(--wikt-accent-edge);
border-radius: var(--wikt-r-pill);
}
/* Parser output goes in here, so it drops the panel's own font and colour and takes the page's \u2014 the
point of the box is that what is inside it looks exactly like what will be saved. */
.dsb-preview-rendered,
.dsb-preview-rendered-inline {
font-family: inherit;
font-size: 14px;
color: var(--wikt-ink);
}
.dsb-preview-rendered-inline {
display: inline;
}
.dsb-preview-rendered-inline .mw-parser-output,
.dsb-preview-rendered-inline .mw-parser-output > p {
display: inline;
}
.dsb-preview-list,
.dsb-preview-text {
margin: 0;
padding-left: 18px;
}
.dsb-preview-text {
padding-left: 0;
}
/* ── Floating save-queue widget ─────────────────────────────────────
This gadget's own small floating box. One "Lê zêde bike" click anywhere on the page adds a line here;
"Guhertinan qeyd bike" makes the one real save; "Betal bike" drops everything queued without touching the page. */
.dsb-queue-box {
position: fixed;
top: 60px;
right: 16px;
z-index: 1000;
box-sizing: border-box;
width: 280px;
max-width: calc(100vw - 32px);
max-height: calc(100vh - 90px);
overflow-y: auto;
padding: 12px 14px;
font-family: var(--wikt-sans);
font-size: 13px;
color: var(--wikt-ink-2);
background: var(--wikt-card);
border: 1px solid var(--wikt-accent);
border-radius: var(--wikt-r-card);
box-shadow: 0 4px 18px rgba(0, 0, 0, 0.16);
}
/* An OOUI dialog sits low in the page's stacking order (z-index 4), so no z-index here can go under it
without dropping behind the article as well. While one is open -- on a phone it fills the screen --
the box is taken off instead; wikt.cite puts the class on while its dialogs are showing. */
body.wikt-dialog-open .dsb-queue-box {
display: none;
}
.dsb-queue-title {
margin-right: 20px;
font-size: 13px;
font-weight: 600;
color: var(--wikt-ink);
}
.dsb-queue-close {
float: right;
color: var(--wikt-ink-3);
text-decoration: none;
font-size: 14px;
line-height: 1;
cursor: pointer;
}
.dsb-queue-close:hover,
.dsb-queue-close:focus {
color: var(--wikt-accent-deep);
}
/* Stands in for the list before anything is queued, saying what the save button is for. */
.dsb-queue-empty {
margin: 8px 0;
font-size: 12px;
line-height: 1.5;
color: var(--wikt-ink-3);
}
.dsb-queue-list {
margin: 8px 0;
padding-left: 18px;
max-height: 160px;
overflow-y: auto;
}
.dsb-queue-list li {
margin-bottom: 4px;
}
/* Drops one queued change. Dim until its line is hovered, so the list stays a list and not a row of
buttons. */
.dsb-queue-drop {
margin-left: 6px;
padding: 0 3px;
border: 0;
background: transparent;
color: var(--wikt-muted);
font-size: 13px;
line-height: 1;
cursor: pointer;
opacity: 0;
transition: opacity 0.12s ease, color 0.12s ease;
}
.dsb-queue-list li:hover .dsb-queue-drop,
.dsb-queue-drop:focus {
opacity: 1;
}
.dsb-queue-drop:hover {
color: var(--wikt-danger);
opacity: 1;
}
/* No hover on touch, so the button is simply there. */
@media (hover: none), (pointer: coarse) {
.dsb-queue-drop {
opacity: 1;
}
}
.dsb-queue-actions {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 4px;
}
.dsb-queue-save,
.dsb-queue-cancel {
font-family: var(--wikt-sans);
font-size: 13px;
font-weight: 500;
padding: 6px 14px;
border-radius: var(--wikt-r-pill);
cursor: pointer;
transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease;
}
.dsb-queue-save {
background: var(--wikt-accent);
border: 1px solid var(--wikt-accent);
color: #fff;
}
.dsb-queue-save:hover {
background: var(--wikt-accent-deep);
border-color: var(--wikt-accent-deep);
}
.dsb-queue-save:disabled {
opacity: 0.55;
cursor: progress;
}
.dsb-queue-cancel {
background: transparent;
border: 1px solid var(--wikt-field-edge);
color: var(--wikt-ink-3);
}
.dsb-queue-cancel:hover {
border-color: var(--wikt-ink-3);
color: var(--wikt-ink);
}
.dsb-queue-status {
margin-top: 6px;
font-size: 12.5px;
color: var(--wikt-muted);
}
.dsb-queue-status.dsb-status-ok { color: var(--wikt-ok); }
.dsb-queue-status.dsb-status-error { color: var(--wikt-danger); }
/* ── Minerva (mobile) ────────────────────────────────────────────────
Narrower viewport: keep the panel on screen and give every tap
target the form's 44px minimum. */
@media (max-width: 720px), (pointer: coarse) {
.dsb-quick-row {
font-size: 13px;
margin-left: 20px;
}
.dsb-input,
.dsb-subsection-select,
.dsb-convert-pos-select {
min-height: 40px;
/* >=16px stops iOS Safari zooming the page on focus. */
font-size: 16px;
}
.dsb-tagfield .dsb-input {
min-height: 32px;
}
.dsb-tag-remove {
padding: 0 6px;
}
.dsb-save,
.dsb-cancel,
.dsb-autolink,
.dsb-queue-save,
.dsb-queue-cancel {
min-height: 40px;
padding: 8px 16px;
}
.dsb-queue-box {
top: auto;
bottom: 8px;
right: 8px;
left: 8px;
width: auto;
}
}
/* ── Dark mode ───────────────────────────────────────────────────────
Same warm dark palette and same explicit-signal-only rule as the
form's stylesheet: no bare prefers-color-scheme fallback, since
legacy Vector sets no theme class and would go dark on its own. */
html.skin-theme-clientpref-night .dsb-save,
html.skin-nightmode .dsb-save,
html.skin-theme-clientpref-night .dsb-queue-save,
html.skin-nightmode .dsb-queue-save {
color: #14213a;
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .dsb-save,
html.skin-theme-clientpref-os .dsb-queue-save {
color: #14213a;
}
}
/* Rules the menu's three sections apart (see MENU_GROUPS). */
.dsb-more-menu .dsb-menu-group-start {
margin-top: 7px;
padding-top: 7px;
border-top: 1px solid var(--wikt-rule-soft);
}
/* Deleting a sense is destructive, so it reads in the danger colour -- but it shares the last section
with "Maneyeke din zêde bike" (both act on the sense itself), so it carries no rule of its own. */
.dsb-more-menu .dsb-field-delete {
color: var(--wikt-danger);
}
.dsb-more-menu .dsb-field-delete:hover,
.dsb-more-menu .dsb-field-delete:focus {
color: var(--wikt-danger);
text-decoration: underline;
}
/* A sense queued for deletion, struck through until the queue is saved or the change dropped. */
li.dsb-sense-doomed {
text-decoration: line-through;
text-decoration-color: var(--wikt-danger);
}
li.dsb-sense-doomed .dsb-quick-row {
text-decoration: none;
}
/* Queue confirmation for row actions that have no field box of their own. */
.dsb-quick-note {
display: block;
margin-top: 6px;
}
/* Dropped by anything that cannot live in a 520px column: a long etymology, and a word list wide
enough to have gone to two columns. */
.dsb-subsection-panel.dsb-panel-wide {
max-width: none;
}
/* Word-list groups: one "{{kol3}}" per block, told apart only when there is more than one. */
.dsb-wordgroups-many .dsb-wordgroup {
padding-top: 10px;
border-top: 1px solid var(--wikt-rule-soft);
}
.dsb-wordgroups-many .dsb-wordgroup:first-child {
padding-top: 0;
border-top: 0;
}
.dsb-group-remove {
color: var(--wikt-danger);
}
/* A sernav-headed group inside an unsaved-section preview. */
.dsb-preview-subheading {
margin-top: 6px;
font-weight: 600;
}
/* ── Werger box form ──
The {{werger-ser}} parameters. Reuses .dsb-input / .dsb-adv-label from the other panels; only the
note and the disclosure body need anything of their own. */
.dsb-werger-note {
margin: 0 0 10px;
color: var(--wikt-muted);
font-size: 12px;
line-height: 1.5;
}
.dsb-werger-main {
display: flex;
flex-direction: column;
gap: 10px;
}
/* The box is nested inside its label, so it is made a block to sit under the label text instead of
beside it -- inline, a short label like "id" ends up behind its own box. */
.dsb-werger-row .dsb-adv-label {
display: block;
margin-bottom: 0;
}
.dsb-werger-row .dsb-input {
display: block;
width: 100%;
margin-top: 4px;
}
/* ── Îzaha maneyî ──
Opens under the Mane box; the two are one gloss, so it sits tight against it. */
.dsb-izah-wrap {
margin-top: 6px;
}
.dsb-izah-wrap .dsb-adv-label {
display: block;
}
.dsb-izah-wrap .dsb-input {
display: block;
width: 100%;
margin-top: 4px;
}
/* A sense redrawn from the change that is queued for it, or a whole new sense waiting in the list's own
numbering. No badge and no frame: the point is that it reads the way it will read once saved. The tint
is the only sign, and the queue box is what actually says nothing is published yet. */
.dsb-sense-preview {
background: var(--wikt-accent-tint);
box-shadow: -3px 0 0 var(--wikt-accent-edge);
}
/* Kept in the tree so another gadget's form still has somewhere to open, but out of sight while the
preview above draws the same content. */
.dsb-preview-hidden {
display: none !important;
}
li.dsb-sense-preview {
display: list-item;
padding-left: 4px;
}
/* </nowiki> */
g70qepztny4ega5cqy8kvkuiulpq7ou
Bikarhêner:Wikihez/Gadget-test/cite.js
2
1358913
6532102
6531967
2026-09-18T20:34:39Z
Wikihez
7344
Etymology: add a builder for {{etîmon}} to the shared template dialog, with its keywords, modifiers and metn= values in data-main.json
6532102
javascript
text/javascript
// <nowiki>
/*
* Page: [[MediaWiki:Gadget-wikt.cite.js]]
*
* Citations for both add-examples and the wizard: jêder-* templates, [[Kategorî:Çavkanî]] templates,
* Citoid, and the "#*" line they become. fieldSpecs() returns plain field descriptions because the two
* callers draw them differently (OOUI vs the wizard's own grid); everything else is shared. Also the
* template-param dialog (openTemplateDialog), used the same way by DefSideBoxes and start.js.
*
* The only caller of window.wikt.citoid, which the citoid-helper gadget owns.
*/
(function () {
"use strict";
var edit = require("ext.gadget.wikt.edit");
var util = edit.util;
var wt = edit.wt;
var langs = edit.langs;
var escapeRegExp = util.escapeRegExp;
var tdText = wt.tdText;
var parseTemplateCalls = wt.parseTemplateCalls;
var splitCallParams = wt.splitCallParams;
var buildTemplateCall = wt.buildTemplateCall;
var jederDefs = edit.data.jederDefs || {};
var etimon = require("./wikt.cite/etimon.js");
var api = new mw.Api();
// Sentinel _currentJederKey / dropdown value for "pick a template from Kategorî:Çavkanî". Not a real
// jederDefs key. Both gadgets use this same string, so a draft saved by one is read by the other.
var CATEGORY_KEY = "__category__";
// Sentinel for "the example box holds a finished template; write it out untouched".
var RAW_KEY = "__raw__";
// Covered by the form's own dedicated boxes, so they are never drawn again as generic template fields.
var COVERED_PARAMS = ["jêgirtin", "jg", "t", "tr"];
// A Kategorî:Çavkanî template whose TemplateData labels a parameter exactly this is fed the language
// from the language dropdown instead of showing a box for it. Unlike jêder-*, an arbitrary template has
// no "parameter 1 is the language" convention, so nothing is assumed positionally.
var LANG_LABEL = "koda zimanî";
// Field key -> {span, multiline}, taken from whichever jêder-* template defines it first. Most
// Kategorî:Çavkanî templates reuse the same bibliographic parameter names, so "sernav" comes out
// full-width and multiline there too rather than as a generic one-line box.
var SIZE_BY_KEY = {};
Object.keys(jederDefs).forEach(function (jederKey) {
(jederDefs[jederKey].fields || []).forEach(function (field) {
if (!SIZE_BY_KEY[field.key]) {
SIZE_BY_KEY[field.key] = {
span: field.span || 4,
multiline: !!field.multiline,
width: field.width || ""
};
}
});
});
// Field pairs Modul:quote refuses together ("Divê tenê yek ji |tarîx= an |sal= were dayîn"): a full
// date and a bare year say the same thing twice. Both are offered because either may be all a source
// gives, so the forms clear one when the other is filled rather than letting the citation break.
var EXCLUSIVE_PAIRS = [["sal", "tarîx"]];
function exclusivePartner(key) {
var found = null;
EXCLUSIVE_PAIRS.forEach(function (pair) {
if (pair[0] === key) {
found = pair[1];
} else if (pair[1] === key) {
found = pair[0];
}
});
return found;
}
function fieldSize(key) {
return SIZE_BY_KEY[key] || { span: 4, multiline: false, width: "" };
}
// ---- text helpers -------------------------------------------------------------------------------
// The entry name as a pattern. A Kurdish word ending in -î loses the circumflex once something is
// attached to it ("safî" is written "safiye"), so a title ending that way matches either spelling --
// otherwise the name is simply never found in the quotation.
function titlePattern(title) {
var escaped = escapeRegExp(String(title || ""));
return /î$/i.test(escaped) ? escaped.slice(0, -1) + "[îi]" : escaped;
}
// Wraps the entry's own name in bold wherever it appears in the quotation, which is how quotations are
// written here, and reports whether the name ends up bold so a caller can say so.
//
// The name may carry an attached suffix ("celbê"), so the match runs on to the end of the word. A word
// ends at whitespace, punctuation or markup: excluding markup is what keeps "celb<br>me’şûq" from
// bolding as one lump. The typographic apostrophe stays a word character -- it is one inside Kurdish
// words like "me’şûq".
function boldenPageTitle(text, title) {
var source = String(text || "");
var escapedTitle = titlePattern(title);
var suffixPattern = "([^\\s.,;:?!()'\"<>\\[\\]{}|=/\\\\«»„“”–—]+)?";
var titleRe = new RegExp("(" + escapedTitle + suffixPattern + ")", "ig");
var titleAnywhere = new RegExp(escapedTitle, "i");
// Whatever already sits between ''' marks is copied through untouched, so a quotation somebody
// bolded by hand -- or one an earlier run bolded -- never collects a second pair.
var boldSpan = /'''[\s\S]*?'''/g;
var out = "";
var last = 0;
var alreadyBold = false;
var span;
while ((span = boldSpan.exec(source)) !== null) {
out += source.slice(last, span.index).replace(titleRe, "'''$1'''");
if (titleAnywhere.test(span[0])) {
alreadyBold = true;
}
out += span[0];
last = span.index + span[0].length;
}
out += source.slice(last).replace(titleRe, "'''$1'''");
return { text: out, bolded: out !== source || alreadyBold };
}
// A literal newline would end the single-line "#*" wikitext, so display text keeps its break as <br>...
function nlToBr(text) {
return String(text || "").replace(/\r\n|\r|\n/g, "<br>");
}
// ...while a plain parameter value (an author, a title) just loses it.
function nlToSpace(text) {
return String(text || "").replace(/\s*(?:\r\n|\r|\n)\s*/g, " ");
}
// Bolds the entry name inside a pasted citation's jêgirtin=/jg= value only, so a book title or author
// containing it is left alone. With no such parameter nothing is bolded: running the plain-text bolder
// over wikitext would wrap the braces too.
function boldQuoteParam(text, title) {
var match = /(\|\s*(?:jêgirtin|jg)\s*=)([\s\S]*?)(?=\|[^|=]*=|\}\}\s*$)/.exec(text);
if (!match) {
return text;
}
var bolded = boldenPageTitle(match[2], title).text;
return text.slice(0, match.index) + match[1] + bolded + text.slice(match.index + match[0].length);
}
// "name — description" for each Kategorî:Çavkanî option in a <select>, from the description half of
// the same TemplateData every citation picker already fetches -- so a search box built over these
// options can also match on what a template documents itself as doing, not only its name. An
// undescribed option, or a failed fetch, just keeps its plain label; never blocks on this.
// A self-contained "search Kategorî:Çavkanî" combo: a text input plus its own results list, matching
// add-examples' own jêgirtin picker -- each row shows its label, a " → target" arrow when a redirect's
// label differs from its target, and a 🔗 link to the canonical template's own page. opts.onPick(entry)
// fires when a row is chosen; the input is then left holding the plain label, not "label → target", so
// re-focusing it to search again doesn't start from that arrow text. opts.describe: true also fills in
// each visible row's own TemplateData description once it loads (batched, so scrolling through matches
// costs a handful of requests, not one per row).
function buildCategoryTemplateSearch(opts) {
opts = opts || {};
var shell = util.buildSearchList({
placeholder: opts.placeholder || util.msg.searchTemplate
});
var $input = shell.$input;
var $results = shell.$results;
var $status = $("<span class='wiktku-cat-tpl-status'></span>").text(util.msg.templatesLoading);
var list = [];
function decorate($text, target, wanted) {
if (!wanted) {
return;
}
edit.wt.fetchTemplateData(target).then(function (doc) {
var desc = doc && edit.wt.tdText(doc.description);
if (desc && $text.closest("body").length) {
$text.append(document.createTextNode(" — " + edit.wt.shortDesc(desc)));
}
});
}
function showResults(query) {
var q = $.trim(query || "").toLowerCase();
$results.empty();
var matched = q ? list.filter(function (entry) {
return entry.label.toLowerCase().indexOf(q) !== -1;
}) : list;
if (!matched.length) {
shell.close();
return;
}
var shown = matched.slice(0, 50);
// Only what a search has narrowed to: an empty box is the whole category, and describing its
// first fifty would ask the wiki about templates nobody has looked for.
var describing = !!opts.describe && !!q;
if (describing) {
edit.wt.fetchTemplateDataBatch(shown.map(function (entry) { return entry.target; }));
}
shown.forEach(function (entry) {
var $li = $("<li class='wiktku-cat-tpl-row'></li>");
var $text = $("<span class='wiktku-cat-tpl-text'></span>").text(entry.label);
if (entry.label !== entry.target) {
$text.append($("<span class='wiktku-cat-tpl-arrow'></span>").text(" → " + entry.target));
}
decorate($text, entry.target, describing);
var $link = $("<a class='wiktku-cat-tpl-link' target='_blank' rel='noopener'>🔗</a>")
.attr("title", util.msg.openTemplatePage)
.attr("href", util.tplPageUrl(entry.target));
// stopPropagation only -- preventDefault would stop the link from actually navigating.
$link.on("mousedown click", function (e) { e.stopPropagation(); });
$li.append($text, $link);
shell.bindPick($li, function () {
shell.close();
$input.val(entry.label);
opts.onPick(entry);
});
$results.append($li);
});
shell.open();
}
$input.on("input focus", function () {
showResults($(this).val());
});
$input.on("blur", function () {
setTimeout(shell.close, 200); // lets the pick handler fire first
});
fetchCategoryTemplates().then(function (l) {
list = l;
$status.text("");
}, function () {
$status.text(util.msg.templatesFailed);
});
return {
$element: $("<span class='wiktku-native-select-wrap wiktku-cat-tpl-picker'></span>").append($input, $results, $status),
$input: $input,
$status: $status
};
}
// ---- Kategorî:Çavkanî -----------------------------------------------------------------------------
// The category's template members plus their redirects, each redirect its own searchable entry pointing
// at the same canonical target, so a template is findable by any of its names. Cached for the session.
var catTemplatesPromise = null;
function fetchCategoryTemplates() {
if (catTemplatesPromise) {
return catTemplatesPromise;
}
catTemplatesPromise = api.get({
action: "query",
generator: "categorymembers",
gcmtitle: "Kategorî:Çavkanî",
gcmnamespace: 10,
gcmlimit: "max",
prop: "redirects",
rdnamespace: 10,
rdlimit: "max",
formatversion: 2
}).then(function (data) {
var list = [];
((data.query && data.query.pages) || []).forEach(function (page) {
var target = page.title.replace(/^[^:]+:/, "");
list.push({ label: target, target: target });
(page.redirects || []).forEach(function (redirect) {
list.push({ label: redirect.title.replace(/^[^:]+:/, ""), target: target });
});
});
list.sort(function (a, b) {
return a.label.localeCompare(b.label, mw.config.get("wgUserLanguage"));
});
return list;
}, function () {
return [];
});
return catTemplatesPromise;
}
// ---- template-param dialog: fills a {{Name|...}} call from its own TemplateData -------------------
// Shared by DefSideBoxes (a fresh insert from Etîmolojî/Çavkanî, or double-clicking an existing chip
// to edit it) and start.js's own Etîmolojî/Çavkanî pickers -- one dialog, so all of them read the same
// TemplateData the same way.
// OOUI's own dialog stack -- the same widgetry VisualEditor's template dialog is built on.
var citeWindowManager = null;
function templateDialogManager() {
if (!citeWindowManager) {
citeWindowManager = new OO.ui.WindowManager();
$(document.body).append(citeWindowManager.$element);
}
return citeWindowManager;
}
// Opens one template call in a modal built from its TemplateData. Resolves with the edited wikitext, or
// null when the user cancels.
// One at a time: a second open while one is loading or showing (a chip clicked again before its dialog
// appeared) stacks a window the manager does not track, and that window's buttons do nothing. The
// second call resolves null, as a cancel does.
var templateDialogBusy = false;
function openTemplateDialog(callWikitext) {
var done = $.Deferred();
var call = parseTemplateCalls(callWikitext).calls[0];
if (!call || templateDialogBusy) {
return done.resolve(null).promise();
}
// {{etîmon}} has no form TemplateData can describe -- a chain of steps, each with its own words
// and their own modifiers -- so it has a builder of its own, on the same contract as this dialog.
if (etimon.isEtimonName(call.name)) {
return etimon.openDialog(callWikitext);
}
templateDialogBusy = true;
done.always(function () {
templateDialogBusy = false;
});
$.when(
mw.loader.using(["oojs-ui-core", "oojs-ui-windows"]),
edit.wt.fetchTemplateData(call.name)
).then(function (_loaded, td) {
var result = null;
// The parent is captured rather than reached through TplDialog.super: "super" is a reserved word,
// and OOjs has moved between .super and .parent for it over the years.
var ParentDialog = OO.ui.ProcessDialog;
function TplDialog(config) {
ParentDialog.call(this, config);
}
OO.inheritClass(TplDialog, ParentDialog);
TplDialog.static.name = "citeTemplateDialog";
TplDialog.static.title = "{{" + call.name + "}}";
TplDialog.static.actions = [
{ action: "save", label: "Biguhêre", flags: ["primary", "progressive"] },
{ action: "remove", label: "Jê bibe", flags: "destructive" },
{ label: util.msg.cancel, flags: "safe" }
];
TplDialog.prototype.initialize = function () {
ParentDialog.prototype.initialize.apply(this, arguments);
this.panel = new OO.ui.PanelLayout({ padded: true, expanded: false });
this.form = buildTemplateParamForm(call, td);
this.panel.$element.append(this.form.$element);
this.$body.append(this.panel.$element);
};
TplDialog.prototype.getBodyHeight = function () {
return this.panel.$element.outerHeight(true);
};
TplDialog.prototype.getActionProcess = function (action) {
var dialog = this;
if (action === "save" || action === "remove") {
return new OO.ui.Process(function () {
result = action === "remove" ? "" : dialog.form.values();
dialog.close();
});
}
return ParentDialog.prototype.getActionProcess.call(this, action);
};
var manager = templateDialogManager();
var dialog = new TplDialog({ size: "medium" });
manager.addWindows([dialog]);
var instance = manager.openWindow(dialog);
instance.closed.then(function () {
manager.clearWindows();
done.resolve(result);
});
instance.opening.fail(function () {
manager.clearWindows();
done.resolve(null);
});
}, function () {
done.resolve(null);
});
return done.promise();
}
// TemplateData descriptions are plain text, but authors write wikilinks in them; render those as links.
function tdDescription(text) {
var $out = $("<span></span>");
var re = /\[\[([^\[\]|]+)(?:\|([^\[\]]*))?\]\]/g;
var last = 0;
var m;
while ((m = re.exec(text)) !== null) {
if (m.index > last) {
$out.append(document.createTextNode(text.slice(last, m.index)));
}
$out.append($("<a></a>").attr("href", mw.util.getUrl(m[1])).text(m[2] || m[1]));
last = re.lastIndex;
}
if (last < text.length) {
$out.append(document.createTextNode(text.slice(last)));
}
return $out;
}
// A parameter whose documentation says so takes "kelîme<t:...>" inline modifiers, so it gets the pill
// widget instead of a plain box. TemplateData has no field for this, hence the marker in the description.
var INLINE_MODIFIER_MARKER = "WF:Guherkerên rêzê";
function acceptsInlineModifiers(doc) {
return tdText(doc && doc.description).indexOf(INLINE_MODIFIER_MARKER) !== -1;
}
// A language-code parameter, per its own label.
function isLanguageParam(doc) {
return /ziman/i.test(tdText(doc && doc.label));
}
function buildTemplateParamForm(call, td) {
var parsed = splitCallParams(call.params);
var docParams = (td && td.params) || {};
var keys = (td && td.paramOrder) ? td.paramOrder.slice() : Object.keys(docParams);
parsed.used.forEach(function (k) {
if (keys.indexOf(k) === -1) {
keys.push(k);
}
});
var $element = $("<div class='dsb-tpl-form'></div>");
var readers = {}; // key -> () => the parameter's current text
$element.append($("<div class='dsb-tpl-name'></div>").append(
$("<a></a>").attr("href", mw.util.getUrl("Şablon:" + call.name))
.attr("target", "_blank").text("{{" + call.name + "}}")
));
var desc = tdText(td && td.description);
if (desc) {
$element.append($("<div class='dsb-tpl-desc'></div>").append(tdDescription(desc)));
}
keys.forEach(function (key) {
var doc = docParams[key] || {};
var value = parsed.values[key] || "";
var $field;
if (acceptsInlineModifiers(doc)) {
// The same word row the sense lists use: plain text plus removable "<t:...>" pills.
var row = util.makeModifierRow({
prefix: "dsb-",
placeholder: tdText(doc.label) || key,
modTitle: util.msg.addModifier,
removeTitle: "Vê nirxê jê bibe",
removeModTitle: util.msg.removeModifier
});
row.setRaw(value);
// A <ul> so the row's own "close other pickers" lookup has something to scope to.
$field = $("<ul class='dsb-wordlist dsb-tpl-modifier-list'></ul>").append(row.$li);
readers[key] = row.getRaw;
} else {
var $input = $("<input type='text' class='dsb-input'>").val(value);
if (isLanguageParam(doc)) {
$input.attr("list", langs.datalistId()).attr("placeholder", "koda zimanî…");
// Typing a language the short list does not have is the cue to fetch the rest.
$input.on("input", function () {
if (langs.missingFromCore($input.val())) {
langs.ensureFull();
}
});
} else {
var suggested = doc.suggestedvalues || [];
if (suggested.length) {
var listId = "dsb-sv-" + call.name.replace(/[^A-Za-z0-9]/g, "") + "-" + key;
var $list = $("<datalist></datalist>").attr("id", listId);
suggested.forEach(function (v) {
$list.append($("<option></option>").val(v));
});
$input.attr("list", listId);
$element.append($list);
}
}
$field = $input;
readers[key] = function () {
return $input.val();
};
}
var $label = $("<label class='dsb-adv-label'></label>").text(tdText(doc.label) || key);
if (!docParams[key]) {
$label.append($("<span class='dsb-tpl-undocumented'></span>").text(" (ne di belgeyê de)"));
}
var $row = $("<div class='dsb-tpl-param-row'></div>").append($label, $field);
var help = tdText(doc.description);
if (help) {
$row.append($("<div class='dsb-tpl-help'></div>").append(tdDescription(help)));
}
if (doc.deprecated) {
$row.addClass("dsb-tpl-deprecated");
}
$element.append($row);
});
return {
$element: $element,
values: function () {
var vals = {};
keys.forEach(function (k) {
vals[k] = $.trim(readers[k]() || "");
});
return buildTemplateCall(call.name, vals, keys);
}
};
}
// The documented parameters of one template (name without the "Şablon:" prefix), in its own
// paramOrder; [] when it has no TemplateData. The fetch, the shaping and the cache all live in
// wikt.edit, so the wizard, DefSideBoxes and this module share one request and one copy per template.
//
// The key stands in for a missing label, because these become form fields and a field needs something
// written on it.
// A template's parameters: its TemplateData, or -- for one with none, like most Kategorî:Çavkanî
// templates -- every {{{name}}} its own source reads.
function templateParams(name) {
return edit.wt.templateDoc(name).then(function (td) {
var params = ((td && td.params) || []).map(function (p) {
return {
key: p.key,
label: p.label || p.key,
required: p.required,
deprecated: p.deprecated
};
});
return params.length ? params : sourceParams(name);
});
}
var sourceParamsCache = {};
function sourceParams(name) {
if (!sourceParamsCache[name]) {
sourceParamsCache[name] = new mw.Api().get({
action: "query", prop: "revisions", titles: "Template:" + name, rvprop: "content", rvslots: "main",
redirects: 1, formatversion: 2
}).then(function (data) {
var page = data.query.pages[0];
var source = page.revisions ? page.revisions[0].slots.main.content : "";
var keys = [];
var re = /\{\{\{\s*([^{}|]+?)\s*[|}]/g;
var m;
while ((m = re.exec(source)) !== null) {
if (!/^\d+$/.test(m[1]) && keys.indexOf(m[1]) === -1) {
keys.push(m[1]);
}
}
return keys.map(function (key) {
return { key: key, label: key, required: false, deprecated: false };
});
}, function () {
return [];
});
}
return sourceParamsCache[name];
}
// alias -> the name a template's TemplateData documents it under ({r: "rûpel"} for jêder-kitêb). Asked
// of the wiki itself: the parameter lists baked into data-main.json carry no aliases.
var aliasCache = {};
function templateAliases(name) {
if (!aliasCache[name]) {
aliasCache[name] = new mw.Api().get({
action: "templatedata", titles: "Template:" + name, redirects: 1, formatversion: 2
}).then(function (data) {
var map = {};
$.each(data.pages || {}, function (_, page) {
$.each(page.params || {}, function (key, p) {
(p.aliases || []).forEach(function (alias) {
map[alias] = key;
});
});
});
return map;
}, function () {
return {};
});
}
return aliasCache[name];
}
// What to draw for one Kategorî:Çavkanî template: a field per documented parameter, minus the ones the
// form already has boxes for and minus the language parameter, which is filled from the dropdown.
// A template with no TemplateData at all falls back to a lone "Rûpel" box, which is what such citations
// almost always need ({{Şablon|rûpel=12|jêgirtin=…}}).
function fieldSpecs(name) {
return templateParams(name).then(function (params) {
var langParamKey = null;
(params || []).forEach(function (p) {
if ((p.label || "").trim().toLowerCase() === LANG_LABEL) {
langParamKey = p.key;
}
});
var filtered = (params || []).filter(function (p) {
return COVERED_PARAMS.indexOf(p.key) === -1 && p.key !== langParamKey;
});
var list = filtered.length ? filtered : [{ key: "rûpel", label: "Rûpel", required: false }];
return {
langParamKey: langParamKey,
fields: list.map(function (p) {
var size = fieldSize(p.key);
return {
key: p.key,
label: p.label,
required: p.required,
span: size.span,
width: size.width,
multiline: size.multiline
};
})
};
});
}
// The same list for a jêder-* template, straight out of the shared table.
function jederFieldSpecs(jederKey) {
var def = jederDefs[jederKey];
return def ? (def.fields || []).slice() : [];
}
// ---- Citoid --------------------------------------------------------------------------------------
// Today, as Modul:quote wants it (it renders "2024-05-05" as "5 gulan 2024").
function today() {
var d = new Date();
function pad(n) { return (n < 10 ? "0" : "") + n; }
return d.getFullYear() + "-" + pad(d.getMonth() + 1) + "-" + pad(d.getDate());
}
// Carries across the parts of a Citoid result that citoid-helper's own mapping drops: the access date
// and the identifiers for the fields the forms have only just gained. Applied here rather than in
// citoid-helper so it reaches both gadgets without an edit to the MediaWiki: gadget page.
function enrichCitoidFields(fields, raw) {
fields = fields || {};
if (fields.url && !fields["tarîxa-gihiştinê"]) {
// Citoid reports when it actually fetched the page ("accessDate": "2026-09-03"), so use that
// rather than the clock -- they differ whenever the answer came from a cache. today() is only
// the fallback for a result that carries no accessDate.
var accessed = raw && (raw.accessDate || raw.accessdate);
fields["tarîxa-gihiştinê"] = (accessed && String(accessed).slice(0, 10)) || today();
}
if (raw) {
var issn = Array.isArray(raw.ISSN) ? raw.ISSN[0] : raw.ISSN;
if (issn && !fields.issn) {
fields.issn = issn;
}
var doi = Array.isArray(raw.DOI) ? raw.DOI[0] : raw.DOI;
if (doi && !fields.doi) {
fields.doi = doi;
}
if (raw.volume && !fields.cild) {
fields.cild = raw.volume;
}
}
return fields;
}
// One URL/DOI/ISBN -> {jederKey, fields}. The lookup itself lives in the citoid-helper gadget; this
// wrapper exists so neither caller has to know that, and so a missing gadget fails in one place.
function fetchFromCitoid(query) {
if (!(window.wikt && window.wikt.citoid && window.wikt.citoid.fetchJederFields)) {
return $.Deferred().reject("Amûra Citoidê ne barkirî ye.").promise();
}
return window.wikt.citoid.fetchJederFields(query).then(function (result) {
result.fields = enrichCitoidFields(result.fields, result.raw);
return result;
});
}
// Re-derives the fields for a different jêder-* template than the one citoid detected, enriched the
// same way -- used when the person had already chosen a template and we keep their choice.
// The form's link box stands in for a jêder-* template's own url= when that is left empty.
function withLinkAsUrl(jederKey, fields, link) {
var def = jederDefs[jederKey];
var hasUrl = !!def && (def.fields || []).some(function (field) {
return field.key === "url";
});
if (hasUrl && !fields.url && /^https?:\/\//.test(link || "")) {
fields.url = link;
}
return fields;
}
function citoidFieldsFor(jederKey, raw, query) {
if (!(window.wikt && window.wikt.citoid && window.wikt.citoid.dataToJederFields)) {
return {};
}
return enrichCitoidFields(window.wikt.citoid.dataToJederFields(jederKey, raw, query), raw);
}
// ---- the "#*" line ------------------------------------------------------------------------------
// One finished citation line. Modes:
// "jeder" {{jêder-kitêb|ku|sernav=…|jêgirtin=…}}
// "category" the Kategorî:Çavkanî template as the citation template: {{Ç:Kitêb|rûpel=12|…}}
// "plain" free-text source, or none: {{jêder|ku|2=…|jêgirtin=…}} / {{nimûne|ku|…}}
// "raw" a finished template, passed through with only the entry name bolded
// opts: {mode, template, language, fields, langParamKey, quote, translation, transcription,
// source, sourceURL, title, marker, keepTranslation, extra}
function buildCitation(opts) {
var marker = opts.marker || "#*";
var title = opts.title || mw.config.get("wgTitle");
var quote = boldenPageTitle(String(opts.quote || ""), title).text;
if (opts.mode === "raw") {
// Written as given: the point is to paste a citation built elsewhere and have it survive intact.
// A line copied off another entry usually still carries its own "#*"/"#:" -- the marker is added
// back below, so strip it rather than emitting "#* #* {{...}}".
var pasted = String(opts.quote || "").replace(LIST_MARKER, "");
return marker + " " + nlToBr(boldQuoteParam(pasted, title)).trim();
}
var isCategory = opts.mode === "category";
var isTemplate = isCategory || opts.mode === "jeder";
var name = isTemplate ? opts.template : (opts.source || opts.sourceURL ? "jêder" : "nimûne");
var line = marker + " {{" + name;
// jêder-*, jêder and nimûne all take the language as parameter 1. A Kategorî:Çavkanî template only
// gets one when its own TemplateData names it, under its own key -- never assumed positionally.
if (!isCategory) {
line += "|" + opts.language;
}
if (isTemplate) {
var fields = opts.fields || {};
Object.keys(fields).forEach(function (key) {
var value = nlToSpace(String(fields[key] || "").trim());
if (value) {
line += "|" + key + "=" + value;
}
});
if (isCategory && opts.langParamKey) {
line += "|" + opts.langParamKey + "=" + opts.language;
}
// "Ç:" templates are quotation-equivalents rather than usage examples (see Modul:quote).
if (isCategory && /^Ç:/.test(name)) {
line += "|wekjêgirtin=1";
}
} else {
if (opts.source) {
// A positional value containing "=" would be read as its own key=value pair, so name it.
line += (String(opts.source).indexOf("=") !== -1 ? "|2=" : "|") + opts.source;
}
if (opts.sourceURL) {
line += "|url=" + opts.sourceURL;
}
}
var isUsex = name === "nimûne";
var translation = nlToBr(String(opts.translation || "").trim());
// {{nimûne}} always takes one, a Kurmancî example's being its explanation; a quotation's is left out
// for Kurmancî unless the edited line already had one (keepTranslation).
var writeTranslation = !!translation && (isUsex || opts.language !== "ku" || opts.keepTranslation);
// {{nimûne}}'s example is parameter 2 and its translation parameter 3, both positional. A value
// containing "=" would be read as key=value, so then both are named: naming only the example would
// slide the translation into slot 2.
var namedSlots = isUsex && (quote.indexOf("=") !== -1 || (writeTranslation && translation.indexOf("=") !== -1));
line += "|" + (isUsex ? (namedSlots ? "2=" : "") : "jêgirtin=") + nlToBr(quote);
if (writeTranslation) {
// Kategorî:Çavkanî templates route through Modul:quote and take its "t="; jêder-* uses "tercime=".
line += "|" + (isUsex ? (namedSlots ? "3=" : "") : isCategory ? "t=" : "tercime=") + translation;
}
var transcription = nlToBr(String(opts.transcription || "").trim());
if (transcription) {
line += "|tr=" + transcription;
}
// Parameters the form has no box for, carried through from the line being edited.
(opts.extra || []).forEach(function (param) {
line += "|" + param;
});
// A short example and its translation read best on one line, which {{nimûne}} does only when told.
// Short is Modul:usex's own measure for "rêz=auto": at most 100 characters shown between them.
if (isUsex && writeTranslation && !hasInlineParam(opts.extra) &&
shownLength(quote) + shownLength(translation) <= 100) {
line += "|rêz=1";
}
return line + "}}";
}
// True when the parameters already say inline or not: {{nimûne}}'s rêz=, under any of its names.
function hasInlineParam(params) {
return (params || []).some(function (param) {
return /^\s*(?:rêz|birêz|inline)\s*=/.test(param);
});
}
// How many characters a bit of wikitext shows: link targets, bold/italic marks and tags don't count.
function shownLength(text) {
return String(text || "")
.replace(/\[\[(?:[^\]|]*\|)?([^\]]*)\]\]/g, "$1")
.replace(/'{2,}/g, "")
.replace(/<[^>]*>/g, " ")
.length;
}
// A leading "#*" / "#:" / "##*" ... list marker.
var LIST_MARKER = /^\s*#+[*:]\s*/;
// True when the text is a whole citation line copied from somewhere else: its own list marker followed
// by a template call. That is the shape of every line this family writes -- {{jêder}}, {{jêder-kitêb}},
// {{nm}}, {{nimûne}}, {{mk}}, any Kategorî:Çavkanî template -- so the template name is not checked
// against a list, which could never cover every citation template on the wiki.
//
// Used to switch the form into raw mode by itself: pasting a finished line and forgetting to change the
// dropdown would otherwise wrap it in a second {{nimûne}}.
function looksLikeCitationLine(text) {
var trimmed = String(text || "");
if (!LIST_MARKER.test(trimmed)) {
return false;
}
return trimmed.replace(LIST_MARKER, "").slice(0, 2) === "{{";
}
// True when the example box holds nothing but one finished template call -- the cue to offer, or to
// switch to, the "write it out as-is" mode.
function looksLikeTemplate(text) {
var trimmed = String(text || "").trim();
if (trimmed.slice(0, 2) !== "{{" || trimmed.slice(-2) !== "}}") {
return false;
}
var parsed = edit.wt.parseTemplateCalls(trimmed);
return parsed.calls.length === 1 && !parsed.otherContent;
}
// ---- reading a finished line back --------------------------------------------------------------
// [[Şablon:nimûne]] and every redirect to it.
var USEX_NAMES = ["nimûne", "mk", "ux", "mînak", "nim", "nm"];
var USEX_TRANSLATION = ["3", "t", "tercime", "translation", "w", "werger"];
var USEX_TRANSCRIPTION = ["tr", "transliteration"];
// A quotation template's translation, under the name Modul:quote documents and its aliases.
var QUOTE_TRANSLATION = ["t", "tercime", "werger", "w"];
// [[Şablon:bênimûne]] and its redirects: the "no example yet" placeholder, with or without a language.
var EMPTY_EXAMPLE_MARKER = /^#+\*\s*\{\{\s*(?:bênimûne|bêmînak|mînak\?|nimûne\?)\s*(?:\|[^{}]*)?\}\}\s*$/i;
// The text of a line written as one italic run ("''…''", bold inside allowed -- "'''''X''' …''" opens
// with both), or null.
function italicRun(text) {
var t = $.trim(text || "");
var opening = /^'*/.exec(t)[0].length;
var m = /^''([\s\S]+)''$/.exec(t);
if ((opening !== 2 && opening !== 5) || !m || /''/.test(m[1].replace(/'''/g, ""))) {
return null;
}
return m[1];
}
// "''…'' (…)": an italic example with its explanation in brackets on the same line, as
// {text, translation}, or null. One level of brackets inside the explanation is allowed.
function italicWithGloss(text) {
var m = /^([\s\S]*'')\s*\(([^()]*(?:\([^()]*\)[^()]*)*)\)$/.exec($.trim(text || ""));
var italic = m && italicRun(m[1]);
if (italic === null || !m) {
return null;
}
var gloss = $.trim(m[2]);
return { text: italic, translation: italicRun(gloss) || gloss };
}
function brToNl(text) {
return String(text || "").replace(/<br\s*\/?>/gi, "\n");
}
/**
* One "#:"/"#*" block -- its line plus any deeper "#::"/"#*:" lines -- as the form's values, or null when
* it is not an example: a word list, the "no example yet" placeholder, a plain note.
* {mode: "nimune"|"jeder"|"source"|"raw", marker, template, text, translation, transcription,
* source, sourceURL, fields, extra}
* extra is every parameter the form has no box for, to be written back as it was. A "raw" block is
* edited as written: text is the whole block, list markers included.
*/
function parseCitationLine(block) {
var all = String(block || "").split("\n");
var k = 1;
while (k < all.length && !/^#/.test(all[k])) {
k++;
}
var head = /^#+([:*])\s*([\s\S]*)$/.exec(all.slice(0, k).join("\n"));
var sub = all.slice(k);
if (!head || EMPTY_EXAMPLE_MARKER.test(all[0])) {
return null;
}
var out = { mode: "raw", marker: head[1], template: "", text: "", translation: "", transcription: "",
source: "", sourceURL: "", fields: {}, extra: [] };
var body = $.trim(head[2]);
var parsed = edit.wt.parseTemplateCalls(body);
var call = parsed.calls.length === 1 && !parsed.otherContent ? parsed.calls[0] : null;
var name = call ? edit.wt.canonicalTemplateKey(call.name) : "";
name = name.charAt(0).toLowerCase() + name.slice(1);
var isUsex = USEX_NAMES.indexOf(name) !== -1;
var def = call && jederDefs[name];
if (call && !sub.length && (isUsex || def || name === "jêder")) {
var split = edit.wt.splitCallParams(call.params);
var fieldKeys = def ? def.fields.map(function (f) { return f.key; }) : [];
out.mode = isUsex ? "nimune" : def ? "jeder" : "source";
out.template = def ? name : "";
split.used.forEach(function (key, i) {
var value = brToNl(split.values[key]);
if (key === "1") {
return; // the language, which the section already says
}
if (isUsex ? key === "2" : (key === "jêgirtin" || key === "jg")) {
out.text = value;
} else if ((isUsex ? USEX_TRANSLATION : QUOTE_TRANSLATION).indexOf(key) !== -1) {
out.translation = value;
} else if (USEX_TRANSCRIPTION.indexOf(key) !== -1) {
out.transcription = value;
} else if (def && fieldKeys.indexOf(key) !== -1) {
out.fields[key] = split.values[key];
} else if (name === "jêder" && key === "2") {
out.source = split.values[key];
} else if (name === "jêder" && key === "url") {
out.sourceURL = split.values[key];
} else {
// Named when it was positional, so it cannot shift into a slot the form now fills.
out.extra.push(/^\d+$/.test(key) && !/=/.test(call.params[i]) ? key + "=" + split.values[key] : $.trim(call.params[i]));
}
});
return out;
}
// Any other citation template on a "#*" line -- the Kategorî:Çavkanî ones, {{J:…}} and {{Ç:…}} --
// reads into the category mode: quote, translation and transcription in their boxes, every other
// named parameter as a field. Which of those get a box is known once the template's parameters
// are fetched (see applyAliases).
if (call && !sub.length && out.marker === "*" &&
(/^[JÇ]:/.test($.trim(call.name)) || /(?:^|\|)\s*(?:jêgirtin|jg)\s*=/.test(call.params.join("|")))) {
var catSplit = edit.wt.splitCallParams(call.params);
out.mode = "category";
out.template = $.trim(call.name);
catSplit.used.forEach(function (key, i) {
var value = catSplit.values[key];
if (key === "jêgirtin" || key === "jg") {
out.text = brToNl(value);
} else if (QUOTE_TRANSLATION.indexOf(key) !== -1) {
out.translation = brToNl(value);
} else if (USEX_TRANSCRIPTION.indexOf(key) !== -1) {
out.transcription = brToNl(value);
} else if (key === "wekjêgirtin" && /^Ç:/.test(out.template)) {
return; // buildCitation() writes it for every "Ç:" template
} else if (/^\d+$/.test(key)) {
out.extra.push(!/=/.test(call.params[i]) ? key + "=" + value : $.trim(call.params[i]));
} else {
out.fields[key] = value;
}
});
return out;
}
if (out.marker === ":") {
// The hand-written kind: "#: ''…''", its translation, if any, on a "#::" line under it.
var italic = italicRun(body);
var translationLine = sub.length === 1 ? /^#+::\s*([\s\S]*)$/.exec(sub[0]) : null;
if (italic !== null && (!sub.length || translationLine)) {
out.mode = "nimune";
out.text = brToNl(italic);
out.translation = translationLine ? brToNl(italicRun(translationLine[1]) || $.trim(translationLine[1])) : "";
return out;
}
var withGloss = sub.length ? null : italicWithGloss(body);
if (withGloss) {
out.mode = "nimune";
out.text = brToNl(withGloss.text);
out.translation = brToNl(withGloss.translation);
return out;
}
if (!isUsex) {
return null;
}
}
out.text = all.join("\n");
return out;
}
/**
* Settles which parameters of a read line get a box. aliases maps an alias to its documented name
* (templateAliases); fieldKeys are the boxes the form drew. A parameter written under an alias -- "r="
* for "rûpel=" -- goes to its box; one with no box goes to extra, written back as it was.
*/
function applyAliases(example, aliases, fieldKeys) {
var pending = example.extra.slice();
Object.keys(example.fields).forEach(function (key) {
if (fieldKeys.indexOf(key) === -1) {
pending.push(key + "=" + example.fields[key]);
delete example.fields[key];
}
});
example.extra = [];
pending.forEach(function (param) {
var m = /^\s*([^=]+?)\s*=([\s\S]*)$/.exec(param);
var key = m ? (aliases[m[1]] || m[1]) : null;
var value = m ? $.trim(m[2]) : "";
if (m && fieldKeys.indexOf(key) !== -1 && !example.fields[key]) {
example.fields[key] = value;
} else if (m && key === "jêgirtin" && !example.text) {
example.text = brToNl(value);
} else if (m && QUOTE_TRANSLATION.indexOf(key) !== -1 && !example.translation) {
example.translation = brToNl(value);
} else {
example.extra.push(param);
}
});
return example;
}
/**
* newLine with its parameters in the order originalLine had them, so an edit's diff shows only what
* changed. Parameters match by name -- an alias counting as the name it stands for (aliases, from
* templateAliases) -- and positional ones by position; any the original lacked follow in newLine's own
* order. A line that is not one template call on either side comes back as it was.
*/
function keepOrder(newLine, originalLine, aliases) {
aliases = aliases || {};
var marker = /^#+[:*]\s*/.exec(newLine || "");
var oldBody = /^#+[:*]\s*([\s\S]*)$/.exec(originalLine || "");
if (!marker || !oldBody) {
return newLine;
}
var fresh = edit.wt.parseTemplateCalls(newLine.slice(marker[0].length));
var old = edit.wt.parseTemplateCalls($.trim(oldBody[1]));
if (fresh.calls.length !== 1 || fresh.otherContent || old.calls.length !== 1 || old.otherContent) {
return newLine;
}
function keyed(params) {
var positional = 0;
return params.map(function (raw) {
var m = /^\s*([^|={}\n]+?)\s*=/.exec(raw);
var key = m ? m[1] : String(++positional);
return { key: aliases[key] || key, raw: raw };
});
}
var rest = keyed(fresh.calls[0].params);
var ordered = [];
keyed(old.calls[0].params).forEach(function (o) {
for (var i = 0; i < rest.length; i++) {
if (rest[i].key === o.key) {
ordered.push(rest.splice(i, 1)[0]);
return;
}
}
});
return marker[0] + "{{" + fresh.calls[0].name + ordered.concat(rest).map(function (p) {
return "|" + p.raw;
}).join("") + "}}";
}
// Where the {{ … }} opened on lines[start] closes, so a template written over several lines stays whole.
function braceEnd(lines, start) {
var depth = 0;
for (var i = start; i < lines.length; i++) {
depth += (lines[i].match(/\{\{/g) || []).length - (lines[i].match(/\}\}/g) || []).length;
if (depth <= 0) {
return i;
}
}
return lines.length - 1;
}
// The "#:"/"#*" blocks right under the definition on lines[defIndex], each {start, end, text, example}:
// example is parseCitationLine's reading, or null for a block that is not an example.
function exampleBlocks(lines, defIndex) {
var depth = /^#+/.exec(lines[defIndex])[0].length;
var own = new RegExp("^#{" + depth + "}[:*]");
var deeper = new RegExp("^#{" + depth + "}[:*][:*]");
var blocks = [];
var i = defIndex + 1;
while (i < lines.length && own.test(lines[i])) {
var start = i;
var end = braceEnd(lines, i);
while (end + 1 < lines.length && deeper.test(lines[end + 1])) {
end = braceEnd(lines, end + 1);
}
var text = lines.slice(start, end + 1).join("\n");
blocks.push({ start: start, end: end, text: text, example: parseCitationLine(text) });
i = end + 1;
}
return blocks;
}
/**
* Replaces the index-th example under a definition with code, or removes it when code is null.
* original is the block as it read when the form opened. When the index no longer holds it (an earlier
* queued change moved it) the one block still reading exactly that is used; otherwise nothing is touched.
*/
function replaceExample(pageContent, language, sectionType, sectionOrdinal, definitionLevel, index, original, code) {
var loc = edit.wt.locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var defIndex = edit.wt.findDefinitionLine(lines, loc.posLineIndex, definitionLevel);
var examples = exampleBlocks(lines, defIndex).filter(function (b) {
return b.example;
});
var block = examples[index] && examples[index].text === original ? examples[index] : null;
if (!block) {
var same = examples.filter(function (b) {
return b.text === original;
});
block = same.length === 1 ? same[0] : null;
}
if (!block) {
throw new edit.util.SubmitAbort("Ev nimûne ji dema vekirina formê ve hatiye guhartin — rûpelê nû bike û dîsa biceribîne.");
}
var replacement = code === null ? [] : String(code).split("\n");
lines.splice.apply(lines, [block.start, block.end - block.start + 1].concat(replacement));
return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n");
}
// Words only, lower-cased: links, templates, tags and quote marks out, so the page's drawn text and the
// line's wikitext can be compared.
function normalizeWords(text) {
return String(text || "")
.replace(/\[\[(?:[^\]|]*\|)?([^\]]*)\]\]/g, "$1")
.replace(/\{\{[^{}]*\}\}/g, " ")
.replace(/<[^>]*>/g, " ")
.replace(/'{2,}/g, "")
.toLowerCase()
.replace(/[\s.,;:!?"'“”‘’«»()\[\]\-–—…\/]+/g, "");
}
// True when the text a page draws for an example comes from this line.
function exampleMatches(drawnText, example) {
var source = example.text;
if (example.mode === "raw") {
var quote = /\|\s*(?:jêgirtin|jg)\s*=([^|}]*)/.exec(source);
source = quote ? quote[1] : source.replace(/^#+[:*]\s*/, "");
}
var drawn = normalizeWords(drawnText);
var written = normalizeWords(source);
if (!drawn || !written) {
return false;
}
return drawn === written || written.indexOf(drawn.slice(0, 24)) !== -1;
}
module.exports = {
CATEGORY_KEY: CATEGORY_KEY,
RAW_KEY: RAW_KEY,
COVERED_PARAMS: COVERED_PARAMS,
LANG_LABEL: LANG_LABEL,
jederDefs: jederDefs,
fieldSize: fieldSize,
exclusivePartner: exclusivePartner,
boldenPageTitle: boldenPageTitle,
nlToBr: nlToBr,
nlToSpace: nlToSpace,
fetchCategoryTemplates: fetchCategoryTemplates,
buildCategoryTemplateSearch: buildCategoryTemplateSearch,
openTemplateDialog: openTemplateDialog,
buildTemplateParamForm: buildTemplateParamForm,
templateParams: templateParams,
fieldSpecs: fieldSpecs,
jederFieldSpecs: jederFieldSpecs,
fetchFromCitoid: fetchFromCitoid,
citoidFieldsFor: citoidFieldsFor,
withLinkAsUrl: withLinkAsUrl,
today: today,
buildCitation: buildCitation,
looksLikeTemplate: looksLikeTemplate,
looksLikeCitationLine: looksLikeCitationLine,
USEX_NAMES: USEX_NAMES,
EMPTY_EXAMPLE_MARKER: EMPTY_EXAMPLE_MARKER,
parseCitationLine: parseCitationLine,
applyAliases: applyAliases,
keepOrder: keepOrder,
templateAliases: templateAliases,
exampleBlocks: exampleBlocks,
replaceExample: replaceExample,
exampleMatches: exampleMatches
};
}());
// </nowiki>
559iftd4dpsbd51hzusaz9ydqn2oryu
6532612
6532102
2026-09-19T09:02:27Z
Wikihez
7344
DefSideBoxes: hide the pending-changes box while a dialog is open
6532612
javascript
text/javascript
// <nowiki>
/*
* Page: [[MediaWiki:Gadget-wikt.cite.js]]
*
* Citations for both add-examples and the wizard: jêder-* templates, [[Kategorî:Çavkanî]] templates,
* Citoid, and the "#*" line they become. fieldSpecs() returns plain field descriptions because the two
* callers draw them differently (OOUI vs the wizard's own grid); everything else is shared. Also the
* template-param dialog (openTemplateDialog), used the same way by DefSideBoxes and start.js.
*
* The only caller of window.wikt.citoid, which the citoid-helper gadget owns.
*/
(function () {
"use strict";
var edit = require("ext.gadget.wikt.edit");
var util = edit.util;
var wt = edit.wt;
var langs = edit.langs;
var escapeRegExp = util.escapeRegExp;
var tdText = wt.tdText;
var parseTemplateCalls = wt.parseTemplateCalls;
var splitCallParams = wt.splitCallParams;
var buildTemplateCall = wt.buildTemplateCall;
var jederDefs = edit.data.jederDefs || {};
var etimon = require("./wikt.cite/etimon.js");
var api = new mw.Api();
// Sentinel _currentJederKey / dropdown value for "pick a template from Kategorî:Çavkanî". Not a real
// jederDefs key. Both gadgets use this same string, so a draft saved by one is read by the other.
var CATEGORY_KEY = "__category__";
// Sentinel for "the example box holds a finished template; write it out untouched".
var RAW_KEY = "__raw__";
// Covered by the form's own dedicated boxes, so they are never drawn again as generic template fields.
var COVERED_PARAMS = ["jêgirtin", "jg", "t", "tr"];
// A Kategorî:Çavkanî template whose TemplateData labels a parameter exactly this is fed the language
// from the language dropdown instead of showing a box for it. Unlike jêder-*, an arbitrary template has
// no "parameter 1 is the language" convention, so nothing is assumed positionally.
var LANG_LABEL = "koda zimanî";
// Field key -> {span, multiline}, taken from whichever jêder-* template defines it first. Most
// Kategorî:Çavkanî templates reuse the same bibliographic parameter names, so "sernav" comes out
// full-width and multiline there too rather than as a generic one-line box.
var SIZE_BY_KEY = {};
Object.keys(jederDefs).forEach(function (jederKey) {
(jederDefs[jederKey].fields || []).forEach(function (field) {
if (!SIZE_BY_KEY[field.key]) {
SIZE_BY_KEY[field.key] = {
span: field.span || 4,
multiline: !!field.multiline,
width: field.width || ""
};
}
});
});
// Field pairs Modul:quote refuses together ("Divê tenê yek ji |tarîx= an |sal= were dayîn"): a full
// date and a bare year say the same thing twice. Both are offered because either may be all a source
// gives, so the forms clear one when the other is filled rather than letting the citation break.
var EXCLUSIVE_PAIRS = [["sal", "tarîx"]];
function exclusivePartner(key) {
var found = null;
EXCLUSIVE_PAIRS.forEach(function (pair) {
if (pair[0] === key) {
found = pair[1];
} else if (pair[1] === key) {
found = pair[0];
}
});
return found;
}
function fieldSize(key) {
return SIZE_BY_KEY[key] || { span: 4, multiline: false, width: "" };
}
// ---- text helpers -------------------------------------------------------------------------------
// The entry name as a pattern. A Kurdish word ending in -î loses the circumflex once something is
// attached to it ("safî" is written "safiye"), so a title ending that way matches either spelling --
// otherwise the name is simply never found in the quotation.
function titlePattern(title) {
var escaped = escapeRegExp(String(title || ""));
return /î$/i.test(escaped) ? escaped.slice(0, -1) + "[îi]" : escaped;
}
// Wraps the entry's own name in bold wherever it appears in the quotation, which is how quotations are
// written here, and reports whether the name ends up bold so a caller can say so.
//
// The name may carry an attached suffix ("celbê"), so the match runs on to the end of the word. A word
// ends at whitespace, punctuation or markup: excluding markup is what keeps "celb<br>me’şûq" from
// bolding as one lump. The typographic apostrophe stays a word character -- it is one inside Kurdish
// words like "me’şûq".
function boldenPageTitle(text, title) {
var source = String(text || "");
var escapedTitle = titlePattern(title);
var suffixPattern = "([^\\s.,;:?!()'\"<>\\[\\]{}|=/\\\\«»„“”–—]+)?";
var titleRe = new RegExp("(" + escapedTitle + suffixPattern + ")", "ig");
var titleAnywhere = new RegExp(escapedTitle, "i");
// Whatever already sits between ''' marks is copied through untouched, so a quotation somebody
// bolded by hand -- or one an earlier run bolded -- never collects a second pair.
var boldSpan = /'''[\s\S]*?'''/g;
var out = "";
var last = 0;
var alreadyBold = false;
var span;
while ((span = boldSpan.exec(source)) !== null) {
out += source.slice(last, span.index).replace(titleRe, "'''$1'''");
if (titleAnywhere.test(span[0])) {
alreadyBold = true;
}
out += span[0];
last = span.index + span[0].length;
}
out += source.slice(last).replace(titleRe, "'''$1'''");
return { text: out, bolded: out !== source || alreadyBold };
}
// A literal newline would end the single-line "#*" wikitext, so display text keeps its break as <br>...
function nlToBr(text) {
return String(text || "").replace(/\r\n|\r|\n/g, "<br>");
}
// ...while a plain parameter value (an author, a title) just loses it.
function nlToSpace(text) {
return String(text || "").replace(/\s*(?:\r\n|\r|\n)\s*/g, " ");
}
// Bolds the entry name inside a pasted citation's jêgirtin=/jg= value only, so a book title or author
// containing it is left alone. With no such parameter nothing is bolded: running the plain-text bolder
// over wikitext would wrap the braces too.
function boldQuoteParam(text, title) {
var match = /(\|\s*(?:jêgirtin|jg)\s*=)([\s\S]*?)(?=\|[^|=]*=|\}\}\s*$)/.exec(text);
if (!match) {
return text;
}
var bolded = boldenPageTitle(match[2], title).text;
return text.slice(0, match.index) + match[1] + bolded + text.slice(match.index + match[0].length);
}
// "name — description" for each Kategorî:Çavkanî option in a <select>, from the description half of
// the same TemplateData every citation picker already fetches -- so a search box built over these
// options can also match on what a template documents itself as doing, not only its name. An
// undescribed option, or a failed fetch, just keeps its plain label; never blocks on this.
// A self-contained "search Kategorî:Çavkanî" combo: a text input plus its own results list, matching
// add-examples' own jêgirtin picker -- each row shows its label, a " → target" arrow when a redirect's
// label differs from its target, and a 🔗 link to the canonical template's own page. opts.onPick(entry)
// fires when a row is chosen; the input is then left holding the plain label, not "label → target", so
// re-focusing it to search again doesn't start from that arrow text. opts.describe: true also fills in
// each visible row's own TemplateData description once it loads (batched, so scrolling through matches
// costs a handful of requests, not one per row).
function buildCategoryTemplateSearch(opts) {
opts = opts || {};
var shell = util.buildSearchList({
placeholder: opts.placeholder || util.msg.searchTemplate
});
var $input = shell.$input;
var $results = shell.$results;
var $status = $("<span class='wiktku-cat-tpl-status'></span>").text(util.msg.templatesLoading);
var list = [];
function decorate($text, target, wanted) {
if (!wanted) {
return;
}
edit.wt.fetchTemplateData(target).then(function (doc) {
var desc = doc && edit.wt.tdText(doc.description);
if (desc && $text.closest("body").length) {
$text.append(document.createTextNode(" — " + edit.wt.shortDesc(desc)));
}
});
}
function showResults(query) {
var q = $.trim(query || "").toLowerCase();
$results.empty();
var matched = q ? list.filter(function (entry) {
return entry.label.toLowerCase().indexOf(q) !== -1;
}) : list;
if (!matched.length) {
shell.close();
return;
}
var shown = matched.slice(0, 50);
// Only what a search has narrowed to: an empty box is the whole category, and describing its
// first fifty would ask the wiki about templates nobody has looked for.
var describing = !!opts.describe && !!q;
if (describing) {
edit.wt.fetchTemplateDataBatch(shown.map(function (entry) { return entry.target; }));
}
shown.forEach(function (entry) {
var $li = $("<li class='wiktku-cat-tpl-row'></li>");
var $text = $("<span class='wiktku-cat-tpl-text'></span>").text(entry.label);
if (entry.label !== entry.target) {
$text.append($("<span class='wiktku-cat-tpl-arrow'></span>").text(" → " + entry.target));
}
decorate($text, entry.target, describing);
var $link = $("<a class='wiktku-cat-tpl-link' target='_blank' rel='noopener'>🔗</a>")
.attr("title", util.msg.openTemplatePage)
.attr("href", util.tplPageUrl(entry.target));
// stopPropagation only -- preventDefault would stop the link from actually navigating.
$link.on("mousedown click", function (e) { e.stopPropagation(); });
$li.append($text, $link);
shell.bindPick($li, function () {
shell.close();
$input.val(entry.label);
opts.onPick(entry);
});
$results.append($li);
});
shell.open();
}
$input.on("input focus", function () {
showResults($(this).val());
});
$input.on("blur", function () {
setTimeout(shell.close, 200); // lets the pick handler fire first
});
fetchCategoryTemplates().then(function (l) {
list = l;
$status.text("");
}, function () {
$status.text(util.msg.templatesFailed);
});
return {
$element: $("<span class='wiktku-native-select-wrap wiktku-cat-tpl-picker'></span>").append($input, $results, $status),
$input: $input,
$status: $status
};
}
// ---- Kategorî:Çavkanî -----------------------------------------------------------------------------
// The category's template members plus their redirects, each redirect its own searchable entry pointing
// at the same canonical target, so a template is findable by any of its names. Cached for the session.
var catTemplatesPromise = null;
function fetchCategoryTemplates() {
if (catTemplatesPromise) {
return catTemplatesPromise;
}
catTemplatesPromise = api.get({
action: "query",
generator: "categorymembers",
gcmtitle: "Kategorî:Çavkanî",
gcmnamespace: 10,
gcmlimit: "max",
prop: "redirects",
rdnamespace: 10,
rdlimit: "max",
formatversion: 2
}).then(function (data) {
var list = [];
((data.query && data.query.pages) || []).forEach(function (page) {
var target = page.title.replace(/^[^:]+:/, "");
list.push({ label: target, target: target });
(page.redirects || []).forEach(function (redirect) {
list.push({ label: redirect.title.replace(/^[^:]+:/, ""), target: target });
});
});
list.sort(function (a, b) {
return a.label.localeCompare(b.label, mw.config.get("wgUserLanguage"));
});
return list;
}, function () {
return [];
});
return catTemplatesPromise;
}
// ---- template-param dialog: fills a {{Name|...}} call from its own TemplateData -------------------
// Shared by DefSideBoxes (a fresh insert from Etîmolojî/Çavkanî, or double-clicking an existing chip
// to edit it) and start.js's own Etîmolojî/Çavkanî pickers -- one dialog, so all of them read the same
// TemplateData the same way.
// OOUI's own dialog stack -- the same widgetry VisualEditor's template dialog is built on.
var citeWindowManager = null;
function templateDialogManager() {
if (!citeWindowManager) {
citeWindowManager = new OO.ui.WindowManager();
$(document.body).append(citeWindowManager.$element);
}
return citeWindowManager;
}
// Opens one template call in a modal built from its TemplateData. Resolves with the edited wikitext, or
// null when the user cancels.
// One at a time: a second open while one is loading or showing (a chip clicked again before its dialog
// appeared) stacks a window the manager does not track, and that window's buttons do nothing. The
// second call resolves null, as a cancel does.
var templateDialogBusy = false;
function openTemplateDialog(callWikitext) {
var done = $.Deferred();
var call = parseTemplateCalls(callWikitext).calls[0];
if (!call || templateDialogBusy) {
return done.resolve(null).promise();
}
// {{etîmon}} has no form TemplateData can describe -- a chain of steps, each with its own words
// and their own modifiers -- so it has a builder of its own, on the same contract as this dialog.
if (etimon.isEtimonName(call.name)) {
return etimon.openDialog(callWikitext);
}
templateDialogBusy = true;
done.always(function () {
templateDialogBusy = false;
});
$.when(
mw.loader.using(["oojs-ui-core", "oojs-ui-windows"]),
edit.wt.fetchTemplateData(call.name)
).then(function (_loaded, td) {
var result = null;
// The parent is captured rather than reached through TplDialog.super: "super" is a reserved word,
// and OOjs has moved between .super and .parent for it over the years.
var ParentDialog = OO.ui.ProcessDialog;
function TplDialog(config) {
ParentDialog.call(this, config);
}
OO.inheritClass(TplDialog, ParentDialog);
TplDialog.static.name = "citeTemplateDialog";
TplDialog.static.title = "{{" + call.name + "}}";
TplDialog.static.actions = [
{ action: "save", label: "Biguhêre", flags: ["primary", "progressive"] },
{ action: "remove", label: "Jê bibe", flags: "destructive" },
{ label: util.msg.cancel, flags: "safe" }
];
TplDialog.prototype.initialize = function () {
ParentDialog.prototype.initialize.apply(this, arguments);
this.panel = new OO.ui.PanelLayout({ padded: true, expanded: false });
this.form = buildTemplateParamForm(call, td);
this.panel.$element.append(this.form.$element);
this.$body.append(this.panel.$element);
};
TplDialog.prototype.getBodyHeight = function () {
return this.panel.$element.outerHeight(true);
};
TplDialog.prototype.getActionProcess = function (action) {
var dialog = this;
if (action === "save" || action === "remove") {
return new OO.ui.Process(function () {
result = action === "remove" ? "" : dialog.form.values();
dialog.close();
});
}
return ParentDialog.prototype.getActionProcess.call(this, action);
};
// Marks the page while this is showing, so a floating box of ours (DefSideBoxes' queue) does
// not sit over a dialog the page's stacking order puts underneath it.
$(document.body).addClass("wikt-dialog-open");
done.always(function () {
$(document.body).removeClass("wikt-dialog-open");
});
var manager = templateDialogManager();
var dialog = new TplDialog({ size: "medium" });
manager.addWindows([dialog]);
var instance = manager.openWindow(dialog);
instance.closed.then(function () {
manager.clearWindows();
done.resolve(result);
});
instance.opening.fail(function () {
manager.clearWindows();
done.resolve(null);
});
}, function () {
done.resolve(null);
});
return done.promise();
}
// TemplateData descriptions are plain text, but authors write wikilinks in them; render those as links.
function tdDescription(text) {
var $out = $("<span></span>");
var re = /\[\[([^\[\]|]+)(?:\|([^\[\]]*))?\]\]/g;
var last = 0;
var m;
while ((m = re.exec(text)) !== null) {
if (m.index > last) {
$out.append(document.createTextNode(text.slice(last, m.index)));
}
$out.append($("<a></a>").attr("href", mw.util.getUrl(m[1])).text(m[2] || m[1]));
last = re.lastIndex;
}
if (last < text.length) {
$out.append(document.createTextNode(text.slice(last)));
}
return $out;
}
// A parameter whose documentation says so takes "kelîme<t:...>" inline modifiers, so it gets the pill
// widget instead of a plain box. TemplateData has no field for this, hence the marker in the description.
var INLINE_MODIFIER_MARKER = "WF:Guherkerên rêzê";
function acceptsInlineModifiers(doc) {
return tdText(doc && doc.description).indexOf(INLINE_MODIFIER_MARKER) !== -1;
}
// A language-code parameter, per its own label.
function isLanguageParam(doc) {
return /ziman/i.test(tdText(doc && doc.label));
}
function buildTemplateParamForm(call, td) {
var parsed = splitCallParams(call.params);
var docParams = (td && td.params) || {};
var keys = (td && td.paramOrder) ? td.paramOrder.slice() : Object.keys(docParams);
parsed.used.forEach(function (k) {
if (keys.indexOf(k) === -1) {
keys.push(k);
}
});
var $element = $("<div class='dsb-tpl-form'></div>");
var readers = {}; // key -> () => the parameter's current text
$element.append($("<div class='dsb-tpl-name'></div>").append(
$("<a></a>").attr("href", mw.util.getUrl("Şablon:" + call.name))
.attr("target", "_blank").text("{{" + call.name + "}}")
));
var desc = tdText(td && td.description);
if (desc) {
$element.append($("<div class='dsb-tpl-desc'></div>").append(tdDescription(desc)));
}
keys.forEach(function (key) {
var doc = docParams[key] || {};
var value = parsed.values[key] || "";
var $field;
if (acceptsInlineModifiers(doc)) {
// The same word row the sense lists use: plain text plus removable "<t:...>" pills.
var row = util.makeModifierRow({
prefix: "dsb-",
placeholder: tdText(doc.label) || key,
modTitle: util.msg.addModifier,
removeTitle: "Vê nirxê jê bibe",
removeModTitle: util.msg.removeModifier
});
row.setRaw(value);
// A <ul> so the row's own "close other pickers" lookup has something to scope to.
$field = $("<ul class='dsb-wordlist dsb-tpl-modifier-list'></ul>").append(row.$li);
readers[key] = row.getRaw;
} else {
var $input = $("<input type='text' class='dsb-input'>").val(value);
if (isLanguageParam(doc)) {
$input.attr("list", langs.datalistId()).attr("placeholder", "koda zimanî…");
// Typing a language the short list does not have is the cue to fetch the rest.
$input.on("input", function () {
if (langs.missingFromCore($input.val())) {
langs.ensureFull();
}
});
} else {
var suggested = doc.suggestedvalues || [];
if (suggested.length) {
var listId = "dsb-sv-" + call.name.replace(/[^A-Za-z0-9]/g, "") + "-" + key;
var $list = $("<datalist></datalist>").attr("id", listId);
suggested.forEach(function (v) {
$list.append($("<option></option>").val(v));
});
$input.attr("list", listId);
$element.append($list);
}
}
$field = $input;
readers[key] = function () {
return $input.val();
};
}
var $label = $("<label class='dsb-adv-label'></label>").text(tdText(doc.label) || key);
if (!docParams[key]) {
$label.append($("<span class='dsb-tpl-undocumented'></span>").text(" (ne di belgeyê de)"));
}
var $row = $("<div class='dsb-tpl-param-row'></div>").append($label, $field);
var help = tdText(doc.description);
if (help) {
$row.append($("<div class='dsb-tpl-help'></div>").append(tdDescription(help)));
}
if (doc.deprecated) {
$row.addClass("dsb-tpl-deprecated");
}
$element.append($row);
});
return {
$element: $element,
values: function () {
var vals = {};
keys.forEach(function (k) {
vals[k] = $.trim(readers[k]() || "");
});
return buildTemplateCall(call.name, vals, keys);
}
};
}
// The documented parameters of one template (name without the "Şablon:" prefix), in its own
// paramOrder; [] when it has no TemplateData. The fetch, the shaping and the cache all live in
// wikt.edit, so the wizard, DefSideBoxes and this module share one request and one copy per template.
//
// The key stands in for a missing label, because these become form fields and a field needs something
// written on it.
// A template's parameters: its TemplateData, or -- for one with none, like most Kategorî:Çavkanî
// templates -- every {{{name}}} its own source reads.
function templateParams(name) {
return edit.wt.templateDoc(name).then(function (td) {
var params = ((td && td.params) || []).map(function (p) {
return {
key: p.key,
label: p.label || p.key,
required: p.required,
deprecated: p.deprecated
};
});
return params.length ? params : sourceParams(name);
});
}
var sourceParamsCache = {};
function sourceParams(name) {
if (!sourceParamsCache[name]) {
sourceParamsCache[name] = new mw.Api().get({
action: "query", prop: "revisions", titles: "Template:" + name, rvprop: "content", rvslots: "main",
redirects: 1, formatversion: 2
}).then(function (data) {
var page = data.query.pages[0];
var source = page.revisions ? page.revisions[0].slots.main.content : "";
var keys = [];
var re = /\{\{\{\s*([^{}|]+?)\s*[|}]/g;
var m;
while ((m = re.exec(source)) !== null) {
if (!/^\d+$/.test(m[1]) && keys.indexOf(m[1]) === -1) {
keys.push(m[1]);
}
}
return keys.map(function (key) {
return { key: key, label: key, required: false, deprecated: false };
});
}, function () {
return [];
});
}
return sourceParamsCache[name];
}
// alias -> the name a template's TemplateData documents it under ({r: "rûpel"} for jêder-kitêb). Asked
// of the wiki itself: the parameter lists baked into data-main.json carry no aliases.
var aliasCache = {};
function templateAliases(name) {
if (!aliasCache[name]) {
aliasCache[name] = new mw.Api().get({
action: "templatedata", titles: "Template:" + name, redirects: 1, formatversion: 2
}).then(function (data) {
var map = {};
$.each(data.pages || {}, function (_, page) {
$.each(page.params || {}, function (key, p) {
(p.aliases || []).forEach(function (alias) {
map[alias] = key;
});
});
});
return map;
}, function () {
return {};
});
}
return aliasCache[name];
}
// What to draw for one Kategorî:Çavkanî template: a field per documented parameter, minus the ones the
// form already has boxes for and minus the language parameter, which is filled from the dropdown.
// A template with no TemplateData at all falls back to a lone "Rûpel" box, which is what such citations
// almost always need ({{Şablon|rûpel=12|jêgirtin=…}}).
function fieldSpecs(name) {
return templateParams(name).then(function (params) {
var langParamKey = null;
(params || []).forEach(function (p) {
if ((p.label || "").trim().toLowerCase() === LANG_LABEL) {
langParamKey = p.key;
}
});
var filtered = (params || []).filter(function (p) {
return COVERED_PARAMS.indexOf(p.key) === -1 && p.key !== langParamKey;
});
var list = filtered.length ? filtered : [{ key: "rûpel", label: "Rûpel", required: false }];
return {
langParamKey: langParamKey,
fields: list.map(function (p) {
var size = fieldSize(p.key);
return {
key: p.key,
label: p.label,
required: p.required,
span: size.span,
width: size.width,
multiline: size.multiline
};
})
};
});
}
// The same list for a jêder-* template, straight out of the shared table.
function jederFieldSpecs(jederKey) {
var def = jederDefs[jederKey];
return def ? (def.fields || []).slice() : [];
}
// ---- Citoid --------------------------------------------------------------------------------------
// Today, as Modul:quote wants it (it renders "2024-05-05" as "5 gulan 2024").
function today() {
var d = new Date();
function pad(n) { return (n < 10 ? "0" : "") + n; }
return d.getFullYear() + "-" + pad(d.getMonth() + 1) + "-" + pad(d.getDate());
}
// Carries across the parts of a Citoid result that citoid-helper's own mapping drops: the access date
// and the identifiers for the fields the forms have only just gained. Applied here rather than in
// citoid-helper so it reaches both gadgets without an edit to the MediaWiki: gadget page.
function enrichCitoidFields(fields, raw) {
fields = fields || {};
if (fields.url && !fields["tarîxa-gihiştinê"]) {
// Citoid reports when it actually fetched the page ("accessDate": "2026-09-03"), so use that
// rather than the clock -- they differ whenever the answer came from a cache. today() is only
// the fallback for a result that carries no accessDate.
var accessed = raw && (raw.accessDate || raw.accessdate);
fields["tarîxa-gihiştinê"] = (accessed && String(accessed).slice(0, 10)) || today();
}
if (raw) {
var issn = Array.isArray(raw.ISSN) ? raw.ISSN[0] : raw.ISSN;
if (issn && !fields.issn) {
fields.issn = issn;
}
var doi = Array.isArray(raw.DOI) ? raw.DOI[0] : raw.DOI;
if (doi && !fields.doi) {
fields.doi = doi;
}
if (raw.volume && !fields.cild) {
fields.cild = raw.volume;
}
}
return fields;
}
// One URL/DOI/ISBN -> {jederKey, fields}. The lookup itself lives in the citoid-helper gadget; this
// wrapper exists so neither caller has to know that, and so a missing gadget fails in one place.
function fetchFromCitoid(query) {
if (!(window.wikt && window.wikt.citoid && window.wikt.citoid.fetchJederFields)) {
return $.Deferred().reject("Amûra Citoidê ne barkirî ye.").promise();
}
return window.wikt.citoid.fetchJederFields(query).then(function (result) {
result.fields = enrichCitoidFields(result.fields, result.raw);
return result;
});
}
// Re-derives the fields for a different jêder-* template than the one citoid detected, enriched the
// same way -- used when the person had already chosen a template and we keep their choice.
// The form's link box stands in for a jêder-* template's own url= when that is left empty.
function withLinkAsUrl(jederKey, fields, link) {
var def = jederDefs[jederKey];
var hasUrl = !!def && (def.fields || []).some(function (field) {
return field.key === "url";
});
if (hasUrl && !fields.url && /^https?:\/\//.test(link || "")) {
fields.url = link;
}
return fields;
}
function citoidFieldsFor(jederKey, raw, query) {
if (!(window.wikt && window.wikt.citoid && window.wikt.citoid.dataToJederFields)) {
return {};
}
return enrichCitoidFields(window.wikt.citoid.dataToJederFields(jederKey, raw, query), raw);
}
// ---- the "#*" line ------------------------------------------------------------------------------
// One finished citation line. Modes:
// "jeder" {{jêder-kitêb|ku|sernav=…|jêgirtin=…}}
// "category" the Kategorî:Çavkanî template as the citation template: {{Ç:Kitêb|rûpel=12|…}}
// "plain" free-text source, or none: {{jêder|ku|2=…|jêgirtin=…}} / {{nimûne|ku|…}}
// "raw" a finished template, passed through with only the entry name bolded
// opts: {mode, template, language, fields, langParamKey, quote, translation, transcription,
// source, sourceURL, title, marker, keepTranslation, extra}
function buildCitation(opts) {
var marker = opts.marker || "#*";
var title = opts.title || mw.config.get("wgTitle");
var quote = boldenPageTitle(String(opts.quote || ""), title).text;
if (opts.mode === "raw") {
// Written as given: the point is to paste a citation built elsewhere and have it survive intact.
// A line copied off another entry usually still carries its own "#*"/"#:" -- the marker is added
// back below, so strip it rather than emitting "#* #* {{...}}".
var pasted = String(opts.quote || "").replace(LIST_MARKER, "");
return marker + " " + nlToBr(boldQuoteParam(pasted, title)).trim();
}
var isCategory = opts.mode === "category";
var isTemplate = isCategory || opts.mode === "jeder";
var name = isTemplate ? opts.template : (opts.source || opts.sourceURL ? "jêder" : "nimûne");
var line = marker + " {{" + name;
// jêder-*, jêder and nimûne all take the language as parameter 1. A Kategorî:Çavkanî template only
// gets one when its own TemplateData names it, under its own key -- never assumed positionally.
if (!isCategory) {
line += "|" + opts.language;
}
if (isTemplate) {
var fields = opts.fields || {};
Object.keys(fields).forEach(function (key) {
var value = nlToSpace(String(fields[key] || "").trim());
if (value) {
line += "|" + key + "=" + value;
}
});
if (isCategory && opts.langParamKey) {
line += "|" + opts.langParamKey + "=" + opts.language;
}
// "Ç:" templates are quotation-equivalents rather than usage examples (see Modul:quote).
if (isCategory && /^Ç:/.test(name)) {
line += "|wekjêgirtin=1";
}
} else {
if (opts.source) {
// A positional value containing "=" would be read as its own key=value pair, so name it.
line += (String(opts.source).indexOf("=") !== -1 ? "|2=" : "|") + opts.source;
}
if (opts.sourceURL) {
line += "|url=" + opts.sourceURL;
}
}
var isUsex = name === "nimûne";
var translation = nlToBr(String(opts.translation || "").trim());
// {{nimûne}} always takes one, a Kurmancî example's being its explanation; a quotation's is left out
// for Kurmancî unless the edited line already had one (keepTranslation).
var writeTranslation = !!translation && (isUsex || opts.language !== "ku" || opts.keepTranslation);
// {{nimûne}}'s example is parameter 2 and its translation parameter 3, both positional. A value
// containing "=" would be read as key=value, so then both are named: naming only the example would
// slide the translation into slot 2.
var namedSlots = isUsex && (quote.indexOf("=") !== -1 || (writeTranslation && translation.indexOf("=") !== -1));
line += "|" + (isUsex ? (namedSlots ? "2=" : "") : "jêgirtin=") + nlToBr(quote);
if (writeTranslation) {
// Kategorî:Çavkanî templates route through Modul:quote and take its "t="; jêder-* uses "tercime=".
line += "|" + (isUsex ? (namedSlots ? "3=" : "") : isCategory ? "t=" : "tercime=") + translation;
}
var transcription = nlToBr(String(opts.transcription || "").trim());
if (transcription) {
line += "|tr=" + transcription;
}
// Parameters the form has no box for, carried through from the line being edited.
(opts.extra || []).forEach(function (param) {
line += "|" + param;
});
// A short example and its translation read best on one line, which {{nimûne}} does only when told.
// Short is Modul:usex's own measure for "rêz=auto": at most 100 characters shown between them.
if (isUsex && writeTranslation && !hasInlineParam(opts.extra) &&
shownLength(quote) + shownLength(translation) <= 100) {
line += "|rêz=1";
}
return line + "}}";
}
// True when the parameters already say inline or not: {{nimûne}}'s rêz=, under any of its names.
function hasInlineParam(params) {
return (params || []).some(function (param) {
return /^\s*(?:rêz|birêz|inline)\s*=/.test(param);
});
}
// How many characters a bit of wikitext shows: link targets, bold/italic marks and tags don't count.
function shownLength(text) {
return String(text || "")
.replace(/\[\[(?:[^\]|]*\|)?([^\]]*)\]\]/g, "$1")
.replace(/'{2,}/g, "")
.replace(/<[^>]*>/g, " ")
.length;
}
// A leading "#*" / "#:" / "##*" ... list marker.
var LIST_MARKER = /^\s*#+[*:]\s*/;
// True when the text is a whole citation line copied from somewhere else: its own list marker followed
// by a template call. That is the shape of every line this family writes -- {{jêder}}, {{jêder-kitêb}},
// {{nm}}, {{nimûne}}, {{mk}}, any Kategorî:Çavkanî template -- so the template name is not checked
// against a list, which could never cover every citation template on the wiki.
//
// Used to switch the form into raw mode by itself: pasting a finished line and forgetting to change the
// dropdown would otherwise wrap it in a second {{nimûne}}.
function looksLikeCitationLine(text) {
var trimmed = String(text || "");
if (!LIST_MARKER.test(trimmed)) {
return false;
}
return trimmed.replace(LIST_MARKER, "").slice(0, 2) === "{{";
}
// True when the example box holds nothing but one finished template call -- the cue to offer, or to
// switch to, the "write it out as-is" mode.
function looksLikeTemplate(text) {
var trimmed = String(text || "").trim();
if (trimmed.slice(0, 2) !== "{{" || trimmed.slice(-2) !== "}}") {
return false;
}
var parsed = edit.wt.parseTemplateCalls(trimmed);
return parsed.calls.length === 1 && !parsed.otherContent;
}
// ---- reading a finished line back --------------------------------------------------------------
// [[Şablon:nimûne]] and every redirect to it.
var USEX_NAMES = ["nimûne", "mk", "ux", "mînak", "nim", "nm"];
var USEX_TRANSLATION = ["3", "t", "tercime", "translation", "w", "werger"];
var USEX_TRANSCRIPTION = ["tr", "transliteration"];
// A quotation template's translation, under the name Modul:quote documents and its aliases.
var QUOTE_TRANSLATION = ["t", "tercime", "werger", "w"];
// [[Şablon:bênimûne]] and its redirects: the "no example yet" placeholder, with or without a language.
var EMPTY_EXAMPLE_MARKER = /^#+\*\s*\{\{\s*(?:bênimûne|bêmînak|mînak\?|nimûne\?)\s*(?:\|[^{}]*)?\}\}\s*$/i;
// The text of a line written as one italic run ("''…''", bold inside allowed -- "'''''X''' …''" opens
// with both), or null.
function italicRun(text) {
var t = $.trim(text || "");
var opening = /^'*/.exec(t)[0].length;
var m = /^''([\s\S]+)''$/.exec(t);
if ((opening !== 2 && opening !== 5) || !m || /''/.test(m[1].replace(/'''/g, ""))) {
return null;
}
return m[1];
}
// "''…'' (…)": an italic example with its explanation in brackets on the same line, as
// {text, translation}, or null. One level of brackets inside the explanation is allowed.
function italicWithGloss(text) {
var m = /^([\s\S]*'')\s*\(([^()]*(?:\([^()]*\)[^()]*)*)\)$/.exec($.trim(text || ""));
var italic = m && italicRun(m[1]);
if (italic === null || !m) {
return null;
}
var gloss = $.trim(m[2]);
return { text: italic, translation: italicRun(gloss) || gloss };
}
function brToNl(text) {
return String(text || "").replace(/<br\s*\/?>/gi, "\n");
}
/**
* One "#:"/"#*" block -- its line plus any deeper "#::"/"#*:" lines -- as the form's values, or null when
* it is not an example: a word list, the "no example yet" placeholder, a plain note.
* {mode: "nimune"|"jeder"|"source"|"raw", marker, template, text, translation, transcription,
* source, sourceURL, fields, extra}
* extra is every parameter the form has no box for, to be written back as it was. A "raw" block is
* edited as written: text is the whole block, list markers included.
*/
function parseCitationLine(block) {
var all = String(block || "").split("\n");
var k = 1;
while (k < all.length && !/^#/.test(all[k])) {
k++;
}
var head = /^#+([:*])\s*([\s\S]*)$/.exec(all.slice(0, k).join("\n"));
var sub = all.slice(k);
if (!head || EMPTY_EXAMPLE_MARKER.test(all[0])) {
return null;
}
var out = { mode: "raw", marker: head[1], template: "", text: "", translation: "", transcription: "",
source: "", sourceURL: "", fields: {}, extra: [] };
var body = $.trim(head[2]);
var parsed = edit.wt.parseTemplateCalls(body);
var call = parsed.calls.length === 1 && !parsed.otherContent ? parsed.calls[0] : null;
var name = call ? edit.wt.canonicalTemplateKey(call.name) : "";
name = name.charAt(0).toLowerCase() + name.slice(1);
var isUsex = USEX_NAMES.indexOf(name) !== -1;
var def = call && jederDefs[name];
if (call && !sub.length && (isUsex || def || name === "jêder")) {
var split = edit.wt.splitCallParams(call.params);
var fieldKeys = def ? def.fields.map(function (f) { return f.key; }) : [];
out.mode = isUsex ? "nimune" : def ? "jeder" : "source";
out.template = def ? name : "";
split.used.forEach(function (key, i) {
var value = brToNl(split.values[key]);
if (key === "1") {
return; // the language, which the section already says
}
if (isUsex ? key === "2" : (key === "jêgirtin" || key === "jg")) {
out.text = value;
} else if ((isUsex ? USEX_TRANSLATION : QUOTE_TRANSLATION).indexOf(key) !== -1) {
out.translation = value;
} else if (USEX_TRANSCRIPTION.indexOf(key) !== -1) {
out.transcription = value;
} else if (def && fieldKeys.indexOf(key) !== -1) {
out.fields[key] = split.values[key];
} else if (name === "jêder" && key === "2") {
out.source = split.values[key];
} else if (name === "jêder" && key === "url") {
out.sourceURL = split.values[key];
} else {
// Named when it was positional, so it cannot shift into a slot the form now fills.
out.extra.push(/^\d+$/.test(key) && !/=/.test(call.params[i]) ? key + "=" + split.values[key] : $.trim(call.params[i]));
}
});
return out;
}
// Any other citation template on a "#*" line -- the Kategorî:Çavkanî ones, {{J:…}} and {{Ç:…}} --
// reads into the category mode: quote, translation and transcription in their boxes, every other
// named parameter as a field. Which of those get a box is known once the template's parameters
// are fetched (see applyAliases).
if (call && !sub.length && out.marker === "*" &&
(/^[JÇ]:/.test($.trim(call.name)) || /(?:^|\|)\s*(?:jêgirtin|jg)\s*=/.test(call.params.join("|")))) {
var catSplit = edit.wt.splitCallParams(call.params);
out.mode = "category";
out.template = $.trim(call.name);
catSplit.used.forEach(function (key, i) {
var value = catSplit.values[key];
if (key === "jêgirtin" || key === "jg") {
out.text = brToNl(value);
} else if (QUOTE_TRANSLATION.indexOf(key) !== -1) {
out.translation = brToNl(value);
} else if (USEX_TRANSCRIPTION.indexOf(key) !== -1) {
out.transcription = brToNl(value);
} else if (key === "wekjêgirtin" && /^Ç:/.test(out.template)) {
return; // buildCitation() writes it for every "Ç:" template
} else if (/^\d+$/.test(key)) {
out.extra.push(!/=/.test(call.params[i]) ? key + "=" + value : $.trim(call.params[i]));
} else {
out.fields[key] = value;
}
});
return out;
}
if (out.marker === ":") {
// The hand-written kind: "#: ''…''", its translation, if any, on a "#::" line under it.
var italic = italicRun(body);
var translationLine = sub.length === 1 ? /^#+::\s*([\s\S]*)$/.exec(sub[0]) : null;
if (italic !== null && (!sub.length || translationLine)) {
out.mode = "nimune";
out.text = brToNl(italic);
out.translation = translationLine ? brToNl(italicRun(translationLine[1]) || $.trim(translationLine[1])) : "";
return out;
}
var withGloss = sub.length ? null : italicWithGloss(body);
if (withGloss) {
out.mode = "nimune";
out.text = brToNl(withGloss.text);
out.translation = brToNl(withGloss.translation);
return out;
}
if (!isUsex) {
return null;
}
}
out.text = all.join("\n");
return out;
}
/**
* Settles which parameters of a read line get a box. aliases maps an alias to its documented name
* (templateAliases); fieldKeys are the boxes the form drew. A parameter written under an alias -- "r="
* for "rûpel=" -- goes to its box; one with no box goes to extra, written back as it was.
*/
function applyAliases(example, aliases, fieldKeys) {
var pending = example.extra.slice();
Object.keys(example.fields).forEach(function (key) {
if (fieldKeys.indexOf(key) === -1) {
pending.push(key + "=" + example.fields[key]);
delete example.fields[key];
}
});
example.extra = [];
pending.forEach(function (param) {
var m = /^\s*([^=]+?)\s*=([\s\S]*)$/.exec(param);
var key = m ? (aliases[m[1]] || m[1]) : null;
var value = m ? $.trim(m[2]) : "";
if (m && fieldKeys.indexOf(key) !== -1 && !example.fields[key]) {
example.fields[key] = value;
} else if (m && key === "jêgirtin" && !example.text) {
example.text = brToNl(value);
} else if (m && QUOTE_TRANSLATION.indexOf(key) !== -1 && !example.translation) {
example.translation = brToNl(value);
} else {
example.extra.push(param);
}
});
return example;
}
/**
* newLine with its parameters in the order originalLine had them, so an edit's diff shows only what
* changed. Parameters match by name -- an alias counting as the name it stands for (aliases, from
* templateAliases) -- and positional ones by position; any the original lacked follow in newLine's own
* order. A line that is not one template call on either side comes back as it was.
*/
function keepOrder(newLine, originalLine, aliases) {
aliases = aliases || {};
var marker = /^#+[:*]\s*/.exec(newLine || "");
var oldBody = /^#+[:*]\s*([\s\S]*)$/.exec(originalLine || "");
if (!marker || !oldBody) {
return newLine;
}
var fresh = edit.wt.parseTemplateCalls(newLine.slice(marker[0].length));
var old = edit.wt.parseTemplateCalls($.trim(oldBody[1]));
if (fresh.calls.length !== 1 || fresh.otherContent || old.calls.length !== 1 || old.otherContent) {
return newLine;
}
function keyed(params) {
var positional = 0;
return params.map(function (raw) {
var m = /^\s*([^|={}\n]+?)\s*=/.exec(raw);
var key = m ? m[1] : String(++positional);
return { key: aliases[key] || key, raw: raw };
});
}
var rest = keyed(fresh.calls[0].params);
var ordered = [];
keyed(old.calls[0].params).forEach(function (o) {
for (var i = 0; i < rest.length; i++) {
if (rest[i].key === o.key) {
ordered.push(rest.splice(i, 1)[0]);
return;
}
}
});
return marker[0] + "{{" + fresh.calls[0].name + ordered.concat(rest).map(function (p) {
return "|" + p.raw;
}).join("") + "}}";
}
// Where the {{ … }} opened on lines[start] closes, so a template written over several lines stays whole.
function braceEnd(lines, start) {
var depth = 0;
for (var i = start; i < lines.length; i++) {
depth += (lines[i].match(/\{\{/g) || []).length - (lines[i].match(/\}\}/g) || []).length;
if (depth <= 0) {
return i;
}
}
return lines.length - 1;
}
// The "#:"/"#*" blocks right under the definition on lines[defIndex], each {start, end, text, example}:
// example is parseCitationLine's reading, or null for a block that is not an example.
function exampleBlocks(lines, defIndex) {
var depth = /^#+/.exec(lines[defIndex])[0].length;
var own = new RegExp("^#{" + depth + "}[:*]");
var deeper = new RegExp("^#{" + depth + "}[:*][:*]");
var blocks = [];
var i = defIndex + 1;
while (i < lines.length && own.test(lines[i])) {
var start = i;
var end = braceEnd(lines, i);
while (end + 1 < lines.length && deeper.test(lines[end + 1])) {
end = braceEnd(lines, end + 1);
}
var text = lines.slice(start, end + 1).join("\n");
blocks.push({ start: start, end: end, text: text, example: parseCitationLine(text) });
i = end + 1;
}
return blocks;
}
/**
* Replaces the index-th example under a definition with code, or removes it when code is null.
* original is the block as it read when the form opened. When the index no longer holds it (an earlier
* queued change moved it) the one block still reading exactly that is used; otherwise nothing is touched.
*/
function replaceExample(pageContent, language, sectionType, sectionOrdinal, definitionLevel, index, original, code) {
var loc = edit.wt.locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var defIndex = edit.wt.findDefinitionLine(lines, loc.posLineIndex, definitionLevel);
var examples = exampleBlocks(lines, defIndex).filter(function (b) {
return b.example;
});
var block = examples[index] && examples[index].text === original ? examples[index] : null;
if (!block) {
var same = examples.filter(function (b) {
return b.text === original;
});
block = same.length === 1 ? same[0] : null;
}
if (!block) {
throw new edit.util.SubmitAbort("Ev nimûne ji dema vekirina formê ve hatiye guhartin — rûpelê nû bike û dîsa biceribîne.");
}
var replacement = code === null ? [] : String(code).split("\n");
lines.splice.apply(lines, [block.start, block.end - block.start + 1].concat(replacement));
return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n");
}
// Words only, lower-cased: links, templates, tags and quote marks out, so the page's drawn text and the
// line's wikitext can be compared.
function normalizeWords(text) {
return String(text || "")
.replace(/\[\[(?:[^\]|]*\|)?([^\]]*)\]\]/g, "$1")
.replace(/\{\{[^{}]*\}\}/g, " ")
.replace(/<[^>]*>/g, " ")
.replace(/'{2,}/g, "")
.toLowerCase()
.replace(/[\s.,;:!?"'“”‘’«»()\[\]\-–—…\/]+/g, "");
}
// True when the text a page draws for an example comes from this line.
function exampleMatches(drawnText, example) {
var source = example.text;
if (example.mode === "raw") {
var quote = /\|\s*(?:jêgirtin|jg)\s*=([^|}]*)/.exec(source);
source = quote ? quote[1] : source.replace(/^#+[:*]\s*/, "");
}
var drawn = normalizeWords(drawnText);
var written = normalizeWords(source);
if (!drawn || !written) {
return false;
}
return drawn === written || written.indexOf(drawn.slice(0, 24)) !== -1;
}
module.exports = {
CATEGORY_KEY: CATEGORY_KEY,
RAW_KEY: RAW_KEY,
COVERED_PARAMS: COVERED_PARAMS,
LANG_LABEL: LANG_LABEL,
jederDefs: jederDefs,
fieldSize: fieldSize,
exclusivePartner: exclusivePartner,
boldenPageTitle: boldenPageTitle,
nlToBr: nlToBr,
nlToSpace: nlToSpace,
fetchCategoryTemplates: fetchCategoryTemplates,
buildCategoryTemplateSearch: buildCategoryTemplateSearch,
openTemplateDialog: openTemplateDialog,
buildTemplateParamForm: buildTemplateParamForm,
templateParams: templateParams,
fieldSpecs: fieldSpecs,
jederFieldSpecs: jederFieldSpecs,
fetchFromCitoid: fetchFromCitoid,
citoidFieldsFor: citoidFieldsFor,
withLinkAsUrl: withLinkAsUrl,
today: today,
buildCitation: buildCitation,
looksLikeTemplate: looksLikeTemplate,
looksLikeCitationLine: looksLikeCitationLine,
USEX_NAMES: USEX_NAMES,
EMPTY_EXAMPLE_MARKER: EMPTY_EXAMPLE_MARKER,
parseCitationLine: parseCitationLine,
applyAliases: applyAliases,
keepOrder: keepOrder,
templateAliases: templateAliases,
exampleBlocks: exampleBlocks,
replaceExample: replaceExample,
exampleMatches: exampleMatches
};
}());
// </nowiki>
sgqg27epdxpguj1acadgcaeifuq88sl
6533049
6532612
2026-09-19T10:12:40Z
Wikihez
7344
Etymology: guard the etimon.js require so a stale package definition cannot break the gadget
6533049
javascript
text/javascript
// <nowiki>
/*
* Page: [[MediaWiki:Gadget-wikt.cite.js]]
*
* Citations for both add-examples and the wizard: jêder-* templates, [[Kategorî:Çavkanî]] templates,
* Citoid, and the "#*" line they become. fieldSpecs() returns plain field descriptions because the two
* callers draw them differently (OOUI vs the wizard's own grid); everything else is shared. Also the
* template-param dialog (openTemplateDialog), used the same way by DefSideBoxes and start.js.
*
* The only caller of window.wikt.citoid, which the citoid-helper gadget owns.
*/
(function () {
"use strict";
var edit = require("ext.gadget.wikt.edit");
var util = edit.util;
var wt = edit.wt;
var langs = edit.langs;
var escapeRegExp = util.escapeRegExp;
var tdText = wt.tdText;
var parseTemplateCalls = wt.parseTemplateCalls;
var splitCallParams = wt.splitCallParams;
var buildTemplateCall = wt.buildTemplateCall;
var jederDefs = edit.data.jederDefs || {};
// Guarded: between deploying this file and the Gadgets-definition line that adds etimon.js to the
// package, a cached startup module would have this require throw and take the whole gadget with it.
// Without the builder, an {{etîmon}} call falls through to the generic dialog below.
var etimon = null;
try {
etimon = require("./wikt.cite/etimon.js");
} catch (e) {
etimon = null;
}
var api = new mw.Api();
// Sentinel _currentJederKey / dropdown value for "pick a template from Kategorî:Çavkanî". Not a real
// jederDefs key. Both gadgets use this same string, so a draft saved by one is read by the other.
var CATEGORY_KEY = "__category__";
// Sentinel for "the example box holds a finished template; write it out untouched".
var RAW_KEY = "__raw__";
// Covered by the form's own dedicated boxes, so they are never drawn again as generic template fields.
var COVERED_PARAMS = ["jêgirtin", "jg", "t", "tr"];
// A Kategorî:Çavkanî template whose TemplateData labels a parameter exactly this is fed the language
// from the language dropdown instead of showing a box for it. Unlike jêder-*, an arbitrary template has
// no "parameter 1 is the language" convention, so nothing is assumed positionally.
var LANG_LABEL = "koda zimanî";
// Field key -> {span, multiline}, taken from whichever jêder-* template defines it first. Most
// Kategorî:Çavkanî templates reuse the same bibliographic parameter names, so "sernav" comes out
// full-width and multiline there too rather than as a generic one-line box.
var SIZE_BY_KEY = {};
Object.keys(jederDefs).forEach(function (jederKey) {
(jederDefs[jederKey].fields || []).forEach(function (field) {
if (!SIZE_BY_KEY[field.key]) {
SIZE_BY_KEY[field.key] = {
span: field.span || 4,
multiline: !!field.multiline,
width: field.width || ""
};
}
});
});
// Field pairs Modul:quote refuses together ("Divê tenê yek ji |tarîx= an |sal= were dayîn"): a full
// date and a bare year say the same thing twice. Both are offered because either may be all a source
// gives, so the forms clear one when the other is filled rather than letting the citation break.
var EXCLUSIVE_PAIRS = [["sal", "tarîx"]];
function exclusivePartner(key) {
var found = null;
EXCLUSIVE_PAIRS.forEach(function (pair) {
if (pair[0] === key) {
found = pair[1];
} else if (pair[1] === key) {
found = pair[0];
}
});
return found;
}
function fieldSize(key) {
return SIZE_BY_KEY[key] || { span: 4, multiline: false, width: "" };
}
// ---- text helpers -------------------------------------------------------------------------------
// The entry name as a pattern. A Kurdish word ending in -î loses the circumflex once something is
// attached to it ("safî" is written "safiye"), so a title ending that way matches either spelling --
// otherwise the name is simply never found in the quotation.
function titlePattern(title) {
var escaped = escapeRegExp(String(title || ""));
return /î$/i.test(escaped) ? escaped.slice(0, -1) + "[îi]" : escaped;
}
// Wraps the entry's own name in bold wherever it appears in the quotation, which is how quotations are
// written here, and reports whether the name ends up bold so a caller can say so.
//
// The name may carry an attached suffix ("celbê"), so the match runs on to the end of the word. A word
// ends at whitespace, punctuation or markup: excluding markup is what keeps "celb<br>me’şûq" from
// bolding as one lump. The typographic apostrophe stays a word character -- it is one inside Kurdish
// words like "me’şûq".
function boldenPageTitle(text, title) {
var source = String(text || "");
var escapedTitle = titlePattern(title);
var suffixPattern = "([^\\s.,;:?!()'\"<>\\[\\]{}|=/\\\\«»„“”–—]+)?";
var titleRe = new RegExp("(" + escapedTitle + suffixPattern + ")", "ig");
var titleAnywhere = new RegExp(escapedTitle, "i");
// Whatever already sits between ''' marks is copied through untouched, so a quotation somebody
// bolded by hand -- or one an earlier run bolded -- never collects a second pair.
var boldSpan = /'''[\s\S]*?'''/g;
var out = "";
var last = 0;
var alreadyBold = false;
var span;
while ((span = boldSpan.exec(source)) !== null) {
out += source.slice(last, span.index).replace(titleRe, "'''$1'''");
if (titleAnywhere.test(span[0])) {
alreadyBold = true;
}
out += span[0];
last = span.index + span[0].length;
}
out += source.slice(last).replace(titleRe, "'''$1'''");
return { text: out, bolded: out !== source || alreadyBold };
}
// A literal newline would end the single-line "#*" wikitext, so display text keeps its break as <br>...
function nlToBr(text) {
return String(text || "").replace(/\r\n|\r|\n/g, "<br>");
}
// ...while a plain parameter value (an author, a title) just loses it.
function nlToSpace(text) {
return String(text || "").replace(/\s*(?:\r\n|\r|\n)\s*/g, " ");
}
// Bolds the entry name inside a pasted citation's jêgirtin=/jg= value only, so a book title or author
// containing it is left alone. With no such parameter nothing is bolded: running the plain-text bolder
// over wikitext would wrap the braces too.
function boldQuoteParam(text, title) {
var match = /(\|\s*(?:jêgirtin|jg)\s*=)([\s\S]*?)(?=\|[^|=]*=|\}\}\s*$)/.exec(text);
if (!match) {
return text;
}
var bolded = boldenPageTitle(match[2], title).text;
return text.slice(0, match.index) + match[1] + bolded + text.slice(match.index + match[0].length);
}
// "name — description" for each Kategorî:Çavkanî option in a <select>, from the description half of
// the same TemplateData every citation picker already fetches -- so a search box built over these
// options can also match on what a template documents itself as doing, not only its name. An
// undescribed option, or a failed fetch, just keeps its plain label; never blocks on this.
// A self-contained "search Kategorî:Çavkanî" combo: a text input plus its own results list, matching
// add-examples' own jêgirtin picker -- each row shows its label, a " → target" arrow when a redirect's
// label differs from its target, and a 🔗 link to the canonical template's own page. opts.onPick(entry)
// fires when a row is chosen; the input is then left holding the plain label, not "label → target", so
// re-focusing it to search again doesn't start from that arrow text. opts.describe: true also fills in
// each visible row's own TemplateData description once it loads (batched, so scrolling through matches
// costs a handful of requests, not one per row).
function buildCategoryTemplateSearch(opts) {
opts = opts || {};
var shell = util.buildSearchList({
placeholder: opts.placeholder || util.msg.searchTemplate
});
var $input = shell.$input;
var $results = shell.$results;
var $status = $("<span class='wiktku-cat-tpl-status'></span>").text(util.msg.templatesLoading);
var list = [];
function decorate($text, target, wanted) {
if (!wanted) {
return;
}
edit.wt.fetchTemplateData(target).then(function (doc) {
var desc = doc && edit.wt.tdText(doc.description);
if (desc && $text.closest("body").length) {
$text.append(document.createTextNode(" — " + edit.wt.shortDesc(desc)));
}
});
}
function showResults(query) {
var q = $.trim(query || "").toLowerCase();
$results.empty();
var matched = q ? list.filter(function (entry) {
return entry.label.toLowerCase().indexOf(q) !== -1;
}) : list;
if (!matched.length) {
shell.close();
return;
}
var shown = matched.slice(0, 50);
// Only what a search has narrowed to: an empty box is the whole category, and describing its
// first fifty would ask the wiki about templates nobody has looked for.
var describing = !!opts.describe && !!q;
if (describing) {
edit.wt.fetchTemplateDataBatch(shown.map(function (entry) { return entry.target; }));
}
shown.forEach(function (entry) {
var $li = $("<li class='wiktku-cat-tpl-row'></li>");
var $text = $("<span class='wiktku-cat-tpl-text'></span>").text(entry.label);
if (entry.label !== entry.target) {
$text.append($("<span class='wiktku-cat-tpl-arrow'></span>").text(" → " + entry.target));
}
decorate($text, entry.target, describing);
var $link = $("<a class='wiktku-cat-tpl-link' target='_blank' rel='noopener'>🔗</a>")
.attr("title", util.msg.openTemplatePage)
.attr("href", util.tplPageUrl(entry.target));
// stopPropagation only -- preventDefault would stop the link from actually navigating.
$link.on("mousedown click", function (e) { e.stopPropagation(); });
$li.append($text, $link);
shell.bindPick($li, function () {
shell.close();
$input.val(entry.label);
opts.onPick(entry);
});
$results.append($li);
});
shell.open();
}
$input.on("input focus", function () {
showResults($(this).val());
});
$input.on("blur", function () {
setTimeout(shell.close, 200); // lets the pick handler fire first
});
fetchCategoryTemplates().then(function (l) {
list = l;
$status.text("");
}, function () {
$status.text(util.msg.templatesFailed);
});
return {
$element: $("<span class='wiktku-native-select-wrap wiktku-cat-tpl-picker'></span>").append($input, $results, $status),
$input: $input,
$status: $status
};
}
// ---- Kategorî:Çavkanî -----------------------------------------------------------------------------
// The category's template members plus their redirects, each redirect its own searchable entry pointing
// at the same canonical target, so a template is findable by any of its names. Cached for the session.
var catTemplatesPromise = null;
function fetchCategoryTemplates() {
if (catTemplatesPromise) {
return catTemplatesPromise;
}
catTemplatesPromise = api.get({
action: "query",
generator: "categorymembers",
gcmtitle: "Kategorî:Çavkanî",
gcmnamespace: 10,
gcmlimit: "max",
prop: "redirects",
rdnamespace: 10,
rdlimit: "max",
formatversion: 2
}).then(function (data) {
var list = [];
((data.query && data.query.pages) || []).forEach(function (page) {
var target = page.title.replace(/^[^:]+:/, "");
list.push({ label: target, target: target });
(page.redirects || []).forEach(function (redirect) {
list.push({ label: redirect.title.replace(/^[^:]+:/, ""), target: target });
});
});
list.sort(function (a, b) {
return a.label.localeCompare(b.label, mw.config.get("wgUserLanguage"));
});
return list;
}, function () {
return [];
});
return catTemplatesPromise;
}
// ---- template-param dialog: fills a {{Name|...}} call from its own TemplateData -------------------
// Shared by DefSideBoxes (a fresh insert from Etîmolojî/Çavkanî, or double-clicking an existing chip
// to edit it) and start.js's own Etîmolojî/Çavkanî pickers -- one dialog, so all of them read the same
// TemplateData the same way.
// OOUI's own dialog stack -- the same widgetry VisualEditor's template dialog is built on.
var citeWindowManager = null;
function templateDialogManager() {
if (!citeWindowManager) {
citeWindowManager = new OO.ui.WindowManager();
$(document.body).append(citeWindowManager.$element);
}
return citeWindowManager;
}
// Opens one template call in a modal built from its TemplateData. Resolves with the edited wikitext, or
// null when the user cancels.
// One at a time: a second open while one is loading or showing (a chip clicked again before its dialog
// appeared) stacks a window the manager does not track, and that window's buttons do nothing. The
// second call resolves null, as a cancel does.
var templateDialogBusy = false;
function openTemplateDialog(callWikitext) {
var done = $.Deferred();
var call = parseTemplateCalls(callWikitext).calls[0];
if (!call || templateDialogBusy) {
return done.resolve(null).promise();
}
// {{etîmon}} has no form TemplateData can describe -- a chain of steps, each with its own words
// and their own modifiers -- so it has a builder of its own, on the same contract as this dialog.
if (etimon && etimon.isEtimonName(call.name)) {
return etimon.openDialog(callWikitext);
}
templateDialogBusy = true;
done.always(function () {
templateDialogBusy = false;
});
$.when(
mw.loader.using(["oojs-ui-core", "oojs-ui-windows"]),
edit.wt.fetchTemplateData(call.name)
).then(function (_loaded, td) {
var result = null;
// The parent is captured rather than reached through TplDialog.super: "super" is a reserved word,
// and OOjs has moved between .super and .parent for it over the years.
var ParentDialog = OO.ui.ProcessDialog;
function TplDialog(config) {
ParentDialog.call(this, config);
}
OO.inheritClass(TplDialog, ParentDialog);
TplDialog.static.name = "citeTemplateDialog";
TplDialog.static.title = "{{" + call.name + "}}";
TplDialog.static.actions = [
{ action: "save", label: "Biguhêre", flags: ["primary", "progressive"] },
{ action: "remove", label: "Jê bibe", flags: "destructive" },
{ label: util.msg.cancel, flags: "safe" }
];
TplDialog.prototype.initialize = function () {
ParentDialog.prototype.initialize.apply(this, arguments);
this.panel = new OO.ui.PanelLayout({ padded: true, expanded: false });
this.form = buildTemplateParamForm(call, td);
this.panel.$element.append(this.form.$element);
this.$body.append(this.panel.$element);
};
TplDialog.prototype.getBodyHeight = function () {
return this.panel.$element.outerHeight(true);
};
TplDialog.prototype.getActionProcess = function (action) {
var dialog = this;
if (action === "save" || action === "remove") {
return new OO.ui.Process(function () {
result = action === "remove" ? "" : dialog.form.values();
dialog.close();
});
}
return ParentDialog.prototype.getActionProcess.call(this, action);
};
// Marks the page while this is showing, so a floating box of ours (DefSideBoxes' queue) does
// not sit over a dialog the page's stacking order puts underneath it.
$(document.body).addClass("wikt-dialog-open");
done.always(function () {
$(document.body).removeClass("wikt-dialog-open");
});
var manager = templateDialogManager();
var dialog = new TplDialog({ size: "medium" });
manager.addWindows([dialog]);
var instance = manager.openWindow(dialog);
instance.closed.then(function () {
manager.clearWindows();
done.resolve(result);
});
instance.opening.fail(function () {
manager.clearWindows();
done.resolve(null);
});
}, function () {
done.resolve(null);
});
return done.promise();
}
// TemplateData descriptions are plain text, but authors write wikilinks in them; render those as links.
function tdDescription(text) {
var $out = $("<span></span>");
var re = /\[\[([^\[\]|]+)(?:\|([^\[\]]*))?\]\]/g;
var last = 0;
var m;
while ((m = re.exec(text)) !== null) {
if (m.index > last) {
$out.append(document.createTextNode(text.slice(last, m.index)));
}
$out.append($("<a></a>").attr("href", mw.util.getUrl(m[1])).text(m[2] || m[1]));
last = re.lastIndex;
}
if (last < text.length) {
$out.append(document.createTextNode(text.slice(last)));
}
return $out;
}
// A parameter whose documentation says so takes "kelîme<t:...>" inline modifiers, so it gets the pill
// widget instead of a plain box. TemplateData has no field for this, hence the marker in the description.
var INLINE_MODIFIER_MARKER = "WF:Guherkerên rêzê";
function acceptsInlineModifiers(doc) {
return tdText(doc && doc.description).indexOf(INLINE_MODIFIER_MARKER) !== -1;
}
// A language-code parameter, per its own label.
function isLanguageParam(doc) {
return /ziman/i.test(tdText(doc && doc.label));
}
function buildTemplateParamForm(call, td) {
var parsed = splitCallParams(call.params);
var docParams = (td && td.params) || {};
var keys = (td && td.paramOrder) ? td.paramOrder.slice() : Object.keys(docParams);
parsed.used.forEach(function (k) {
if (keys.indexOf(k) === -1) {
keys.push(k);
}
});
var $element = $("<div class='dsb-tpl-form'></div>");
var readers = {}; // key -> () => the parameter's current text
$element.append($("<div class='dsb-tpl-name'></div>").append(
$("<a></a>").attr("href", mw.util.getUrl("Şablon:" + call.name))
.attr("target", "_blank").text("{{" + call.name + "}}")
));
var desc = tdText(td && td.description);
if (desc) {
$element.append($("<div class='dsb-tpl-desc'></div>").append(tdDescription(desc)));
}
keys.forEach(function (key) {
var doc = docParams[key] || {};
var value = parsed.values[key] || "";
var $field;
if (acceptsInlineModifiers(doc)) {
// The same word row the sense lists use: plain text plus removable "<t:...>" pills.
var row = util.makeModifierRow({
prefix: "dsb-",
placeholder: tdText(doc.label) || key,
modTitle: util.msg.addModifier,
removeTitle: "Vê nirxê jê bibe",
removeModTitle: util.msg.removeModifier
});
row.setRaw(value);
// A <ul> so the row's own "close other pickers" lookup has something to scope to.
$field = $("<ul class='dsb-wordlist dsb-tpl-modifier-list'></ul>").append(row.$li);
readers[key] = row.getRaw;
} else {
var $input = $("<input type='text' class='dsb-input'>").val(value);
if (isLanguageParam(doc)) {
$input.attr("list", langs.datalistId()).attr("placeholder", "koda zimanî…");
// Typing a language the short list does not have is the cue to fetch the rest.
$input.on("input", function () {
if (langs.missingFromCore($input.val())) {
langs.ensureFull();
}
});
} else {
var suggested = doc.suggestedvalues || [];
if (suggested.length) {
var listId = "dsb-sv-" + call.name.replace(/[^A-Za-z0-9]/g, "") + "-" + key;
var $list = $("<datalist></datalist>").attr("id", listId);
suggested.forEach(function (v) {
$list.append($("<option></option>").val(v));
});
$input.attr("list", listId);
$element.append($list);
}
}
$field = $input;
readers[key] = function () {
return $input.val();
};
}
var $label = $("<label class='dsb-adv-label'></label>").text(tdText(doc.label) || key);
if (!docParams[key]) {
$label.append($("<span class='dsb-tpl-undocumented'></span>").text(" (ne di belgeyê de)"));
}
var $row = $("<div class='dsb-tpl-param-row'></div>").append($label, $field);
var help = tdText(doc.description);
if (help) {
$row.append($("<div class='dsb-tpl-help'></div>").append(tdDescription(help)));
}
if (doc.deprecated) {
$row.addClass("dsb-tpl-deprecated");
}
$element.append($row);
});
return {
$element: $element,
values: function () {
var vals = {};
keys.forEach(function (k) {
vals[k] = $.trim(readers[k]() || "");
});
return buildTemplateCall(call.name, vals, keys);
}
};
}
// The documented parameters of one template (name without the "Şablon:" prefix), in its own
// paramOrder; [] when it has no TemplateData. The fetch, the shaping and the cache all live in
// wikt.edit, so the wizard, DefSideBoxes and this module share one request and one copy per template.
//
// The key stands in for a missing label, because these become form fields and a field needs something
// written on it.
// A template's parameters: its TemplateData, or -- for one with none, like most Kategorî:Çavkanî
// templates -- every {{{name}}} its own source reads.
function templateParams(name) {
return edit.wt.templateDoc(name).then(function (td) {
var params = ((td && td.params) || []).map(function (p) {
return {
key: p.key,
label: p.label || p.key,
required: p.required,
deprecated: p.deprecated
};
});
return params.length ? params : sourceParams(name);
});
}
var sourceParamsCache = {};
function sourceParams(name) {
if (!sourceParamsCache[name]) {
sourceParamsCache[name] = new mw.Api().get({
action: "query", prop: "revisions", titles: "Template:" + name, rvprop: "content", rvslots: "main",
redirects: 1, formatversion: 2
}).then(function (data) {
var page = data.query.pages[0];
var source = page.revisions ? page.revisions[0].slots.main.content : "";
var keys = [];
var re = /\{\{\{\s*([^{}|]+?)\s*[|}]/g;
var m;
while ((m = re.exec(source)) !== null) {
if (!/^\d+$/.test(m[1]) && keys.indexOf(m[1]) === -1) {
keys.push(m[1]);
}
}
return keys.map(function (key) {
return { key: key, label: key, required: false, deprecated: false };
});
}, function () {
return [];
});
}
return sourceParamsCache[name];
}
// alias -> the name a template's TemplateData documents it under ({r: "rûpel"} for jêder-kitêb). Asked
// of the wiki itself: the parameter lists baked into data-main.json carry no aliases.
var aliasCache = {};
function templateAliases(name) {
if (!aliasCache[name]) {
aliasCache[name] = new mw.Api().get({
action: "templatedata", titles: "Template:" + name, redirects: 1, formatversion: 2
}).then(function (data) {
var map = {};
$.each(data.pages || {}, function (_, page) {
$.each(page.params || {}, function (key, p) {
(p.aliases || []).forEach(function (alias) {
map[alias] = key;
});
});
});
return map;
}, function () {
return {};
});
}
return aliasCache[name];
}
// What to draw for one Kategorî:Çavkanî template: a field per documented parameter, minus the ones the
// form already has boxes for and minus the language parameter, which is filled from the dropdown.
// A template with no TemplateData at all falls back to a lone "Rûpel" box, which is what such citations
// almost always need ({{Şablon|rûpel=12|jêgirtin=…}}).
function fieldSpecs(name) {
return templateParams(name).then(function (params) {
var langParamKey = null;
(params || []).forEach(function (p) {
if ((p.label || "").trim().toLowerCase() === LANG_LABEL) {
langParamKey = p.key;
}
});
var filtered = (params || []).filter(function (p) {
return COVERED_PARAMS.indexOf(p.key) === -1 && p.key !== langParamKey;
});
var list = filtered.length ? filtered : [{ key: "rûpel", label: "Rûpel", required: false }];
return {
langParamKey: langParamKey,
fields: list.map(function (p) {
var size = fieldSize(p.key);
return {
key: p.key,
label: p.label,
required: p.required,
span: size.span,
width: size.width,
multiline: size.multiline
};
})
};
});
}
// The same list for a jêder-* template, straight out of the shared table.
function jederFieldSpecs(jederKey) {
var def = jederDefs[jederKey];
return def ? (def.fields || []).slice() : [];
}
// ---- Citoid --------------------------------------------------------------------------------------
// Today, as Modul:quote wants it (it renders "2024-05-05" as "5 gulan 2024").
function today() {
var d = new Date();
function pad(n) { return (n < 10 ? "0" : "") + n; }
return d.getFullYear() + "-" + pad(d.getMonth() + 1) + "-" + pad(d.getDate());
}
// Carries across the parts of a Citoid result that citoid-helper's own mapping drops: the access date
// and the identifiers for the fields the forms have only just gained. Applied here rather than in
// citoid-helper so it reaches both gadgets without an edit to the MediaWiki: gadget page.
function enrichCitoidFields(fields, raw) {
fields = fields || {};
if (fields.url && !fields["tarîxa-gihiştinê"]) {
// Citoid reports when it actually fetched the page ("accessDate": "2026-09-03"), so use that
// rather than the clock -- they differ whenever the answer came from a cache. today() is only
// the fallback for a result that carries no accessDate.
var accessed = raw && (raw.accessDate || raw.accessdate);
fields["tarîxa-gihiştinê"] = (accessed && String(accessed).slice(0, 10)) || today();
}
if (raw) {
var issn = Array.isArray(raw.ISSN) ? raw.ISSN[0] : raw.ISSN;
if (issn && !fields.issn) {
fields.issn = issn;
}
var doi = Array.isArray(raw.DOI) ? raw.DOI[0] : raw.DOI;
if (doi && !fields.doi) {
fields.doi = doi;
}
if (raw.volume && !fields.cild) {
fields.cild = raw.volume;
}
}
return fields;
}
// One URL/DOI/ISBN -> {jederKey, fields}. The lookup itself lives in the citoid-helper gadget; this
// wrapper exists so neither caller has to know that, and so a missing gadget fails in one place.
function fetchFromCitoid(query) {
if (!(window.wikt && window.wikt.citoid && window.wikt.citoid.fetchJederFields)) {
return $.Deferred().reject("Amûra Citoidê ne barkirî ye.").promise();
}
return window.wikt.citoid.fetchJederFields(query).then(function (result) {
result.fields = enrichCitoidFields(result.fields, result.raw);
return result;
});
}
// Re-derives the fields for a different jêder-* template than the one citoid detected, enriched the
// same way -- used when the person had already chosen a template and we keep their choice.
// The form's link box stands in for a jêder-* template's own url= when that is left empty.
function withLinkAsUrl(jederKey, fields, link) {
var def = jederDefs[jederKey];
var hasUrl = !!def && (def.fields || []).some(function (field) {
return field.key === "url";
});
if (hasUrl && !fields.url && /^https?:\/\//.test(link || "")) {
fields.url = link;
}
return fields;
}
function citoidFieldsFor(jederKey, raw, query) {
if (!(window.wikt && window.wikt.citoid && window.wikt.citoid.dataToJederFields)) {
return {};
}
return enrichCitoidFields(window.wikt.citoid.dataToJederFields(jederKey, raw, query), raw);
}
// ---- the "#*" line ------------------------------------------------------------------------------
// One finished citation line. Modes:
// "jeder" {{jêder-kitêb|ku|sernav=…|jêgirtin=…}}
// "category" the Kategorî:Çavkanî template as the citation template: {{Ç:Kitêb|rûpel=12|…}}
// "plain" free-text source, or none: {{jêder|ku|2=…|jêgirtin=…}} / {{nimûne|ku|…}}
// "raw" a finished template, passed through with only the entry name bolded
// opts: {mode, template, language, fields, langParamKey, quote, translation, transcription,
// source, sourceURL, title, marker, keepTranslation, extra}
function buildCitation(opts) {
var marker = opts.marker || "#*";
var title = opts.title || mw.config.get("wgTitle");
var quote = boldenPageTitle(String(opts.quote || ""), title).text;
if (opts.mode === "raw") {
// Written as given: the point is to paste a citation built elsewhere and have it survive intact.
// A line copied off another entry usually still carries its own "#*"/"#:" -- the marker is added
// back below, so strip it rather than emitting "#* #* {{...}}".
var pasted = String(opts.quote || "").replace(LIST_MARKER, "");
return marker + " " + nlToBr(boldQuoteParam(pasted, title)).trim();
}
var isCategory = opts.mode === "category";
var isTemplate = isCategory || opts.mode === "jeder";
var name = isTemplate ? opts.template : (opts.source || opts.sourceURL ? "jêder" : "nimûne");
var line = marker + " {{" + name;
// jêder-*, jêder and nimûne all take the language as parameter 1. A Kategorî:Çavkanî template only
// gets one when its own TemplateData names it, under its own key -- never assumed positionally.
if (!isCategory) {
line += "|" + opts.language;
}
if (isTemplate) {
var fields = opts.fields || {};
Object.keys(fields).forEach(function (key) {
var value = nlToSpace(String(fields[key] || "").trim());
if (value) {
line += "|" + key + "=" + value;
}
});
if (isCategory && opts.langParamKey) {
line += "|" + opts.langParamKey + "=" + opts.language;
}
// "Ç:" templates are quotation-equivalents rather than usage examples (see Modul:quote).
if (isCategory && /^Ç:/.test(name)) {
line += "|wekjêgirtin=1";
}
} else {
if (opts.source) {
// A positional value containing "=" would be read as its own key=value pair, so name it.
line += (String(opts.source).indexOf("=") !== -1 ? "|2=" : "|") + opts.source;
}
if (opts.sourceURL) {
line += "|url=" + opts.sourceURL;
}
}
var isUsex = name === "nimûne";
var translation = nlToBr(String(opts.translation || "").trim());
// {{nimûne}} always takes one, a Kurmancî example's being its explanation; a quotation's is left out
// for Kurmancî unless the edited line already had one (keepTranslation).
var writeTranslation = !!translation && (isUsex || opts.language !== "ku" || opts.keepTranslation);
// {{nimûne}}'s example is parameter 2 and its translation parameter 3, both positional. A value
// containing "=" would be read as key=value, so then both are named: naming only the example would
// slide the translation into slot 2.
var namedSlots = isUsex && (quote.indexOf("=") !== -1 || (writeTranslation && translation.indexOf("=") !== -1));
line += "|" + (isUsex ? (namedSlots ? "2=" : "") : "jêgirtin=") + nlToBr(quote);
if (writeTranslation) {
// Kategorî:Çavkanî templates route through Modul:quote and take its "t="; jêder-* uses "tercime=".
line += "|" + (isUsex ? (namedSlots ? "3=" : "") : isCategory ? "t=" : "tercime=") + translation;
}
var transcription = nlToBr(String(opts.transcription || "").trim());
if (transcription) {
line += "|tr=" + transcription;
}
// Parameters the form has no box for, carried through from the line being edited.
(opts.extra || []).forEach(function (param) {
line += "|" + param;
});
// A short example and its translation read best on one line, which {{nimûne}} does only when told.
// Short is Modul:usex's own measure for "rêz=auto": at most 100 characters shown between them.
if (isUsex && writeTranslation && !hasInlineParam(opts.extra) &&
shownLength(quote) + shownLength(translation) <= 100) {
line += "|rêz=1";
}
return line + "}}";
}
// True when the parameters already say inline or not: {{nimûne}}'s rêz=, under any of its names.
function hasInlineParam(params) {
return (params || []).some(function (param) {
return /^\s*(?:rêz|birêz|inline)\s*=/.test(param);
});
}
// How many characters a bit of wikitext shows: link targets, bold/italic marks and tags don't count.
function shownLength(text) {
return String(text || "")
.replace(/\[\[(?:[^\]|]*\|)?([^\]]*)\]\]/g, "$1")
.replace(/'{2,}/g, "")
.replace(/<[^>]*>/g, " ")
.length;
}
// A leading "#*" / "#:" / "##*" ... list marker.
var LIST_MARKER = /^\s*#+[*:]\s*/;
// True when the text is a whole citation line copied from somewhere else: its own list marker followed
// by a template call. That is the shape of every line this family writes -- {{jêder}}, {{jêder-kitêb}},
// {{nm}}, {{nimûne}}, {{mk}}, any Kategorî:Çavkanî template -- so the template name is not checked
// against a list, which could never cover every citation template on the wiki.
//
// Used to switch the form into raw mode by itself: pasting a finished line and forgetting to change the
// dropdown would otherwise wrap it in a second {{nimûne}}.
function looksLikeCitationLine(text) {
var trimmed = String(text || "");
if (!LIST_MARKER.test(trimmed)) {
return false;
}
return trimmed.replace(LIST_MARKER, "").slice(0, 2) === "{{";
}
// True when the example box holds nothing but one finished template call -- the cue to offer, or to
// switch to, the "write it out as-is" mode.
function looksLikeTemplate(text) {
var trimmed = String(text || "").trim();
if (trimmed.slice(0, 2) !== "{{" || trimmed.slice(-2) !== "}}") {
return false;
}
var parsed = edit.wt.parseTemplateCalls(trimmed);
return parsed.calls.length === 1 && !parsed.otherContent;
}
// ---- reading a finished line back --------------------------------------------------------------
// [[Şablon:nimûne]] and every redirect to it.
var USEX_NAMES = ["nimûne", "mk", "ux", "mînak", "nim", "nm"];
var USEX_TRANSLATION = ["3", "t", "tercime", "translation", "w", "werger"];
var USEX_TRANSCRIPTION = ["tr", "transliteration"];
// A quotation template's translation, under the name Modul:quote documents and its aliases.
var QUOTE_TRANSLATION = ["t", "tercime", "werger", "w"];
// [[Şablon:bênimûne]] and its redirects: the "no example yet" placeholder, with or without a language.
var EMPTY_EXAMPLE_MARKER = /^#+\*\s*\{\{\s*(?:bênimûne|bêmînak|mînak\?|nimûne\?)\s*(?:\|[^{}]*)?\}\}\s*$/i;
// The text of a line written as one italic run ("''…''", bold inside allowed -- "'''''X''' …''" opens
// with both), or null.
function italicRun(text) {
var t = $.trim(text || "");
var opening = /^'*/.exec(t)[0].length;
var m = /^''([\s\S]+)''$/.exec(t);
if ((opening !== 2 && opening !== 5) || !m || /''/.test(m[1].replace(/'''/g, ""))) {
return null;
}
return m[1];
}
// "''…'' (…)": an italic example with its explanation in brackets on the same line, as
// {text, translation}, or null. One level of brackets inside the explanation is allowed.
function italicWithGloss(text) {
var m = /^([\s\S]*'')\s*\(([^()]*(?:\([^()]*\)[^()]*)*)\)$/.exec($.trim(text || ""));
var italic = m && italicRun(m[1]);
if (italic === null || !m) {
return null;
}
var gloss = $.trim(m[2]);
return { text: italic, translation: italicRun(gloss) || gloss };
}
function brToNl(text) {
return String(text || "").replace(/<br\s*\/?>/gi, "\n");
}
/**
* One "#:"/"#*" block -- its line plus any deeper "#::"/"#*:" lines -- as the form's values, or null when
* it is not an example: a word list, the "no example yet" placeholder, a plain note.
* {mode: "nimune"|"jeder"|"source"|"raw", marker, template, text, translation, transcription,
* source, sourceURL, fields, extra}
* extra is every parameter the form has no box for, to be written back as it was. A "raw" block is
* edited as written: text is the whole block, list markers included.
*/
function parseCitationLine(block) {
var all = String(block || "").split("\n");
var k = 1;
while (k < all.length && !/^#/.test(all[k])) {
k++;
}
var head = /^#+([:*])\s*([\s\S]*)$/.exec(all.slice(0, k).join("\n"));
var sub = all.slice(k);
if (!head || EMPTY_EXAMPLE_MARKER.test(all[0])) {
return null;
}
var out = { mode: "raw", marker: head[1], template: "", text: "", translation: "", transcription: "",
source: "", sourceURL: "", fields: {}, extra: [] };
var body = $.trim(head[2]);
var parsed = edit.wt.parseTemplateCalls(body);
var call = parsed.calls.length === 1 && !parsed.otherContent ? parsed.calls[0] : null;
var name = call ? edit.wt.canonicalTemplateKey(call.name) : "";
name = name.charAt(0).toLowerCase() + name.slice(1);
var isUsex = USEX_NAMES.indexOf(name) !== -1;
var def = call && jederDefs[name];
if (call && !sub.length && (isUsex || def || name === "jêder")) {
var split = edit.wt.splitCallParams(call.params);
var fieldKeys = def ? def.fields.map(function (f) { return f.key; }) : [];
out.mode = isUsex ? "nimune" : def ? "jeder" : "source";
out.template = def ? name : "";
split.used.forEach(function (key, i) {
var value = brToNl(split.values[key]);
if (key === "1") {
return; // the language, which the section already says
}
if (isUsex ? key === "2" : (key === "jêgirtin" || key === "jg")) {
out.text = value;
} else if ((isUsex ? USEX_TRANSLATION : QUOTE_TRANSLATION).indexOf(key) !== -1) {
out.translation = value;
} else if (USEX_TRANSCRIPTION.indexOf(key) !== -1) {
out.transcription = value;
} else if (def && fieldKeys.indexOf(key) !== -1) {
out.fields[key] = split.values[key];
} else if (name === "jêder" && key === "2") {
out.source = split.values[key];
} else if (name === "jêder" && key === "url") {
out.sourceURL = split.values[key];
} else {
// Named when it was positional, so it cannot shift into a slot the form now fills.
out.extra.push(/^\d+$/.test(key) && !/=/.test(call.params[i]) ? key + "=" + split.values[key] : $.trim(call.params[i]));
}
});
return out;
}
// Any other citation template on a "#*" line -- the Kategorî:Çavkanî ones, {{J:…}} and {{Ç:…}} --
// reads into the category mode: quote, translation and transcription in their boxes, every other
// named parameter as a field. Which of those get a box is known once the template's parameters
// are fetched (see applyAliases).
if (call && !sub.length && out.marker === "*" &&
(/^[JÇ]:/.test($.trim(call.name)) || /(?:^|\|)\s*(?:jêgirtin|jg)\s*=/.test(call.params.join("|")))) {
var catSplit = edit.wt.splitCallParams(call.params);
out.mode = "category";
out.template = $.trim(call.name);
catSplit.used.forEach(function (key, i) {
var value = catSplit.values[key];
if (key === "jêgirtin" || key === "jg") {
out.text = brToNl(value);
} else if (QUOTE_TRANSLATION.indexOf(key) !== -1) {
out.translation = brToNl(value);
} else if (USEX_TRANSCRIPTION.indexOf(key) !== -1) {
out.transcription = brToNl(value);
} else if (key === "wekjêgirtin" && /^Ç:/.test(out.template)) {
return; // buildCitation() writes it for every "Ç:" template
} else if (/^\d+$/.test(key)) {
out.extra.push(!/=/.test(call.params[i]) ? key + "=" + value : $.trim(call.params[i]));
} else {
out.fields[key] = value;
}
});
return out;
}
if (out.marker === ":") {
// The hand-written kind: "#: ''…''", its translation, if any, on a "#::" line under it.
var italic = italicRun(body);
var translationLine = sub.length === 1 ? /^#+::\s*([\s\S]*)$/.exec(sub[0]) : null;
if (italic !== null && (!sub.length || translationLine)) {
out.mode = "nimune";
out.text = brToNl(italic);
out.translation = translationLine ? brToNl(italicRun(translationLine[1]) || $.trim(translationLine[1])) : "";
return out;
}
var withGloss = sub.length ? null : italicWithGloss(body);
if (withGloss) {
out.mode = "nimune";
out.text = brToNl(withGloss.text);
out.translation = brToNl(withGloss.translation);
return out;
}
if (!isUsex) {
return null;
}
}
out.text = all.join("\n");
return out;
}
/**
* Settles which parameters of a read line get a box. aliases maps an alias to its documented name
* (templateAliases); fieldKeys are the boxes the form drew. A parameter written under an alias -- "r="
* for "rûpel=" -- goes to its box; one with no box goes to extra, written back as it was.
*/
function applyAliases(example, aliases, fieldKeys) {
var pending = example.extra.slice();
Object.keys(example.fields).forEach(function (key) {
if (fieldKeys.indexOf(key) === -1) {
pending.push(key + "=" + example.fields[key]);
delete example.fields[key];
}
});
example.extra = [];
pending.forEach(function (param) {
var m = /^\s*([^=]+?)\s*=([\s\S]*)$/.exec(param);
var key = m ? (aliases[m[1]] || m[1]) : null;
var value = m ? $.trim(m[2]) : "";
if (m && fieldKeys.indexOf(key) !== -1 && !example.fields[key]) {
example.fields[key] = value;
} else if (m && key === "jêgirtin" && !example.text) {
example.text = brToNl(value);
} else if (m && QUOTE_TRANSLATION.indexOf(key) !== -1 && !example.translation) {
example.translation = brToNl(value);
} else {
example.extra.push(param);
}
});
return example;
}
/**
* newLine with its parameters in the order originalLine had them, so an edit's diff shows only what
* changed. Parameters match by name -- an alias counting as the name it stands for (aliases, from
* templateAliases) -- and positional ones by position; any the original lacked follow in newLine's own
* order. A line that is not one template call on either side comes back as it was.
*/
function keepOrder(newLine, originalLine, aliases) {
aliases = aliases || {};
var marker = /^#+[:*]\s*/.exec(newLine || "");
var oldBody = /^#+[:*]\s*([\s\S]*)$/.exec(originalLine || "");
if (!marker || !oldBody) {
return newLine;
}
var fresh = edit.wt.parseTemplateCalls(newLine.slice(marker[0].length));
var old = edit.wt.parseTemplateCalls($.trim(oldBody[1]));
if (fresh.calls.length !== 1 || fresh.otherContent || old.calls.length !== 1 || old.otherContent) {
return newLine;
}
function keyed(params) {
var positional = 0;
return params.map(function (raw) {
var m = /^\s*([^|={}\n]+?)\s*=/.exec(raw);
var key = m ? m[1] : String(++positional);
return { key: aliases[key] || key, raw: raw };
});
}
var rest = keyed(fresh.calls[0].params);
var ordered = [];
keyed(old.calls[0].params).forEach(function (o) {
for (var i = 0; i < rest.length; i++) {
if (rest[i].key === o.key) {
ordered.push(rest.splice(i, 1)[0]);
return;
}
}
});
return marker[0] + "{{" + fresh.calls[0].name + ordered.concat(rest).map(function (p) {
return "|" + p.raw;
}).join("") + "}}";
}
// Where the {{ … }} opened on lines[start] closes, so a template written over several lines stays whole.
function braceEnd(lines, start) {
var depth = 0;
for (var i = start; i < lines.length; i++) {
depth += (lines[i].match(/\{\{/g) || []).length - (lines[i].match(/\}\}/g) || []).length;
if (depth <= 0) {
return i;
}
}
return lines.length - 1;
}
// The "#:"/"#*" blocks right under the definition on lines[defIndex], each {start, end, text, example}:
// example is parseCitationLine's reading, or null for a block that is not an example.
function exampleBlocks(lines, defIndex) {
var depth = /^#+/.exec(lines[defIndex])[0].length;
var own = new RegExp("^#{" + depth + "}[:*]");
var deeper = new RegExp("^#{" + depth + "}[:*][:*]");
var blocks = [];
var i = defIndex + 1;
while (i < lines.length && own.test(lines[i])) {
var start = i;
var end = braceEnd(lines, i);
while (end + 1 < lines.length && deeper.test(lines[end + 1])) {
end = braceEnd(lines, end + 1);
}
var text = lines.slice(start, end + 1).join("\n");
blocks.push({ start: start, end: end, text: text, example: parseCitationLine(text) });
i = end + 1;
}
return blocks;
}
/**
* Replaces the index-th example under a definition with code, or removes it when code is null.
* original is the block as it read when the form opened. When the index no longer holds it (an earlier
* queued change moved it) the one block still reading exactly that is used; otherwise nothing is touched.
*/
function replaceExample(pageContent, language, sectionType, sectionOrdinal, definitionLevel, index, original, code) {
var loc = edit.wt.locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var defIndex = edit.wt.findDefinitionLine(lines, loc.posLineIndex, definitionLevel);
var examples = exampleBlocks(lines, defIndex).filter(function (b) {
return b.example;
});
var block = examples[index] && examples[index].text === original ? examples[index] : null;
if (!block) {
var same = examples.filter(function (b) {
return b.text === original;
});
block = same.length === 1 ? same[0] : null;
}
if (!block) {
throw new edit.util.SubmitAbort("Ev nimûne ji dema vekirina formê ve hatiye guhartin — rûpelê nû bike û dîsa biceribîne.");
}
var replacement = code === null ? [] : String(code).split("\n");
lines.splice.apply(lines, [block.start, block.end - block.start + 1].concat(replacement));
return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n");
}
// Words only, lower-cased: links, templates, tags and quote marks out, so the page's drawn text and the
// line's wikitext can be compared.
function normalizeWords(text) {
return String(text || "")
.replace(/\[\[(?:[^\]|]*\|)?([^\]]*)\]\]/g, "$1")
.replace(/\{\{[^{}]*\}\}/g, " ")
.replace(/<[^>]*>/g, " ")
.replace(/'{2,}/g, "")
.toLowerCase()
.replace(/[\s.,;:!?"'“”‘’«»()\[\]\-–—…\/]+/g, "");
}
// True when the text a page draws for an example comes from this line.
function exampleMatches(drawnText, example) {
var source = example.text;
if (example.mode === "raw") {
var quote = /\|\s*(?:jêgirtin|jg)\s*=([^|}]*)/.exec(source);
source = quote ? quote[1] : source.replace(/^#+[:*]\s*/, "");
}
var drawn = normalizeWords(drawnText);
var written = normalizeWords(source);
if (!drawn || !written) {
return false;
}
return drawn === written || written.indexOf(drawn.slice(0, 24)) !== -1;
}
module.exports = {
CATEGORY_KEY: CATEGORY_KEY,
RAW_KEY: RAW_KEY,
COVERED_PARAMS: COVERED_PARAMS,
LANG_LABEL: LANG_LABEL,
jederDefs: jederDefs,
fieldSize: fieldSize,
exclusivePartner: exclusivePartner,
boldenPageTitle: boldenPageTitle,
nlToBr: nlToBr,
nlToSpace: nlToSpace,
fetchCategoryTemplates: fetchCategoryTemplates,
buildCategoryTemplateSearch: buildCategoryTemplateSearch,
openTemplateDialog: openTemplateDialog,
buildTemplateParamForm: buildTemplateParamForm,
templateParams: templateParams,
fieldSpecs: fieldSpecs,
jederFieldSpecs: jederFieldSpecs,
fetchFromCitoid: fetchFromCitoid,
citoidFieldsFor: citoidFieldsFor,
withLinkAsUrl: withLinkAsUrl,
today: today,
buildCitation: buildCitation,
looksLikeTemplate: looksLikeTemplate,
looksLikeCitationLine: looksLikeCitationLine,
USEX_NAMES: USEX_NAMES,
EMPTY_EXAMPLE_MARKER: EMPTY_EXAMPLE_MARKER,
parseCitationLine: parseCitationLine,
applyAliases: applyAliases,
keepOrder: keepOrder,
templateAliases: templateAliases,
exampleBlocks: exampleBlocks,
replaceExample: replaceExample,
exampleMatches: exampleMatches
};
}());
// </nowiki>
ercf8tbbun9mc0gl0czwwtjdgds7ar1
Bikarhêner:Wikihez/Gadget-test/cite.css
2
1358918
6532103
6353121
2026-09-18T20:34:49Z
Wikihez
7344
Etymology: add a builder for {{etîmon}} to the shared template dialog, with its keywords, modifiers and metn= values in data-main.json
6532103
css
text/css
/* <nowiki> */
/*
* Page: [[MediaWiki:Gadget-wikt.cite.css]]
*
* Styles cite.js's own DOM: the Kategorî:Çavkanî search rows (buildCategoryTemplateSearch) and the
* template-param dialog (openTemplateDialog/buildTemplateParamForm) it shares with DefSideBoxes and
* start.js. .dsb-input and .dsb-adv-label also exist in dsb-panels.css for its own unrelated fields --
* duplicated here, not moved, since those other uses have nothing to do with this module.
*/
/* ── Template parameter form ─────────────────────────────────────────
Built by buildTemplateParamForm(): a fresh insert from Etîmolojî/Çavkanî, editing an existing chip, or a
gloss line that turns out to be one template call. */
.dsb-input {
box-sizing: border-box;
min-width: 16em;
padding: 6px 10px;
font-family: var(--wikt-sans);
font-size: 13px;
color: var(--wikt-ink);
background: var(--wikt-field-bg);
border: 1px solid var(--wikt-field-edge);
border-radius: var(--wikt-r-field);
transition: border-color 0.12s ease, box-shadow 0.12s ease;
}
.dsb-input::placeholder {
color: var(--wikt-placeholder);
opacity: 1;
}
.dsb-input:focus {
border-color: var(--wikt-accent);
box-shadow: 0 0 0 3px var(--wikt-accent-tint);
outline: 0;
}
.dsb-adv-label {
margin-bottom: 4px;
font-size: 12px;
font-weight: 600;
color: var(--wikt-ink-3);
}
.dsb-tpl-name {
font-family: var(--wikt-mono);
font-size: 12px;
color: var(--wikt-ink-3);
}
.dsb-tpl-name a {
color: inherit;
text-decoration: none;
border-bottom: 1px dotted var(--wikt-ink-3);
}
.dsb-tpl-name a:hover {
color: var(--wikt-accent-deep);
}
.dsb-tpl-desc {
margin-top: 2px;
font-size: 12px;
color: var(--wikt-muted);
}
.dsb-tpl-param-row {
display: flex;
flex-direction: column;
gap: 3px;
margin-top: 8px;
}
.dsb-tpl-help {
font-size: 11.5px;
color: var(--wikt-muted);
}
.dsb-tpl-undocumented {
font-weight: 400;
color: var(--wikt-muted);
}
.dsb-tpl-deprecated .dsb-adv-label {
text-decoration: line-through;
color: var(--wikt-muted);
}
/* A parameter that takes inline modifiers reuses the word row, so strip the list styling. */
.dsb-tpl-modifier-list {
margin: 0;
padding: 0;
list-style: none;
}
/* ---- the {{etîmon}} builder --------------------------------------------------------------------- */
.dsb-etimon {
display: flex;
flex-direction: column;
gap: 10px;
}
.dsb-etimon-pagelang,
.dsb-etimon-metn {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
}
.dsb-etimon-lang {
max-width: 11em;
}
/* One step of the chain: its keyword, that keyword's modifiers, and the words it applies to. */
.dsb-etimon-step {
border: 1px solid var(--wikt-card-edge);
border-radius: var(--wikt-r-card);
padding: 8px 10px;
background: var(--wikt-code-bg);
}
.dsb-etimon-step-head {
display: flex;
align-items: flex-start;
gap: 8px;
flex-wrap: wrap;
}
.dsb-etimon-words {
margin: 6px 0 0;
padding: 0;
list-style: none;
display: flex;
flex-direction: column;
gap: 6px;
}
.dsb-etimon-word-row {
display: flex;
align-items: flex-start;
gap: 6px;
flex-wrap: wrap;
}
.dsb-etimon-word-input {
flex: 1 1 12em;
min-width: 10em;
}
/* The modifier chips and their ⊕ sit together, the picker drops out underneath. */
.dsb-etimon-mods {
position: relative;
display: flex;
align-items: center;
gap: 4px;
flex-wrap: wrap;
}
/* An inline <etimon:…>: the same blocks again, one step deeper. */
.dsb-etimon-nested {
margin: 6px 0 0 14px;
padding-left: 10px;
border-left: 2px solid var(--wikt-accent-edge);
}
.dsb-etimon-nested-head {
display: flex;
align-items: center;
gap: 6px;
}
.dsb-etimon-add {
align-self: flex-start;
margin-top: 6px;
border: 0;
padding: 2px 0;
background: none;
color: var(--wikt-accent);
font-size: 12.5px;
cursor: pointer;
}
.dsb-etimon-add:hover {
text-decoration: underline;
}
.dsb-etimon-remove {
border: 0;
background: none;
padding: 0 4px;
color: var(--wikt-muted);
font-size: 15px;
line-height: 1.4;
cursor: pointer;
}
.dsb-etimon-remove:hover {
color: var(--wikt-danger);
}
.dsb-etimon-metn-free {
max-width: 9em;
}
.dsb-etimon-more summary {
cursor: pointer;
font-size: 12.5px;
color: var(--wikt-ink-3);
}
.dsb-etimon-param {
display: flex;
flex-direction: column;
gap: 3px;
margin-top: 8px;
}
/* A flag is a checkbox with its explanation on the label, so it reads as one line. */
.dsb-etimon-param-flag {
flex-direction: row;
align-items: center;
gap: 6px;
}
/* What the form will write, so the wikitext is never a surprise. */
.dsb-etimon-preview {
display: block;
padding: 6px 8px;
border-radius: var(--wikt-r-field);
background: var(--wikt-code-bg);
border: 1px solid var(--wikt-card-edge);
font-family: var(--wikt-mono);
font-size: 11.5px;
color: var(--wikt-ink-2);
word-break: break-all;
}
/* Touch: >=16px stops iOS Safari zooming the page when a field is focused, and the taller box clears the
44px tap minimum. dsb-panels.css says the same for its own fields; the dialog opens on the wizard too,
which never loads that sheet. */
@media (max-width: 720px), (pointer: coarse) {
.dsb-input {
min-height: 40px;
font-size: 16px;
}
}
/* </nowiki> */
9c5va6tn6231msv5c9nf4zzebglswqv
Modul:parameters/data/ceribandin
828
1359050
6532074
6531682
2026-09-18T18:40:29Z
Wikihez
7344
sync test copy
6532074
Scribunto
text/plain
local list_to_set = require("Module:table").listToSet
local function process_set_param(param)
param.set = list_to_set(param.set)
param.converted_set = true
return param
end
local boolean = {type = "boolean"}
local empty_list = {}
local list = {list = true}
local list_allow_holes_separate_no_index = {list = true, allow_holes = true, separate_no_index = true}
local required = {required = true}
local required_default_ = {required = true, default = ""}
local required_lang_default_und = {required = true, type = "language", default = "und"}
local m = {}
-- [[Module:anchors]]
m["anchor"] = {
[1] = {required = true, list = true, disallow_holes = true},
}
m["senseid"] = {
[1] = required_lang_default_und,
[2] = required_default_,
tag = process_set_param{set = {"li", "p"}, default = "li"},
}
m["etymid"] = {
[1] = required_lang_default_und,
[2] = required_default_
}
-- [[Module:etymon]]
m["etymon"] = {
[1] = required_lang_default_und,
[2] = {list = true, disallow_holes = true},
id = true,
title = true,
tree = boolean,
text = true,
-- Kurdish names for the same two parameters.
dar = {alias_of = "tree"},
metn = {alias_of = "text"},
exnihilo = boolean,
etydate = true,
doublet = {sublist = "comma without whitespace"},
-- Kurdish name for the same parameter, cf. Şablon:cotreh.
cotreh = {alias_of = "doublet"},
rfe = true,
etystub = true,
nl = boolean,
pos = true,
-- Kurdish name for the same parameter; Modul:etymon maps its Kurdish values (reh, kelîme, ...).
crz = {alias_of = "pos"},
notree = {default = false, type = "boolean"},
nocat = {default = false, type = "boolean"},
nodot = {default = false, type = "boolean"},
dot = true,
-- Kurdish names for the same parameters.
["tarîxa-etîm"] = {alias_of = "etydate"},
darna = {alias_of = "notree"},
katna = {alias_of = "nocat"},
nekat = {alias_of = "nocat"},
niqtena = {alias_of = "nodot"},
niqte = {alias_of = "dot"},
json = {default = false, type = "boolean"},
}
-- [[Module:translations]]
m["translation"] = {
[1] = required_lang_default_und,
[2] = true,
[3] = list,
["alt"] = true,
["id"] = true,
["sc"] = {type = "script"},
["tr"] = true,
["ts"] = true,
["lit"] = true,
}
m["t-needed"] = {
[1] = required_lang_default_und,
[2] = process_set_param{set = {"usex", "quote"}},
["nocat"] = boolean,
["sort"] = true,
}
m["trans-top"] = {
[1] = true,
["id"] = true,
["column-width"] = true,
}
m["trans-top-also"] = {
[1] = required,
[2] = list,
["id"] = list_allow_holes_separate_no_index,
["column-width"] = true,
}
m["checktrans-top"] = {
[1] = true,
["column-width"] = true,
}
m["trans-bottom"] = empty_list
m["trans-see"] = {
[1] = required,
[2] = list,
["id"] = list_allow_holes_separate_no_index,
}
m["translation subpage"] = empty_list
m["no equivalent translation"] = {
[1] = required_lang_default_und,
["noend"] = boolean,
}
m["no attested translation"] = {
[1] = required_lang_default_und,
["noend"] = boolean,
["sort"] = true,
}
m["not used"] = {
[1] = required_lang_default_und,
[2] = true,
}
return m
338lyfowsqvo2n7ky43h9frxqyo5oz6
Modul:etydate
828
1359081
6532081
6370545
2026-09-18T19:07:30Z
Wikihez
7344
Kurdish wording: "Cara ewil di 1900an de hatiye peyitandin"; Kurdish endings on years (-ê after a final 1, -î for decades, -an otherwise)
6532081
Scribunto
text/plain
local export = {}
local M = require("Module:module loader").init({
require = {
parameters = "Module:parameters",
references = "Module:references",
},
})
local insert = table.insert
local concat = table.concat
function export.etydate(frame)
local params = {
nocap = { type = "boolean" },
[1] = { list = true, required = true, template_default = "{{{1}}}", disallow_holes = true },
ref = { list = true, type = "references", allow_holes = true },
["ref\1n"] = { list = true, allow_holes = true },
}
local parent_args = frame:getParent().args
local args = M.parameters.process(parent_args, params)
return export.format_etydate(args, nil)
end
function export.collect_etydate_ref_specs(args)
local ref = args.ref or {}
local refn = args.refn
local maxindex = (refn and refn.maxindex) or 0
for k in pairs(ref) do
if type(k) == "number" and k > maxindex then
maxindex = k
end
end
if maxindex == 0 and not next(ref) then
return {}
end
local parse_refs = M.references.parse_references
local flattened_refs = {}
for i = 1, maxindex do
if refn and refn[i] then
if ref[i] then
if ref[i][2] then
local ind = i == 1 and "" or i
error(("Can't specify two or more references in |ref%s= and also |ref%sn="):format(ind, ind))
end
if type(ref[i][1]) == "string" then
ref[i][1] = { text = ref[i][1] }
end
ref[i][1].name = refn[i]
insert(flattened_refs, ref[i][1])
else
insert(flattened_refs, { name = refn[i] })
end
elseif ref[i] then
if type(ref[i]) == "string" then
for _, note in ipairs(parse_refs(ref[i])) do
insert(flattened_refs, note)
end
else
for j = 1, #ref[i] do
local item = ref[i][j]
if type(item) == "string" then
for _, note in ipairs(parse_refs(item)) do
insert(flattened_refs, note)
end
else
insert(flattened_refs, item)
end
end
end
end
end
return flattened_refs
end
function export.format_etydate(args, opts)
local parts, tail = {}, {}
local specs = args[1]
local target = parts
local function ins(txt)
insert(target, txt)
end
-- Kurdish oblique ending on a year: "-ê" after a final 1, "-an" after a final 11 and everything else.
local function oblique(num)
if num:find("11$") then
return num .. "an"
elseif num:find("1$") then
return num .. "ê"
end
return num .. "an"
end
-- "1900" -> "1900an", "1500s" -> "salên 1500an", "14c" -> "sedsala 14an",
-- with "early"/"mid"/"late" in front where they are given.
local period_prefixes = { early = "destpêka ", mid = "nîvê ", late = "dawiya " }
local function period(arg)
arg = arg:gsub("^!", "")
local prefix = ""
local word, rest = arg:match("^(%a+)[ %-](.+)$")
if word and period_prefixes[word] then
prefix, arg = period_prefixes[word], rest
end
local decade = arg:match("^(%d+)s$")
if decade then
return prefix .. "salên " .. decade .. "î"
end
local century = arg:match("^(%d+)c$")
if century then
return prefix .. "sedsala " .. oblique(century)
end
if arg:find("^%d+$") then
return prefix .. oblique(arg)
end
return prefix .. arg
end
local process_common_usage
local function process_year_or_range(poff)
local year = specs[poff]
if not year then
error(("Expected a year or 'r' in %s= but it is missing"):format(poff))
end
if year == "r" then
local r1 = specs[poff + 1]
local r2 = specs[poff + 2]
if not r1 or not r2 then
error(("Saw 'r' in %s= but %s= or %s= is missing"):format(poff, poff + 1, poff + 2))
end
ins("navbera " .. r1:gsub("^!", "") .. " û " .. period(r2))
return poff + 3
end
ins(period(year))
return poff + 1
end
local function process_circa_or_year_range(offset)
local next_param
if specs[offset] == "c" then
ins("''[[circa|nêzîkî]]'' ")
next_param = process_year_or_range(offset + 1)
else
next_param = process_year_or_range(offset)
end
if specs[next_param] then
process_common_usage(next_param)
end
end
-- The second date goes after the main clause, as a sentence of its own.
process_common_usage = function(offset)
target = tail
ins(", lê ancax ji ")
process_circa_or_year_range(offset)
ins(" ve bi berfirehî hatiye bikaranîn")
target = parts
end
if args.nocap then
ins("c")
else
ins("C")
end
ins("ara ewil ")
if specs[1] == "before" or specs[1] == "after" then
ins(specs[1] == "before" and "beriya " or "piştî ")
if not specs[2] then
error(("Saw 1=%s but 2= is missing"):format(specs[1]))
end
ins(period(specs[2]))
if specs[3] then
process_common_usage(3)
end
ins(" hatiye peyitandin")
else
ins("di ")
process_circa_or_year_range(1)
ins(" de hatiye peyitandin")
end
for _, part in ipairs(tail) do
insert(parts, part)
end
if not (opts and opts.omit_refs) then
local flattened_refs = export.collect_etydate_ref_specs(args)
if #flattened_refs > 0 then
insert(parts, M.references.format_references(flattened_refs))
end
end
return concat(parts)
end
return export
q0rpkr9bn4b2ronjkx2u27tdfblmzeh
6532091
6532081
2026-09-18T19:17:39Z
Wikihez
7344
Kurdish wording: "Cara ewil di 1900an de hatiye peyitandin"; Kurdish endings on years (-ê after a final 1, -î for decades, -an otherwise)
6532091
Scribunto
text/plain
local export = {}
local M = require("Module:module loader").init({
require = {
parameters = "Module:parameters",
references = "Module:references",
},
})
local insert = table.insert
local concat = table.concat
function export.etydate(frame)
local params = {
nocap = { type = "boolean" },
[1] = { list = true, required = true, template_default = "{{{1}}}", disallow_holes = true },
ref = { list = true, type = "references", allow_holes = true },
["ref\1n"] = { list = true, allow_holes = true },
}
local parent_args = frame:getParent().args
local args = M.parameters.process(parent_args, params)
return export.format_etydate(args, nil)
end
function export.collect_etydate_ref_specs(args)
local ref = args.ref or {}
local refn = args.refn
local maxindex = (refn and refn.maxindex) or 0
for k in pairs(ref) do
if type(k) == "number" and k > maxindex then
maxindex = k
end
end
if maxindex == 0 and not next(ref) then
return {}
end
local parse_refs = M.references.parse_references
local flattened_refs = {}
for i = 1, maxindex do
if refn and refn[i] then
if ref[i] then
if ref[i][2] then
local ind = i == 1 and "" or i
error(("Can't specify two or more references in |ref%s= and also |ref%sn="):format(ind, ind))
end
if type(ref[i][1]) == "string" then
ref[i][1] = { text = ref[i][1] }
end
ref[i][1].name = refn[i]
insert(flattened_refs, ref[i][1])
else
insert(flattened_refs, { name = refn[i] })
end
elseif ref[i] then
if type(ref[i]) == "string" then
for _, note in ipairs(parse_refs(ref[i])) do
insert(flattened_refs, note)
end
else
for j = 1, #ref[i] do
local item = ref[i][j]
if type(item) == "string" then
for _, note in ipairs(parse_refs(item)) do
insert(flattened_refs, note)
end
else
insert(flattened_refs, item)
end
end
end
end
end
return flattened_refs
end
function export.format_etydate(args, opts)
local parts, tail = {}, {}
local specs = args[1]
local target = parts
local function ins(txt)
insert(target, txt)
end
-- Kurdish oblique ending on a year: "-ê" after a final 1, "-an" after a final 11 and everything else.
local function oblique(num)
if num:find("11$") then
return num .. "an"
elseif num:find("1$") then
return num .. "ê"
end
return num .. "an"
end
-- "1900" -> "1900an", "1500s" -> "salên 1500an", "14c" -> "sedsala 14an",
-- with "early"/"mid"/"late" in front where they are given.
local period_prefixes = { early = "destpêka ", mid = "nîvê ", late = "dawiya " }
local function period(arg)
if arg:find("^!") then -- "!" means: print it exactly as it was typed
return (arg:gsub("^!", ""))
end
local prefix = ""
local word, rest = arg:match("^(%a+)[ %-](.+)$")
if word and period_prefixes[word] then
prefix, arg = period_prefixes[word], rest
end
-- An ending the editor typed already ("1900î", "1901ê", "1900an") is kept as it is.
if arg:find("^%d+[îê]$") or arg:find("^%d+an$") then
return prefix .. arg
end
local decade = arg:match("^(%d+)s$")
if decade then
return prefix .. "salên " .. decade .. "î"
end
local century = arg:match("^(%d+)c$")
if century then
return prefix .. "sedsala " .. oblique(century)
end
if arg:find("^%d+$") then
return prefix .. oblique(arg)
end
return prefix .. arg
end
local process_common_usage
local function process_year_or_range(poff)
local year = specs[poff]
if not year then
error(("Expected a year or 'r' in %s= but it is missing"):format(poff))
end
if year == "r" then
local r1 = specs[poff + 1]
local r2 = specs[poff + 2]
if not r1 or not r2 then
error(("Saw 'r' in %s= but %s= or %s= is missing"):format(poff, poff + 1, poff + 2))
end
ins("navbera " .. r1:gsub("^!", "") .. " û " .. period(r2))
return poff + 3
end
ins(period(year))
return poff + 1
end
local function process_circa_or_year_range(offset)
local next_param
if specs[offset] == "c" then
ins("''[[circa|nêzîkî]]'' ")
next_param = process_year_or_range(offset + 1)
else
next_param = process_year_or_range(offset)
end
if specs[next_param] then
process_common_usage(next_param)
end
end
-- The second date goes after the main clause, as a sentence of its own.
process_common_usage = function(offset)
target = tail
ins(", lê ancax ji ")
process_circa_or_year_range(offset)
ins(" ve bi berfirehî hatiye bikaranîn")
target = parts
end
if args.nocap then
ins("c")
else
ins("C")
end
ins("ara ewil ")
if specs[1] == "before" or specs[1] == "after" then
ins(specs[1] == "before" and "beriya " or "piştî ")
if not specs[2] then
error(("Saw 1=%s but 2= is missing"):format(specs[1]))
end
ins(period(specs[2]))
if specs[3] then
process_common_usage(3)
end
ins(" hatiye peyitandin")
else
ins("di ")
process_circa_or_year_range(1)
ins(" de hatiye peyitandin")
end
for _, part in ipairs(tail) do
insert(parts, part)
end
if not (opts and opts.omit_refs) then
local flattened_refs = export.collect_etydate_ref_specs(args)
if #flattened_refs > 0 then
insert(parts, M.references.format_references(flattened_refs))
end
end
return concat(parts)
end
return export
ljm1hlpw1vnhhwzm66nabwf3vuj5oxu
MediaWiki:Gadget-wikt.core/sections.js
8
1359153
6533069
6529960
2026-09-19T10:14:46Z
Wikihez
7344
DefSideBoxes: numbered sense-group headings, subsection rename and removal, bottom-up conversions, bracketed examples, and the add-subsection form fix
6533069
javascript
text/javascript
// <nowiki>
/*
* Page: [[MediaWiki:Gadget-wikt.core/sections.js]]
*/
(function () {
"use strict";
var startData = require("./data-sections.json");
// Inlined so the view path does not pull in util.js.
function capitalize(str) {
return str ? str[0].toUpperCase() + str.substr(1) : str;
}
// Recognized part-of-speech section headings, exported for the wizard, DefSideBoxes and add-examples.
// Section titles: posChoices' keys capitalised, plus a "Formeke Xê" for each POS that has forms, plus Biwêj.
var POS_KEYS = Object.keys(startData.posChoices);
var NO_FORM_HEADING = ["gotineke pêşiyan", "îfade"];
function hasFormHeading(pos) {
return NO_FORM_HEADING.indexOf(pos) === -1;
}
var sectionNames = {};
POS_KEYS.forEach(function (key) {
var title = capitalize(key);
sectionNames[title] = [title];
if (hasFormHeading(key)) {
sectionNames["Formeke " + key + "ê"] = ["Formeke " + key + "ê"];
}
});
sectionNames["Biwêj"] = ["Biwêj"];
// Page-level (per part-of-speech, "====" heading) subsections start.js can also build from scratch.
// "kind: wordlist" ones use {{kol3|lang|cure=Header|word1|word2}}; "kind: text" ones are a plain paragraph.
// Only steps with a confirmed wikitext format are included; insertion rank comes from SUBSECTION_ORDER below.
var PAGE_SUBSECTIONS = startData.pageSubsections;
// ---- section/language helpers (document-order based, immune to mobile's per-section DOM wrapping and
// MediaWiki's page-wide heading-id collisions) ----
// MediaWiki wraps each heading in a "mw-heading2/3/.../" div in current skin output.
function headingOuter($h) {
var $wrap = $h.closest(".mw-heading2, .mw-heading3, .mw-heading4, .mw-heading5, .mw-heading6");
return $wrap.length ? $wrap : $h;
}
// Section's language code: nearest preceding .besazimani[id] by document order, not sibling-walking.
function languageCodeForOl($ol) {
var $marks = $(".besazimani[id]").add($ol);
var ol = $ol.get(0);
var idx = $marks.index(ol);
for (var i = idx - 1; i >= 0; i--) {
var el = $marks.get(i);
if (el.id) {
return el.id;
}
}
return null;
}
// Pseudo section type for start.js's unclassified "=== Mane ===" / "=== Mane 2 ===" placeholder heading, so
// locateSection() (and everything built on it) can target one before a real POS has been chosen.
var MANE_SECTION = "Mane";
// A heading's depth, from its own tag or the wrapper the skin puts around it. 0 for anything that is
// not a heading.
function headingDepth($el) {
var m = /(?:^|\s)mw-heading([2-6])(?:\s|$)/.exec($el.attr("class") || "");
if (m) {
return Number(m[1]);
}
var tag = ($el.prop("tagName") || "").toLowerCase();
return /^h[2-6]$/.test(tag) ? Number(tag.slice(1)) : 0;
}
// Every part-of-speech heading on the page, at either depth it is written at: "===" on most entries,
// "====" where the senses are grouped under numbered etymologies. Called back with the heading, its
// section key and its depth.
function eachPosHeading(callback) {
$("h3, h4").each(function () {
var $h = $(this);
var key = sectionKeyOf($h);
if (key) {
callback($h, key, headingDepth($h) || 3);
}
});
}
// A heading's own text, with the pencil/convert-trigger this gadget injects into it filtered out --
// otherwise attaching one would change what sectionTypeOf() and the ordinal counter see.
function headingText($h) {
return $h.clone().find(".dsb-toolbar").remove().end().text().trim();
}
// An older layout heads each sense group with a number and a short gloss: "=== 2. dîn, bêhiş ===".
function isNumberedHeadingText(text) {
return /^\d+\.\s+\S/.test(text);
}
// "Mane", or a numbered group heading with {{cure?}} straight under it -- the same unsorted section under
// another name. {{cure?}} and its aliases render an anchor with data-id="bekatrez". Read once per heading
// and kept: a queued conversion's preview replaces that line, and the heading must not change kind.
function isManeHeading($h) {
var text = headingText($h);
if (/^Mane(\s+\d+)?$/.test(text)) {
return true;
}
if (!isNumberedHeadingText(text)) {
return false;
}
var known = $h.data("dsbNumberedMane");
if (typeof known === "boolean") {
return known;
}
var found = false;
for (var $cursor = headingOuter($h).next(); $cursor.length; $cursor = $cursor.next()) {
if (headingDepth($cursor) || $cursor.is("ol")) {
break;
}
if ($cursor.is("[data-id='bekatrez']") || $cursor.find("[data-id='bekatrez']").length) {
found = true;
break;
}
}
$h.data("dsbNumberedMane", found);
return found;
}
// Canonical section-type key for a heading, stripping a page author's own disambiguating trailing number.
function sectionTypeOf($h3) {
var text = headingText($h3);
if (sectionNames[text]) {
return text;
}
var stripped = text.replace(/\s*\d+$/, ""); // \s* not \s+: locateSection() also accepts "Navdêr2"
return sectionNames[stripped] ? stripped : null;
}
// A heading's section key: its part of speech, or the wizard's "Mane" placeholder, which is a real
// section holding real definitions but not a part of speech. Everything that locates a section by
// heading goes through here, so the placeholder is never half-supported.
function sectionKeyOf($h3) {
return sectionTypeOf($h3) || (isManeHeading($h3) ? MANE_SECTION : null);
}
// The heading texts a section key accepts, or null when the key names no section at all. What the
// wikitext locator matches "=== ... ===" against.
function headingNamesFor(sectionType) {
return sectionNames[sectionType] ||
(sectionType === MANE_SECTION ? [MANE_SECTION] : null);
}
// This heading's 1-based position among same-type headings within its own language block.
// How many sections of one type this language has. A summary only needs to number a section when
// there is more than one of its kind -- "Navdêr" alone is unambiguous, "Navdêr" out of two is not.
// Same walk as sectionOrdinalWithinLanguage below: language marks reset the count, headings add to it.
function sectionTypeCountWithinLanguage($h3) {
var h3El = $h3.get(0);
var wanted = sectionKeyOf($h3) || headingText($h3);
var $all = $(".besazimani[id]").add($("h3, h4"));
var count = 0;
var seen = false;
$all.each(function () {
if ($(this).is(".besazimani[id]")) {
// A new language starts: whatever was counted belonged to the previous one.
if (seen) {
return false;
}
count = 0;
return;
}
var type = sectionKeyOf($(this)) || headingText($(this));
if (type === wanted) {
count++;
}
if (this === h3El) {
seen = true;
}
});
return count;
}
function sectionOrdinalWithinLanguage($h3) {
var h3El = $h3.get(0);
var $all = $(".besazimani[id]").add($("h3, h4"));
var counts = {};
var result = 1;
$all.each(function () {
if ($(this).is(".besazimani[id]")) {
counts = {};
return;
}
var type = sectionKeyOf($(this)) || headingText($(this));
counts[type] = (counts[type] || 0) + 1;
if (this === h3El) {
result = counts[type];
return false;
}
});
return result;
}
// This heading's 1-based position among headings carrying the same text in its own language block,
// at any depth. What locateHeadingByText() counts in the wikitext, so the two agree.
function headingTextOrdinalWithinLanguage($h) {
var el = $h.get(0);
var wanted = headingText($h);
var $all = $(".besazimani[id]").add($("h3, h4, h5, h6"));
var count = 0;
var result = 1;
$all.each(function () {
if ($(this).is(".besazimani[id]")) {
count = 0;
return;
}
if (headingText($(this)) === wanted) {
count++;
}
if (this === el) {
result = count;
return false;
}
});
return result;
}
// A "form of"-template-generated <li> wraps its own content; its nested <ol> isn't real "##" senses.
function isFormOfWrapper($li) {
return $li.children(".form-of-definition").length > 0;
}
// Recurse into a <li>'s nested <ol> unless it's a form-of wrapper.
function eachLeafDefinition($ol, fn) {
$ol.children("li").each(function () {
var $li = $(this);
var $childOl = $li.children("ol");
if ($childOl.length && !isFormOfWrapper($li)) {
$childOl.each(function () {
eachLeafDefinition($(this), fn);
});
} else {
fn($li);
}
});
}
/**
* Whether the gadgets should run on this page at all: an entry, a reconstruction (ns 108), or a
* sandbox -- a user's own /ceribandin or /test subpage, and the project's own [[WF:ceribandin]].
*
* Shared because dsb.js and start-launch.js each gate on it, and a sandbox added to one but not the
* other is a gadget that half-works there.
*/
function isEntryPage() {
var ns = mw.config.get("wgNamespaceNumber");
var page = mw.config.get("wgPageName") || "";
if (!ns || ns === 108) {
return true;
}
// A sandbox and anything under it: [[Bikarhêner:X/ceribandin]] and its own subpages.
if (ns === 2 && /\/(ceribandin|test)(\/|$)/.test(page)) {
return true;
}
// The project namespace has one sandbox, not one per page, so it is matched by name.
return ns === 4 && /^[^:]+:(ceribandin|test)(\/|$)/i.test(page);
}
// The examples and quotations drawn under one definition, in page order: a "#:" line is a <dd> and a "#*"
// line an <li>. A <dd> counts when it is a usage example or a plain italic sentence, never a word list;
// the "no example yet" placeholder and add-examples' own form row never count. While DefSideBoxes shows a
// queued change, the sense is drawn inside its preview, and the examples are read from there.
function exampleItemsOf($li) {
var $root = $li.children(".dsb-sense-preview").last();
if (!$root.length) {
$root = $li;
}
return $root.children("dl").children("dd").add($root.children("ul").children("li")).filter(function () {
var $item = $(this);
if (this.style.display === "none" || $item.hasClass("mw-empty-elt")) {
return false;
}
if ($item.is("li")) {
return !$item.find(".benimune").length && !$item.children(".add-example-form-title").length;
}
if ($item.children(".h-usage-example").length) {
return true;
}
var first = this.firstChild;
while (first && first.nodeType === 3 && !$.trim(first.nodeValue)) {
first = first.nextSibling;
}
return !!first && first.nodeType === 1 && first.tagName === "I";
});
}
module.exports = {
// posChoices and pageSubsections: wikt.edit hands these on as part of its own data.
data: startData,
isEntryPage: isEntryPage,
hasFormHeading: hasFormHeading,
sectionNames: sectionNames,
MANE_SECTION: MANE_SECTION,
PAGE_SUBSECTIONS: PAGE_SUBSECTIONS,
headingOuter: headingOuter,
headingText: headingText,
isManeHeading: isManeHeading,
isNumberedHeadingText: isNumberedHeadingText,
sectionTypeOf: sectionTypeOf,
sectionKeyOf: sectionKeyOf,
headingDepth: headingDepth,
eachPosHeading: eachPosHeading,
headingNamesFor: headingNamesFor,
sectionOrdinalWithinLanguage: sectionOrdinalWithinLanguage,
headingTextOrdinalWithinLanguage: headingTextOrdinalWithinLanguage,
sectionTypeCountWithinLanguage: sectionTypeCountWithinLanguage,
languageCodeForOl: languageCodeForOl,
isFormOfWrapper: isFormOfWrapper,
exampleItemsOf: exampleItemsOf,
eachLeafDefinition: eachLeafDefinition
};
}());
// </nowiki>
1fcj0v4xpgwr3aukbgh0j7ruoob57sb
MediaWiki:Gadget-wikt.edit/wikitext.js
8
1359159
6533071
6426108
2026-09-19T10:14:56Z
Wikihez
7344
DefSideBoxes: numbered sense-group headings, subsection rename and removal, bottom-up conversions, bracketed examples, and the add-subsection form fix
6533071
javascript
text/javascript
// <nowiki>
/*
* Page: [[MediaWiki:Gadget-wikt.edit/wikitext.js]]
*
*/
// Wikitext parsing and serialisation: template calls, kol/col word lists, template redirects and
// TemplateData lookups. No DOM, no wizard state.
(function () {
"use strict";
var util = require("./util.js");
var sections = require("ext.gadget.wikt.core").sections;
var startData = require("./data-main.json");
var escapeRegExp = util.escapeRegExp;
var SubmitAbort = util.SubmitAbort;
var MANE_SECTION = sections.MANE_SECTION;
// The "needs a POS" maintenance tag under a placeholder "Mane" heading, under every name it is called by
// on real pages (data-main.json's maneTags). A space inside a tag name matches any run of whitespace.
var MANE_TAG_REGEX = new RegExp(
"^\\{\\{\\s*(?:" + startData.maneTags.map(function (tag) {
return escapeRegExp(tag).replace(/ +/g, "\\s+");
}).join("|") + ")\\s*(?:\\|[^{}]*)?\\}\\}\\s*$", "i");
var HEADING_LINE = /^(={3,6})[ ]*(.+?)[ ]*\1\s*$/;
// A numbered group heading ("=== 3. roj ===") with the maintenance tag before its first definition is a
// "Mane" section under another name, as sections.isManeHeading() reads it on the page. Its depth, or 0.
function numberedManeDepth(lines, index) {
var m = HEADING_LINE.exec(lines[index] || "");
if (!m || !sections.isNumberedHeadingText(m[2])) {
return 0;
}
for (var i = index + 1; i < lines.length && !/^[#=]/.test(lines[i]); i++) {
if (MANE_TAG_REGEX.test(lines[i])) {
return m[1].length;
}
}
return 0;
}
// The numbered group heading one level up that a section sits straight under, blank lines aside
// ("=== 2. dîn ===" then "==== Mane ===="), as a line index; -1 when there is none.
function numberedGroupAbove(lines, index, depth) {
var at = index - 1;
while (at >= 0 && !$.trim(lines[at])) {
at--;
}
var m = at >= 0 && HEADING_LINE.exec(lines[at]);
return m && m[1].length === depth - 1 && sections.isNumberedHeadingText(m[2]) ? at : -1;
}
var templateDataApi = new mw.Api();
// Templates that mean the same thing. The first entry of each row is what gets written; every entry is
// recognised when reading, so an existing call keeps the spelling the page already uses.
// Matched differently, so listed separately: WORDLIST_TEMPLATES and MANE_TAG_REGEX.
var TEMPLATE_ALIASES = startData.templateAliases;
// Every alias -> the name this gadget uses for it.
var TEMPLATE_CANONICAL = {};
Object.keys(TEMPLATE_ALIASES).forEach(function (key) {
TEMPLATE_ALIASES[key].forEach(function (alias) {
TEMPLATE_CANONICAL[alias] = key;
});
});
function canonicalTemplateKey(name) {
var trimmed = $.trim(name || "");
return TEMPLATE_CANONICAL[trimmed] || trimmed;
}
// Regex alternation matching any spelling of one key. Callers wrap it in their own group.
function aliasPattern(key) {
return (TEMPLATE_ALIASES[key] || [key]).map(escapeRegExp).join("|");
}
// {{kol}}, {{kol2}}, {{kol3}} and their col* spellings are the same column word-list template. New sections
// are written as kol3; any of the six is recognized when parsing an existing one.
var WORDLIST_TEMPLATES = startData.wordlistTemplates;
// The leading run of "{{...}}" calls on a definition line; "rest" is the gloss text after them.
function splitLeadingCalls(afterMarker) {
var calls = [];
var rest = afterMarker;
var leadingRegex = /^\{\{\s*([^{}|]+?)\s*\|([^{}]*)\}\}\s*/;
var m;
while ((m = leadingRegex.exec(rest)) !== null) {
calls.push({ key: m[1], params: m[2].split("|") });
rest = rest.slice(m[0].length);
}
return { calls: calls, rest: rest };
}
// Splits a template call's inner text on its top-level "|", ignoring pipes nested in {{...}} or [[...]].
function splitTemplateParams(inner) {
var parts = [];
var buf = "";
var tpl = 0;
var link = 0;
for (var i = 0; i < inner.length; i++) {
var two = inner.substr(i, 2);
if (two === "{{" || two === "}}" || two === "[[" || two === "]]") {
if (two === "{{") { tpl++; } else if (two === "}}") { tpl--; } else if (two === "[[") { link++; } else { link--; }
buf += two;
i++;
continue;
}
if (inner.charAt(i) === "|" && tpl === 0 && link === 0) {
parts.push(buf);
buf = "";
continue;
}
buf += inner.charAt(i);
}
parts.push(buf);
return parts;
}
// Every top-level "{{...}}" call in a string, and whether anything else (bar whitespace) sits between them.
function parseTemplateCalls(text) {
var calls = [];
var otherContent = false;
var plainFrom = 0;
var i = 0;
while (i < text.length) {
if (text.substr(i, 2) !== "{{") {
i++;
continue;
}
if ($.trim(text.slice(plainFrom, i))) {
otherContent = true;
}
var depth = 0;
var close = -1;
for (var j = i; j < text.length - 1; j++) {
var two = text.substr(j, 2);
if (two === "{{") {
depth++;
j++;
} else if (two === "}}") {
depth--;
j++;
if (depth === 0) {
close = j + 1;
break;
}
}
}
if (close === -1) {
otherContent = true; // unbalanced braces: not something to offer a form for
break;
}
var parts = splitTemplateParams(text.slice(i + 2, close - 2));
calls.push({ name: $.trim(parts[0]), params: parts.slice(1), start: i, end: close });
i = close;
plainFrom = close;
}
if ($.trim(text.slice(plainFrom))) {
otherContent = true;
}
return { calls: calls, otherContent: otherContent };
}
// "ku", "îngilîzî", "id=ziman" -> positional values in order plus a named map, keeping the keys the call
// actually uses (a positional value is keyed by its 1-based position, matching TemplateData).
function splitCallParams(params) {
var values = {};
var used = [];
var positional = 0;
params.forEach(function (raw) {
// Anything but | = { } can be a parameter name; Kurdish ones carry diacritics ("rêz=", "jêder=").
var m = /^\s*([^|={}\n]+?)\s*=([\s\S]*)$/.exec(raw);
var key;
if (m) {
key = m[1];
values[key] = $.trim(m[2]);
} else {
positional++;
key = String(positional);
values[key] = $.trim(raw);
}
used.push(key);
});
return { values: values, used: used };
}
// Rebuilds a call from the form's values. Positional parameters keep their slots even when blanked --
// dropping "1" would silently promote "2" into its place.
function buildTemplateCall(name, values, keys) {
var numeric = keys.filter(function (k) {
return /^\d+$/.test(k);
}).sort(function (a, b) {
return a - b;
});
var lastFilled = 0;
numeric.forEach(function (k) {
if ($.trim(values[k] || "")) {
lastFilled = Math.max(lastFilled, parseInt(k, 10));
}
});
var out = "{{" + name;
numeric.forEach(function (k) {
if (parseInt(k, 10) <= lastFilled) {
out += "|" + $.trim(values[k] || "");
}
});
keys.forEach(function (k) {
if (/^\d+$/.test(k)) {
return;
}
var v = $.trim(values[k] || "");
if (v) {
out += "|" + k + "=" + v;
}
});
return out + "}}";
}
// TemplateData labels and descriptions are {langCode: text} objects; prefer Kurdish, then the wiki's own
// content language, then whatever is present.
function tdText(value) {
if (!value) {
return "";
}
if (typeof value === "string") {
return value;
}
return value.ku || value[mw.config.get("wgContentLanguage")] || value[Object.keys(value)[0]] || "";
}
// Cached per template name. A template with no TemplateData resolves to null, not an error -- the form
// still renders, just with raw parameter names for labels.
var templateDataCache = {};
// Fetches TemplateData for many templates in as few requests as the API's 50-title cap allows, filling
// the same cache fetchTemplateData() reads -- so a picker with hundreds of entries (Kategorî:Çavkanî,
// say) costs a handful of requests instead of one per template. Every requested name is cached (a miss
// as null) by the time this resolves; a name already cached, pending or not, is left untouched.
function fetchTemplateDataBatch(names) {
var missing = [];
(names || []).forEach(function (name) {
if (!name || templateDataCache[name] || missing.indexOf(name) !== -1) {
return;
}
// Baked-in entries answer here too, so a picker row for one costs nothing.
var baked = bakedTemplateData(name);
if (baked) {
templateDataCache[name] = $.Deferred().resolve(baked).promise();
return;
}
missing.push(name);
});
if (!missing.length) {
return $.Deferred().resolve().promise();
}
var chunks = [];
for (var i = 0; i < missing.length; i += 50) {
chunks.push(missing.slice(i, i + 50));
}
function fetchChunk(chunk) {
return templateDataApi.get({
action: "templatedata",
titles: chunk.map(function (n) { return "Şablon:" + n; }).join("|"),
redirects: 1,
formatversion: 2
}).then(function (data) {
// "pages" is an object keyed by page id even under formatversion=2 -- this endpoint (a
// third-party extension, not a core action) doesn't follow the "pages as array" convention
// core actions do -- and a title with no TemplateData at all is simply absent, not listed
// with an empty entry.
var byTitle = {};
$.each((data && data.pages) || {}, function (_, page) {
if (page && page.title) {
byTitle[page.title] = page;
}
});
// A redirect's/normalization's own target may itself need one more hop.
((data && data.redirects) || []).forEach(function (r) {
if (byTitle[r.to] && !byTitle[r.from]) {
byTitle[r.from] = byTitle[r.to];
}
});
((data && data.normalized) || []).forEach(function (n) {
if (byTitle[n.to] && !byTitle[n.from]) {
byTitle[n.from] = byTitle[n.to];
}
});
chunk.forEach(function (name) {
templateDataCache[name] = $.Deferred().resolve(byTitle["Şablon:" + name] || null).promise();
});
}, function () {
chunk.forEach(function (name) {
templateDataCache[name] = $.Deferred().resolve(null).promise();
});
});
}
return $.when.apply($, chunks.map(fetchChunk));
}
// data-main.json's own copy of the parameter lists for the templates whose dialogs open constantly, so
// those need no request at all. Shaped like the API's own answer, so nothing downstream can tell the
// difference; a template that is not in the table is fetched as before.
function bakedTemplateData(name) {
var baked = (startData.templateParams || {})[name];
if (!baked) {
return null;
}
var params = {};
(baked.order || []).forEach(function (key) {
params[key] = { label: (baked.labels || {})[key] || null };
});
return { title: "Şablon:" + name, params: params, paramOrder: baked.order || [] };
}
function fetchTemplateData(name) {
if (!templateDataCache[name]) {
var baked = bakedTemplateData(name);
if (baked) {
templateDataCache[name] = $.Deferred().resolve(baked).promise();
return templateDataCache[name];
}
}
if (!templateDataCache[name]) {
templateDataCache[name] = templateDataApi.get({
action: "templatedata",
titles: "Şablon:" + name,
redirects: 1,
formatversion: 2
}).then(function (data) {
var pages = data && data.pages;
var key = pages && Object.keys(pages)[0];
return key ? pages[key] : null;
}, function () {
return null;
});
}
return templateDataCache[name];
}
// One line of a TemplateData description, capped so a picker row stays a picker row rather than
// wrapping. Shared so every picker that shows descriptions trims them the same way.
// Numbers repeated part-of-speech headings inside one language section: two "=== Rengdêr ===" are
// indistinguishable on the page, in the table of contents and to anything linking at one. Every
// repeated heading is numbered 1..n, so an existing lone "Rengdêr" becomes "Rengdêr 1" the moment a
// second is added, and a heading that stops being repeated loses its number again.
//
// Numbers already on a heading are stripped before counting, so the result depends only on what is
// there now -- removing the middle one of three closes the gap instead of leaving 1, 3.
// Only "===" headings are touched: "====" subsections and the "==" language header are left alone.
function numberRepeatedPosHeadings(sectionText) {
var HEADING = /^(===[ \t]*)([^=\n]+?)([ \t]*===)[ \t]*$/gm;
function base(name) {
return name.replace(/\s+\d+$/, "");
}
var counts = {};
var m;
HEADING.lastIndex = 0;
while ((m = HEADING.exec(sectionText)) !== null) {
var b = base(m[2]);
counts[b] = (counts[b] || 0) + 1;
}
var seen = {};
HEADING.lastIndex = 0;
return sectionText.replace(HEADING, function (all, open, name, close) {
var key = base(name);
if (counts[key] < 2) {
return open + key + close;
}
seen[key] = (seen[key] || 0) + 1;
return open + key + " " + seen[key] + close;
});
}
function shortDesc(text, maxLen) {
maxLen = maxLen || 90;
var line = $.trim(String(text || "").split("\n")[0]);
return line.length > maxLen ? line.slice(0, maxLen) + "…" : line;
}
// Pulls a {{kol3|ku|cure=Jê|word|word}}-style call apart into the bits an edit has to preserve (template
// name, language, named params) plus the positional word list. Null if the body has no such call.
// Every word-list call in a section body, in order with absolute offsets. A section commonly holds
// several: one per "sernav=" group, often alongside an unheaded one.
function parseWordListCalls(text) {
var calls = [];
var offset = 0;
for (;;) {
var call = parseWordListCall(text.slice(offset));
if (!call) {
return calls;
}
call.start += offset;
call.end += offset;
calls.push(call);
offset = call.end;
}
}
function parseWordListCall(text) {
var m = new RegExp("\\{\\{\\s*(" + WORDLIST_TEMPLATES.join("|") + ")\\s*[|}]", "i").exec(text);
if (!m) {
return null;
}
var open = m.index;
var depth = 0;
var close = -1;
for (var i = open; i < text.length - 1; i++) {
var two = text.substr(i, 2);
if (two === "{{") {
depth++;
i++;
} else if (two === "}}") {
depth--;
i++;
if (depth === 0) {
close = i + 1;
break;
}
}
}
if (close === -1) {
return null;
}
var parts = splitTemplateParams(text.slice(open + 2, close - 2));
var named = [];
var words = [];
for (var pi = 2; pi < parts.length; pi++) {
var val = $.trim(parts[pi]);
if (!val) {
continue;
}
if (/^[A-Za-z][A-Za-z0-9_-]*\s*=/.test(val)) {
named.push(val);
} else {
words.push(val);
}
}
return {
name: $.trim(parts[0]),
lang: parts.length > 1 ? $.trim(parts[1]) : "",
named: named,
words: words,
start: open,
end: close
};
}
// Named parameters of a kol/col call are carried around as raw "key=value" strings ("cure=Jê").
// Modul:columns declares sernav alongside cure, so it round-trips like any other named parameter.
function namedParam(named, key) {
var prefix = new RegExp("^" + escapeRegExp(key) + "\s*=");
for (var i = 0; i < named.length; i++) {
if (prefix.test(named[i])) {
return $.trim(named[i].replace(prefix, ""));
}
}
return "";
}
// A copy of `named` with key set, or with it removed when the value is blank.
function withNamedParam(named, key, value) {
var prefix = new RegExp("^" + escapeRegExp(key) + "\s*=");
var out = named.filter(function (param) {
return !prefix.test(param);
});
if ($.trim(value || "")) {
out.push(key + "=" + $.trim(value));
}
return out;
}
// Canonical multi-line layout, matching how existing ku.wiktionary lists are written (one word per line).
function buildWordListCall(name, lang, named, words) {
var head = "{{" + name + "|" + lang;
named.forEach(function (n) {
head += "|" + n;
});
return words.length ? head + "\n|" + words.join("\n|") + "\n}}" : head + "\n}}";
}
// A word-list section body written as plain bullets -- "* [[kelîme]]" or "* {{g|ku|kelîme}}" -- read as a word
// list so it can be edited in the normal widget and saved back as a real {{kol3}}. Null for anything
// richer (a piped link, a {{g}} carrying extra parameters, prose between the bullets), which is left as
// raw wikitext rather than guessed at.
// A "{{mj|a|b}}" label at one end of a bullet. Several labels become one comma-joined modifier value,
// which is how the word-list templates read "<e:...>" anyway.
var MJ_LEADING = /^\{\{\s*mj\s*\|([^{}]*)\}\}\s*/;
var MJ_TRAILING = /\s*\{\{\s*mj\s*\|([^{}]*)\}\}$/;
function mjValue(params) {
return params.split("|").map(function (part) {
return $.trim(part);
}).filter(Boolean).join(", ");
}
/**
* One bullet's word, or null if the line is carrying something this cannot express.
*
* "[[kelîme]]" and "{{g|ku|kelîme}}" are the plain forms. A "{{mj|...}}" label in front of the word becomes
* an "<e:...>" modifier and one after it "<ee:...>" -- the same distinction the label templates make
* between a label that reads before the word and one that reads after it.
*/
function parseBulletWord(item) {
var lead = "";
var tail = "";
var m = MJ_LEADING.exec(item);
if (m) {
lead = mjValue(m[1]);
item = $.trim(item.slice(m[0].length));
}
m = MJ_TRAILING.exec(item);
if (m) {
tail = mjValue(m[1]);
item = $.trim(item.slice(0, item.length - m[0].length));
}
var word = null;
var link = /^\[\[([^\[\]|]+)\]\]$/.exec(item);
if (link) {
word = $.trim(link[1]);
} else {
var parsed = parseTemplateCalls(item);
if (parsed.otherContent || parsed.calls.length !== 1) {
return null;
}
var call = parsed.calls[0];
// {{g|lang|kelîme}} exactly: a third parameter means it is carrying something this cannot express.
if (canonicalTemplateKey(call.name) !== "g" || call.params.length !== 2) {
return null;
}
word = $.trim(call.params[1]);
}
if (!word) {
return null;
}
return word + (lead ? "<e:" + lead + ">" : "") + (tail ? "<ee:" + tail + ">" : "");
}
function parseBulletWordList(body) {
var lines = (body || "").split("\n");
var words = [];
for (var i = 0; i < lines.length; i++) {
var line = $.trim(lines[i]);
if (!line) {
continue;
}
var bullet = /^\*\s*(.+)$/.exec(line);
if (!bullet) {
return null;
}
var word = parseBulletWord($.trim(bullet[1]));
if (word === null) {
return null;
}
words.push(word);
}
return words.length ? words : null;
}
// "{{h-bnr|a|b}}" — the "herwiha binêre" hatnote that sits above the first language heading. Empty
// entries are dropped; an empty list has no call at all. name keeps whichever of the seven spellings
// the page already uses, so editing one never renames it.
function buildHbnrCall(pages, name) {
var kept = $.grep(pages || [], function (p) { return !!$.trim(p); });
return kept.length ? "{{" + (name || "h-bnr") + "|" + $.map(kept, $.trim).join("|") + "}}" : "";
}
// The "{{herwiha binêre|...}}" call on a page, under any of its names, or null. subpage is set when
// the call names one -- "{{h-bnr/-ane}}" -- because those hold a list shared by every page that
// transcludes them, which lives on the template rather than here.
function findHbnrCall(pageContent) {
var lines = (pageContent || "").split("\n");
var pattern = new RegExp("^\\{\\{\\s*(" + aliasPattern("h-bnr") + ")(/[^|}]*)?\\s*([|}])", "i");
for (var i = 0; i < lines.length; i++) {
if (/^==[^=]/.test(lines[i])) {
break; // the hatnote sits above the first language heading
}
var m = pattern.exec($.trim(lines[i]));
if (m) {
var call = parseTemplateCalls($.trim(lines[i])).calls[0];
return {
lineIndex: i,
name: m[1] + (m[2] || ""),
subpage: m[2] ? m[1] + m[2] : null,
words: (call && call.params) || []
};
}
}
return null;
}
// One "[[Wêne:...|thumb|...]]" line. alt is left out when it is empty rather than written blank.
// extra is the line's own display keywords ("thumb", "left", "frameless", ...) in the order it had them,
// kept so editing a caption never drops them; a new image gets "thumb". size ("250px", "upright=1.2")
// has its own box, so it is written after them.
function buildImageLine(image) {
var file = $.trim((image && image.file) || "");
if (!file) {
return "";
}
var extra = (image.extra && image.extra.length) ? image.extra : ["thumb"];
var size = $.trim(image.size || "");
var alt = $.trim(image.alt || "");
return "[[Wêne:" + file + "|" + extra.join("|") + (size ? "|" + size : "") +
(alt ? "|alt=" + alt : "") + "|" + $.trim(image.caption || "") + "]]";
}
var IMAGE_SIZE = /^\s*(?:\d+\s*px|x\s*\d+\s*px|\d+\s*x\s*\d+\s*px|upright(?:\s*=\s*[\d.]+)?)\s*$/i;
var IMAGE_KEYWORD = /^\s*(?:thumb|thumbnail|frame|framed|frameless|border|right|left|center|centre|none|baseline|middle|top|bottom)\s*$/i;
// The {file, caption, alt} behind one "[[Wêne:...|thumb|...]]" line, or null for anything else. The
// caption is the last parameter; "alt=" and the sizing/placement keywords are read off the ones before
// it, so a hand-written line with "|left|200px" still comes back editable.
//
// Split on top-level pipes only: a caption routinely holds "{{w|Riya Teze (rojname)|Riya Teze}}" or
// "[[kaxiz|kaxizên]]", and a plain split would take their pipes for the image's own.
function parseImageLine(line) {
var m = /^\[\[\s*(?:Wêne|File|Image|Dosya)\s*:([\s\S]*)\]\]$/i.exec($.trim(line || ""));
if (!m || !closesOnlyAtEnd(m[1])) {
return null;
}
var parts = splitTemplateParams(m[1]);
var file = $.trim(parts.shift());
if (!file) {
return null;
}
var alt = "";
var caption = "";
var size = "";
var extra = [];
$.each(parts, function (_, part) {
var altMatch = /^\s*alt\s*=\s*([\s\S]*)$/i.exec(part);
if (altMatch) {
alt = $.trim(altMatch[1]);
return;
}
if (IMAGE_SIZE.test(part)) {
size = $.trim(part);
return;
}
if (IMAGE_KEYWORD.test(part)) {
extra.push($.trim(part));
return;
}
caption = $.trim(part);
});
return { file: file, caption: caption, alt: alt, size: size, extra: extra };
}
// Whether a link's inner text never closes the link early: "a.jpg|x]] [[Wêne:b.jpg|y" would otherwise
// pass for one image holding the text of two.
function closesOnlyAtEnd(inner) {
var depth = 0;
for (var i = 0; i < inner.length; i++) {
var two = inner.substr(i, 2);
if (two === "[[") {
depth++;
i++;
} else if (two === "]]") {
depth--;
i++;
if (depth < 0) {
return false;
}
}
}
return depth === 0;
}
// A caption on a non-Kurdish entry is written in that language, so it is wrapped for the reader --
// unless whoever typed it already wrapped it themselves.
function captionForLang(caption, lang) {
var text = $.trim(caption || "");
if (!text || !lang || lang === "ku" || /^\{\{\s*zim\s*\|/i.test(text)) {
return text;
}
return "{{zim|" + lang + "|" + text + "}}";
}
// One "* {{dû|lang|kelîme|kelîme}}" line of a Dûnde list.
function buildDundeLine(lang, words) {
var kept = $.grep(words || [], function (w) { return !!$.trim(w); });
return kept.length ? "* {{dû|" + lang + "|" + $.map(kept, $.trim).join("|") + "}}" : "";
}
// Regex source for a "== {{ziman|CODE}} ==" heading; codePattern is a regex fragment. No leading
// newline: callers that want one prepend it, and callers that index into the page must not have it.
function langHeaderSource(codePattern) {
return "==\\s*\\{\\{\\s*ziman\\s*\\|\\s*(" + codePattern + ")\\s*\\}\\}\\s*==";
}
/**
* One TemplateData page in the shape the pickers actually want: the description, and one entry per
* documented parameter in the template's own paramOrder. Labels and descriptions can be language maps,
* so tdText picks the right one; null when the template has no TemplateData at all, which is common.
*
* Shaped once and kept, so the wizard's ⓘ popup, the citation form and DefSideBoxes' template dialog
* share one request and one copy per template.
*/
var shapedCache = {};
function shapeTemplateDoc(doc) {
if (!doc) {
return null;
}
var params = [];
(doc.paramOrder || Object.keys(doc.params || {})).forEach(function (key) {
var p = (doc.params || {})[key];
if (!p) {
return;
}
params.push({
key: key,
label: tdText(p.label) || "",
required: !!p.required,
deprecated: !!p.deprecated
});
});
return { desc: tdText(doc.description) || "", params: params };
}
function templateDoc(name) {
if (Object.prototype.hasOwnProperty.call(shapedCache, name)) {
return $.Deferred().resolve(shapedCache[name]).promise();
}
return fetchTemplateData(name).then(function (doc) {
shapedCache[name] = shapeTemplateDoc(doc);
return shapedCache[name];
});
}
// Many at once, so a picker full of rows costs one request. Resolves once every name is shaped and in
// the cache, which is what a caller that then reads templateDocNow() depends on.
function templateDocBatch(names) {
var wanted = $.grep(names || [], function (n) {
return n && !Object.prototype.hasOwnProperty.call(shapedCache, n);
});
if (!wanted.length) {
return $.Deferred().resolve().promise();
}
return fetchTemplateDataBatch(wanted).then(function () {
return $.when.apply($, wanted.map(function (n) {
return templateDoc(n);
}));
});
}
// What is already known, without asking: null for a template nobody has fetched yet. For drawing a
// list that must not wait, after templateDocBatch() has filled the cache.
function templateDocNow(name) {
return Object.prototype.hasOwnProperty.call(shapedCache, name) ? shapedCache[name] : null;
}
// ---- locating a section, and a definition inside it ----
//
// One copy, shared: DefSideBoxes and add-examples both write into a numbered sense of a numbered
// section, and both find it here.
// Start and end offsets of one language section within the page. Throws when the page has no such
// section, naming the code that was looked for.
function langSectionRange(pageContent, language) {
var langSectionIndex = pageContent.search(new RegExp(langHeaderSource(escapeRegExp(language))));
if (langSectionIndex === -1) {
// Quoted: a stray space or wrong case in the code is invisible otherwise.
throw new SubmitAbort("Xetayeke bi koda zimanî heye. Koda zimanî: " + JSON.stringify(language));
}
var afterLangHeading = pageContent.indexOf("\n", langSectionIndex);
afterLangHeading = afterLangHeading === -1 ? pageContent.length : afterLangHeading + 1;
var nextLangSectionMatch = /\n==[^=\n][^\n]*==/.exec(pageContent.slice(afterLangHeading));
return {
start: langSectionIndex,
end: nextLangSectionMatch ? afterLangHeading + nextLangSectionMatch.index : pageContent.length
};
}
/**
* The line index of one "=== ... ===" heading, and the lines to read it from.
*
* The heading is found by section key + ordinal, never by a DOM id number: MediaWiki's page-wide
* anchor uniquification can attach a number to a heading that has nothing to do with its position.
* The closing run is anchored to the opening one, or "=== Navdêra pirjimar ===" would count as a
* "Navdêr" here while sectionTypeOf() rejects it, and the two ordinals would drift apart.
*
* A part of speech is usually "===", but an entry that groups its senses under numbered etymologies
* writes it one level deeper ("=== Etîmolojî 1 ===" then "==== Lêker ===="). The depth is read off
* the heading rather than assumed, and comes back with it: a subsection of that section is one
* deeper again.
*
* lines covers the whole rest of the page from the language heading onward, not just this language's
* own section: callers rebuild the saved page out of it, and truncating here would drop every later
* language. Only the heading search itself is bounded, so a same-named heading in the next language
* can never be matched by mistake.
*/
function locateSection(pageContent, language, sectionType, sectionOrdinal) {
var headingNames = sections.headingNamesFor(sectionType);
if (!headingNames) {
throw new SubmitAbort("Navê beşê xelet e: " + JSON.stringify(sectionType));
}
var langRange = langSectionRange(pageContent, language);
var langSectionIndex = langRange.start;
var lines = pageContent.slice(langSectionIndex).split("\n");
var searchEndLine = pageContent.slice(langSectionIndex, langRange.end).split("\n").length;
// Every recognised heading name, so the ordinal counts headings of this kind and no others.
var namePattern = Object.keys(sections.sectionNames).concat([MANE_SECTION])
.map(escapeRegExp).join("|");
var headingRegex = new RegExp("^(={3,6})[ ]*(" + namePattern + ")\\s*(\\d+)?[ ]*\\1");
var posLineIndex;
var occurrence = 0;
var depth = 3;
for (posLineIndex = 0; posLineIndex < searchEndLine; posLineIndex++) {
var m = headingRegex.exec(lines[posLineIndex]);
var numbered = m ? 0 : numberedManeDepth(lines, posLineIndex);
var name = m ? m[2] : (numbered ? MANE_SECTION : null);
if (name && headingNames.indexOf(name) !== -1) {
occurrence++;
if (occurrence === sectionOrdinal) {
depth = m ? m[1].length : numbered;
break;
}
}
}
if (posLineIndex === searchEndLine) {
throw new SubmitAbort("Di navê beşê de xetayek heye. Mihtemelen çend beş bi vî navî hene.");
}
return { langSectionIndex: langSectionIndex, lines: lines, posLineIndex: posLineIndex, depth: depth };
}
// The "=" run for a heading depth, and a matcher for any heading at or above one (a smaller run is a
// bigger section, so "at or above" means "this deep or shallower").
function headingMarks(depth) {
return new Array(depth + 1).join("=");
}
function headingAtOrAbove(depth) {
return new RegExp("^={2," + depth + "}[^=]");
}
function headingAtDepth(depth) {
var marks = headingMarks(depth);
return new RegExp("^" + marks + "\\s*([^=]+?)\\s*" + marks + "\\s*$");
}
/**
* One heading found by its own text, and the lines around it.
*
* The section keys locateSection() knows cover the parts of speech; a heading like
* "=== Etîmolojî ===" that sits beside them rather than under one is matched by its own text
* instead, at any depth from "===" down. The ordinal counts headings carrying that same text within
* the language, which is what the DOM side counts too.
*
* bodyEnd is the next heading of any depth: a section's own text is what lies between its heading and
* the next one, so editing "=== Etîmolojî 1 ===" never reaches the parts of speech under it.
*/
function locateHeadingByText(pageContent, language, header, ordinal) {
var langRange = langSectionRange(pageContent, language);
var langSectionIndex = langRange.start;
var lines = pageContent.slice(langSectionIndex).split("\n");
var searchEndLine = pageContent.slice(langSectionIndex, langRange.end).split("\n").length;
var headingRegex = /^(={3,6})[ ]*(.+?)[ ]*\1\s*$/;
var nextHeading = headingAtOrAbove(6);
var occurrence = 0;
for (var i = 0; i < searchEndLine; i++) {
var m = headingRegex.exec(lines[i]);
if (!m || m[2] !== header) {
continue;
}
occurrence++;
if (occurrence !== (ordinal || 1)) {
continue;
}
var end = lines.length;
for (var j = i + 1; j < lines.length; j++) {
if (nextHeading.test(lines[j])) {
end = j;
break;
}
}
return {
langSectionIndex: langSectionIndex,
lines: lines,
headingLineIndex: i,
depth: m[1].length,
bodyStart: i + 1,
bodyEnd: end
};
}
throw new SubmitAbort(util.msg.sectionMissing + header);
}
/**
* The line index of one definition under a section heading.
*
* definitionLevel is the shape both gadgets already pass around: element 0 is the "type|ordinal"
* string locateSection() has resolved, and the rest are 0-based indices, one per nesting level, so
* ["Navdêr|1", 1, 0] is the first sub-sense of the second sense. Only "#" lines count -- "#:", "#*"
* and "##" belong to a sense rather than starting one.
*/
function findDefinitionLine(lines, posLineIndex, definitionLevel) {
var defIndex = -1;
var level = 1;
for (var i = posLineIndex; i < lines.length; i++) {
var m = /^(#+)[^*#:]/.exec(lines[i]);
if (m && m[1].length === level) {
defIndex++;
if (definitionLevel[level] === defIndex) {
if (level === definitionLevel.length - 1) {
return i;
}
level++;
defIndex = -1;
}
}
}
throw new SubmitAbort("Nikare rêza vê maneyê di metnê de bibîne.");
}
// Parameter names a headword template reads as another: Modul:rêziman declares "z" alias_of "c", so
// "z=m" and "c=m" are one gender. A numbered one maps the same way ("z2" is "c2").
var PARAM_ALIASES = { z: "c" };
function canonicalParamName(name) {
var trimmed = $.trim(name || "");
var m = /^([a-z]+)(\d*)$/i.exec(trimmed);
return m && Object.prototype.hasOwnProperty.call(PARAM_ALIASES, m[1])
? PARAM_ALIASES[m[1]] + m[2]
: trimmed;
}
// A named parameter of the first call in a line, read with the parser above rather than a pattern, so
// a "c=" inside a nested template is never taken for the call's own. Names match canonically, so
// asking for "c" also finds "z=". Empty when the line holds no closed call or the parameter is unset.
function callParamValue(text, name) {
var call = parseTemplateCalls($.trim(text || "")).calls[0];
if (!call) {
return "";
}
var values = splitCallParams(call.params).values;
var want = canonicalParamName(name);
var found = "";
Object.keys(values).forEach(function (key) {
if (!found && values[key] && canonicalParamName(key) === want) {
found = values[key];
}
});
return found;
}
module.exports = {
canonicalParamName: canonicalParamName,
callParamValue: callParamValue,
langHeaderSource: langHeaderSource,
langSectionRange: langSectionRange,
MANE_TAG_REGEX: MANE_TAG_REGEX,
locateSection: locateSection,
numberedGroupAbove: numberedGroupAbove,
locateHeadingByText: locateHeadingByText,
headingMarks: headingMarks,
headingAtOrAbove: headingAtOrAbove,
headingAtDepth: headingAtDepth,
findDefinitionLine: findDefinitionLine,
canonicalTemplateKey: canonicalTemplateKey,
aliasPattern: aliasPattern,
splitLeadingCalls: splitLeadingCalls,
splitTemplateParams: splitTemplateParams,
parseTemplateCalls: parseTemplateCalls,
splitCallParams: splitCallParams,
buildTemplateCall: buildTemplateCall,
buildHbnrCall: buildHbnrCall,
findHbnrCall: findHbnrCall,
buildImageLine: buildImageLine,
parseImageLine: parseImageLine,
captionForLang: captionForLang,
buildDundeLine: buildDundeLine,
tdText: tdText,
fetchTemplateData: fetchTemplateData,
templateDoc: templateDoc,
templateDocBatch: templateDocBatch,
templateDocNow: templateDocNow,
fetchTemplateDataBatch: fetchTemplateDataBatch,
shortDesc: shortDesc,
numberRepeatedPosHeadings: numberRepeatedPosHeadings,
parseWordListCall: parseWordListCall,
parseWordListCalls: parseWordListCalls,
namedParam: namedParam,
withNamedParam: withNamedParam,
buildWordListCall: buildWordListCall,
parseBulletWordList: parseBulletWordList
};
// </nowiki>
}());
92ug9k8y6u2czgpy61dhv68mtao7eni
MediaWiki:Gadget-wikt.edit/langs.js
8
1359160
6533063
6414254
2026-09-19T10:14:03Z
Wikihez
7344
Etymology: route {{etîmon}} to its own builder; keyword, modifier and metn= tables in data-main.json; language datalist moved to langs.js
6533063
javascript
text/javascript
// <nowiki>
/*
* Page: [[MediaWiki:Gadget-wikt.edit/langs.js]]
*/
// ~300 common languages ship with the gadget; the remaining ~3400 are fetched from the translation
// editor's copy only when a search finds nothing in the short list.
( function () {
"use strict";
var core = require( "./ziman-core.json" );
var FULL_PAGE = "MediaWiki:Gadget-translation editor.js/ziman.json";
var full = null;
var pending = null;
var listeners = [];
// {code: name} -- the full list once it has arrived, the short one until then.
function names() {
return full || core;
}
function isFull() {
return !!full;
}
// Resolves with the full list, fetched once; falls back to the short list rather than rejecting.
function ensureFull() {
if ( full ) {
return $.Deferred().resolve( full ).promise();
}
if ( pending ) {
return pending;
}
pending = $.get( {
url: mw.util.getUrl( FULL_PAGE, { action: "raw" } ),
dataType: "text"
} ).then( function ( text ) {
try {
full = $.extend( {}, core, JSON.parse( text ) );
} catch ( e ) {
full = core;
}
pending = null;
listeners.forEach( function ( fn ) {
fn( full );
} );
return full;
}, function () {
pending = null;
return core;
} );
return pending;
}
// True when the text names no language the short list knows -- the cue to go and fetch the rest.
function missingFromCore( query ) {
var wanted = $.trim( query || "" ).toLowerCase();
if ( !wanted || full ) {
return false;
}
var found = false;
Object.keys( core ).some( function ( code ) {
if ( code.toLowerCase().indexOf( wanted ) !== -1 ||
core[ code ].toLowerCase().indexOf( wanted ) !== -1 ) {
found = true;
return true;
}
return false;
} );
return !found;
}
// Called with the full list when it lands, so a picker built from the short one can rebuild itself.
function onFull( fn ) {
if ( full ) {
fn( full );
} else {
listeners.push( fn );
}
}
// One <datalist> for the whole page: 3693 options are far too many to rebuild per form, and a list
// can be shared by id, so every language box in every gadget points at this one.
var DATALIST_ID = "dsb-language-list";
function fillDatalist( $list ) {
var all = names();
$list.empty();
Object.keys( all ).forEach( function ( code ) {
$list.append( $( "<option></option>" ).val( code ).attr( "label", all[ code ] ) );
} );
}
function datalistId() {
if ( !document.getElementById( DATALIST_ID ) ) {
var $list = $( "<datalist></datalist>" ).attr( "id", DATALIST_ID );
fillDatalist( $list );
$( document.body ).append( $list );
// Refilled in place if the long list ever arrives, so every box using it grows at once.
onFull( function () {
fillDatalist( $( "#" + DATALIST_ID ) );
} );
}
return DATALIST_ID;
}
module.exports = {
names: names,
isFull: isFull,
ensureFull: ensureFull,
missingFromCore: missingFromCore,
onFull: onFull,
datalistId: datalistId
};
}() );
// </nowiki>
gz0t5o06ruekajg8el6j72y3uqg5eo5
MediaWiki:Gadget-wikt.edit/data-main.json
8
1359163
6533065
6426116
2026-09-19T10:14:14Z
Wikihez
7344
Etymology: route {{etîmon}} to its own builder; keyword, modifier and metn= tables in data-main.json; language datalist moved to langs.js
6533065
json
application/json
{
"langChoices": {
"ku": "kurmancî",
"zza": "zazakî",
"ckb": "soranî",
"sdh": "kurdiya başûrî",
"hac": "hewramî",
"de": "almanî",
"ar": "erebî",
"fa": "farisî",
"fr": "fransî",
"fi": "fînî",
"en": "îngilîzî",
"ja": "japonî",
"sv": "swêdî",
"tr": "tirkî"
},
"posExamples": {
"navdêr": "Kelîmeyên ji bo tiştan (sêv, heywan, qedeh) yan terman (dilşadî, bextiyarî hwd.) di rêzimanê de.",
"lêker": "Kelîmeyên ji bo kirin an bûyînê wekî 'nivîsîn' yan 'xeber dan'.",
"rengdêr": "Kelîmeyên ku wesfa navdêran nîşan didin wekî 'sêva sor' yan 'xwarina şîrîn'.",
"hoker": "Kelîmeyên ku dem, cih yan awayê kirinê diyar dikin wekî 'bi vî awayî' yan 'demkî'.",
"daçek": "Kelîmeyên ku cih, dem yan hereketê diyar dikin wekî 'di.. de' yan 'ji'.",
"cînav": "Kelîmeyên ku li şûna navdêran tên bikaranîn daku navdêr neyên dubarekirin wekî 'ew' yan 'em'.",
"baneşan": "Kelîmeyên ku hest, deng hwd. îfade dikin wekî 'noşî!' yan 'aferîn'.",
"serenav": "Navdêrên ku şexsiyetên ferdî nîşan didin, wek navên kes, cih an organîzasyonan nimûne 'London' yan 'Diyarbekir'.",
"gotineke pêşiyan": "Gotinên ku di nav xelkê de bi berbelavî tên bikaranîn bo nimûne 'Serê neêşe ne hewceyî destmalê ye'."
},
"genderLabels": {
"m": "mê",
"n": "nêr",
"nt": "nêtar",
"mn": "mê yan nêr",
"mnmane": "mê yan nêr li gorî maneyê",
"mndudil": "mê yan nêr bikaranîn dudil e",
"g": "giştî",
"y": "yekjimar",
"p": "pirjimar"
},
"tplDefs": {
"rastnivîs": {
"langs": [
"ku"
],
"noLang": true
},
"ku-Latn": {
"langs": [
"ku"
],
"noLang": true
},
"ku-tewîna-nav": {
"langs": [
"ku"
],
"noLang": true
},
"sdh-Arab": {
"langs": [
"sdh"
],
"noLang": true
},
"hac-Arab": {
"langs": [
"hac"
],
"noLang": true
},
"ja-romanîzekirin": {
"langs": [
"ja"
],
"noLang": true
},
"ckb-Arab": {
"langs": [
"ckb"
],
"noLang": true
},
"zza-awayê-Jacobsonê": {
"langs": [
"zza"
]
},
"awayekî din": {
"langs": null
},
"guharto": {
"langs": null
},
"hevmaneya": {
"langs": null
},
"kevnbûyî": {
"langs": null
},
"kêmpeyda": {
"langs": null
},
"kurtkirin": {
"langs": null
},
"paşnav": {
"langs": null
},
"şaşnivîs": {
"langs": null
}
},
"jederDefs": {
"jêder-kitêb": {
"label": "Kitêb",
"fields": [
{
"key": "nivîskar",
"label": "Nivîskar",
"span": 3
},
{
"key": "terciman",
"label": "Terciman",
"span": 3
},
{
"key": "amadekar",
"label": "Amadekar",
"span": 3
},
{
"key": "weşanxane",
"label": "Weşanxane",
"span": 3
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "beş",
"label": "Beş",
"span": 3,
"width": "medium"
},
{
"key": "cih",
"label": "Cih",
"span": 2,
"width": "narrow"
},
{
"key": "sal",
"label": "Sal",
"span": 1,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3,
"width": "medium"
},
{
"key": "sala-weşandinê",
"label": "Sala weşandinê",
"span": 2,
"width": "narrow"
},
{
"key": "çap",
"label": "Çap",
"span": 1,
"width": "narrow"
},
{
"key": "cild",
"label": "Cild",
"span": 2,
"width": "narrow"
},
{
"key": "rûpel",
"label": "Rûpel",
"span": 1,
"width": "narrow"
},
{
"key": "isbn",
"label": "ISBN",
"span": 2,
"width": "narrow"
},
{
"key": "url",
"label": "URL",
"span": 12,
"width": "wide"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
}
]
},
"jêder-kovar": {
"label": "Kovar",
"fields": [
{
"key": "nivîskar",
"label": "Nivîskar",
"span": 3
},
{
"key": "terciman",
"label": "Terciman",
"span": 3
},
{
"key": "amadekar",
"label": "Amadekar",
"span": 3
},
{
"key": "weşanxane",
"label": "Weşanxane",
"span": 3
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "kovar",
"label": "Kovar",
"span": 4
},
{
"key": "cild",
"label": "Cild",
"span": 2,
"width": "narrow"
},
{
"key": "hejmar",
"label": "Hejmar",
"span": 2,
"width": "narrow"
},
{
"key": "sal",
"label": "Sal",
"span": 2,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3,
"width": "medium"
},
{
"key": "rûpel",
"label": "Rûpel",
"span": 2,
"width": "narrow"
},
{
"key": "issn",
"label": "ISSN",
"span": 2,
"width": "narrow"
},
{
"key": "doi",
"label": "DOI",
"span": 2,
"width": "narrow"
},
{
"key": "url",
"label": "URL",
"span": 12,
"width": "wide"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
}
]
},
"jêder-websîte": {
"label": "Websîte",
"fields": [
{
"key": "nivîskar",
"label": "Nivîskar",
"span": 4
},
{
"key": "terciman",
"label": "Terciman",
"span": 4
},
{
"key": "websîte",
"label": "Websîte",
"span": 4
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "url",
"label": "URL",
"span": 5
},
{
"key": "urlya-arşîvê",
"label": "URLya Arşîvê",
"span": 5
},
{
"key": "roja-arşîvê",
"label": "Roja arşîvê",
"span": 3,
"width": "medium"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
},
{
"key": "sal",
"label": "Sal",
"span": 1,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3,
"width": "medium"
}
]
},
"jêder-vîdeo": {
"fields": [
{
"key": "hunermend",
"label": "Hunermend",
"span": 6
},
{
"key": "platform",
"label": "Platform",
"span": 6
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "sal",
"label": "Sal",
"span": 2,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3
},
{
"key": "dem",
"label": "Dem",
"span": 2,
"width": "narrow"
},
{
"key": "url",
"label": "URL",
"span": 12,
"width": "wide"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
}
],
"label": "Vîdeo"
}
},
"pronTpls": {
"ku-IPA": {
"desc": "IPAya otomatîk ji bo kurmancî (kontrol hewce ye)",
"snippet": "* {{ku-IPA}}",
"langs": [
"ku"
],
"noLang": true
},
"ku-kîte": {
"desc": "Hecekirina otomatîk ji bo kurmancî",
"snippet": "* {{ku-kîte}}",
"langs": [
"ku"
],
"noLang": true
},
"zza-IPA": {
"desc": "IPAya otomatîk ji bo zazakî",
"snippet": "* {{zza-IPA}}",
"langs": [
"zza"
],
"noLang": true
},
"zza-kîte": {
"desc": "Hecekirina otomatîk ji bo zazakî",
"snippet": "* {{zza-kîte}}",
"langs": [
"zza"
],
"noLang": true
},
"IPA": {
"desc": "Alfabeya fonetîk a navmiletî (IPA)",
"snippet": "* {{IPA|CODE|/…/}}"
},
"deng": {
"desc": "Nimûneya telafûzê bi dosyeya dengî",
"snippet": "* {{deng|CODE|navê_dosyayê.ogg|dever=}}"
},
"bilêv": {
"desc": "{{bilêv|herf|nerm, req|hejmar}}",
"snippet": "* {{bilêv|herf|cure|hejmar}}"
},
"kîte": {
"desc": "Şablona hecekirinê",
"snippet": "* {{kîte|CODE|he|ce}}"
},
"hevdeng": {
"desc": "Hevdeng — gotinên bi heman dengî",
"snippet": "* {{hevdeng|CODE|…}}"
}
},
"etymTpls": {
"etîmon": {
"desc": "Etîmolojiya birêkûpêk: zincîr, dar û kategorî — {{etîmon|ku|:deyn|fa:پنجه\u003Ct:dest\u003E|metn=++}}",
"snippet": "{{etîmon|CODE}}"
},
"ji": {
"desc": "Ji zimanekî din hatiye — {{ji|en|ku|anatomy|tr=|t=}}",
"snippet": "{{ji|SOURCELANG|CODE|…}}"
},
"deyn": {
"desc": "Deynkirî — {{deyn|lang|kod|kelîme}}",
"snippet": "{{deyn|SOURCELANG|CODE|…}}"
},
"mîr": {
"desc": "Mîrasmayî — {{mîr|lang|kod|kelîme}}",
"snippet": "{{mîr|SOURCELANG|CODE|…}}"
},
"qertaf": {
"desc": "Ji bo pêşgir, paşgir û hevedudanî — {{qertaf|kod|pêşgir-|reh}}",
"snippet": "{{qertaf|CODE|…|…}}"
},
"anlz": {
"desc": "Wekî qertaf lê dibêje analîza şiklî — {{anlz|kod|pêşgir-|reh}}",
"snippet": "{{anlz|CODE|…|…}}"
},
"q": {
"desc": "Referans bo rûpelekê — {{q|kod|kelîme}} navê zimanî dernakeve",
"snippet": "{{q|CODE|…}}"
},
"hv": {
"desc": "Hevreh — {{hv|lang|kelîme}} navê zimanî derdikeve",
"snippet": "{{hv|SOURCELANG|…}}"
},
"nh": {
"desc": "Nehevreh — {{nh|lang|kelîme}} navê zimanî derdikeve",
"snippet": "{{nh|SOURCELANG|…}}"
},
"cotreh": {
"desc": "Cotreh — teror {{cotreh|ku|tirs}}",
"snippet": "{{cotreh|CODE|…}}"
},
"yekser": {
"desc": "tercimeya yekser — {{yekser|lang|kod|kelîme}}",
"snippet": "{{yekser|SOURCELANG|CODE|…}}"
},
"wergirtin": {
"desc": "Wergirtina maneyê — {{wergirtin|lang|kod|kelîme}}",
"snippet": "{{wergirtin|SOURCELANG|CODE|…}}"
},
"paşvesazî": {
"desc": "Paşvesazî — greed {{paşvesazî|en|greedy}}",
"snippet": "{{paşvesazî|CODE|…}}"
},
"qusandin": {
"desc": "Qusandin — Miho {{qusandin|ku|Mihemmed}}",
"snippet": "{{qusandin|CODE|…}}"
},
"têkilkirin": {
"desc": "Têkilkirin — sormancî {{têkilkirin|ku|soranî|kurmancî}}",
"snippet": "{{têkilkirin|CODE|…}}"
},
"nyz": {
"desc": "Nayê zanîn — {{nyz|ku|hûr=1}}",
"snippet": "{{nyz|CODE}}"
},
"onom": {
"desc": "Onomatopoetîk — {{onom|ku|hûr=1}}",
"snippet": "{{onom|CODE}}"
},
"navmiletî": {
"desc": "Navmiletî — {{navmiletî|ku|hûr=1}}",
"snippet": "{{navmiletî|CODE}}"
},
"neo": {
"desc": "neolojîzm — {{neolojîzm|ku|hûr=1}}",
"snippet": "{{neolojîzm|CODE}}"
}
},
"etimon": {
"keywords": [
{
"key": "mîrasmayî",
"desc": "Kelîmeya ku ji zimanê bav û kalan maye",
"aliases": [
"mîr",
"inh"
]
},
{
"key": "deyn",
"desc": "Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin",
"aliases": [
"bor",
"borrowed"
]
},
{
"key": "deynh",
"desc": "Deynkirina hînbûyî: ne bi riya têkiliya rojane, bi qesd hatiye girtin",
"aliases": [
"lbor"
]
},
{
"key": "deynhq",
"desc": "Deynkirina hînbûyî ya ku hinekî hatiye guhertin",
"aliases": [
"slbor"
]
},
{
"key": "deynort",
"desc": "Deynkirina ortografîk",
"aliases": [
"obor"
]
},
{
"key": "deynne",
"desc": "Deynkirina neadaptekirî",
"aliases": [
"ubor"
]
},
{
"key": "dariştî",
"desc": "Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be",
"aliases": [
"drş",
"der"
]
},
{
"key": "ji",
"desc": "Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e",
"aliases": [
"from"
]
},
{
"key": "drşnd",
"desc": "Dariştin heye lê cureyê wê ne diyar e",
"aliases": [
"uder"
]
},
{
"key": "qertaf",
"desc": "Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e",
"aliases": [
"qf",
"af"
]
},
{
"key": "reh",
"desc": "Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e (\"Peyvên … yên aîdî rehê …\") û di metn û darê de xuya nabe",
"aliases": [
"root"
],
"invisible": true
},
{
"key": "yekser",
"desc": "Wergerandina yekser; zincîr li vir disekine",
"aliases": [
"cal",
"clq"
]
},
{
"key": "yekserqismî",
"desc": "Wergerandina yekser a qismî; zincîr li vir disekine",
"aliases": [
"yekserq",
"pcal"
]
},
{
"key": "wergirtin",
"desc": "Wergirtina maneyê; mana wergirtî bi \u003Cmaneid:…\u003E tê nîşankirin",
"aliases": [
"sl"
]
},
{
"key": "lihevanîn",
"desc": "Lihevanîna dengî-maneyî",
"aliases": [
"psm"
]
},
{
"key": "tesîr",
"desc": "Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine",
"aliases": [
"influence"
]
},
{
"key": "têkilkirin",
"desc": "Têkilkirina du kelîmeyan",
"aliases": [
"blend"
],
"min": 2
},
{
"key": "ûnîverbasyon",
"desc": "Ûnîverbasyon",
"aliases": [
"ûnîv",
"univ"
]
},
{
"key": "qusandin",
"desc": "Qusandin",
"aliases": [
"clip"
]
},
{
"key": "paşvesazî",
"desc": "Paşvesazî",
"aliases": [
"bf"
]
},
{
"key": "elîpsîz",
"desc": "Elîpsîz",
"aliases": [
"elîp",
"ellip"
]
},
{
"key": "nomînalîzasyon",
"desc": "Nomînalîzasyon",
"aliases": [
"nomîn",
"nom"
]
},
{
"key": "translîterasyon",
"desc": "Translîterasyon",
"aliases": [
"translît",
"translit"
]
},
{
"key": "redûblîkasyon",
"desc": "Redûblîkasyon",
"aliases": [
"redûb",
"redup"
]
},
{
"key": "kurtkirin",
"desc": "Kurtkirina kelîmeyekê",
"aliases": [
"abbr"
]
},
{
"key": "sylabbr",
"desc": "Kurtkirin li gorî kîteyan",
"aliases": [
"syllabic abbreviation",
"sylabbrev"
]
},
{
"key": "akronîm",
"desc": "Akronîm",
"aliases": [
"acro"
]
},
{
"key": "înîtîalîzm",
"desc": "Înîtîalîzm",
"aliases": [
"înît",
"init"
]
},
{
"key": "metatez",
"desc": "Metatez",
"aliases": [
"meta"
]
},
{
"key": "afeq",
"desc": "Wek :qf, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike",
"invisible": true
},
{
"key": "apheresis",
"desc": "Şiklê ku dengê destpêkê winda kiriye",
"aliases": [
"apheretic",
"aphetic"
]
},
{
"key": "denominal",
"desc": "Fiîla ji îsmekê çêbûyî",
"aliases": [
"denom"
]
},
{
"key": "deverbal",
"desc": "Kelîmeya ji fiîlekê çêbûyî"
},
{
"key": "vrd",
"desc": "Dariştina vṛddhî (sanskrîtî); bi qertaf: :vrd-af"
},
{
"key": "sa-af",
"desc": "Pêkhateya sanskrîtî",
"min": 2
}
],
"wordMods": [
{
"key": "t",
"desc": "Tercimeya kelîmeyê bi kurmancî",
"aliases": [
"w"
]
},
{
"key": "tr",
"desc": "Translîterasyon"
},
{
"key": "ts",
"desc": "Transkrîpsiyon"
},
{
"key": "cuda",
"desc": "Şiklê ku tê nîşandan, eger ne wek navê rûpelê be",
"aliases": [
"alt"
]
},
{
"key": "id",
"desc": "Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan"
},
{
"key": "crz",
"desc": "Cureyê rêzimanî yê kelîmeyê",
"aliases": [
"pos"
],
"values": [
"reh",
"kelîme",
"pêşgir",
"paşgir",
"navgir"
]
},
{
"key": "g",
"desc": "Cinsiyet: n (nêr), m (mê), nt (nêtar)",
"values": [
"n",
"m",
"nt"
]
},
{
"key": "q",
"desc": "Wesf li pêşiyê kelîmeyê"
},
{
"key": "qq",
"desc": "Wesf li pey kelîmeyê"
},
{
"key": "hrf",
"desc": "Mana herfiyen",
"aliases": [
"lit"
]
},
{
"key": "ref",
"desc": "Çavkanî; binêre #Çavkanî"
},
{
"key": "nediyar",
"desc": "Ev gav ne teqez e",
"flag": true,
"aliases": [
"unc"
]
},
{
"key": "crztip",
"desc": "Kelîme ji bo kategoriyan wek reh yan kelîme tê hesibandin",
"aliases": [
"postype"
],
"values": [
"reh",
"kelîme"
]
},
{
"key": "etimon",
"desc": "Etîmolojiya di cih de; binêre jor",
"aliases": [
"ety"
]
},
{
"key": "aftype",
"desc": "Di nav :qf de: cureyê qertafê; binêre #Cureyên qertafan",
"values": [
"pêşgir",
"paşgir",
"navgir",
"circumfix",
"infix",
"non-affix",
"root"
],
"only": [
"qertaf"
]
},
{
"key": "deyn",
"desc": "Di nav :qf de: ev parçe deynkirî ye",
"flag": true,
"only": [
"qertaf"
]
},
{
"key": "deynh",
"desc": "Di nav :qf de: ev parçe deynkirî ye",
"flag": true,
"only": [
"qertaf"
]
},
{
"key": "deynhq",
"desc": "Di nav :qf de: ev parçe deynkirî ye",
"flag": true,
"only": [
"qertaf"
]
}
],
"keywordMods": [
{
"key": "unc",
"desc": "Ev gav ne teqez e: \"Mihtemelen…\"",
"flag": true
},
{
"key": "grdk",
"desc": "Girêdeka di navbera kelîmeyên jêder de, li şûna \"yan jî\"",
"aliases": [
"conj"
]
},
{
"key": "anlz",
"desc": "Analîza şiklî",
"flag": true,
"aliases": [
"surf"
]
},
{
"key": "hrf",
"desc": "Di nav :qf de: mana herfiyen",
"aliases": [
"lit"
],
"only": [
"qertaf"
]
},
{
"key": "maneid",
"desc": "Di nav :wergirtin de: nasnameya maneya wergirtî",
"aliases": [
"senseid"
],
"only": [
"wergirtin"
]
},
{
"key": "metn",
"desc": "Di nav :ji û :drş de: metnekî din li şûna \"Ji\"",
"aliases": [
"text"
],
"only": [
"ji",
"dariştî"
]
},
{
"key": "ref",
"desc": "Çavkaniya vê gavê"
}
],
"metnChoices": [
{
"value": "++",
"desc": "Tevahiya zincîrê"
},
{
"value": "+",
"desc": "Tenê gava pêşîn"
},
{
"value": "*",
"desc": "Heta kelîmeya pêşîn a ku rûpela wê heye"
},
{
"value": "1",
"desc": "Ewqas gav (hejmarek)",
"free": true
},
{
"value": ":",
"desc": "Heta zimanê bi wê kodê (:kod)",
"free": true
},
{
"value": ":*",
"desc": "Heta wî zimanî, eger rûpela wî tune be heta ya pêşîn a heyî (:kod*)",
"free": true
}
],
"afTypes": [
{
"key": "pêşgir",
"desc": "Pêşgir"
},
{
"key": "paşgir",
"desc": "Paşgir"
},
{
"key": "navgir",
"desc": "Navgir"
},
{
"key": "circumfix",
"desc": "Dorgir"
},
{
"key": "infix",
"desc": "Nawgir (infix)"
},
{
"key": "non-affix",
"desc": "Ne qertaf"
},
{
"key": "root",
"desc": "Reh"
}
],
"params": [
{
"key": "dar",
"desc": "Bi 1 dara etîmolojiyê nîşan dide.",
"type": "flag",
"primary": true
},
{
"key": "id",
"desc": "Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan.",
"type": "text",
"primary": true
},
{
"key": "title",
"desc": "Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be.",
"type": "text"
},
{
"key": "crz",
"desc": "Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: reh, kelîme, pêşgir, paşgir, navgir.",
"type": "select",
"values": [
"reh",
"kelîme",
"pêşgir",
"paşgir",
"navgir"
]
},
{
"key": "cotreh",
"desc": "Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda.",
"type": "text"
},
{
"key": "tarîxa-etîm",
"desc": "Tarîxa peyitandina pêşîn, wek 1901, 1500s, 14c, c,1900, before,1850, r,1501,1558.",
"type": "text"
},
{
"key": "niqtena",
"desc": "Bi 1 niqteya dawiyê nayê zêdekirin.",
"type": "flag"
},
{
"key": "niqte",
"desc": "Li şûna niqteya dawiyê nîşaneke din.",
"type": "text"
},
{
"key": "katna",
"desc": "Bi 1 kategorî nayên zêdekirin. Herwiha {{para|nekat}}.",
"type": "flag"
},
{
"key": "darna",
"desc": "Bi 1 ev etîmolojî di dara rûpelên din de dernakeve.",
"type": "flag"
},
{
"key": "exnihilo",
"desc": "Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin.",
"type": "flag"
}
]
},
"metadata": {
"aa": {
"haswikt": 1,
"sc": [
"Latn",
"Ethi"
]
},
"ab": {
"haswikt": 1,
"sc": [
"Cyrl",
"Latn",
"Geor"
]
},
"aer": {
"sc": "Latn"
},
"af": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"ak": {
"haswikt": 1
},
"akk": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"sc": "Xsux"
},
"als": {
"haswikt": 1
},
"am": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1,
"sc": "Ethi"
},
"an": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"ang": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"ar": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"alt": 1,
"haswikt": 1,
"sc": "Arab"
},
"arc": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"sc": [
"Hebr",
"Syrc"
]
},
"are": {},
"arz": {
"alt": 1,
"g": [
"n",
"m",
"n-p",
"m-p"
],
"sc": "Arab"
},
"as": {
"haswikt": 1,
"sc": "Beng"
},
"ast": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"av": {
"haswikt": 1
},
"ay": {
"haswikt": 1
},
"az": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": [
"Latn",
"Cyrl",
"Arab"
]
},
"ba": {
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"bar": {},
"bat-smg": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"bbl": {
"sc": "Geor"
},
"be": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"be-x-old": {
"sc": "Cyrl"
},
"bg": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"bh": {
"haswikt": 1,
"sc": "Deva"
},
"bhb": {
"sc": "Deva"
},
"bi": {
"haswikt": 1
},
"blt": {
"sc": "Tavt"
},
"bm": {
"haswikt": 1,
"sc": [
"Latn",
"Nkoo",
"Arab"
]
},
"bn": {
"haswikt": 1,
"sc": "Beng"
},
"bo": {
"haswikt": 1,
"sc": "Tibt"
},
"br": {
"g": [
"n",
"m"
],
"haswikt": 1
},
"ca": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"cdo": {
"sc": "Hani"
},
"ce": {
"sc": "Cyrl"
},
"ch": {
"haswikt": 1
},
"chr": {
"haswikt": 1,
"sc": "Cher"
},
"cjy": {
"sc": "Hani"
},
"ckb": {
"haswikt": 1,
"sc": "Arab",
"wsc": "ku-Arab"
},
"cmn": {
"sc": "Hani",
"wiktprefix": "zh"
},
"co": {
"haswikt": 1
},
"cpx": {
"sc": "Hani"
},
"cr": {
"haswikt": 1,
"sc": "Cans"
},
"crh": {},
"cs": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"csb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"cu": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"sc": [
"Cyrs",
"Glag"
]
},
"cv": {
"sc": "Cyrl"
},
"cy": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"czh": {
"sc": "Hani"
},
"czo": {
"sc": "Hani"
},
"da": {
"g": [
"g",
"nt",
"g-p",
"nt-p",
"p"
],
"haswikt": 1
},
"dax": {},
"de": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1,
"allowCaps": 1
},
"dhg": {},
"djb": {},
"dji": {},
"djr": {},
"dng": {
"sc": "Cyrl"
},
"dsb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
]
},
"dsx": {},
"duj": {},
"dv": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Thaa"
},
"dz": {
"haswikt": 1,
"sc": "Tibt"
},
"el": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"en": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"eo": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"es": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"et": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"ett": {
"g": [
"y",
"p"
],
"sc": "Ital"
},
"eu": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"fa": {
"haswikt": 1,
"g": [
"y",
"p"
],
"sc": "Arab",
"wsc": "fa-Arab"
},
"fa-cls": {
"wiktprefix": "fa",
"sc": "Arab",
"wsc": "fa-Arab"
},
"fa-ira": {
"wiktprefix": "fa",
"sc": "Arab",
"wsc": "fa-Arab"
},
"fi": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"fil": {},
"fj": {
"haswikt": 1
},
"fo": {
"g": [
"n",
"m",
"nt"
],
"haswikt": 1
},
"fr": {
"g": [
"n",
"m",
"mnmane",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"frm": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"fro": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"fur": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"fy": {
"g": [
"g",
"nt",
"p"
],
"haswikt": 1
},
"ga": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"gan": {
"sc": "Hani"
},
"gd": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"gez": {
"sc": "Ethi"
},
"gl": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"gmw-ecg": {
"g": [
"n",
"m",
"nt",
"p"
],
"allowCaps": 1
},
"gmy": {
"sc": "Linb"
},
"gn": {
"haswikt": 1
},
"gnn": {
"sc": "Latn"
},
"got": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"sc": "Goth"
},
"grc": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
]
},
"gsw": {
"g": [
"n",
"m",
"nt",
"p"
],
"allowCaps": 1
},
"gu": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1,
"sc": "Gujr"
},
"guf": {
"sc": "Latn"
},
"gv": {
"haswikt": 1
},
"ha": {
"haswikt": 1
},
"hak": {
"sc": "Hani"
},
"har": {
"sc": "Ethi"
},
"he": {
"alt": 1,
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Hebr"
},
"hi": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Deva"
},
"hif": {
"sc": [
"Latn",
"Deva"
]
},
"hit": {
"sc": "Xsux"
},
"hrx": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"hsb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"hsn": {
"sc": "Hani"
},
"hu": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"hy": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Armn"
},
"ia": {
"haswikt": 1
},
"id": {
"haswikt": 1
},
"ie": {
"haswikt": 1
},
"ik": {
"haswikt": 1
},
"ike": {
"sc": "Cans"
},
"ikt": {
"sc": "Cans"
},
"io": {
"haswikt": 1
},
"is": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"it": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"iu": {
"haswikt": 1,
"sc": "Cans"
},
"ja": {
"haswikt": 1,
"sc": "Jpan"
},
"jay": {
"sc": "Latn"
},
"jbo": {
"haswikt": 1
},
"jv": {
"haswikt": 1
},
"ka": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"khb": {
"sc": [
"Talu",
"Lana",
"Thai"
]
},
"kjh": {
"sc": "Cyrl"
},
"kk": {
"haswikt": 1,
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"kkh": {
"sc": [
"Lana",
"Thai"
]
},
"kl": {
"haswikt": 1
},
"km": {
"haswikt": 1,
"sc": "Khmr"
},
"kn": {
"haswikt": 1,
"sc": "Knda"
},
"ku": {
"g": [
"n",
"m",
"mnmane",
"mndudil",
"n-p",
"m-p",
"p"
],
"wiktprefix": "ku"
},
"ko": {
"haswikt": 1,
"sc": "Kore"
},
"krc": {
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"ks": {
"haswikt": 1,
"sc": [
"Arab",
"Deva"
],
"wsc": "ks-Arab"
},
"kw": {
"haswikt": 1
},
"ky": {
"haswikt": 1,
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"la": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"lb": {
"g": [
"n",
"m",
"nt",
"p"
],
"haswikt": 1,
"allowCaps": 1
},
"lez": {
"sc": "Cyrl"
},
"li": {
"haswikt": 1
},
"lki": {
"wiktprefix": "ku"
},
"lld": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"lmo": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"ln": {
"haswikt": 1
},
"lo": {
"haswikt": 1,
"sc": "Laoo"
},
"lt": {
"alt": 1,
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"lv": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"lzz": {
"sc": "Geor"
},
"mg": {
"haswikt": 1
},
"mh": {
"haswikt": 1
},
"mi": {
"g": 0,
"haswikt": 1
},
"mk": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"ml": {
"haswikt": 1,
"sc": "Mlym"
},
"mn": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": [
"Cyrl",
"Mong"
]
},
"mnp": {
"sc": "Hani"
},
"mo": {
"haswikt": 1,
"sc": "Cyrl"
},
"mol": {
"sc": "Cyrl"
},
"mr": {
"g": [
"n",
"m",
"nt"
],
"haswikt": 1,
"sc": "Deva"
},
"ms": {
"haswikt": 1,
"sc": [
"Latn",
"Arab"
]
},
"mt": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"mwp": {
"sc": "Latn"
},
"my": {
"haswikt": 1,
"sc": "Mymr"
},
"na": {
"haswikt": 1
},
"nah": {
"haswikt": 1
},
"nan": {
"wiktprefix": "zh-min-nan",
"sc": "Hani"
},
"nb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"wiktprefix": "no"
},
"nds-de": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "nds"
},
"nds-nl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "nds"
},
"ne": {
"haswikt": 1,
"sc": "Deva"
},
"nl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1
},
"nn": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1
},
"no": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1
},
"nod": {
"sc": "Lana"
},
"non": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"oc": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"om": {
"haswikt": 1
},
"or": {
"haswikt": 1,
"sc": "Orya"
},
"orv": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"sc": "Cyrs"
},
"osc": {
"sc": "Ital"
},
"ota": {
"g": [
"y",
"p"
],
"sc": "Arab",
"wsc": "ota-Arab"
},
"pa": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": [
"Guru",
"Arab"
]
},
"pdt": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "nds"
},
"peo": {
"sc": "Xpeo"
},
"phn": {
"sc": "Phnx"
},
"pi": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"pjt": {
"sc": "Latn"
},
"pl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"pms": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"pox": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"împf",
"pf"
]
},
"prs": {
"wiktprefix": "fa",
"sc": "Arab",
"wsc": "fa-Arab"
},
"ps": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Arab",
"wsc": "ps-Arab"
},
"pt": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"qu": {
"haswikt": 1
},
"rgn": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"rit": {
"sc": "Latn"
},
"rm": {
"g": [
"n",
"m"
],
"haswikt": 1
},
"rn": {
"haswikt": 1
},
"ro": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1,
"sc": [
"Latn",
"Cyrl"
]
},
"roa-rup": {
"haswikt": 1
},
"ru": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"rue": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"sc": "Cyrl"
},
"ruo": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"rup": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "roa-rup"
},
"ruq": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"rw": {
"haswikt": 1
},
"sa": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1,
"sc": "Deva"
},
"sah": {
"sc": "Cyrl"
},
"sc": {
"haswikt": 1
},
"scn": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"sco": {
"sc": "Latn"
},
"sd": {
"haswikt": 1,
"sc": "Arab",
"wsc": "sd-Arab"
},
"sdh": {
"sc": "Arab",
"wiktprefix": "ku"
},
"sg": {
"haswikt": 1
},
"sh": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": [
"Latn",
"Cyrl"
]
},
"si": {
"haswikt": 1,
"sc": "Sinh"
},
"simple": {
"haswikt": 1
},
"sk": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"sl": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"sm": {
"haswikt": 1
},
"sn": {
"haswikt": 1
},
"so": {
"haswikt": 1
},
"spx": {
"sc": "Ital"
},
"sq": {
"g": [
"n",
"m"
],
"haswikt": 1
},
"ss": {
"haswikt": 1
},
"st": {
"haswikt": 1
},
"su": {
"haswikt": 1
},
"sux": {
"sc": "Xsux"
},
"sv": {
"g": [
"g",
"nt",
"g-p",
"nt-p"
],
"haswikt": 1
},
"sva": {
"sc": "Geor"
},
"sw": {
"nclass": 1,
"haswikt": 1
},
"syc": {
"sc": "Syrc"
},
"syr": {
"sc": "Syrc"
},
"szl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
]
},
"ta": {
"haswikt": 1,
"sc": "Taml"
},
"tdd": {
"sc": "Tale"
},
"te": {
"haswikt": 1,
"sc": "Telu"
},
"tg": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Cyrl"
},
"th": {
"haswikt": 1,
"sc": "Thai"
},
"ti": {
"haswikt": 1,
"sc": "Ethi"
},
"tig": {
"sc": "Ethi"
},
"tiw": {
"sc": "Latn"
},
"tk": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"tl": {
"haswikt": 1,
"sc": [
"Latn",
"Tglg"
]
},
"tmr": {
"sc": "Hebr"
},
"tn": {
"haswikt": 1
},
"to": {
"haswikt": 1
},
"tpi": {
"haswikt": 1
},
"tr": {
"g": [
"y",
"p"
],
"alt": 1,
"haswikt": 1
},
"ts": {
"haswikt": 1
},
"tt": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"tts": {
"sc": "Thai"
},
"tw": {
"haswikt": 1
},
"udi": {
"sc": [
"Cyrl",
"Latn",
"Armn",
"Geor"
]
},
"ug": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Arab",
"wsc": "ug-Arab"
},
"uga": {
"sc": "Ugar"
},
"uk": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"ulk": {
"sc": "Latn"
},
"ur": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Arab",
"wsc": "ur-Arab"
},
"uz": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"vec": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"vi": {
"haswikt": 1
},
"vls": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"vo": {
"haswikt": 1
},
"wa": {
"haswikt": 1
},
"wbp": {
"sc": "Latn"
},
"wo": {
"haswikt": 1
},
"wuu": {
"sc": "Hani"
},
"xae": {
"sc": "Ital"
},
"xcr": {
"sc": "Cari"
},
"xfa": {
"sc": "Ital"
},
"xh": {
"alt": 1,
"nclass": 1,
"haswikt": 1
},
"xlc": {
"sc": "Lyci"
},
"xld": {
"sc": "Lydi"
},
"xlu": {
"sc": "Xsux"
},
"xmf": {
"sc": "Geor"
},
"xno": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"xrr": {
"sc": "Ital"
},
"xst": {
"sc": "Ethi"
},
"xum": {
"sc": "Ital"
},
"xve": {
"sc": "Ital"
},
"xvo": {
"sc": "Ital"
},
"yi": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1,
"sc": "Hebr"
},
"yo": {
"haswikt": 1
},
"yua": {
"g": [
"y",
"p"
],
"alt": 1
},
"yue": {
"sc": "Hani"
},
"za": {
"haswikt": 1,
"sc": "Latn"
},
"zh-classical": {
"sc": "Hani"
},
"zh-min-nan": {
"haswikt": 1
},
"zh-yue": {
"sc": "Hani"
},
"zu": {
"alt": 1,
"nclass": 1,
"haswikt": 1
},
"zza": {
"g": [
"n",
"m",
"mn",
"n-p",
"m-p",
"p"
],
"wiktprefix": "diq"
}
},
"numberLabels": {
"y": {
"display": "yekjimar"
},
"d": {
"display": "hejmar dual"
},
"p": {
"display": "pirjimar"
},
"p+": {
"display": "axlebî pirjimar"
},
"tp": {
"display": "tenê pirjimar"
},
"j": {
"display": "jimarbar"
},
"j+": {
"display": "axlebî jimarbar"
},
"j/nj": {
"display": "jimarbar û nejimarbar"
},
"nj": {
"display": "nejimarbar"
},
"nj+": {
"display": "axlebî nejimarbar"
},
"hj!": {
"display": "hejmar nepeyitandî ye"
},
"hj?": {
"display": "hejmar hewce ye"
}
},
"leadingTplOrder": [
"maneid",
"K",
"e"
],
"lekturChoices": [
{
"code": "gh",
"label": "gerguhêz (îsmî mefûl digire)"
},
{
"code": "ngh",
"label": "negerguhêz (îsmî mefûl nagire)"
}
],
"lekturFormChoices": [
{
"code": "x",
"label": "xwerû"
},
{
"code": "p",
"label": "pêkhatî"
},
{
"code": "h",
"label": "hevedudanî"
}
],
"deverQuickPicks": [
"kurmanciya rojavayî",
"kurmanciya merkezî",
"kurmanciya rojhilatî",
"Badînî",
"Botî",
"Serhedî",
"Bakur",
"Amed",
"Riha"
],
"maneTags": [
"cure?",
"rêziman?",
"kat-rêziman",
"kategoriya rêzimanê?",
"bêcure"
],
"senseGroups": [
{
"key": "alt-r",
"label": "Formên alternatîv",
"field": "alternativ",
"order": 3,
"hint": "Varyantên vê kelîmeyê"
},
{
"key": "hevmane",
"label": "Hevmane",
"field": "hevmane",
"order": 1,
"hint": "Spehî hevmaneya Bedew e."
},
{
"key": "dijmane",
"label": "Dijmane",
"field": "dijmane",
"order": 2,
"hint": "Zengîn dijmaneya feqîr e."
},
{
"key": "koordîne",
"label": "Termên koordîne",
"field": "koordine",
"order": 4,
"hint": "Pisîk û kûçik termên koordîne ne çunkî Jornavên wan gelek in"
},
{
"key": "jornav",
"label": "Jornav",
"field": "jornav",
"order": 5,
"hint": "Heywan jornavê guhandar e"
},
{
"key": "jêrnav",
"label": "Jêrnav",
"field": "jernav",
"order": 6,
"hint": "Guhandar jêrnavê heywan e"
}
],
"subsectionOrder": [
"Bilêvkirin",
"Ji wêjeya klasîk",
"Ji wêjeyê",
"Tewandin",
"Notên bikaranînê",
"Bi alfabeyên din",
"Formên alternatîv",
"Kurtkirin",
"Sembol",
"Navê zanistî",
"Hevmane",
"Nêzîk",
"Dijmane",
"Jornav",
"Jêrnav",
"Jê",
"Têkildar",
"Etîmolojî",
"Dûnde",
"Bide ber",
"Herwiha binêre",
"Bêhtir bixwîne",
"Bi zaravayên din",
"Werger",
"Qafiye",
"Anagram",
"Çavkanî"
],
"templateAliases": {
"K": [
"K",
"kategorîzebike",
"mijar"
],
"alt-r": [
"alt-r",
"forma alt di rêzê de",
"herwiha-rêz",
"herwiha di rêza maneyê de"
],
"dijmane": [
"dijmane",
"dijwate",
"dijmaneyên peyvê"
],
"e": [
"e",
"etîket",
"f",
"lb"
],
"g": [
"g",
"girêdan",
"l",
"link"
],
"hevmane": [
"hevmane",
"hevwate",
"hevmaneya peyvê",
"hevmaneyên peyvê",
"synonyms"
],
"jornav": [
"jornav",
"hîpernîm"
],
"jêrnav": [
"jêrnav",
"hîponîm"
],
"koordîne": [
"koordîne",
"termên koordîne",
"peyvên koordîneyî"
],
"mane?": [
"mane?",
"wate?",
"bêmane",
"bêwate"
],
"maneid": [
"maneid",
"senseid"
],
"h-bnr": [
"h-bnr",
"bnr-h",
"bnr h",
"bnr-hrw",
"bnr herwiha",
"herwiha binêre",
"binêre herwiha"
]
},
"wordlistTemplates": [
"kol3",
"kol2",
"kol",
"col3",
"col2",
"col"
],
"templateParams": {
"deyn": {
"order": [
"1",
"2",
"3",
"4",
"5",
"tr",
"ts",
"sc",
"id"
],
"labels": {
"1": "Zimanê jêder",
"2": "Zimanê wergir",
"3": "Kelîme",
"4": "Xuyakirina alternatîv",
"5": "Maneya kelîmeyê",
"tr": "Transliterasyon",
"ts": "Transkîpsiyon",
"sc": "Koda skrîptê",
"id": "IDya maneyê"
}
},
"hv": {
"order": [
"1",
"2",
"3",
"4",
"tr",
"ts",
"sc"
],
"labels": {
"1": "Koda zimanî",
"2": "Kelîme",
"3": "Xuyakirina alternatîv",
"4": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"sc": "Koda skrîptê"
}
},
"ji": {
"order": [
"1",
"2",
"3",
"4",
"5",
"tr",
"ts",
"id",
"sc"
],
"labels": {
"1": "Zimanê jêder",
"2": "Zimanê wergir",
"3": "Kelîme",
"4": "Xuyakirina alternatîv",
"5": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"id": "IDya maneyê",
"sc": "Koda skrîptê"
}
},
"jêder-kitêb": {
"order": [
"1",
"jêgirtin",
"sc",
"tr",
"t",
"nivîskar",
"nivîskar2",
"nivîskar3",
"amadekar",
"terciman",
"sernav",
"url",
"weşanxane",
"cih",
"cild",
"sal",
"sala-weşandinê",
"çap",
"rûpel",
"isbn",
"nekat",
"nivîskar4",
"nivîskar5",
"issn",
"oclc",
"serî",
"doi"
],
"labels": {
"1": "koda zimanî",
"sc": "koda skrîptê eger hewce be",
"tr": "translîterasyon",
"t": "tercime",
"rûpel": "rûpel"
}
},
"jêder-kovar": {
"order": [
"1",
"jêgirtin",
"sc",
"tr",
"werger",
"kovar",
"sernav",
"wergêr",
"nivîskar",
"nivîskar2",
"url",
"weşanxane",
"cîld",
"hejmar",
"sal",
"tarîx",
"rûpel"
],
"labels": {
"1": "Koda zimanî",
"sc": "Koda skrîptê",
"tr": "Translîterasyon",
"werger": "Tercimeya kurmancî ya jêgirtinê"
}
},
"jêder-vîdeo": {
"order": [
"1",
"title",
"year",
"date",
"author",
"authorlink",
"actor",
"role",
"time",
"at",
"medium",
"network",
"text",
"translation",
"season",
"number",
"episode",
"publisher",
"url",
"director",
"brackets"
],
"labels": {
"1": "Language",
"title": "Title",
"year": "Year of release",
"date": "Date of release",
"author": "Writer (screenplay)",
"authorlink": "Wikipedia author page",
"actor": "Actor (speaker)",
"role": "Role",
"time": "Timecode",
"at": "Context",
"medium": "Recording medium",
"network": "Network",
"text": "Quoted line",
"translation": "Translation",
"season": "Season number (series)",
"number": "Episode number (series)",
"episode": "Episode title (series)",
"publisher": "Publisher",
"url": "URL",
"director": "Director",
"brackets": "Brackets"
}
},
"jêder-websîte": {
"order": [
"1",
"jêgirtin",
"sc",
"tr",
"t",
"nivîskar",
"terciman",
"sernav",
"url",
"urlya-arşîvê",
"websîte",
"tarîx",
"sal"
],
"labels": {
"1": "Koda zimanî",
"sc": "Koda skrîptê ya jêgirtinê",
"tr": "Translîterasyona jêgirtinê",
"t": "Tercimeya kurmancî ya jêgirtinê"
}
},
"mîr": {
"order": [
"1",
"2",
"3",
"4",
"5",
"tr",
"ts",
"id",
"sc"
],
"labels": {
"1": "Zimanê jêder",
"2": "Zimanê wergir",
"3": "Kelîme",
"4": "Xuyakirina alternatîv",
"5": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"id": "IDya maneyê",
"sc": "Koda skrîptê"
}
},
"nh": {
"order": [
"1",
"2",
"3",
"4",
"tr",
"ts",
"sc"
],
"labels": {
"1": "Koda zimanî",
"2": "Kelîme",
"3": "Xuyakirina alternatîv",
"4": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"sc": "Koda skrîptê"
}
},
"qertaf": {
"order": [
"1",
"2",
"3",
"sc",
"cuda1",
"cuda2",
"t1",
"t2",
"tr1",
"tr2"
],
"labels": {
"1": "language code",
"2": "first part",
"3": "second part",
"sc": "script code",
"cuda1": "first part alternate text",
"cuda2": "second part alternate text",
"w1": "first gloss",
"w2": "second gloss",
"tr1": "first part transliteration",
"tr2": "second part transliteration"
}
},
"yekser": {
"order": [
"1",
"2",
"3",
"hûr",
"nekat"
]
}
}
}
j4njrkz0my1aquhha40j6bfgz54a320
6533230
6533065
2026-09-19T10:40:20Z
Wikihez
7344
Etymology: gender is c in the builder, with z and g as aliases
6533230
json
application/json
{
"langChoices": {
"ku": "kurmancî",
"zza": "zazakî",
"ckb": "soranî",
"sdh": "kurdiya başûrî",
"hac": "hewramî",
"de": "almanî",
"ar": "erebî",
"fa": "farisî",
"fr": "fransî",
"fi": "fînî",
"en": "îngilîzî",
"ja": "japonî",
"sv": "swêdî",
"tr": "tirkî"
},
"posExamples": {
"navdêr": "Kelîmeyên ji bo tiştan (sêv, heywan, qedeh) yan terman (dilşadî, bextiyarî hwd.) di rêzimanê de.",
"lêker": "Kelîmeyên ji bo kirin an bûyînê wekî 'nivîsîn' yan 'xeber dan'.",
"rengdêr": "Kelîmeyên ku wesfa navdêran nîşan didin wekî 'sêva sor' yan 'xwarina şîrîn'.",
"hoker": "Kelîmeyên ku dem, cih yan awayê kirinê diyar dikin wekî 'bi vî awayî' yan 'demkî'.",
"daçek": "Kelîmeyên ku cih, dem yan hereketê diyar dikin wekî 'di.. de' yan 'ji'.",
"cînav": "Kelîmeyên ku li şûna navdêran tên bikaranîn daku navdêr neyên dubarekirin wekî 'ew' yan 'em'.",
"baneşan": "Kelîmeyên ku hest, deng hwd. îfade dikin wekî 'noşî!' yan 'aferîn'.",
"serenav": "Navdêrên ku şexsiyetên ferdî nîşan didin, wek navên kes, cih an organîzasyonan nimûne 'London' yan 'Diyarbekir'.",
"gotineke pêşiyan": "Gotinên ku di nav xelkê de bi berbelavî tên bikaranîn bo nimûne 'Serê neêşe ne hewceyî destmalê ye'."
},
"genderLabels": {
"m": "mê",
"n": "nêr",
"nt": "nêtar",
"mn": "mê yan nêr",
"mnmane": "mê yan nêr li gorî maneyê",
"mndudil": "mê yan nêr bikaranîn dudil e",
"g": "giştî",
"y": "yekjimar",
"p": "pirjimar"
},
"tplDefs": {
"rastnivîs": {
"langs": [
"ku"
],
"noLang": true
},
"ku-Latn": {
"langs": [
"ku"
],
"noLang": true
},
"ku-tewîna-nav": {
"langs": [
"ku"
],
"noLang": true
},
"sdh-Arab": {
"langs": [
"sdh"
],
"noLang": true
},
"hac-Arab": {
"langs": [
"hac"
],
"noLang": true
},
"ja-romanîzekirin": {
"langs": [
"ja"
],
"noLang": true
},
"ckb-Arab": {
"langs": [
"ckb"
],
"noLang": true
},
"zza-awayê-Jacobsonê": {
"langs": [
"zza"
]
},
"awayekî din": {
"langs": null
},
"guharto": {
"langs": null
},
"hevmaneya": {
"langs": null
},
"kevnbûyî": {
"langs": null
},
"kêmpeyda": {
"langs": null
},
"kurtkirin": {
"langs": null
},
"paşnav": {
"langs": null
},
"şaşnivîs": {
"langs": null
}
},
"jederDefs": {
"jêder-kitêb": {
"label": "Kitêb",
"fields": [
{
"key": "nivîskar",
"label": "Nivîskar",
"span": 3
},
{
"key": "terciman",
"label": "Terciman",
"span": 3
},
{
"key": "amadekar",
"label": "Amadekar",
"span": 3
},
{
"key": "weşanxane",
"label": "Weşanxane",
"span": 3
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "beş",
"label": "Beş",
"span": 3,
"width": "medium"
},
{
"key": "cih",
"label": "Cih",
"span": 2,
"width": "narrow"
},
{
"key": "sal",
"label": "Sal",
"span": 1,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3,
"width": "medium"
},
{
"key": "sala-weşandinê",
"label": "Sala weşandinê",
"span": 2,
"width": "narrow"
},
{
"key": "çap",
"label": "Çap",
"span": 1,
"width": "narrow"
},
{
"key": "cild",
"label": "Cild",
"span": 2,
"width": "narrow"
},
{
"key": "rûpel",
"label": "Rûpel",
"span": 1,
"width": "narrow"
},
{
"key": "isbn",
"label": "ISBN",
"span": 2,
"width": "narrow"
},
{
"key": "url",
"label": "URL",
"span": 12,
"width": "wide"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
}
]
},
"jêder-kovar": {
"label": "Kovar",
"fields": [
{
"key": "nivîskar",
"label": "Nivîskar",
"span": 3
},
{
"key": "terciman",
"label": "Terciman",
"span": 3
},
{
"key": "amadekar",
"label": "Amadekar",
"span": 3
},
{
"key": "weşanxane",
"label": "Weşanxane",
"span": 3
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "kovar",
"label": "Kovar",
"span": 4
},
{
"key": "cild",
"label": "Cild",
"span": 2,
"width": "narrow"
},
{
"key": "hejmar",
"label": "Hejmar",
"span": 2,
"width": "narrow"
},
{
"key": "sal",
"label": "Sal",
"span": 2,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3,
"width": "medium"
},
{
"key": "rûpel",
"label": "Rûpel",
"span": 2,
"width": "narrow"
},
{
"key": "issn",
"label": "ISSN",
"span": 2,
"width": "narrow"
},
{
"key": "doi",
"label": "DOI",
"span": 2,
"width": "narrow"
},
{
"key": "url",
"label": "URL",
"span": 12,
"width": "wide"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
}
]
},
"jêder-websîte": {
"label": "Websîte",
"fields": [
{
"key": "nivîskar",
"label": "Nivîskar",
"span": 4
},
{
"key": "terciman",
"label": "Terciman",
"span": 4
},
{
"key": "websîte",
"label": "Websîte",
"span": 4
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "url",
"label": "URL",
"span": 5
},
{
"key": "urlya-arşîvê",
"label": "URLya Arşîvê",
"span": 5
},
{
"key": "roja-arşîvê",
"label": "Roja arşîvê",
"span": 3,
"width": "medium"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
},
{
"key": "sal",
"label": "Sal",
"span": 1,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3,
"width": "medium"
}
]
},
"jêder-vîdeo": {
"fields": [
{
"key": "hunermend",
"label": "Hunermend",
"span": 6
},
{
"key": "platform",
"label": "Platform",
"span": 6
},
{
"key": "sernav",
"label": "Sernav",
"multiline": true,
"span": 12,
"width": "wide"
},
{
"key": "sal",
"label": "Sal",
"span": 2,
"width": "narrow"
},
{
"key": "tarîx",
"label": "Tarîx",
"span": 3
},
{
"key": "dem",
"label": "Dem",
"span": 2,
"width": "narrow"
},
{
"key": "url",
"label": "URL",
"span": 12,
"width": "wide"
},
{
"key": "tarîxa-gihiştinê",
"label": "Tarîxa gihiştinê",
"span": 3,
"width": "medium"
}
],
"label": "Vîdeo"
}
},
"pronTpls": {
"ku-IPA": {
"desc": "IPAya otomatîk ji bo kurmancî (kontrol hewce ye)",
"snippet": "* {{ku-IPA}}",
"langs": [
"ku"
],
"noLang": true
},
"ku-kîte": {
"desc": "Hecekirina otomatîk ji bo kurmancî",
"snippet": "* {{ku-kîte}}",
"langs": [
"ku"
],
"noLang": true
},
"zza-IPA": {
"desc": "IPAya otomatîk ji bo zazakî",
"snippet": "* {{zza-IPA}}",
"langs": [
"zza"
],
"noLang": true
},
"zza-kîte": {
"desc": "Hecekirina otomatîk ji bo zazakî",
"snippet": "* {{zza-kîte}}",
"langs": [
"zza"
],
"noLang": true
},
"IPA": {
"desc": "Alfabeya fonetîk a navmiletî (IPA)",
"snippet": "* {{IPA|CODE|/…/}}"
},
"deng": {
"desc": "Nimûneya telafûzê bi dosyeya dengî",
"snippet": "* {{deng|CODE|navê_dosyayê.ogg|dever=}}"
},
"bilêv": {
"desc": "{{bilêv|herf|nerm, req|hejmar}}",
"snippet": "* {{bilêv|herf|cure|hejmar}}"
},
"kîte": {
"desc": "Şablona hecekirinê",
"snippet": "* {{kîte|CODE|he|ce}}"
},
"hevdeng": {
"desc": "Hevdeng — gotinên bi heman dengî",
"snippet": "* {{hevdeng|CODE|…}}"
}
},
"etymTpls": {
"etîmon": {
"desc": "Etîmolojiya birêkûpêk: zincîr, dar û kategorî — {{etîmon|ku|:deyn|fa:پنجه\u003Ct:dest\u003E|metn=++}}",
"snippet": "{{etîmon|CODE}}"
},
"ji": {
"desc": "Ji zimanekî din hatiye — {{ji|en|ku|anatomy|tr=|t=}}",
"snippet": "{{ji|SOURCELANG|CODE|…}}"
},
"deyn": {
"desc": "Deynkirî — {{deyn|lang|kod|kelîme}}",
"snippet": "{{deyn|SOURCELANG|CODE|…}}"
},
"mîr": {
"desc": "Mîrasmayî — {{mîr|lang|kod|kelîme}}",
"snippet": "{{mîr|SOURCELANG|CODE|…}}"
},
"qertaf": {
"desc": "Ji bo pêşgir, paşgir û hevedudanî — {{qertaf|kod|pêşgir-|reh}}",
"snippet": "{{qertaf|CODE|…|…}}"
},
"anlz": {
"desc": "Wekî qertaf lê dibêje analîza şiklî — {{anlz|kod|pêşgir-|reh}}",
"snippet": "{{anlz|CODE|…|…}}"
},
"q": {
"desc": "Referans bo rûpelekê — {{q|kod|kelîme}} navê zimanî dernakeve",
"snippet": "{{q|CODE|…}}"
},
"hv": {
"desc": "Hevreh — {{hv|lang|kelîme}} navê zimanî derdikeve",
"snippet": "{{hv|SOURCELANG|…}}"
},
"nh": {
"desc": "Nehevreh — {{nh|lang|kelîme}} navê zimanî derdikeve",
"snippet": "{{nh|SOURCELANG|…}}"
},
"cotreh": {
"desc": "Cotreh — teror {{cotreh|ku|tirs}}",
"snippet": "{{cotreh|CODE|…}}"
},
"yekser": {
"desc": "tercimeya yekser — {{yekser|lang|kod|kelîme}}",
"snippet": "{{yekser|SOURCELANG|CODE|…}}"
},
"wergirtin": {
"desc": "Wergirtina maneyê — {{wergirtin|lang|kod|kelîme}}",
"snippet": "{{wergirtin|SOURCELANG|CODE|…}}"
},
"paşvesazî": {
"desc": "Paşvesazî — greed {{paşvesazî|en|greedy}}",
"snippet": "{{paşvesazî|CODE|…}}"
},
"qusandin": {
"desc": "Qusandin — Miho {{qusandin|ku|Mihemmed}}",
"snippet": "{{qusandin|CODE|…}}"
},
"têkilkirin": {
"desc": "Têkilkirin — sormancî {{têkilkirin|ku|soranî|kurmancî}}",
"snippet": "{{têkilkirin|CODE|…}}"
},
"nyz": {
"desc": "Nayê zanîn — {{nyz|ku|hûr=1}}",
"snippet": "{{nyz|CODE}}"
},
"onom": {
"desc": "Onomatopoetîk — {{onom|ku|hûr=1}}",
"snippet": "{{onom|CODE}}"
},
"navmiletî": {
"desc": "Navmiletî — {{navmiletî|ku|hûr=1}}",
"snippet": "{{navmiletî|CODE}}"
},
"neo": {
"desc": "neolojîzm — {{neolojîzm|ku|hûr=1}}",
"snippet": "{{neolojîzm|CODE}}"
}
},
"etimon": {
"keywords": [
{
"key": "mîrasmayî",
"desc": "Kelîmeya ku ji zimanê bav û kalan maye",
"aliases": [
"mîr",
"inh"
]
},
{
"key": "deyn",
"desc": "Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin",
"aliases": [
"bor",
"borrowed"
]
},
{
"key": "deynh",
"desc": "Deynkirina hînbûyî: ne bi riya têkiliya rojane, bi qesd hatiye girtin",
"aliases": [
"lbor"
]
},
{
"key": "deynhq",
"desc": "Deynkirina hînbûyî ya ku hinekî hatiye guhertin",
"aliases": [
"slbor"
]
},
{
"key": "deynort",
"desc": "Deynkirina ortografîk",
"aliases": [
"obor"
]
},
{
"key": "deynne",
"desc": "Deynkirina neadaptekirî",
"aliases": [
"ubor"
]
},
{
"key": "dariştî",
"desc": "Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be",
"aliases": [
"drş",
"der"
]
},
{
"key": "ji",
"desc": "Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e",
"aliases": [
"from"
]
},
{
"key": "drşnd",
"desc": "Dariştin heye lê cureyê wê ne diyar e",
"aliases": [
"uder"
]
},
{
"key": "qertaf",
"desc": "Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e",
"aliases": [
"qf",
"af"
]
},
{
"key": "reh",
"desc": "Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e (\"Peyvên … yên aîdî rehê …\") û di metn û darê de xuya nabe",
"aliases": [
"root"
],
"invisible": true
},
{
"key": "yekser",
"desc": "Wergerandina yekser; zincîr li vir disekine",
"aliases": [
"cal",
"clq"
]
},
{
"key": "yekserqismî",
"desc": "Wergerandina yekser a qismî; zincîr li vir disekine",
"aliases": [
"yekserq",
"pcal"
]
},
{
"key": "wergirtin",
"desc": "Wergirtina maneyê; mana wergirtî bi \u003Cmaneid:…\u003E tê nîşankirin",
"aliases": [
"sl"
]
},
{
"key": "lihevanîn",
"desc": "Lihevanîna dengî-maneyî",
"aliases": [
"psm"
]
},
{
"key": "tesîr",
"desc": "Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine",
"aliases": [
"influence"
]
},
{
"key": "têkilkirin",
"desc": "Têkilkirina du kelîmeyan",
"aliases": [
"blend"
],
"min": 2
},
{
"key": "ûnîverbasyon",
"desc": "Ûnîverbasyon",
"aliases": [
"ûnîv",
"univ"
]
},
{
"key": "qusandin",
"desc": "Qusandin",
"aliases": [
"clip"
]
},
{
"key": "paşvesazî",
"desc": "Paşvesazî",
"aliases": [
"bf"
]
},
{
"key": "elîpsîz",
"desc": "Elîpsîz",
"aliases": [
"elîp",
"ellip"
]
},
{
"key": "nomînalîzasyon",
"desc": "Nomînalîzasyon",
"aliases": [
"nomîn",
"nom"
]
},
{
"key": "translîterasyon",
"desc": "Translîterasyon",
"aliases": [
"translît",
"translit"
]
},
{
"key": "redûblîkasyon",
"desc": "Redûblîkasyon",
"aliases": [
"redûb",
"redup"
]
},
{
"key": "kurtkirin",
"desc": "Kurtkirina kelîmeyekê",
"aliases": [
"abbr"
]
},
{
"key": "sylabbr",
"desc": "Kurtkirin li gorî kîteyan",
"aliases": [
"syllabic abbreviation",
"sylabbrev"
]
},
{
"key": "akronîm",
"desc": "Akronîm",
"aliases": [
"acro"
]
},
{
"key": "înîtîalîzm",
"desc": "Înîtîalîzm",
"aliases": [
"înît",
"init"
]
},
{
"key": "metatez",
"desc": "Metatez",
"aliases": [
"meta"
]
},
{
"key": "afeq",
"desc": "Wek :qf, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike",
"invisible": true
},
{
"key": "apheresis",
"desc": "Şiklê ku dengê destpêkê winda kiriye",
"aliases": [
"apheretic",
"aphetic"
]
},
{
"key": "denominal",
"desc": "Fiîla ji îsmekê çêbûyî",
"aliases": [
"denom"
]
},
{
"key": "deverbal",
"desc": "Kelîmeya ji fiîlekê çêbûyî"
},
{
"key": "vrd",
"desc": "Dariştina vṛddhî (sanskrîtî); bi qertaf: :vrd-af"
},
{
"key": "sa-af",
"desc": "Pêkhateya sanskrîtî",
"min": 2
}
],
"wordMods": [
{
"key": "t",
"desc": "Tercimeya kelîmeyê bi kurmancî",
"aliases": [
"w"
]
},
{
"key": "tr",
"desc": "Translîterasyon"
},
{
"key": "ts",
"desc": "Transkrîpsiyon"
},
{
"key": "cuda",
"desc": "Şiklê ku tê nîşandan, eger ne wek navê rûpelê be",
"aliases": [
"alt"
]
},
{
"key": "id",
"desc": "Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan"
},
{
"key": "crz",
"desc": "Cureyê rêzimanî yê kelîmeyê",
"aliases": [
"pos"
],
"values": [
"reh",
"kelîme",
"pêşgir",
"paşgir",
"navgir"
]
},
{
"key": "c",
"desc": "Cinsiyet: n (nêr), m (mê), nt (nêtar)",
"values": [
"n",
"m",
"nt"
],
"aliases": [
"z",
"g"
]
},
{
"key": "q",
"desc": "Wesf li pêşiyê kelîmeyê"
},
{
"key": "qq",
"desc": "Wesf li pey kelîmeyê"
},
{
"key": "hrf",
"desc": "Mana herfiyen",
"aliases": [
"lit"
]
},
{
"key": "ref",
"desc": "Çavkanî; binêre #Çavkanî"
},
{
"key": "nediyar",
"desc": "Ev gav ne teqez e",
"flag": true,
"aliases": [
"unc"
]
},
{
"key": "crztip",
"desc": "Kelîme ji bo kategoriyan wek reh yan kelîme tê hesibandin",
"aliases": [
"postype"
],
"values": [
"reh",
"kelîme"
]
},
{
"key": "etimon",
"desc": "Etîmolojiya di cih de; binêre jor",
"aliases": [
"ety"
]
},
{
"key": "aftype",
"desc": "Di nav :qf de: cureyê qertafê; binêre #Cureyên qertafan",
"values": [
"pêşgir",
"paşgir",
"navgir",
"circumfix",
"infix",
"non-affix",
"root"
],
"only": [
"qertaf"
]
},
{
"key": "deyn",
"desc": "Di nav :qf de: ev parçe deynkirî ye",
"flag": true,
"only": [
"qertaf"
]
},
{
"key": "deynh",
"desc": "Di nav :qf de: ev parçe deynkirî ye",
"flag": true,
"only": [
"qertaf"
]
},
{
"key": "deynhq",
"desc": "Di nav :qf de: ev parçe deynkirî ye",
"flag": true,
"only": [
"qertaf"
]
}
],
"keywordMods": [
{
"key": "unc",
"desc": "Ev gav ne teqez e: \"Mihtemelen…\"",
"flag": true
},
{
"key": "grdk",
"desc": "Girêdeka di navbera kelîmeyên jêder de, li şûna \"yan jî\"",
"aliases": [
"conj"
]
},
{
"key": "anlz",
"desc": "Analîza şiklî",
"flag": true,
"aliases": [
"surf"
]
},
{
"key": "hrf",
"desc": "Di nav :qf de: mana herfiyen",
"aliases": [
"lit"
],
"only": [
"qertaf"
]
},
{
"key": "maneid",
"desc": "Di nav :wergirtin de: nasnameya maneya wergirtî",
"aliases": [
"senseid"
],
"only": [
"wergirtin"
]
},
{
"key": "metn",
"desc": "Di nav :ji û :drş de: metnekî din li şûna \"Ji\"",
"aliases": [
"text"
],
"only": [
"ji",
"dariştî"
]
},
{
"key": "ref",
"desc": "Çavkaniya vê gavê"
}
],
"metnChoices": [
{
"value": "++",
"desc": "Tevahiya zincîrê"
},
{
"value": "+",
"desc": "Tenê gava pêşîn"
},
{
"value": "*",
"desc": "Heta kelîmeya pêşîn a ku rûpela wê heye"
},
{
"value": "1",
"desc": "Ewqas gav (hejmarek)",
"free": true
},
{
"value": ":",
"desc": "Heta zimanê bi wê kodê (:kod)",
"free": true
},
{
"value": ":*",
"desc": "Heta wî zimanî, eger rûpela wî tune be heta ya pêşîn a heyî (:kod*)",
"free": true
}
],
"afTypes": [
{
"key": "pêşgir",
"desc": "Pêşgir"
},
{
"key": "paşgir",
"desc": "Paşgir"
},
{
"key": "navgir",
"desc": "Navgir"
},
{
"key": "circumfix",
"desc": "Dorgir"
},
{
"key": "infix",
"desc": "Nawgir (infix)"
},
{
"key": "non-affix",
"desc": "Ne qertaf"
},
{
"key": "root",
"desc": "Reh"
}
],
"params": [
{
"key": "dar",
"desc": "Bi 1 dara etîmolojiyê nîşan dide.",
"type": "flag",
"primary": true
},
{
"key": "id",
"desc": "Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan.",
"type": "text",
"primary": true
},
{
"key": "title",
"desc": "Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be.",
"type": "text"
},
{
"key": "crz",
"desc": "Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: reh, kelîme, pêşgir, paşgir, navgir.",
"type": "select",
"values": [
"reh",
"kelîme",
"pêşgir",
"paşgir",
"navgir"
]
},
{
"key": "cotreh",
"desc": "Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda.",
"type": "text"
},
{
"key": "tarîxa-etîm",
"desc": "Tarîxa peyitandina pêşîn, wek 1901, 1500s, 14c, c,1900, before,1850, r,1501,1558.",
"type": "text"
},
{
"key": "niqtena",
"desc": "Bi 1 niqteya dawiyê nayê zêdekirin.",
"type": "flag"
},
{
"key": "niqte",
"desc": "Li şûna niqteya dawiyê nîşaneke din.",
"type": "text"
},
{
"key": "katna",
"desc": "Bi 1 kategorî nayên zêdekirin. Herwiha {{para|nekat}}.",
"type": "flag"
},
{
"key": "darna",
"desc": "Bi 1 ev etîmolojî di dara rûpelên din de dernakeve.",
"type": "flag"
},
{
"key": "exnihilo",
"desc": "Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin.",
"type": "flag"
}
]
},
"metadata": {
"aa": {
"haswikt": 1,
"sc": [
"Latn",
"Ethi"
]
},
"ab": {
"haswikt": 1,
"sc": [
"Cyrl",
"Latn",
"Geor"
]
},
"aer": {
"sc": "Latn"
},
"af": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"ak": {
"haswikt": 1
},
"akk": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"sc": "Xsux"
},
"als": {
"haswikt": 1
},
"am": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1,
"sc": "Ethi"
},
"an": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"ang": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"ar": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"alt": 1,
"haswikt": 1,
"sc": "Arab"
},
"arc": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"sc": [
"Hebr",
"Syrc"
]
},
"are": {},
"arz": {
"alt": 1,
"g": [
"n",
"m",
"n-p",
"m-p"
],
"sc": "Arab"
},
"as": {
"haswikt": 1,
"sc": "Beng"
},
"ast": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"av": {
"haswikt": 1
},
"ay": {
"haswikt": 1
},
"az": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": [
"Latn",
"Cyrl",
"Arab"
]
},
"ba": {
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"bar": {},
"bat-smg": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"bbl": {
"sc": "Geor"
},
"be": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"be-x-old": {
"sc": "Cyrl"
},
"bg": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"bh": {
"haswikt": 1,
"sc": "Deva"
},
"bhb": {
"sc": "Deva"
},
"bi": {
"haswikt": 1
},
"blt": {
"sc": "Tavt"
},
"bm": {
"haswikt": 1,
"sc": [
"Latn",
"Nkoo",
"Arab"
]
},
"bn": {
"haswikt": 1,
"sc": "Beng"
},
"bo": {
"haswikt": 1,
"sc": "Tibt"
},
"br": {
"g": [
"n",
"m"
],
"haswikt": 1
},
"ca": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"cdo": {
"sc": "Hani"
},
"ce": {
"sc": "Cyrl"
},
"ch": {
"haswikt": 1
},
"chr": {
"haswikt": 1,
"sc": "Cher"
},
"cjy": {
"sc": "Hani"
},
"ckb": {
"haswikt": 1,
"sc": "Arab",
"wsc": "ku-Arab"
},
"cmn": {
"sc": "Hani",
"wiktprefix": "zh"
},
"co": {
"haswikt": 1
},
"cpx": {
"sc": "Hani"
},
"cr": {
"haswikt": 1,
"sc": "Cans"
},
"crh": {},
"cs": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"csb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"cu": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"sc": [
"Cyrs",
"Glag"
]
},
"cv": {
"sc": "Cyrl"
},
"cy": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"czh": {
"sc": "Hani"
},
"czo": {
"sc": "Hani"
},
"da": {
"g": [
"g",
"nt",
"g-p",
"nt-p",
"p"
],
"haswikt": 1
},
"dax": {},
"de": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1,
"allowCaps": 1
},
"dhg": {},
"djb": {},
"dji": {},
"djr": {},
"dng": {
"sc": "Cyrl"
},
"dsb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
]
},
"dsx": {},
"duj": {},
"dv": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Thaa"
},
"dz": {
"haswikt": 1,
"sc": "Tibt"
},
"el": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"en": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"eo": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"es": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"et": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"ett": {
"g": [
"y",
"p"
],
"sc": "Ital"
},
"eu": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"fa": {
"haswikt": 1,
"g": [
"y",
"p"
],
"sc": "Arab",
"wsc": "fa-Arab"
},
"fa-cls": {
"wiktprefix": "fa",
"sc": "Arab",
"wsc": "fa-Arab"
},
"fa-ira": {
"wiktprefix": "fa",
"sc": "Arab",
"wsc": "fa-Arab"
},
"fi": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"fil": {},
"fj": {
"haswikt": 1
},
"fo": {
"g": [
"n",
"m",
"nt"
],
"haswikt": 1
},
"fr": {
"g": [
"n",
"m",
"mnmane",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"frm": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"fro": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"fur": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"fy": {
"g": [
"g",
"nt",
"p"
],
"haswikt": 1
},
"ga": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"gan": {
"sc": "Hani"
},
"gd": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"gez": {
"sc": "Ethi"
},
"gl": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"gmw-ecg": {
"g": [
"n",
"m",
"nt",
"p"
],
"allowCaps": 1
},
"gmy": {
"sc": "Linb"
},
"gn": {
"haswikt": 1
},
"gnn": {
"sc": "Latn"
},
"got": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"sc": "Goth"
},
"grc": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
]
},
"gsw": {
"g": [
"n",
"m",
"nt",
"p"
],
"allowCaps": 1
},
"gu": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1,
"sc": "Gujr"
},
"guf": {
"sc": "Latn"
},
"gv": {
"haswikt": 1
},
"ha": {
"haswikt": 1
},
"hak": {
"sc": "Hani"
},
"har": {
"sc": "Ethi"
},
"he": {
"alt": 1,
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Hebr"
},
"hi": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Deva"
},
"hif": {
"sc": [
"Latn",
"Deva"
]
},
"hit": {
"sc": "Xsux"
},
"hrx": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"hsb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"hsn": {
"sc": "Hani"
},
"hu": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"hy": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Armn"
},
"ia": {
"haswikt": 1
},
"id": {
"haswikt": 1
},
"ie": {
"haswikt": 1
},
"ik": {
"haswikt": 1
},
"ike": {
"sc": "Cans"
},
"ikt": {
"sc": "Cans"
},
"io": {
"haswikt": 1
},
"is": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"it": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"iu": {
"haswikt": 1,
"sc": "Cans"
},
"ja": {
"haswikt": 1,
"sc": "Jpan"
},
"jay": {
"sc": "Latn"
},
"jbo": {
"haswikt": 1
},
"jv": {
"haswikt": 1
},
"ka": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"khb": {
"sc": [
"Talu",
"Lana",
"Thai"
]
},
"kjh": {
"sc": "Cyrl"
},
"kk": {
"haswikt": 1,
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"kkh": {
"sc": [
"Lana",
"Thai"
]
},
"kl": {
"haswikt": 1
},
"km": {
"haswikt": 1,
"sc": "Khmr"
},
"kn": {
"haswikt": 1,
"sc": "Knda"
},
"ku": {
"g": [
"n",
"m",
"mnmane",
"mndudil",
"n-p",
"m-p",
"p"
],
"wiktprefix": "ku"
},
"ko": {
"haswikt": 1,
"sc": "Kore"
},
"krc": {
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"ks": {
"haswikt": 1,
"sc": [
"Arab",
"Deva"
],
"wsc": "ks-Arab"
},
"kw": {
"haswikt": 1
},
"ky": {
"haswikt": 1,
"g": [
"y",
"p"
],
"sc": "Cyrl"
},
"la": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"lb": {
"g": [
"n",
"m",
"nt",
"p"
],
"haswikt": 1,
"allowCaps": 1
},
"lez": {
"sc": "Cyrl"
},
"li": {
"haswikt": 1
},
"lki": {
"wiktprefix": "ku"
},
"lld": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"lmo": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"ln": {
"haswikt": 1
},
"lo": {
"haswikt": 1,
"sc": "Laoo"
},
"lt": {
"alt": 1,
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"lv": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"lzz": {
"sc": "Geor"
},
"mg": {
"haswikt": 1
},
"mh": {
"haswikt": 1
},
"mi": {
"g": 0,
"haswikt": 1
},
"mk": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"ml": {
"haswikt": 1,
"sc": "Mlym"
},
"mn": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": [
"Cyrl",
"Mong"
]
},
"mnp": {
"sc": "Hani"
},
"mo": {
"haswikt": 1,
"sc": "Cyrl"
},
"mol": {
"sc": "Cyrl"
},
"mr": {
"g": [
"n",
"m",
"nt"
],
"haswikt": 1,
"sc": "Deva"
},
"ms": {
"haswikt": 1,
"sc": [
"Latn",
"Arab"
]
},
"mt": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"mwp": {
"sc": "Latn"
},
"my": {
"haswikt": 1,
"sc": "Mymr"
},
"na": {
"haswikt": 1
},
"nah": {
"haswikt": 1
},
"nan": {
"wiktprefix": "zh-min-nan",
"sc": "Hani"
},
"nb": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"wiktprefix": "no"
},
"nds-de": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "nds"
},
"nds-nl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "nds"
},
"ne": {
"haswikt": 1,
"sc": "Deva"
},
"nl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1
},
"nn": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1
},
"no": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1
},
"nod": {
"sc": "Lana"
},
"non": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"oc": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"om": {
"haswikt": 1
},
"or": {
"haswikt": 1,
"sc": "Orya"
},
"orv": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"sc": "Cyrs"
},
"osc": {
"sc": "Ital"
},
"ota": {
"g": [
"y",
"p"
],
"sc": "Arab",
"wsc": "ota-Arab"
},
"pa": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": [
"Guru",
"Arab"
]
},
"pdt": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "nds"
},
"peo": {
"sc": "Xpeo"
},
"phn": {
"sc": "Phnx"
},
"pi": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1
},
"pjt": {
"sc": "Latn"
},
"pl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"pms": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"pox": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"împf",
"pf"
]
},
"prs": {
"wiktprefix": "fa",
"sc": "Arab",
"wsc": "fa-Arab"
},
"ps": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Arab",
"wsc": "ps-Arab"
},
"pt": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1
},
"qu": {
"haswikt": 1
},
"rgn": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"rit": {
"sc": "Latn"
},
"rm": {
"g": [
"n",
"m"
],
"haswikt": 1
},
"rn": {
"haswikt": 1
},
"ro": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1,
"sc": [
"Latn",
"Cyrl"
]
},
"roa-rup": {
"haswikt": 1
},
"ru": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"rue": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"sc": "Cyrl"
},
"ruo": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"rup": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"wiktprefix": "roa-rup"
},
"ruq": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"rw": {
"haswikt": 1
},
"sa": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
],
"haswikt": 1,
"sc": "Deva"
},
"sah": {
"sc": "Cyrl"
},
"sc": {
"haswikt": 1
},
"scn": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"sco": {
"sc": "Latn"
},
"sd": {
"haswikt": 1,
"sc": "Arab",
"wsc": "sd-Arab"
},
"sdh": {
"sc": "Arab",
"wiktprefix": "ku"
},
"sg": {
"haswikt": 1
},
"sh": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": [
"Latn",
"Cyrl"
]
},
"si": {
"haswikt": 1,
"sc": "Sinh"
},
"simple": {
"haswikt": 1
},
"sk": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"sl": {
"alt": 1,
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1
},
"sm": {
"haswikt": 1
},
"sn": {
"haswikt": 1
},
"so": {
"haswikt": 1
},
"spx": {
"sc": "Ital"
},
"sq": {
"g": [
"n",
"m"
],
"haswikt": 1
},
"ss": {
"haswikt": 1
},
"st": {
"haswikt": 1
},
"su": {
"haswikt": 1
},
"sux": {
"sc": "Xsux"
},
"sv": {
"g": [
"g",
"nt",
"g-p",
"nt-p"
],
"haswikt": 1
},
"sva": {
"sc": "Geor"
},
"sw": {
"nclass": 1,
"haswikt": 1
},
"syc": {
"sc": "Syrc"
},
"syr": {
"sc": "Syrc"
},
"szl": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
]
},
"ta": {
"haswikt": 1,
"sc": "Taml"
},
"tdd": {
"sc": "Tale"
},
"te": {
"haswikt": 1,
"sc": "Telu"
},
"tg": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Cyrl"
},
"th": {
"haswikt": 1,
"sc": "Thai"
},
"ti": {
"haswikt": 1,
"sc": "Ethi"
},
"tig": {
"sc": "Ethi"
},
"tiw": {
"sc": "Latn"
},
"tk": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"tl": {
"haswikt": 1,
"sc": [
"Latn",
"Tglg"
]
},
"tmr": {
"sc": "Hebr"
},
"tn": {
"haswikt": 1
},
"to": {
"haswikt": 1
},
"tpi": {
"haswikt": 1
},
"tr": {
"g": [
"y",
"p"
],
"alt": 1,
"haswikt": 1
},
"ts": {
"haswikt": 1
},
"tt": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"tts": {
"sc": "Thai"
},
"tw": {
"haswikt": 1
},
"udi": {
"sc": [
"Cyrl",
"Latn",
"Armn",
"Geor"
]
},
"ug": {
"g": [
"y",
"p"
],
"haswikt": 1,
"sc": "Arab",
"wsc": "ug-Arab"
},
"uga": {
"sc": "Ugar"
},
"uk": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p",
"împf",
"pf"
],
"haswikt": 1,
"sc": "Cyrl"
},
"ulk": {
"sc": "Latn"
},
"ur": {
"g": [
"n",
"m",
"n-p",
"m-p",
"p"
],
"haswikt": 1,
"sc": "Arab",
"wsc": "ur-Arab"
},
"uz": {
"g": [
"y",
"p"
],
"haswikt": 1
},
"vec": {
"g": [
"n",
"m",
"n-p",
"m-p"
],
"haswikt": 1
},
"vi": {
"haswikt": 1
},
"vls": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p"
]
},
"vo": {
"haswikt": 1
},
"wa": {
"haswikt": 1
},
"wbp": {
"sc": "Latn"
},
"wo": {
"haswikt": 1
},
"wuu": {
"sc": "Hani"
},
"xae": {
"sc": "Ital"
},
"xcr": {
"sc": "Cari"
},
"xfa": {
"sc": "Ital"
},
"xh": {
"alt": 1,
"nclass": 1,
"haswikt": 1
},
"xlc": {
"sc": "Lyci"
},
"xld": {
"sc": "Lydi"
},
"xlu": {
"sc": "Xsux"
},
"xmf": {
"sc": "Geor"
},
"xno": {
"g": [
"n",
"m",
"n-p",
"m-p"
]
},
"xrr": {
"sc": "Ital"
},
"xst": {
"sc": "Ethi"
},
"xum": {
"sc": "Ital"
},
"xve": {
"sc": "Ital"
},
"xvo": {
"sc": "Ital"
},
"yi": {
"g": [
"n",
"m",
"nt",
"n-p",
"m-p",
"nt-p",
"p"
],
"haswikt": 1,
"sc": "Hebr"
},
"yo": {
"haswikt": 1
},
"yua": {
"g": [
"y",
"p"
],
"alt": 1
},
"yue": {
"sc": "Hani"
},
"za": {
"haswikt": 1,
"sc": "Latn"
},
"zh-classical": {
"sc": "Hani"
},
"zh-min-nan": {
"haswikt": 1
},
"zh-yue": {
"sc": "Hani"
},
"zu": {
"alt": 1,
"nclass": 1,
"haswikt": 1
},
"zza": {
"g": [
"n",
"m",
"mn",
"n-p",
"m-p",
"p"
],
"wiktprefix": "diq"
}
},
"numberLabels": {
"y": {
"display": "yekjimar"
},
"d": {
"display": "hejmar dual"
},
"p": {
"display": "pirjimar"
},
"p+": {
"display": "axlebî pirjimar"
},
"tp": {
"display": "tenê pirjimar"
},
"j": {
"display": "jimarbar"
},
"j+": {
"display": "axlebî jimarbar"
},
"j/nj": {
"display": "jimarbar û nejimarbar"
},
"nj": {
"display": "nejimarbar"
},
"nj+": {
"display": "axlebî nejimarbar"
},
"hj!": {
"display": "hejmar nepeyitandî ye"
},
"hj?": {
"display": "hejmar hewce ye"
}
},
"leadingTplOrder": [
"maneid",
"K",
"e"
],
"lekturChoices": [
{
"code": "gh",
"label": "gerguhêz (îsmî mefûl digire)"
},
{
"code": "ngh",
"label": "negerguhêz (îsmî mefûl nagire)"
}
],
"lekturFormChoices": [
{
"code": "x",
"label": "xwerû"
},
{
"code": "p",
"label": "pêkhatî"
},
{
"code": "h",
"label": "hevedudanî"
}
],
"deverQuickPicks": [
"kurmanciya rojavayî",
"kurmanciya merkezî",
"kurmanciya rojhilatî",
"Badînî",
"Botî",
"Serhedî",
"Bakur",
"Amed",
"Riha"
],
"maneTags": [
"cure?",
"rêziman?",
"kat-rêziman",
"kategoriya rêzimanê?",
"bêcure"
],
"senseGroups": [
{
"key": "alt-r",
"label": "Formên alternatîv",
"field": "alternativ",
"order": 3,
"hint": "Varyantên vê kelîmeyê"
},
{
"key": "hevmane",
"label": "Hevmane",
"field": "hevmane",
"order": 1,
"hint": "Spehî hevmaneya Bedew e."
},
{
"key": "dijmane",
"label": "Dijmane",
"field": "dijmane",
"order": 2,
"hint": "Zengîn dijmaneya feqîr e."
},
{
"key": "koordîne",
"label": "Termên koordîne",
"field": "koordine",
"order": 4,
"hint": "Pisîk û kûçik termên koordîne ne çunkî Jornavên wan gelek in"
},
{
"key": "jornav",
"label": "Jornav",
"field": "jornav",
"order": 5,
"hint": "Heywan jornavê guhandar e"
},
{
"key": "jêrnav",
"label": "Jêrnav",
"field": "jernav",
"order": 6,
"hint": "Guhandar jêrnavê heywan e"
}
],
"subsectionOrder": [
"Bilêvkirin",
"Ji wêjeya klasîk",
"Ji wêjeyê",
"Tewandin",
"Notên bikaranînê",
"Bi alfabeyên din",
"Formên alternatîv",
"Kurtkirin",
"Sembol",
"Navê zanistî",
"Hevmane",
"Nêzîk",
"Dijmane",
"Jornav",
"Jêrnav",
"Jê",
"Têkildar",
"Etîmolojî",
"Dûnde",
"Bide ber",
"Herwiha binêre",
"Bêhtir bixwîne",
"Bi zaravayên din",
"Werger",
"Qafiye",
"Anagram",
"Çavkanî"
],
"templateAliases": {
"K": [
"K",
"kategorîzebike",
"mijar"
],
"alt-r": [
"alt-r",
"forma alt di rêzê de",
"herwiha-rêz",
"herwiha di rêza maneyê de"
],
"dijmane": [
"dijmane",
"dijwate",
"dijmaneyên peyvê"
],
"e": [
"e",
"etîket",
"f",
"lb"
],
"g": [
"g",
"girêdan",
"l",
"link"
],
"hevmane": [
"hevmane",
"hevwate",
"hevmaneya peyvê",
"hevmaneyên peyvê",
"synonyms"
],
"jornav": [
"jornav",
"hîpernîm"
],
"jêrnav": [
"jêrnav",
"hîponîm"
],
"koordîne": [
"koordîne",
"termên koordîne",
"peyvên koordîneyî"
],
"mane?": [
"mane?",
"wate?",
"bêmane",
"bêwate"
],
"maneid": [
"maneid",
"senseid"
],
"h-bnr": [
"h-bnr",
"bnr-h",
"bnr h",
"bnr-hrw",
"bnr herwiha",
"herwiha binêre",
"binêre herwiha"
]
},
"wordlistTemplates": [
"kol3",
"kol2",
"kol",
"col3",
"col2",
"col"
],
"templateParams": {
"deyn": {
"order": [
"1",
"2",
"3",
"4",
"5",
"tr",
"ts",
"sc",
"id"
],
"labels": {
"1": "Zimanê jêder",
"2": "Zimanê wergir",
"3": "Kelîme",
"4": "Xuyakirina alternatîv",
"5": "Maneya kelîmeyê",
"tr": "Transliterasyon",
"ts": "Transkîpsiyon",
"sc": "Koda skrîptê",
"id": "IDya maneyê"
}
},
"hv": {
"order": [
"1",
"2",
"3",
"4",
"tr",
"ts",
"sc"
],
"labels": {
"1": "Koda zimanî",
"2": "Kelîme",
"3": "Xuyakirina alternatîv",
"4": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"sc": "Koda skrîptê"
}
},
"ji": {
"order": [
"1",
"2",
"3",
"4",
"5",
"tr",
"ts",
"id",
"sc"
],
"labels": {
"1": "Zimanê jêder",
"2": "Zimanê wergir",
"3": "Kelîme",
"4": "Xuyakirina alternatîv",
"5": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"id": "IDya maneyê",
"sc": "Koda skrîptê"
}
},
"jêder-kitêb": {
"order": [
"1",
"jêgirtin",
"sc",
"tr",
"t",
"nivîskar",
"nivîskar2",
"nivîskar3",
"amadekar",
"terciman",
"sernav",
"url",
"weşanxane",
"cih",
"cild",
"sal",
"sala-weşandinê",
"çap",
"rûpel",
"isbn",
"nekat",
"nivîskar4",
"nivîskar5",
"issn",
"oclc",
"serî",
"doi"
],
"labels": {
"1": "koda zimanî",
"sc": "koda skrîptê eger hewce be",
"tr": "translîterasyon",
"t": "tercime",
"rûpel": "rûpel"
}
},
"jêder-kovar": {
"order": [
"1",
"jêgirtin",
"sc",
"tr",
"werger",
"kovar",
"sernav",
"wergêr",
"nivîskar",
"nivîskar2",
"url",
"weşanxane",
"cîld",
"hejmar",
"sal",
"tarîx",
"rûpel"
],
"labels": {
"1": "Koda zimanî",
"sc": "Koda skrîptê",
"tr": "Translîterasyon",
"werger": "Tercimeya kurmancî ya jêgirtinê"
}
},
"jêder-vîdeo": {
"order": [
"1",
"title",
"year",
"date",
"author",
"authorlink",
"actor",
"role",
"time",
"at",
"medium",
"network",
"text",
"translation",
"season",
"number",
"episode",
"publisher",
"url",
"director",
"brackets"
],
"labels": {
"1": "Language",
"title": "Title",
"year": "Year of release",
"date": "Date of release",
"author": "Writer (screenplay)",
"authorlink": "Wikipedia author page",
"actor": "Actor (speaker)",
"role": "Role",
"time": "Timecode",
"at": "Context",
"medium": "Recording medium",
"network": "Network",
"text": "Quoted line",
"translation": "Translation",
"season": "Season number (series)",
"number": "Episode number (series)",
"episode": "Episode title (series)",
"publisher": "Publisher",
"url": "URL",
"director": "Director",
"brackets": "Brackets"
}
},
"jêder-websîte": {
"order": [
"1",
"jêgirtin",
"sc",
"tr",
"t",
"nivîskar",
"terciman",
"sernav",
"url",
"urlya-arşîvê",
"websîte",
"tarîx",
"sal"
],
"labels": {
"1": "Koda zimanî",
"sc": "Koda skrîptê ya jêgirtinê",
"tr": "Translîterasyona jêgirtinê",
"t": "Tercimeya kurmancî ya jêgirtinê"
}
},
"mîr": {
"order": [
"1",
"2",
"3",
"4",
"5",
"tr",
"ts",
"id",
"sc"
],
"labels": {
"1": "Zimanê jêder",
"2": "Zimanê wergir",
"3": "Kelîme",
"4": "Xuyakirina alternatîv",
"5": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"id": "IDya maneyê",
"sc": "Koda skrîptê"
}
},
"nh": {
"order": [
"1",
"2",
"3",
"4",
"tr",
"ts",
"sc"
],
"labels": {
"1": "Koda zimanî",
"2": "Kelîme",
"3": "Xuyakirina alternatîv",
"4": "Maneya peyvê",
"tr": "Transliterasyon",
"ts": "Transkrîpsiyon",
"sc": "Koda skrîptê"
}
},
"qertaf": {
"order": [
"1",
"2",
"3",
"sc",
"cuda1",
"cuda2",
"t1",
"t2",
"tr1",
"tr2"
],
"labels": {
"1": "language code",
"2": "first part",
"3": "second part",
"sc": "script code",
"cuda1": "first part alternate text",
"cuda2": "second part alternate text",
"w1": "first gloss",
"w2": "second gloss",
"tr1": "first part transliteration",
"tr2": "second part transliteration"
}
},
"yekser": {
"order": [
"1",
"2",
"3",
"hûr",
"nekat"
]
}
}
}
oht8ebq2yw5xs1xmonu1ym66p79j5et
MediaWiki:Gadget-wikt.cite.js
8
1359166
6533059
6531674
2026-09-19T10:13:44Z
Wikihez
7344
Etymology: route {{etîmon}} to its own builder; keyword, modifier and metn= tables in data-main.json; language datalist moved to langs.js
6533059
javascript
text/javascript
// <nowiki>
/*
* Page: [[MediaWiki:Gadget-wikt.cite.js]]
*
* Citations for both add-examples and the wizard: jêder-* templates, [[Kategorî:Çavkanî]] templates,
* Citoid, and the "#*" line they become. fieldSpecs() returns plain field descriptions because the two
* callers draw them differently (OOUI vs the wizard's own grid); everything else is shared. Also the
* template-param dialog (openTemplateDialog), used the same way by DefSideBoxes and start.js.
*
* The only caller of window.wikt.citoid, which the citoid-helper gadget owns.
*/
(function () {
"use strict";
var edit = require("ext.gadget.wikt.edit");
var util = edit.util;
var wt = edit.wt;
var langs = edit.langs;
var escapeRegExp = util.escapeRegExp;
var tdText = wt.tdText;
var parseTemplateCalls = wt.parseTemplateCalls;
var splitCallParams = wt.splitCallParams;
var buildTemplateCall = wt.buildTemplateCall;
var jederDefs = edit.data.jederDefs || {};
// Guarded: between deploying this file and the Gadgets-definition line that adds etimon.js to the
// package, a cached startup module would have this require throw and take the whole gadget with it.
// Without the builder, an {{etîmon}} call falls through to the generic dialog below.
var etimon = null;
try {
etimon = require("./wikt.cite/etimon.js");
} catch (e) {
etimon = null;
}
var api = new mw.Api();
// Sentinel _currentJederKey / dropdown value for "pick a template from Kategorî:Çavkanî". Not a real
// jederDefs key. Both gadgets use this same string, so a draft saved by one is read by the other.
var CATEGORY_KEY = "__category__";
// Sentinel for "the example box holds a finished template; write it out untouched".
var RAW_KEY = "__raw__";
// Covered by the form's own dedicated boxes, so they are never drawn again as generic template fields.
var COVERED_PARAMS = ["jêgirtin", "jg", "t", "tr"];
// A Kategorî:Çavkanî template whose TemplateData labels a parameter exactly this is fed the language
// from the language dropdown instead of showing a box for it. Unlike jêder-*, an arbitrary template has
// no "parameter 1 is the language" convention, so nothing is assumed positionally.
var LANG_LABEL = "koda zimanî";
// Field key -> {span, multiline}, taken from whichever jêder-* template defines it first. Most
// Kategorî:Çavkanî templates reuse the same bibliographic parameter names, so "sernav" comes out
// full-width and multiline there too rather than as a generic one-line box.
var SIZE_BY_KEY = {};
Object.keys(jederDefs).forEach(function (jederKey) {
(jederDefs[jederKey].fields || []).forEach(function (field) {
if (!SIZE_BY_KEY[field.key]) {
SIZE_BY_KEY[field.key] = {
span: field.span || 4,
multiline: !!field.multiline,
width: field.width || ""
};
}
});
});
// Field pairs Modul:quote refuses together ("Divê tenê yek ji |tarîx= an |sal= were dayîn"): a full
// date and a bare year say the same thing twice. Both are offered because either may be all a source
// gives, so the forms clear one when the other is filled rather than letting the citation break.
var EXCLUSIVE_PAIRS = [["sal", "tarîx"]];
function exclusivePartner(key) {
var found = null;
EXCLUSIVE_PAIRS.forEach(function (pair) {
if (pair[0] === key) {
found = pair[1];
} else if (pair[1] === key) {
found = pair[0];
}
});
return found;
}
function fieldSize(key) {
return SIZE_BY_KEY[key] || { span: 4, multiline: false, width: "" };
}
// ---- text helpers -------------------------------------------------------------------------------
// The entry name as a pattern. A Kurdish word ending in -î loses the circumflex once something is
// attached to it ("safî" is written "safiye"), so a title ending that way matches either spelling --
// otherwise the name is simply never found in the quotation.
function titlePattern(title) {
var escaped = escapeRegExp(String(title || ""));
return /î$/i.test(escaped) ? escaped.slice(0, -1) + "[îi]" : escaped;
}
// Wraps the entry's own name in bold wherever it appears in the quotation, which is how quotations are
// written here, and reports whether the name ends up bold so a caller can say so.
//
// The name may carry an attached suffix ("celbê"), so the match runs on to the end of the word. A word
// ends at whitespace, punctuation or markup: excluding markup is what keeps "celb<br>me’şûq" from
// bolding as one lump. The typographic apostrophe stays a word character -- it is one inside Kurdish
// words like "me’şûq".
function boldenPageTitle(text, title) {
var source = String(text || "");
var escapedTitle = titlePattern(title);
var suffixPattern = "([^\\s.,;:?!()'\"<>\\[\\]{}|=/\\\\«»„“”–—]+)?";
var titleRe = new RegExp("(" + escapedTitle + suffixPattern + ")", "ig");
var titleAnywhere = new RegExp(escapedTitle, "i");
// Whatever already sits between ''' marks is copied through untouched, so a quotation somebody
// bolded by hand -- or one an earlier run bolded -- never collects a second pair.
var boldSpan = /'''[\s\S]*?'''/g;
var out = "";
var last = 0;
var alreadyBold = false;
var span;
while ((span = boldSpan.exec(source)) !== null) {
out += source.slice(last, span.index).replace(titleRe, "'''$1'''");
if (titleAnywhere.test(span[0])) {
alreadyBold = true;
}
out += span[0];
last = span.index + span[0].length;
}
out += source.slice(last).replace(titleRe, "'''$1'''");
return { text: out, bolded: out !== source || alreadyBold };
}
// A literal newline would end the single-line "#*" wikitext, so display text keeps its break as <br>...
function nlToBr(text) {
return String(text || "").replace(/\r\n|\r|\n/g, "<br>");
}
// ...while a plain parameter value (an author, a title) just loses it.
function nlToSpace(text) {
return String(text || "").replace(/\s*(?:\r\n|\r|\n)\s*/g, " ");
}
// Bolds the entry name inside a pasted citation's jêgirtin=/jg= value only, so a book title or author
// containing it is left alone. With no such parameter nothing is bolded: running the plain-text bolder
// over wikitext would wrap the braces too.
function boldQuoteParam(text, title) {
var match = /(\|\s*(?:jêgirtin|jg)\s*=)([\s\S]*?)(?=\|[^|=]*=|\}\}\s*$)/.exec(text);
if (!match) {
return text;
}
var bolded = boldenPageTitle(match[2], title).text;
return text.slice(0, match.index) + match[1] + bolded + text.slice(match.index + match[0].length);
}
// "name — description" for each Kategorî:Çavkanî option in a <select>, from the description half of
// the same TemplateData every citation picker already fetches -- so a search box built over these
// options can also match on what a template documents itself as doing, not only its name. An
// undescribed option, or a failed fetch, just keeps its plain label; never blocks on this.
// A self-contained "search Kategorî:Çavkanî" combo: a text input plus its own results list, matching
// add-examples' own jêgirtin picker -- each row shows its label, a " → target" arrow when a redirect's
// label differs from its target, and a 🔗 link to the canonical template's own page. opts.onPick(entry)
// fires when a row is chosen; the input is then left holding the plain label, not "label → target", so
// re-focusing it to search again doesn't start from that arrow text. opts.describe: true also fills in
// each visible row's own TemplateData description once it loads (batched, so scrolling through matches
// costs a handful of requests, not one per row).
function buildCategoryTemplateSearch(opts) {
opts = opts || {};
var shell = util.buildSearchList({
placeholder: opts.placeholder || util.msg.searchTemplate
});
var $input = shell.$input;
var $results = shell.$results;
var $status = $("<span class='wiktku-cat-tpl-status'></span>").text(util.msg.templatesLoading);
var list = [];
function decorate($text, target, wanted) {
if (!wanted) {
return;
}
edit.wt.fetchTemplateData(target).then(function (doc) {
var desc = doc && edit.wt.tdText(doc.description);
if (desc && $text.closest("body").length) {
$text.append(document.createTextNode(" — " + edit.wt.shortDesc(desc)));
}
});
}
function showResults(query) {
var q = $.trim(query || "").toLowerCase();
$results.empty();
var matched = q ? list.filter(function (entry) {
return entry.label.toLowerCase().indexOf(q) !== -1;
}) : list;
if (!matched.length) {
shell.close();
return;
}
var shown = matched.slice(0, 50);
// Only what a search has narrowed to: an empty box is the whole category, and describing its
// first fifty would ask the wiki about templates nobody has looked for.
var describing = !!opts.describe && !!q;
if (describing) {
edit.wt.fetchTemplateDataBatch(shown.map(function (entry) { return entry.target; }));
}
shown.forEach(function (entry) {
var $li = $("<li class='wiktku-cat-tpl-row'></li>");
var $text = $("<span class='wiktku-cat-tpl-text'></span>").text(entry.label);
if (entry.label !== entry.target) {
$text.append($("<span class='wiktku-cat-tpl-arrow'></span>").text(" → " + entry.target));
}
decorate($text, entry.target, describing);
var $link = $("<a class='wiktku-cat-tpl-link' target='_blank' rel='noopener'>🔗</a>")
.attr("title", util.msg.openTemplatePage)
.attr("href", util.tplPageUrl(entry.target));
// stopPropagation only -- preventDefault would stop the link from actually navigating.
$link.on("mousedown click", function (e) { e.stopPropagation(); });
$li.append($text, $link);
shell.bindPick($li, function () {
shell.close();
$input.val(entry.label);
opts.onPick(entry);
});
$results.append($li);
});
shell.open();
}
$input.on("input focus", function () {
showResults($(this).val());
});
$input.on("blur", function () {
setTimeout(shell.close, 200); // lets the pick handler fire first
});
fetchCategoryTemplates().then(function (l) {
list = l;
$status.text("");
}, function () {
$status.text(util.msg.templatesFailed);
});
return {
$element: $("<span class='wiktku-native-select-wrap wiktku-cat-tpl-picker'></span>").append($input, $results, $status),
$input: $input,
$status: $status
};
}
// ---- Kategorî:Çavkanî -----------------------------------------------------------------------------
// The category's template members plus their redirects, each redirect its own searchable entry pointing
// at the same canonical target, so a template is findable by any of its names. Cached for the session.
var catTemplatesPromise = null;
function fetchCategoryTemplates() {
if (catTemplatesPromise) {
return catTemplatesPromise;
}
catTemplatesPromise = api.get({
action: "query",
generator: "categorymembers",
gcmtitle: "Kategorî:Çavkanî",
gcmnamespace: 10,
gcmlimit: "max",
prop: "redirects",
rdnamespace: 10,
rdlimit: "max",
formatversion: 2
}).then(function (data) {
var list = [];
((data.query && data.query.pages) || []).forEach(function (page) {
var target = page.title.replace(/^[^:]+:/, "");
list.push({ label: target, target: target });
(page.redirects || []).forEach(function (redirect) {
list.push({ label: redirect.title.replace(/^[^:]+:/, ""), target: target });
});
});
list.sort(function (a, b) {
return a.label.localeCompare(b.label, mw.config.get("wgUserLanguage"));
});
return list;
}, function () {
return [];
});
return catTemplatesPromise;
}
// ---- template-param dialog: fills a {{Name|...}} call from its own TemplateData -------------------
// Shared by DefSideBoxes (a fresh insert from Etîmolojî/Çavkanî, or double-clicking an existing chip
// to edit it) and start.js's own Etîmolojî/Çavkanî pickers -- one dialog, so all of them read the same
// TemplateData the same way.
// OOUI's own dialog stack -- the same widgetry VisualEditor's template dialog is built on.
var citeWindowManager = null;
function templateDialogManager() {
if (!citeWindowManager) {
citeWindowManager = new OO.ui.WindowManager();
$(document.body).append(citeWindowManager.$element);
}
return citeWindowManager;
}
// Opens one template call in a modal built from its TemplateData. Resolves with the edited wikitext, or
// null when the user cancels.
// One at a time: a second open while one is loading or showing (a chip clicked again before its dialog
// appeared) stacks a window the manager does not track, and that window's buttons do nothing. The
// second call resolves null, as a cancel does.
var templateDialogBusy = false;
function openTemplateDialog(callWikitext) {
var done = $.Deferred();
var call = parseTemplateCalls(callWikitext).calls[0];
if (!call || templateDialogBusy) {
return done.resolve(null).promise();
}
// {{etîmon}} has no form TemplateData can describe -- a chain of steps, each with its own words
// and their own modifiers -- so it has a builder of its own, on the same contract as this dialog.
if (etimon && etimon.isEtimonName(call.name)) {
return etimon.openDialog(callWikitext);
}
templateDialogBusy = true;
done.always(function () {
templateDialogBusy = false;
});
$.when(
mw.loader.using(["oojs-ui-core", "oojs-ui-windows"]),
edit.wt.fetchTemplateData(call.name)
).then(function (_loaded, td) {
var result = null;
// The parent is captured rather than reached through TplDialog.super: "super" is a reserved word,
// and OOjs has moved between .super and .parent for it over the years.
var ParentDialog = OO.ui.ProcessDialog;
function TplDialog(config) {
ParentDialog.call(this, config);
}
OO.inheritClass(TplDialog, ParentDialog);
TplDialog.static.name = "citeTemplateDialog";
TplDialog.static.title = "{{" + call.name + "}}";
TplDialog.static.actions = [
{ action: "save", label: "Biguhêre", flags: ["primary", "progressive"] },
{ action: "remove", label: "Jê bibe", flags: "destructive" },
{ label: util.msg.cancel, flags: "safe" }
];
TplDialog.prototype.initialize = function () {
ParentDialog.prototype.initialize.apply(this, arguments);
this.panel = new OO.ui.PanelLayout({ padded: true, expanded: false });
this.form = buildTemplateParamForm(call, td);
this.panel.$element.append(this.form.$element);
this.$body.append(this.panel.$element);
};
TplDialog.prototype.getBodyHeight = function () {
return this.panel.$element.outerHeight(true);
};
TplDialog.prototype.getActionProcess = function (action) {
var dialog = this;
if (action === "save" || action === "remove") {
return new OO.ui.Process(function () {
result = action === "remove" ? "" : dialog.form.values();
dialog.close();
});
}
return ParentDialog.prototype.getActionProcess.call(this, action);
};
// Marks the page while this is showing, so a floating box of ours (DefSideBoxes' queue) does
// not sit over a dialog the page's stacking order puts underneath it.
$(document.body).addClass("wikt-dialog-open");
done.always(function () {
$(document.body).removeClass("wikt-dialog-open");
});
var manager = templateDialogManager();
var dialog = new TplDialog({ size: "medium" });
manager.addWindows([dialog]);
var instance = manager.openWindow(dialog);
instance.closed.then(function () {
manager.clearWindows();
done.resolve(result);
});
instance.opening.fail(function () {
manager.clearWindows();
done.resolve(null);
});
}, function () {
done.resolve(null);
});
return done.promise();
}
// TemplateData descriptions are plain text, but authors write wikilinks in them; render those as links.
function tdDescription(text) {
var $out = $("<span></span>");
var re = /\[\[([^\[\]|]+)(?:\|([^\[\]]*))?\]\]/g;
var last = 0;
var m;
while ((m = re.exec(text)) !== null) {
if (m.index > last) {
$out.append(document.createTextNode(text.slice(last, m.index)));
}
$out.append($("<a></a>").attr("href", mw.util.getUrl(m[1])).text(m[2] || m[1]));
last = re.lastIndex;
}
if (last < text.length) {
$out.append(document.createTextNode(text.slice(last)));
}
return $out;
}
// A parameter whose documentation says so takes "kelîme<t:...>" inline modifiers, so it gets the pill
// widget instead of a plain box. TemplateData has no field for this, hence the marker in the description.
var INLINE_MODIFIER_MARKER = "WF:Guherkerên rêzê";
function acceptsInlineModifiers(doc) {
return tdText(doc && doc.description).indexOf(INLINE_MODIFIER_MARKER) !== -1;
}
// A language-code parameter, per its own label.
function isLanguageParam(doc) {
return /ziman/i.test(tdText(doc && doc.label));
}
function buildTemplateParamForm(call, td) {
var parsed = splitCallParams(call.params);
var docParams = (td && td.params) || {};
var keys = (td && td.paramOrder) ? td.paramOrder.slice() : Object.keys(docParams);
parsed.used.forEach(function (k) {
if (keys.indexOf(k) === -1) {
keys.push(k);
}
});
var $element = $("<div class='dsb-tpl-form'></div>");
var readers = {}; // key -> () => the parameter's current text
$element.append($("<div class='dsb-tpl-name'></div>").append(
$("<a></a>").attr("href", mw.util.getUrl("Şablon:" + call.name))
.attr("target", "_blank").text("{{" + call.name + "}}")
));
var desc = tdText(td && td.description);
if (desc) {
$element.append($("<div class='dsb-tpl-desc'></div>").append(tdDescription(desc)));
}
keys.forEach(function (key) {
var doc = docParams[key] || {};
var value = parsed.values[key] || "";
var $field;
if (acceptsInlineModifiers(doc)) {
// The same word row the sense lists use: plain text plus removable "<t:...>" pills.
var row = util.makeModifierRow({
prefix: "dsb-",
placeholder: tdText(doc.label) || key,
modTitle: util.msg.addModifier,
removeTitle: "Vê nirxê jê bibe",
removeModTitle: util.msg.removeModifier
});
row.setRaw(value);
// A <ul> so the row's own "close other pickers" lookup has something to scope to.
$field = $("<ul class='dsb-wordlist dsb-tpl-modifier-list'></ul>").append(row.$li);
readers[key] = row.getRaw;
} else {
var $input = $("<input type='text' class='dsb-input'>").val(value);
if (isLanguageParam(doc)) {
$input.attr("list", langs.datalistId()).attr("placeholder", "koda zimanî…");
// Typing a language the short list does not have is the cue to fetch the rest.
$input.on("input", function () {
if (langs.missingFromCore($input.val())) {
langs.ensureFull();
}
});
} else {
var suggested = doc.suggestedvalues || [];
if (suggested.length) {
var listId = "dsb-sv-" + call.name.replace(/[^A-Za-z0-9]/g, "") + "-" + key;
var $list = $("<datalist></datalist>").attr("id", listId);
suggested.forEach(function (v) {
$list.append($("<option></option>").val(v));
});
$input.attr("list", listId);
$element.append($list);
}
}
$field = $input;
readers[key] = function () {
return $input.val();
};
}
var $label = $("<label class='dsb-adv-label'></label>").text(tdText(doc.label) || key);
if (!docParams[key]) {
$label.append($("<span class='dsb-tpl-undocumented'></span>").text(" (ne di belgeyê de)"));
}
var $row = $("<div class='dsb-tpl-param-row'></div>").append($label, $field);
var help = tdText(doc.description);
if (help) {
$row.append($("<div class='dsb-tpl-help'></div>").append(tdDescription(help)));
}
if (doc.deprecated) {
$row.addClass("dsb-tpl-deprecated");
}
$element.append($row);
});
return {
$element: $element,
values: function () {
var vals = {};
keys.forEach(function (k) {
vals[k] = $.trim(readers[k]() || "");
});
return buildTemplateCall(call.name, vals, keys);
}
};
}
// The documented parameters of one template (name without the "Şablon:" prefix), in its own
// paramOrder; [] when it has no TemplateData. The fetch, the shaping and the cache all live in
// wikt.edit, so the wizard, DefSideBoxes and this module share one request and one copy per template.
//
// The key stands in for a missing label, because these become form fields and a field needs something
// written on it.
// A template's parameters: its TemplateData, or -- for one with none, like most Kategorî:Çavkanî
// templates -- every {{{name}}} its own source reads.
function templateParams(name) {
return edit.wt.templateDoc(name).then(function (td) {
var params = ((td && td.params) || []).map(function (p) {
return {
key: p.key,
label: p.label || p.key,
required: p.required,
deprecated: p.deprecated
};
});
return params.length ? params : sourceParams(name);
});
}
var sourceParamsCache = {};
function sourceParams(name) {
if (!sourceParamsCache[name]) {
sourceParamsCache[name] = new mw.Api().get({
action: "query", prop: "revisions", titles: "Template:" + name, rvprop: "content", rvslots: "main",
redirects: 1, formatversion: 2
}).then(function (data) {
var page = data.query.pages[0];
var source = page.revisions ? page.revisions[0].slots.main.content : "";
var keys = [];
var re = /\{\{\{\s*([^{}|]+?)\s*[|}]/g;
var m;
while ((m = re.exec(source)) !== null) {
if (!/^\d+$/.test(m[1]) && keys.indexOf(m[1]) === -1) {
keys.push(m[1]);
}
}
return keys.map(function (key) {
return { key: key, label: key, required: false, deprecated: false };
});
}, function () {
return [];
});
}
return sourceParamsCache[name];
}
// alias -> the name a template's TemplateData documents it under ({r: "rûpel"} for jêder-kitêb). Asked
// of the wiki itself: the parameter lists baked into data-main.json carry no aliases.
var aliasCache = {};
function templateAliases(name) {
if (!aliasCache[name]) {
aliasCache[name] = new mw.Api().get({
action: "templatedata", titles: "Template:" + name, redirects: 1, formatversion: 2
}).then(function (data) {
var map = {};
$.each(data.pages || {}, function (_, page) {
$.each(page.params || {}, function (key, p) {
(p.aliases || []).forEach(function (alias) {
map[alias] = key;
});
});
});
return map;
}, function () {
return {};
});
}
return aliasCache[name];
}
// What to draw for one Kategorî:Çavkanî template: a field per documented parameter, minus the ones the
// form already has boxes for and minus the language parameter, which is filled from the dropdown.
// A template with no TemplateData at all falls back to a lone "Rûpel" box, which is what such citations
// almost always need ({{Şablon|rûpel=12|jêgirtin=…}}).
function fieldSpecs(name) {
return templateParams(name).then(function (params) {
var langParamKey = null;
(params || []).forEach(function (p) {
if ((p.label || "").trim().toLowerCase() === LANG_LABEL) {
langParamKey = p.key;
}
});
var filtered = (params || []).filter(function (p) {
return COVERED_PARAMS.indexOf(p.key) === -1 && p.key !== langParamKey;
});
var list = filtered.length ? filtered : [{ key: "rûpel", label: "Rûpel", required: false }];
return {
langParamKey: langParamKey,
fields: list.map(function (p) {
var size = fieldSize(p.key);
return {
key: p.key,
label: p.label,
required: p.required,
span: size.span,
width: size.width,
multiline: size.multiline
};
})
};
});
}
// The same list for a jêder-* template, straight out of the shared table.
function jederFieldSpecs(jederKey) {
var def = jederDefs[jederKey];
return def ? (def.fields || []).slice() : [];
}
// ---- Citoid --------------------------------------------------------------------------------------
// Today, as Modul:quote wants it (it renders "2024-05-05" as "5 gulan 2024").
function today() {
var d = new Date();
function pad(n) { return (n < 10 ? "0" : "") + n; }
return d.getFullYear() + "-" + pad(d.getMonth() + 1) + "-" + pad(d.getDate());
}
// Carries across the parts of a Citoid result that citoid-helper's own mapping drops: the access date
// and the identifiers for the fields the forms have only just gained. Applied here rather than in
// citoid-helper so it reaches both gadgets without an edit to the MediaWiki: gadget page.
function enrichCitoidFields(fields, raw) {
fields = fields || {};
if (fields.url && !fields["tarîxa-gihiştinê"]) {
// Citoid reports when it actually fetched the page ("accessDate": "2026-09-03"), so use that
// rather than the clock -- they differ whenever the answer came from a cache. today() is only
// the fallback for a result that carries no accessDate.
var accessed = raw && (raw.accessDate || raw.accessdate);
fields["tarîxa-gihiştinê"] = (accessed && String(accessed).slice(0, 10)) || today();
}
if (raw) {
var issn = Array.isArray(raw.ISSN) ? raw.ISSN[0] : raw.ISSN;
if (issn && !fields.issn) {
fields.issn = issn;
}
var doi = Array.isArray(raw.DOI) ? raw.DOI[0] : raw.DOI;
if (doi && !fields.doi) {
fields.doi = doi;
}
if (raw.volume && !fields.cild) {
fields.cild = raw.volume;
}
}
return fields;
}
// One URL/DOI/ISBN -> {jederKey, fields}. The lookup itself lives in the citoid-helper gadget; this
// wrapper exists so neither caller has to know that, and so a missing gadget fails in one place.
function fetchFromCitoid(query) {
if (!(window.wikt && window.wikt.citoid && window.wikt.citoid.fetchJederFields)) {
return $.Deferred().reject("Amûra Citoidê ne barkirî ye.").promise();
}
return window.wikt.citoid.fetchJederFields(query).then(function (result) {
result.fields = enrichCitoidFields(result.fields, result.raw);
return result;
});
}
// Re-derives the fields for a different jêder-* template than the one citoid detected, enriched the
// same way -- used when the person had already chosen a template and we keep their choice.
// The form's link box stands in for a jêder-* template's own url= when that is left empty.
function withLinkAsUrl(jederKey, fields, link) {
var def = jederDefs[jederKey];
var hasUrl = !!def && (def.fields || []).some(function (field) {
return field.key === "url";
});
if (hasUrl && !fields.url && /^https?:\/\//.test(link || "")) {
fields.url = link;
}
return fields;
}
function citoidFieldsFor(jederKey, raw, query) {
if (!(window.wikt && window.wikt.citoid && window.wikt.citoid.dataToJederFields)) {
return {};
}
return enrichCitoidFields(window.wikt.citoid.dataToJederFields(jederKey, raw, query), raw);
}
// ---- the "#*" line ------------------------------------------------------------------------------
// One finished citation line. Modes:
// "jeder" {{jêder-kitêb|ku|sernav=…|jêgirtin=…}}
// "category" the Kategorî:Çavkanî template as the citation template: {{Ç:Kitêb|rûpel=12|…}}
// "plain" free-text source, or none: {{jêder|ku|2=…|jêgirtin=…}} / {{nimûne|ku|…}}
// "raw" a finished template, passed through with only the entry name bolded
// opts: {mode, template, language, fields, langParamKey, quote, translation, transcription,
// source, sourceURL, title, marker, keepTranslation, extra}
function buildCitation(opts) {
var marker = opts.marker || "#*";
var title = opts.title || mw.config.get("wgTitle");
var quote = boldenPageTitle(String(opts.quote || ""), title).text;
if (opts.mode === "raw") {
// Written as given: the point is to paste a citation built elsewhere and have it survive intact.
// A line copied off another entry usually still carries its own "#*"/"#:" -- the marker is added
// back below, so strip it rather than emitting "#* #* {{...}}".
var pasted = String(opts.quote || "").replace(LIST_MARKER, "");
return marker + " " + nlToBr(boldQuoteParam(pasted, title)).trim();
}
var isCategory = opts.mode === "category";
var isTemplate = isCategory || opts.mode === "jeder";
var name = isTemplate ? opts.template : (opts.source || opts.sourceURL ? "jêder" : "nimûne");
var line = marker + " {{" + name;
// jêder-*, jêder and nimûne all take the language as parameter 1. A Kategorî:Çavkanî template only
// gets one when its own TemplateData names it, under its own key -- never assumed positionally.
if (!isCategory) {
line += "|" + opts.language;
}
if (isTemplate) {
var fields = opts.fields || {};
Object.keys(fields).forEach(function (key) {
var value = nlToSpace(String(fields[key] || "").trim());
if (value) {
line += "|" + key + "=" + value;
}
});
if (isCategory && opts.langParamKey) {
line += "|" + opts.langParamKey + "=" + opts.language;
}
// "Ç:" templates are quotation-equivalents rather than usage examples (see Modul:quote).
if (isCategory && /^Ç:/.test(name)) {
line += "|wekjêgirtin=1";
}
} else {
if (opts.source) {
// A positional value containing "=" would be read as its own key=value pair, so name it.
line += (String(opts.source).indexOf("=") !== -1 ? "|2=" : "|") + opts.source;
}
if (opts.sourceURL) {
line += "|url=" + opts.sourceURL;
}
}
var isUsex = name === "nimûne";
var translation = nlToBr(String(opts.translation || "").trim());
// {{nimûne}} always takes one, a Kurmancî example's being its explanation; a quotation's is left out
// for Kurmancî unless the edited line already had one (keepTranslation).
var writeTranslation = !!translation && (isUsex || opts.language !== "ku" || opts.keepTranslation);
// {{nimûne}}'s example is parameter 2 and its translation parameter 3, both positional. A value
// containing "=" would be read as key=value, so then both are named: naming only the example would
// slide the translation into slot 2.
var namedSlots = isUsex && (quote.indexOf("=") !== -1 || (writeTranslation && translation.indexOf("=") !== -1));
line += "|" + (isUsex ? (namedSlots ? "2=" : "") : "jêgirtin=") + nlToBr(quote);
if (writeTranslation) {
// Kategorî:Çavkanî templates route through Modul:quote and take its "t="; jêder-* uses "tercime=".
line += "|" + (isUsex ? (namedSlots ? "3=" : "") : isCategory ? "t=" : "tercime=") + translation;
}
var transcription = nlToBr(String(opts.transcription || "").trim());
if (transcription) {
line += "|tr=" + transcription;
}
// Parameters the form has no box for, carried through from the line being edited.
(opts.extra || []).forEach(function (param) {
line += "|" + param;
});
// A short example and its translation read best on one line, which {{nimûne}} does only when told.
// Short is Modul:usex's own measure for "rêz=auto": at most 100 characters shown between them.
if (isUsex && writeTranslation && !hasInlineParam(opts.extra) &&
shownLength(quote) + shownLength(translation) <= 100) {
line += "|rêz=1";
}
return line + "}}";
}
// True when the parameters already say inline or not: {{nimûne}}'s rêz=, under any of its names.
function hasInlineParam(params) {
return (params || []).some(function (param) {
return /^\s*(?:rêz|birêz|inline)\s*=/.test(param);
});
}
// How many characters a bit of wikitext shows: link targets, bold/italic marks and tags don't count.
function shownLength(text) {
return String(text || "")
.replace(/\[\[(?:[^\]|]*\|)?([^\]]*)\]\]/g, "$1")
.replace(/'{2,}/g, "")
.replace(/<[^>]*>/g, " ")
.length;
}
// A leading "#*" / "#:" / "##*" ... list marker.
var LIST_MARKER = /^\s*#+[*:]\s*/;
// True when the text is a whole citation line copied from somewhere else: its own list marker followed
// by a template call. That is the shape of every line this family writes -- {{jêder}}, {{jêder-kitêb}},
// {{nm}}, {{nimûne}}, {{mk}}, any Kategorî:Çavkanî template -- so the template name is not checked
// against a list, which could never cover every citation template on the wiki.
//
// Used to switch the form into raw mode by itself: pasting a finished line and forgetting to change the
// dropdown would otherwise wrap it in a second {{nimûne}}.
function looksLikeCitationLine(text) {
var trimmed = String(text || "");
if (!LIST_MARKER.test(trimmed)) {
return false;
}
return trimmed.replace(LIST_MARKER, "").slice(0, 2) === "{{";
}
// True when the example box holds nothing but one finished template call -- the cue to offer, or to
// switch to, the "write it out as-is" mode.
function looksLikeTemplate(text) {
var trimmed = String(text || "").trim();
if (trimmed.slice(0, 2) !== "{{" || trimmed.slice(-2) !== "}}") {
return false;
}
var parsed = edit.wt.parseTemplateCalls(trimmed);
return parsed.calls.length === 1 && !parsed.otherContent;
}
// ---- reading a finished line back --------------------------------------------------------------
// [[Şablon:nimûne]] and every redirect to it.
var USEX_NAMES = ["nimûne", "mk", "ux", "mînak", "nim", "nm"];
var USEX_TRANSLATION = ["3", "t", "tercime", "translation", "w", "werger"];
var USEX_TRANSCRIPTION = ["tr", "transliteration"];
// A quotation template's translation, under the name Modul:quote documents and its aliases.
var QUOTE_TRANSLATION = ["t", "tercime", "werger", "w"];
// [[Şablon:bênimûne]] and its redirects: the "no example yet" placeholder, with or without a language.
var EMPTY_EXAMPLE_MARKER = /^#+\*\s*\{\{\s*(?:bênimûne|bêmînak|mînak\?|nimûne\?)\s*(?:\|[^{}]*)?\}\}\s*$/i;
// The text of a line written as one italic run ("''…''", bold inside allowed -- "'''''X''' …''" opens
// with both), or null.
function italicRun(text) {
var t = $.trim(text || "");
var opening = /^'*/.exec(t)[0].length;
var m = /^''([\s\S]+)''$/.exec(t);
if ((opening !== 2 && opening !== 5) || !m || /''/.test(m[1].replace(/'''/g, ""))) {
return null;
}
return m[1];
}
// "''…'' (…)": an italic example with its explanation in brackets on the same line, as
// {text, translation}, or null. One level of brackets inside the explanation is allowed.
function italicWithGloss(text) {
var m = /^([\s\S]*'')\s*\(([^()]*(?:\([^()]*\)[^()]*)*)\)$/.exec($.trim(text || ""));
var italic = m && italicRun(m[1]);
if (italic === null || !m) {
return null;
}
var gloss = $.trim(m[2]);
return { text: italic, translation: italicRun(gloss) || gloss };
}
function brToNl(text) {
return String(text || "").replace(/<br\s*\/?>/gi, "\n");
}
/**
* One "#:"/"#*" block -- its line plus any deeper "#::"/"#*:" lines -- as the form's values, or null when
* it is not an example: a word list, the "no example yet" placeholder, a plain note.
* {mode: "nimune"|"jeder"|"source"|"raw", marker, template, text, translation, transcription,
* source, sourceURL, fields, extra}
* extra is every parameter the form has no box for, to be written back as it was. A "raw" block is
* edited as written: text is the whole block, list markers included.
*/
function parseCitationLine(block) {
var all = String(block || "").split("\n");
var k = 1;
while (k < all.length && !/^#/.test(all[k])) {
k++;
}
var head = /^#+([:*])\s*([\s\S]*)$/.exec(all.slice(0, k).join("\n"));
var sub = all.slice(k);
if (!head || EMPTY_EXAMPLE_MARKER.test(all[0])) {
return null;
}
var out = { mode: "raw", marker: head[1], template: "", text: "", translation: "", transcription: "",
source: "", sourceURL: "", fields: {}, extra: [] };
var body = $.trim(head[2]);
var parsed = edit.wt.parseTemplateCalls(body);
var call = parsed.calls.length === 1 && !parsed.otherContent ? parsed.calls[0] : null;
var name = call ? edit.wt.canonicalTemplateKey(call.name) : "";
name = name.charAt(0).toLowerCase() + name.slice(1);
var isUsex = USEX_NAMES.indexOf(name) !== -1;
var def = call && jederDefs[name];
if (call && !sub.length && (isUsex || def || name === "jêder")) {
var split = edit.wt.splitCallParams(call.params);
var fieldKeys = def ? def.fields.map(function (f) { return f.key; }) : [];
out.mode = isUsex ? "nimune" : def ? "jeder" : "source";
out.template = def ? name : "";
split.used.forEach(function (key, i) {
var value = brToNl(split.values[key]);
if (key === "1") {
return; // the language, which the section already says
}
if (isUsex ? key === "2" : (key === "jêgirtin" || key === "jg")) {
out.text = value;
} else if ((isUsex ? USEX_TRANSLATION : QUOTE_TRANSLATION).indexOf(key) !== -1) {
out.translation = value;
} else if (USEX_TRANSCRIPTION.indexOf(key) !== -1) {
out.transcription = value;
} else if (def && fieldKeys.indexOf(key) !== -1) {
out.fields[key] = split.values[key];
} else if (name === "jêder" && key === "2") {
out.source = split.values[key];
} else if (name === "jêder" && key === "url") {
out.sourceURL = split.values[key];
} else {
// Named when it was positional, so it cannot shift into a slot the form now fills.
out.extra.push(/^\d+$/.test(key) && !/=/.test(call.params[i]) ? key + "=" + split.values[key] : $.trim(call.params[i]));
}
});
return out;
}
// Any other citation template on a "#*" line -- the Kategorî:Çavkanî ones, {{J:…}} and {{Ç:…}} --
// reads into the category mode: quote, translation and transcription in their boxes, every other
// named parameter as a field. Which of those get a box is known once the template's parameters
// are fetched (see applyAliases).
if (call && !sub.length && out.marker === "*" &&
(/^[JÇ]:/.test($.trim(call.name)) || /(?:^|\|)\s*(?:jêgirtin|jg)\s*=/.test(call.params.join("|")))) {
var catSplit = edit.wt.splitCallParams(call.params);
out.mode = "category";
out.template = $.trim(call.name);
catSplit.used.forEach(function (key, i) {
var value = catSplit.values[key];
if (key === "jêgirtin" || key === "jg") {
out.text = brToNl(value);
} else if (QUOTE_TRANSLATION.indexOf(key) !== -1) {
out.translation = brToNl(value);
} else if (USEX_TRANSCRIPTION.indexOf(key) !== -1) {
out.transcription = brToNl(value);
} else if (key === "wekjêgirtin" && /^Ç:/.test(out.template)) {
return; // buildCitation() writes it for every "Ç:" template
} else if (/^\d+$/.test(key)) {
out.extra.push(!/=/.test(call.params[i]) ? key + "=" + value : $.trim(call.params[i]));
} else {
out.fields[key] = value;
}
});
return out;
}
if (out.marker === ":") {
// The hand-written kind: "#: ''…''", its translation, if any, on a "#::" line under it.
var italic = italicRun(body);
var translationLine = sub.length === 1 ? /^#+::\s*([\s\S]*)$/.exec(sub[0]) : null;
if (italic !== null && (!sub.length || translationLine)) {
out.mode = "nimune";
out.text = brToNl(italic);
out.translation = translationLine ? brToNl(italicRun(translationLine[1]) || $.trim(translationLine[1])) : "";
return out;
}
var withGloss = sub.length ? null : italicWithGloss(body);
if (withGloss) {
out.mode = "nimune";
out.text = brToNl(withGloss.text);
out.translation = brToNl(withGloss.translation);
return out;
}
if (!isUsex) {
return null;
}
}
out.text = all.join("\n");
return out;
}
/**
* Settles which parameters of a read line get a box. aliases maps an alias to its documented name
* (templateAliases); fieldKeys are the boxes the form drew. A parameter written under an alias -- "r="
* for "rûpel=" -- goes to its box; one with no box goes to extra, written back as it was.
*/
function applyAliases(example, aliases, fieldKeys) {
var pending = example.extra.slice();
Object.keys(example.fields).forEach(function (key) {
if (fieldKeys.indexOf(key) === -1) {
pending.push(key + "=" + example.fields[key]);
delete example.fields[key];
}
});
example.extra = [];
pending.forEach(function (param) {
var m = /^\s*([^=]+?)\s*=([\s\S]*)$/.exec(param);
var key = m ? (aliases[m[1]] || m[1]) : null;
var value = m ? $.trim(m[2]) : "";
if (m && fieldKeys.indexOf(key) !== -1 && !example.fields[key]) {
example.fields[key] = value;
} else if (m && key === "jêgirtin" && !example.text) {
example.text = brToNl(value);
} else if (m && QUOTE_TRANSLATION.indexOf(key) !== -1 && !example.translation) {
example.translation = brToNl(value);
} else {
example.extra.push(param);
}
});
return example;
}
/**
* newLine with its parameters in the order originalLine had them, so an edit's diff shows only what
* changed. Parameters match by name -- an alias counting as the name it stands for (aliases, from
* templateAliases) -- and positional ones by position; any the original lacked follow in newLine's own
* order. A line that is not one template call on either side comes back as it was.
*/
function keepOrder(newLine, originalLine, aliases) {
aliases = aliases || {};
var marker = /^#+[:*]\s*/.exec(newLine || "");
var oldBody = /^#+[:*]\s*([\s\S]*)$/.exec(originalLine || "");
if (!marker || !oldBody) {
return newLine;
}
var fresh = edit.wt.parseTemplateCalls(newLine.slice(marker[0].length));
var old = edit.wt.parseTemplateCalls($.trim(oldBody[1]));
if (fresh.calls.length !== 1 || fresh.otherContent || old.calls.length !== 1 || old.otherContent) {
return newLine;
}
function keyed(params) {
var positional = 0;
return params.map(function (raw) {
var m = /^\s*([^|={}\n]+?)\s*=/.exec(raw);
var key = m ? m[1] : String(++positional);
return { key: aliases[key] || key, raw: raw };
});
}
var rest = keyed(fresh.calls[0].params);
var ordered = [];
keyed(old.calls[0].params).forEach(function (o) {
for (var i = 0; i < rest.length; i++) {
if (rest[i].key === o.key) {
ordered.push(rest.splice(i, 1)[0]);
return;
}
}
});
return marker[0] + "{{" + fresh.calls[0].name + ordered.concat(rest).map(function (p) {
return "|" + p.raw;
}).join("") + "}}";
}
// Where the {{ … }} opened on lines[start] closes, so a template written over several lines stays whole.
function braceEnd(lines, start) {
var depth = 0;
for (var i = start; i < lines.length; i++) {
depth += (lines[i].match(/\{\{/g) || []).length - (lines[i].match(/\}\}/g) || []).length;
if (depth <= 0) {
return i;
}
}
return lines.length - 1;
}
// The "#:"/"#*" blocks right under the definition on lines[defIndex], each {start, end, text, example}:
// example is parseCitationLine's reading, or null for a block that is not an example.
function exampleBlocks(lines, defIndex) {
var depth = /^#+/.exec(lines[defIndex])[0].length;
var own = new RegExp("^#{" + depth + "}[:*]");
var deeper = new RegExp("^#{" + depth + "}[:*][:*]");
var blocks = [];
var i = defIndex + 1;
while (i < lines.length && own.test(lines[i])) {
var start = i;
var end = braceEnd(lines, i);
while (end + 1 < lines.length && deeper.test(lines[end + 1])) {
end = braceEnd(lines, end + 1);
}
var text = lines.slice(start, end + 1).join("\n");
blocks.push({ start: start, end: end, text: text, example: parseCitationLine(text) });
i = end + 1;
}
return blocks;
}
/**
* Replaces the index-th example under a definition with code, or removes it when code is null.
* original is the block as it read when the form opened. When the index no longer holds it (an earlier
* queued change moved it) the one block still reading exactly that is used; otherwise nothing is touched.
*/
function replaceExample(pageContent, language, sectionType, sectionOrdinal, definitionLevel, index, original, code) {
var loc = edit.wt.locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var defIndex = edit.wt.findDefinitionLine(lines, loc.posLineIndex, definitionLevel);
var examples = exampleBlocks(lines, defIndex).filter(function (b) {
return b.example;
});
var block = examples[index] && examples[index].text === original ? examples[index] : null;
if (!block) {
var same = examples.filter(function (b) {
return b.text === original;
});
block = same.length === 1 ? same[0] : null;
}
if (!block) {
throw new edit.util.SubmitAbort("Ev nimûne ji dema vekirina formê ve hatiye guhartin — rûpelê nû bike û dîsa biceribîne.");
}
var replacement = code === null ? [] : String(code).split("\n");
lines.splice.apply(lines, [block.start, block.end - block.start + 1].concat(replacement));
return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n");
}
// Words only, lower-cased: links, templates, tags and quote marks out, so the page's drawn text and the
// line's wikitext can be compared.
function normalizeWords(text) {
return String(text || "")
.replace(/\[\[(?:[^\]|]*\|)?([^\]]*)\]\]/g, "$1")
.replace(/\{\{[^{}]*\}\}/g, " ")
.replace(/<[^>]*>/g, " ")
.replace(/'{2,}/g, "")
.toLowerCase()
.replace(/[\s.,;:!?"'“”‘’«»()\[\]\-–—…\/]+/g, "");
}
// True when the text a page draws for an example comes from this line.
function exampleMatches(drawnText, example) {
var source = example.text;
if (example.mode === "raw") {
var quote = /\|\s*(?:jêgirtin|jg)\s*=([^|}]*)/.exec(source);
source = quote ? quote[1] : source.replace(/^#+[:*]\s*/, "");
}
var drawn = normalizeWords(drawnText);
var written = normalizeWords(source);
if (!drawn || !written) {
return false;
}
return drawn === written || written.indexOf(drawn.slice(0, 24)) !== -1;
}
module.exports = {
CATEGORY_KEY: CATEGORY_KEY,
RAW_KEY: RAW_KEY,
COVERED_PARAMS: COVERED_PARAMS,
LANG_LABEL: LANG_LABEL,
jederDefs: jederDefs,
fieldSize: fieldSize,
exclusivePartner: exclusivePartner,
boldenPageTitle: boldenPageTitle,
nlToBr: nlToBr,
nlToSpace: nlToSpace,
fetchCategoryTemplates: fetchCategoryTemplates,
buildCategoryTemplateSearch: buildCategoryTemplateSearch,
openTemplateDialog: openTemplateDialog,
buildTemplateParamForm: buildTemplateParamForm,
templateParams: templateParams,
fieldSpecs: fieldSpecs,
jederFieldSpecs: jederFieldSpecs,
fetchFromCitoid: fetchFromCitoid,
citoidFieldsFor: citoidFieldsFor,
withLinkAsUrl: withLinkAsUrl,
today: today,
buildCitation: buildCitation,
looksLikeTemplate: looksLikeTemplate,
looksLikeCitationLine: looksLikeCitationLine,
USEX_NAMES: USEX_NAMES,
EMPTY_EXAMPLE_MARKER: EMPTY_EXAMPLE_MARKER,
parseCitationLine: parseCitationLine,
applyAliases: applyAliases,
keepOrder: keepOrder,
templateAliases: templateAliases,
exampleBlocks: exampleBlocks,
replaceExample: replaceExample,
exampleMatches: exampleMatches
};
}());
// </nowiki>
ercf8tbbun9mc0gl0czwwtjdgds7ar1
MediaWiki:Gadget-wikt.cite.css
8
1359167
6533061
6414278
2026-09-19T10:13:53Z
Wikihez
7344
Etymology: route {{etîmon}} to its own builder; keyword, modifier and metn= tables in data-main.json; language datalist moved to langs.js
6533061
css
text/css
/* <nowiki> */
/*
* Page: [[MediaWiki:Gadget-wikt.cite.css]]
*
* Styles cite.js's own DOM: the Kategorî:Çavkanî search rows (buildCategoryTemplateSearch) and the
* template-param dialog (openTemplateDialog/buildTemplateParamForm) it shares with DefSideBoxes and
* start.js. .dsb-input and .dsb-adv-label also exist in dsb-panels.css for its own unrelated fields --
* duplicated here, not moved, since those other uses have nothing to do with this module.
*/
/* ── Template parameter form ─────────────────────────────────────────
Built by buildTemplateParamForm(): a fresh insert from Etîmolojî/Çavkanî, editing an existing chip, or a
gloss line that turns out to be one template call. */
.dsb-input {
box-sizing: border-box;
min-width: 16em;
padding: 6px 10px;
font-family: var(--wikt-sans);
font-size: 13px;
color: var(--wikt-ink);
background: var(--wikt-field-bg);
border: 1px solid var(--wikt-field-edge);
border-radius: var(--wikt-r-field);
transition: border-color 0.12s ease, box-shadow 0.12s ease;
}
.dsb-input::placeholder {
color: var(--wikt-placeholder);
opacity: 1;
}
.dsb-input:focus {
border-color: var(--wikt-accent);
box-shadow: 0 0 0 3px var(--wikt-accent-tint);
outline: 0;
}
.dsb-adv-label {
margin-bottom: 4px;
font-size: 12px;
font-weight: 600;
color: var(--wikt-ink-3);
}
.dsb-tpl-name {
font-family: var(--wikt-mono);
font-size: 12px;
color: var(--wikt-ink-3);
}
.dsb-tpl-name a {
color: inherit;
text-decoration: none;
border-bottom: 1px dotted var(--wikt-ink-3);
}
.dsb-tpl-name a:hover {
color: var(--wikt-accent-deep);
}
.dsb-tpl-desc {
margin-top: 2px;
font-size: 12px;
color: var(--wikt-muted);
}
.dsb-tpl-param-row {
display: flex;
flex-direction: column;
gap: 3px;
margin-top: 8px;
}
.dsb-tpl-help {
font-size: 11.5px;
color: var(--wikt-muted);
}
.dsb-tpl-undocumented {
font-weight: 400;
color: var(--wikt-muted);
}
.dsb-tpl-deprecated .dsb-adv-label {
text-decoration: line-through;
color: var(--wikt-muted);
}
/* A parameter that takes inline modifiers reuses the word row, so strip the list styling. */
.dsb-tpl-modifier-list {
margin: 0;
padding: 0;
list-style: none;
}
/* ---- the {{etîmon}} builder --------------------------------------------------------------------- */
.dsb-etimon {
display: flex;
flex-direction: column;
gap: 10px;
}
.dsb-etimon-pagelang,
.dsb-etimon-metn {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
}
.dsb-etimon-lang {
max-width: 11em;
}
/* One step of the chain: its keyword, that keyword's modifiers, and the words it applies to. */
.dsb-etimon-step {
border: 1px solid var(--wikt-card-edge);
border-radius: var(--wikt-r-card);
padding: 8px 10px;
background: var(--wikt-code-bg);
}
.dsb-etimon-step-head {
display: flex;
align-items: flex-start;
gap: 8px;
flex-wrap: wrap;
}
.dsb-etimon-words {
margin: 6px 0 0;
padding: 0;
list-style: none;
display: flex;
flex-direction: column;
gap: 6px;
}
.dsb-etimon-word-row {
display: flex;
align-items: flex-start;
gap: 6px;
flex-wrap: wrap;
}
.dsb-etimon-word-input {
flex: 1 1 12em;
min-width: 10em;
}
/* The modifier chips and their ⊕ sit together, the picker drops out underneath. */
.dsb-etimon-mods {
position: relative;
display: flex;
align-items: center;
gap: 4px;
flex-wrap: wrap;
}
/* An inline <etimon:…>: the same blocks again, one step deeper. */
.dsb-etimon-nested {
margin: 6px 0 0 14px;
padding-left: 10px;
border-left: 2px solid var(--wikt-accent-edge);
}
.dsb-etimon-nested-head {
display: flex;
align-items: center;
gap: 6px;
}
.dsb-etimon-add {
align-self: flex-start;
margin-top: 6px;
border: 0;
padding: 2px 0;
background: none;
color: var(--wikt-accent);
font-size: 12.5px;
cursor: pointer;
}
.dsb-etimon-add:hover {
text-decoration: underline;
}
.dsb-etimon-remove {
border: 0;
background: none;
padding: 0 4px;
color: var(--wikt-muted);
font-size: 15px;
line-height: 1.4;
cursor: pointer;
}
.dsb-etimon-remove:hover {
color: var(--wikt-danger);
}
.dsb-etimon-metn-free {
max-width: 9em;
}
.dsb-etimon-more summary {
cursor: pointer;
font-size: 12.5px;
color: var(--wikt-ink-3);
}
.dsb-etimon-param {
display: flex;
flex-direction: column;
gap: 3px;
margin-top: 8px;
}
/* A flag is a checkbox with its explanation on the label, so it reads as one line. */
.dsb-etimon-param-flag {
flex-direction: row;
align-items: center;
gap: 6px;
}
/* What the form will write, so the wikitext is never a surprise. */
.dsb-etimon-preview {
display: block;
padding: 6px 8px;
border-radius: var(--wikt-r-field);
background: var(--wikt-code-bg);
border: 1px solid var(--wikt-card-edge);
font-family: var(--wikt-mono);
font-size: 11.5px;
color: var(--wikt-ink-2);
word-break: break-all;
}
/* Touch: >=16px stops iOS Safari zooming the page when a field is focused, and the taller box clears the
44px tap minimum. dsb-panels.css says the same for its own fields; the dialog opens on the wizard too,
which never loads that sheet. */
@media (max-width: 720px), (pointer: coarse) {
.dsb-input {
min-height: 40px;
font-size: 16px;
}
}
/* </nowiki> */
9c5va6tn6231msv5c9nf4zzebglswqv
MediaWiki:Gadget-EtytreeZoom.js
8
1359170
6532015
6531936
2026-09-18T14:20:57Z
Wikihez
7344
Zoom button: icon-only, in the box's top right corner; a tree that doesn't fit starts zoomed out; Codex zoomIn/zoomOut icons from Commons
6532015
javascript
text/javascript
// <nowiki>
/*
* Page: [[MediaWiki:Gadget-EtytreeZoom.js]]
*
* Ji [[:en:MediaWiki:Gadget-EtytreeZoom.js]] hatiye wergirtin (guhartoya 88543908, 2025-12-11).
*
* The etymology tree box has a fixed height (Module:etymon/styles.css) and scrolls. For a tree that doesn't
* fit, this gadget:
* - starts zoomed out: the whole tree scaled down to the box's width, with the box as tall as the tree;
* - adds an icon button in the box's top right corner that zooms in to the full-size, scrolling box
* (opened on the entry, the bottom of the tree) and back;
* - lets the zoomed-in tree be dragged with the mouse (touch screens already move it by swiping).
* It works on the ".etytree" markup the tree template renders; without that on the page it does nothing.
*/
const elem = s => document.createRange().createContextualFragment(s).firstChild; // helper
const ZOOM_IN = "Mezin bike";
const ZOOM_OUT = "Biçûk bike";
// Codex icons from Commons, drawn as masks in the text colour so they follow light and dark mode.
const ZOOM_IN_ICON = "https://upload.wikimedia.org/wikipedia/commons/0/0d/Codex_icon_zoomIn_%28v2.6%29.svg";
const ZOOM_OUT_ICON = "https://upload.wikimedia.org/wikipedia/commons/2/26/Codex_icon_zoomOut_%28v2.6%29.svg";
mw.util.addCSS(`
.etytree {
position: relative;
}
.etytree-scale {
position: absolute;
z-index: 1;
padding: 0.3em;
}
.etytree-scale-toggle.cdx-button {
min-width: 0;
min-height: 0;
padding: 0.3em;
opacity: 0.85;
}
.etytree-scale-toggle.cdx-button:hover {
opacity: 1;
}
.etytree-zoom-icon {
display: block;
width: 1.1em;
height: 1.1em;
background-color: currentColor;
-webkit-mask: var(--etytree-icon) center / contain no-repeat;
mask: var(--etytree-icon) center / contain no-repeat;
}
.etytree-body {
transform-origin: top left;
}
.etytree .NavContent.etytree-pannable {
cursor: grab;
}
.etytree .NavContent.etytree-panning {
cursor: grabbing;
user-select: none;
}
`);
// Scroll to the entry: the last block, at the bottom of the tree.
function showEntry(navContent, tree) {
navContent.scrollTop = navContent.scrollHeight;
const blocks = tree.querySelectorAll(".etytree-block");
if (blocks.length) {
const b = blocks[blocks.length - 1].getBoundingClientRect();
const n = navContent.getBoundingClientRect();
navContent.scrollLeft += (b.left + b.width / 2) - (n.left + n.width / 2);
}
}
function zoomOut(tree) {
const navContent = tree.parentElement;
if (!navContent.clientWidth) // collapsed
return;
tree.style.transform = "";
navContent.style.overflow = "hidden"; // hide scrollbars
navContent.style.maxHeight = "none"; // let the box grow to the whole tree
const scale = Math.min(1, navContent.clientWidth / tree.scrollWidth);
tree.style.transform = `scale(${scale})`;
navContent.scrollLeft = 0;
navContent.scrollTop = 0;
navContent.style.height = `${tree.scrollHeight * scale}px`;
}
function zoomIn(tree) {
const navContent = tree.parentElement;
tree.style.transform = "";
navContent.style.overflow = "";
navContent.style.maxHeight = "";
navContent.style.height = "";
showEntry(navContent, tree);
}
// Drag to move around the tree. A drag shorter than a few pixels stays a click, so links still work.
function makeDraggable(navContent) {
let startX = 0, startY = 0, left = 0, top = 0, down = false, moved = false;
navContent.addEventListener("mousedown", e => {
if (e.button !== 0 || !navContent.classList.contains("etytree-pannable"))
return;
down = true;
moved = false;
startX = e.clientX;
startY = e.clientY;
left = navContent.scrollLeft;
top = navContent.scrollTop;
});
window.addEventListener("mousemove", e => {
if (!down)
return;
const dx = e.clientX - startX, dy = e.clientY - startY;
if (!moved && Math.abs(dx) + Math.abs(dy) < 5)
return;
moved = true;
navContent.classList.add("etytree-panning");
navContent.scrollLeft = left - dx;
navContent.scrollTop = top - dy;
e.preventDefault();
});
window.addEventListener("mouseup", () => {
if (!down)
return;
down = false;
navContent.classList.remove("etytree-panning");
// The click that ends a drag fires before this timer; after it, clicks count again. Without
// this, a drag released outside the box would swallow the next real click in it.
setTimeout(() => { moved = false; }, 0);
});
// A drag that ends on a link must not follow it.
navContent.addEventListener("click", e => {
if (moved) {
e.preventDefault();
e.stopPropagation();
moved = false;
}
}, true);
}
mw.hook("wikipage.content").add(function($content) {
for (let etytree of $(".etytree", $content).toArray()) {
if (etytree.dataset.etytreeZoom) // already set up
continue;
etytree.dataset.etytreeZoom = "1";
let navContent = etytree.querySelector(".NavContent");
let tree = navContent.querySelector(".etytree-body");
let etytreeScale = elem(`<div class="etytree-scale"><button class="etytree-scale-toggle cdx-button cdx-button--icon-only"><span class="etytree-zoom-icon"></span></button></div>`);
let toggle = etytreeScale.querySelector(".etytree-scale-toggle");
let maxHeight = parseFloat(getComputedStyle(navContent).maxHeight); // the fixed height, from the stylesheet
let started = false;
// A sibling of the box, placed over its top right corner, so it doesn't scroll with the tree.
navContent.before(etytreeScale);
etytree.treeZoomedOut = false;
// Whether the full-size tree is wider or taller than the box.
function tooBig() {
return tree.scrollWidth > navContent.clientWidth + 1 || tree.scrollHeight > maxHeight + 1;
}
function setIcon() {
const label = etytree.treeZoomedOut ? ZOOM_IN : ZOOM_OUT;
const icon = etytree.treeZoomedOut ? ZOOM_IN_ICON : ZOOM_OUT_ICON;
toggle.title = label;
toggle.setAttribute("aria-label", label);
toggle.firstElementChild.style.setProperty("--etytree-icon", `url("${icon}")`);
}
function update() {
const open = navContent.clientHeight > 0;
etytreeScale.style.display = open && tooBig() ? "" : "none";
if (open) {
// Inside the box's border and clear of its scrollbar.
etytreeScale.style.top = `${navContent.offsetTop + navContent.clientTop}px`;
etytreeScale.style.right = `${etytree.clientWidth - navContent.offsetLeft - navContent.clientLeft - navContent.clientWidth}px`;
}
navContent.classList.toggle("etytree-pannable", !etytree.treeZoomedOut && open && tooBig());
}
toggle.addEventListener("click", () => {
etytree.treeZoomedOut = !etytree.treeZoomedOut;
if (etytree.treeZoomedOut)
zoomOut(tree);
else
zoomIn(tree);
setIcon();
update();
});
// The box may start collapsed; zoom out the first time it has a size.
function refresh() {
if (!started && navContent.clientHeight > 0) {
started = true;
etytree.treeZoomedOut = tooBig();
setIcon();
}
if (etytree.treeZoomedOut) // redo the zoom out
zoomOut(tree);
update();
}
makeDraggable(navContent);
setIcon();
refresh();
(new ResizeObserver(refresh)).observe(navContent);
}
});
// </nowiki>
lbhh96sp2d69uj6lwi4gm4aatteby3n
MediaWiki:Gadget-wikt.dsb-panels.js
8
1359173
6533073
6529971
2026-09-19T10:15:06Z
Wikihez
7344
DefSideBoxes: numbered sense-group headings, subsection rename and removal, bottom-up conversions, bracketed examples, and the add-subsection form fix
6533073
javascript
text/javascript
// <nowiki>
/*
* Page: [[MediaWiki:Gadget-wikt.dsb-panels.js]]
*
* Everything DefSideBoxes shows once you click: the per-sense advanced panel, the subsection editors,
* the part-of-speech picker, the template dialogs, the preview and the queued save.
*
* Loaded on demand by wikt.dsb, never on a plain page view. It exports only what that half calls.
*/
(function () {
"use strict";
var sections = require("ext.gadget.wikt.core").sections;
var edit = require("ext.gadget.wikt.edit");
var cite = require("ext.gadget.wikt.cite");
var util = edit.util;
var posparams = edit.posparams;
var wt = edit.wt;
var startData = edit.data;
var langs = edit.langs;
var escapeRegExp = util.escapeRegExp;
// Local names for the shared wikitext layer, so every call site below reads as it always did.
var langHeaderSource = wt.langHeaderSource;
var canonicalTemplateKey = wt.canonicalTemplateKey;
var aliasPattern = wt.aliasPattern;
var splitLeadingCalls = wt.splitLeadingCalls;
var splitTemplateParams = wt.splitTemplateParams;
var parseTemplateCalls = wt.parseTemplateCalls;
var splitCallParams = wt.splitCallParams;
var buildTemplateCall = wt.buildTemplateCall;
var tdText = wt.tdText;
var fetchTemplateData = wt.fetchTemplateData;
var parseWordListCall = wt.parseWordListCall;
var parseWordListCalls = wt.parseWordListCalls;
var namedParam = wt.namedParam;
var withNamedParam = wt.withNamedParam;
var buildWordListCall = wt.buildWordListCall;
var parseBulletWordList = wt.parseBulletWordList;
var sectionNames = sections.sectionNames;
var MANE_SECTION = sections.MANE_SECTION;
var PAGE_SUBSECTIONS = sections.PAGE_SUBSECTIONS;
var headingOuter = sections.headingOuter;
var headingText = sections.headingText;
var isManeHeading = sections.isManeHeading;
var sectionTypeOf = sections.sectionTypeOf;
var sectionOrdinalWithinLanguage = sections.sectionOrdinalWithinLanguage;
var isFormOfWrapper = sections.isFormOfWrapper;
var eachLeafDefinition = sections.eachLeafDefinition;
var api = new mw.Api();
// metadata[lang].g, minus the grammatical-number codes start.js filters out with isNumberCode(), rendered
// the way its genderLabel() does ("m-p" -> "mê (pirjimar)").
// start.js asks transitivity and structural form as two questions and joins them as "<form>-<base>", so
// "gerguhêz" alone is "gh" and "xwerû" + "gerguhêz" is "x-gh".
// Template call convertSectionToPos() drops under a newly-chosen POS heading, e.g. "Hoker" -> "{{hoker|ku}}".
// A "Formeke X" (form-of) heading uses the unchanged base pos template. Doubles as the list of template
// calls a conversion may find under the OLD heading and replace, rather than leave stacked beside the new one.
// A section's template call. "Formeke Xê" uses X's own template with form=erê. Biwêj is recognised so a
// conversion can replace its {{biwêj}}, but never written: no new ones.
function posTemplateFor(header) {
var form = /^Formeke (.+)ê$/.exec(header || "");
if (form && startData.posChoices[form[1]] && sections.hasFormHeading(form[1])) {
return { name: form[1], params: ["form=erê"] };
}
var key = util.decapitalize(header || "");
return startData.posChoices[key] ? { name: key, params: [] } : null;
}
// convertSectionToPos() drops whichever of the tag's names is actually present.
var MANE_TAG_REGEX = wt.MANE_TAG_REGEX;
// The six per-sense groups start.js writes as "#: {{tpl|lang|word1|word2}}" sub-lines under a "#" definition.
// Array order controls where a new group line lands relative to existing ones. Every group lives behind the
// quick row's "Hevmane û Bêhtir" dropdown; only the gloss and Nimûne/jêgirtin links sit in the row itself.
var SENSE_GROUPS = startData.senseGroups;
// The column word-list template new sections are written with; the rest of wordlistTemplates are
// spellings the parser also accepts.
var WORDLIST_TEMPLATE = startData.wordlistTemplates[0];
// ---- {{werger-ser}} / {{werger-bin}}: one translation box ----
// The pair brackets the rows; the translation editor gadget writes the rows themselves onto the
// rendered page, so this only ever builds (and reads back) the opening call.
// Parameters, from [[Şablon:werger-ser]]: 1 = the sense shown in the box head, 2 = a note in
// parentheses after it, id = anchor override (defaults to 1), stûn = column count, firehî = column
// width (default 26em), bgcolor, valign (default top), align (default left).
var WERGER_NAMED = ["id", "stûn", "firehî", "bgcolor", "valign", "align"];
function buildWergerBlock(params) {
var parts = ["werger-ser"];
// Positional slots: 2 can only be reached past 1, so an empty 1 still has to be written.
if (params["1"] || params["2"]) {
parts.push(params["1"] || "");
}
if (params["2"]) {
parts.push(params["2"]);
}
WERGER_NAMED.forEach(function (key) {
if (params[key]) {
parts.push(key + "=" + params[key]);
}
});
return "{{" + parts.join("|") + "}}\n{{werger-bin}}";
}
// The opening call of the first block in `text`, as the same {1, 2, id, ...} object. Empty object when
// there is none, so a half-typed draft restores as an empty form rather than throwing.
function parseWergerBlock(text) {
var out = {};
var body = wergerSerBody(String(text || ""));
if (!body) {
return out;
}
var positional = 0;
splitTemplateArgs(body).forEach(function (arg) {
var eq = arg.indexOf("=");
var name = eq === -1 ? "" : $.trim(arg.slice(0, eq));
if (eq !== -1 && WERGER_NAMED.indexOf(name) !== -1) {
out[name] = $.trim(arg.slice(eq + 1));
} else {
out[String(++positional)] = $.trim(arg);
}
});
return out;
}
// Everything after "{{werger-ser|" up to the "}}" that closes it, or "" when there is no call or it
// takes no parameters. Scans for the matching close rather than the first one: a gloss can hold a
// template of its own, and a lazy regex would stop inside it.
function wergerSerBody(text) {
var m = /\{\{\s*werger-ser\s*(?=[|}])/.exec(text);
if (!m) {
return "";
}
var depth = 1;
var start = m.index + m[0].length;
for (var i = start; i < text.length - 1; i++) {
var two = text.substr(i, 2);
if (two === "{{") {
depth++; i++;
} else if (two === "}}") {
depth--; i++;
if (!depth) {
return text.charAt(start) === "|" ? text.slice(start + 1, i - 1) : "";
}
}
}
return "";
}
// Splits on "|" at brace/bracket depth 0, so a value containing a template or a link stays whole.
function splitTemplateArgs(body) {
var args = [];
var depth = 0;
var current = "";
for (var i = 0; i < body.length; i++) {
var two = body.substr(i, 2);
if (two === "{{" || two === "[[") {
depth++; current += two; i++; continue;
}
if (two === "}}" || two === "]]") {
depth--; current += two; i++; continue;
}
if (body[i] === "|" && depth <= 0) {
args.push(current); current = ""; continue;
}
current += body[i];
}
args.push(current);
return args;
}
// Canonical ku.wiktionary "====" subsection order, used only as insertPageSubsection()'s insertion rank
// (see subsectionRankForHeader()). Wider than PAGE_SUBSECTIONS: it also covers subsections the gadget
// cannot create but still has to order around.
var SUBSECTION_ORDER = startData.subsectionOrder;
// ---- searchable <select> ----------------------------------------------------------------------------
// Same widget start.js gets from its util.js wrapNativeSelect(): the native <select> stays as the value
// holder (so .val() and "change" handlers keep working) but is hidden behind a text input that filters an
// overlay list. Ported rather than required() because util.js is a file inside start.js's package module,
// which another gadget cannot reach; the template-row decoration start.js uses is left out.
// util.js's wrapNativeSelect(): the native <select> stays the value holder behind a filtering text input.
// It reads its own placeholder off data-placeholder, and its wiktku-* styles ship in start.css, so both
// gadgets get the identical widget instead of two lookalikes.
function makeSearchable($select, placeholder) {
$select.attr("data-placeholder", placeholder || "Lê bigere…");
return util.wrapNativeSelect($select);
}
// ---- small shared utilities ----
// The readable half of an mw.Api rejection.
var apiErrorMessage = util.apiErrorMessage;
// Thrown from inside an edit() transform to bail out with a specific message.
var SubmitAbort = util.SubmitAbort;
// A gloss is one field on the page: the sense, then {{îzah|…}} explaining it when there is one.
function joinGloss(mane, izah) {
return izah ? $.trim(mane + " {{îzah|" + izah + "}}") : $.trim(mane);
}
// The two halves are linked separately, never joined first: linkify leaves template calls alone by
// design, so anything inside {{îzah|…}} would never be looked at.
//
// A half is skipped when there is nothing in it worth looking up, and -- when onlyUnlinked is set --
// when it already carries a link. Someone who has linked a word by hand has made that half theirs, and
// a save must not go on linking the rest of it behind their back; "Oto-lînk bike" leaves the flag off
// and still links on demand.
function linkifyGlossParts(mane, izah, done, onlyUnlinked) {
function needsLinking(text) {
if (!$.trim(text) || !util.hasLinkableText(text)) {
return false;
}
return !(onlyUnlinked && text.indexOf("[[") !== -1);
}
function step(text, next) {
if (!needsLinking(text)) {
next(text, null);
return;
}
util.linkifyText(text, function (linked, error) {
// An empty answer would wipe what the user typed, so only real text is taken.
next(typeof linked === "string" && $.trim(linked) ? $.trim(linked) : text, error || null);
});
}
step(mane, function (linkedMane, maneError) {
step(izah, function (linkedIzah, izahError) {
done(linkedMane, linkedIzah, maneError || izahError);
});
});
}
// Runs transformFn(content) inside mw.Api().edit()'s own transform callback so one fetch covers both the
// edit-conflict check and the content, preventing a stale overwrite of someone else's edit.
//
// No badtoken retry here on purpose: edit() posts through postWithEditToken -> postWithToken, which
// already throws the cached token away and repeats the request once when the wiki says "badtoken".
// A second retry of our own would only double it.
function editPage(summary, transformFn, onSuccess, onError) {
api.edit(mw.config.get("wgPageName"), function (revision) {
return { text: transformFn(revision.content), summary: summary };
}).then(onSuccess, function (codeOrAbort, result) {
if (codeOrAbort instanceof SubmitAbort) {
onError(codeOrAbort.message);
} else {
onError(util.msg.saveFailed + apiErrorMessage(codeOrAbort, result));
}
});
}
// ---- rendered preview: wikitext through the parse API, so a preview shows what the templates
// actually produce rather than a plain list standing in for them ----
// Same text is usually asked for twice (open the preview, close it, open it again), so the promise is
// kept rather than the call repeated.
var renderCache = {};
/**
* Renders wikitext as this page would render it. Resolves with an HTML string.
*
* pst: 1 applies pre-save transform, so ~~~~ and subst: behave as they will once saved. The
* modulestyles/modules the parse reports are loaded before resolving: without them TemplateStyles is
* missing and the preview would show the right markup in the wrong clothes.
*/
function renderWikitext(wikitext) {
if (renderCache[wikitext]) {
return renderCache[wikitext];
}
renderCache[wikitext] = api.post({
action: "parse",
format: "json",
formatversion: 2,
title: mw.config.get("wgPageName"),
text: wikitext,
contentmodel: "wikitext",
prop: "text|modules|jsconfigvars",
pst: 1,
disablelimitreport: 1,
disableeditsection: 1,
disabletoc: 1
}).then(function (data) {
var parsed = (data && data.parse) || {};
if (parsed.modulestyles && parsed.modulestyles.length) {
mw.loader.load(parsed.modulestyles);
}
if (parsed.modules && parsed.modules.length) {
mw.loader.load(parsed.modules);
}
return parsed.text || "";
}, function () {
// A failed render must not be remembered, or the next attempt gets the rejection back.
delete renderCache[wikitext];
return $.Deferred().reject().promise();
});
return renderCache[wikitext];
}
/**
* Puts rendered wikitext into $target, replacing whatever placeholder is there.
*
* The site's own gadgets are told about it through the "wikipage.content" hook, the same way
* MediaWiki announces real content, so collapsible lists and the like behave in the preview too.
*/
// MediaWiki warns when the hook is fired on content that is not in the document, and a gadget that
// listens to it can do nothing useful with nodes nobody can see.
function announceContent($el) {
if ($el.closest("html").length) {
mw.hook("wikipage.content").fire($el);
}
}
function fillWithRendered($target, wikitext, onFail) {
return renderWikitext(wikitext).then(function (html) {
if (!$target.closest("body").length) {
return; // the preview was dropped while the parse was in flight
}
$target.empty().append($("<div class='mw-parser-output'></div>").html(html));
announceContent($target);
}, function () {
if (onFail) onFail();
});
}
/**
* Puts a rendered sense in place of the one on the page, keeping this gadget's own furniture (the
* pencil's toolbar, the quick row, any open panel) where it is. The page's own nodes are detached
* rather than dropped, so the returned function can put them straight back when the change is
* cancelled or superseded.
*
* Nothing labels the result: the change is shown by the sense simply reading the way it will read,
* and the queue box is what says nothing is saved yet.
*/
function replaceSenseInPlace($li, item) {
var html = item.html;
var $anchor = $li.children(".dsb-toolbar").last();
// class/id/data-* off the parsed <li>, so a queued maneid shows its pill here exactly as it will
// once saved. The old values are kept for the restore below.
var node = $li.get(0);
var before = {};
$.each(node.attributes, function (_, attr) {
before[attr.name] = attr.value;
});
$.each(item.attrs, function (name, value) {
if (name !== "class") {
$li.attr(name, value);
}
});
var addedClasses = (item.attrs["class"] || "").split(/\s+/).filter(function (c) {
return c && !$li.hasClass(c);
});
$li.addClass(addedClasses.join(" "));
// add-examples hangs its own <ul> off the sense and opens its form as that <ul>'s next sibling.
// Detaching those leaves the form to open into a tree nobody can see -- "+ Nimune/jegirtin" takes
// the click and shows nothing -- so they stay where they are. Only the rows already in that <ul>
// are hidden, since the preview draws the examples itself; the tool's own title line stays.
var $keep = $li.children("ul, .add-example-form");
var $hiddenRows = $keep.filter("ul").children("li").filter(function () {
return !$(this).find(".add-example-form-title").length;
});
$hiddenRows.addClass("dsb-preview-hidden");
var originals = $li.contents().filter(function () {
return !$(this).is(".dsb-toolbar, .dsb-quick-row, .dsb-subsection-panel, .dsb-preview-block, .dsb-sense-preview");
}).not($keep).get();
// Where the sense's own nodes sat, so cancelling puts them back there rather than above the quick
// row -- the row belongs between the sense and its examples.
var backAfter = originals.length ? originals[0].previousSibling : null;
var $rendered = $("<span class='dsb-sense-preview'></span>").html(html);
if ($anchor.length) {
$anchor.after($rendered);
} else {
$li.prepend($rendered);
}
$(originals).detach();
announceContent($rendered);
// The id pill is drawn by the same code a page load uses, so a queued maneid looks like a saved
// one rather than like something this gadget invented.
if (window.wikt && wikt.showIDs && wikt.showIDs.process) {
wikt.showIDs.process($li);
}
// dsb.js puts the example pencils back on the redrawn examples. The originals keep theirs.
$li.triggerHandler("dsbSenseRedrawn");
return function () {
$hiddenRows.removeClass("dsb-preview-hidden");
$li.removeClass(addedClasses.join(" "));
$.each(item.attrs, function (name) {
if (name === "class") {
return;
}
if (Object.prototype.hasOwnProperty.call(before, name)) {
$li.attr(name, before[name]);
} else {
$li.removeAttr(name);
}
});
$li.children(".senseid-displayed, .etymid-displayed, .etymonid-displayed").remove();
if (backAfter && backAfter.parentNode === node) {
$(backAfter).after(originals);
} else if ($anchor.length) {
$anchor.after(originals);
} else {
$li.prepend(originals);
}
$rendered.remove();
};
}
/**
* The <li> out of a parsed "#" block, and the attributes it carries.
*
* The parse wraps it in its own <ol>, which must not reach the page: the sense already has a number
* from the list it lives in. A leading {{maneid}} also makes the parser emit an empty
* "li.mw-empty-elt" ahead of the real one, so the first <li> is not necessarily the sense.
*
* The attributes matter as much as the content: {{maneid|ku|x}} renders as class="senseid"
* data-id="x" on the <li> itself, which is what wikt.showids draws its pill from.
*/
function parsedSenseItem(html, depth) {
var $item = $("<div></div>").html(html).find("ol > li").filter(function () {
return !$(this).hasClass("mw-empty-elt");
}).first();
// A sub-sense parsed on its own comes back one <ol> deeper per "#": "##" is a list inside a list.
// Descend as far as the sense's own depth, or its number would be drawn inside a second list --
// "2." with a "1." under it.
for (var level = 1; level < (depth || 1) && $item.length; level++) {
var $inner = $item.children("ol").children("li").filter(function () {
return !$(this).hasClass("mw-empty-elt");
}).first();
if (!$inner.length) {
break;
}
$item = $inner;
}
if (!$item.length) {
return { html: html, attrs: {} };
}
var attrs = {};
$.each($item.get(0).attributes, function (_, attr) {
attrs[attr.name] = attr.value;
});
return { html: $item.html(), attrs: attrs };
}
// This gadget's own save queue + floating widget, separate from the shared Gadget-Editor queue.
// Each entry keeps its own transformFn so saveQueueNow() can re-run all of them against one fresh fetch.
var dsbQueue = {
// [{key, summary, transformFn, runLast, removePreview}]; transformFn: baseContent -> {content, warnings}.
// removePreview lives on the entry so replacing one entry takes its own live DOM preview with it.
entries: []
};
var $queueBox = null;
function dropPreview(entry) {
if (typeof entry.removePreview === "function") {
try {
entry.removePreview();
} catch (e) { /* a preview failing to clean up should never block the queue itself */ }
entry.removePreview = null;
}
}
function clearAllPreviews() {
dsbQueue.entries.forEach(dropPreview);
}
function clearQueue() {
clearAllPreviews();
dsbQueue.entries = [];
if ($queueBox) {
$queueBox.$list.empty();
$queueBox.$box.hide();
}
}
// Closes every editor UI on the page. Each open box's own "x" clears its getter, restores its picker
// link and updates the counter, so those are triggered rather than repeating that work here; hiding a
// row alone would leave its fields populated and the next pencil click would reopen them half-filled.
function closeAllPanels() {
$(".dsb-open-boxes .dsb-box-remove").trigger("click");
$(".dsb-quick-note").hide().text("");
$(".dsb-more-menu").hide();
$(".dsb-subsection-panel, .dsb-convert-pos-panel").hide();
// dsb.js owns each pencil's pinned state; tell it rather than hiding behind its back, or the next
// click on the pencil would only toggle "pinned" off and appear to do nothing.
$(".dsb-quick-row").trigger("dsbCancel");
}
function ensureQueueBox() {
if ($queueBox) {
return $queueBox;
}
var $box = $("<div class='dsb-queue-box'></div>").hide();
var $close = $("<a href='#' class='dsb-queue-close' title='Veşêre'>×</a>");
var $title = $("<div class='dsb-queue-title'></div>").text("Guhartinên li benda qeydkirinê");
var $list = $("<ul class='dsb-queue-list'></ul>");
var $empty = $("<div class='dsb-queue-empty'></div>").text(
"Guhartinên te dê li vir werin rêzkirin. Heta ku tu pêl «Guhartinan qeyd bike» nekî, "
+ "tiştek li ser rûpelê nayê weşandin."
);
var $status = $("<div class='dsb-queue-status'></div>");
var $save = $("<button type='button' class='dsb-queue-save'>Guhartinan qeyd bike</button>");
var $cancel = $("<button type='button' class='dsb-queue-cancel'></button>").text(util.msg.cancel);
var $actions = $("<div class='dsb-queue-actions'></div>").append($save, $cancel);
$close.on("click", function (e) {
e.preventDefault();
$box.hide();
});
$cancel.on("click", function () {
clearQueue();
closeAllPanels();
});
$save.on("click", function () {
saveQueueNow();
});
$box.append($close, $title, $empty, $list, $actions, $status);
$(document.body).append($box);
$queueBox = { $box: $box, $list: $list, $empty: $empty, $status: $status, $save: $save, $cancel: $cancel };
return $queueBox;
}
// Takes one change out of the queue and puts the page back as it was before it, its in-place preview
// included. The queue is the only record of what "Guhartinan qeyd bike" will write, so every line in it
// has to be removable on its own -- closing the panel that made a change does not unmake it.
// Each preview draws the page the whole queue would save, so one entry leaving changes what all the
// others should show. They are taken down and drawn again from what is left.
function redrawPreviews() {
dsbQueue.entries.forEach(function (entry) {
if (typeof entry.previewFn !== "function") {
return;
}
dropPreview(entry);
try {
var removePreview = entry.previewFn();
if (typeof removePreview === "function") {
entry.removePreview = removePreview;
}
} catch (e) { /* a broken preview never stops the queue */ }
});
}
function dropQueueEntry(entry) {
var at = dsbQueue.entries.indexOf(entry);
if (at === -1) {
return;
}
dropPreview(entry);
dsbQueue.entries.splice(at, 1);
redrawPreviews();
renderQueueBox();
hideQueueIfIdle();
}
function renderQueueBox() {
var box = ensureQueueBox();
box.$list.empty();
dsbQueue.entries.forEach(function (entry) {
var $drop = $("<button type='button' class='dsb-queue-drop'>×</button>")
.attr("title", "Vê guhartinê ji rêzê derxe");
$drop.on("click", function () {
dropQueueEntry(entry);
});
box.$list.append($("<li></li>").text(entry.summary).append($drop));
});
box.$empty.toggle(!dsbQueue.entries.length);
box.$status.removeClass("dsb-status-ok dsb-status-error").text("");
box.$save.prop("disabled", !dsbQueue.entries.length);
box.$box.show();
}
// Shown the moment a panel opens, empty, so it is clear before anything is typed that a change waits
// for "Guhartinan qeyd bike" rather than publishing itself.
function openQueueBox() {
renderQueueBox();
}
// Nothing queued and no form left open means nothing to save, so the box goes away rather than
// lingering on an empty state.
function hideQueueIfIdle() {
if (dsbQueue.entries.length || !$queueBox) {
return;
}
if ($(".dsb-quick-row:visible, .dsb-subsection-panel:visible, .dsb-convert-pos-panel:visible").length) {
return;
}
$queueBox.$box.hide();
}
// Asks core's postEdit module to show its toast on the next load (dsb.js loads it there), then reloads.
// Loaded here rather than declared as a dependency, so a reload happens even if it fails.
function reloadWithPostEditNotice() {
mw.loader.using("mediawiki.action.view.postEdit").then(function (require) {
require("mediawiki.action.view.postEdit").fireHookOnPageReload("saved");
}).always(function () {
location.reload();
});
}
// A transform returns either the new page text or {content, warnings}; both shapes are accepted.
// One that returns neither stops the save, named, rather than writing a broken page.
function transformedContent(entry, pageContent) {
var result = entry.transformFn(pageContent);
var next = typeof result === "string" ? result : (result && result.content);
if (typeof next !== "string") {
throw new SubmitAbort("Guhartin nehate sepandin: " + entry.summary);
}
return next;
}
// Queue order, except that runLast entries move to the end: converting "=== Mane ===" into a real POS
// heading renames the very heading every other queued change locates itself by.
// Those run from the bottom of the page up: a rename changes the ordinals of the sections after it
// ("Mane 2" becomes "Mane 1"), never of the ones before.
function orderedEntries() {
var normal = [];
var last = [];
dsbQueue.entries.forEach(function (entry) {
(entry.runLast ? last : normal).push(entry);
});
last.sort(function (a, b) {
return b.pagePosition - a.pagePosition;
});
return normal.concat(last);
}
/**
* The pending page as previews and example lookups need it: every queued transform, in save order,
* except the runLast section renames. Those callers find their section under the heading it has on
* the page now, which a queued "Mane" -> "Navdêr" would take away, and a rename leaves the senses as
* they are. An entry that cannot apply is skipped -- the save reports that properly, and a preview
* must not shout.
*/
function queuedContent(pageContent) {
var content = pageContent;
orderedEntries().filter(function (entry) {
return !entry.runLast;
}).forEach(function (entry) {
try {
content = transformedContent(entry, content);
} catch (e) {
// Left out of the preview; the save reports it properly. Named, so a change that fails to
// draw is distinguishable from one with nothing to draw.
mw.log.warn("wikt.dsb: pêşdîtin bêyî vê guhartinê hate xêzkirin — " + entry.summary, e);
}
});
return content;
}
/**
* Redraws one sense where it sits, from the page the queue would save -- so a queued gloss edit, a
* queued example and everything else pending on that sense are shown together, rendered by the parser
* rather than described in a box. Returns the queue's own "take the preview down" function.
*
* One preview per sense: a second queued change takes the first drawing down and draws the queue.
*/
function previewSense($li, language, sectionType, sectionOrdinal, definitionLevel) {
var cancelled = false;
var restore = null;
function undo() {
cancelled = true;
if (restore) {
restore();
restore = null;
}
if ($li.data("dsbPreview") === undo) {
$li.removeData("dsbPreview");
}
}
var previous = $li.data("dsbPreview");
if (typeof previous === "function") {
previous();
}
$li.data("dsbPreview", undo);
fetchPageContent().then(function (pageContent) {
if (cancelled) {
return;
}
var wikitext;
try {
wikitext = senseBlockWikitext(queuedContent(pageContent), language, sectionType,
sectionOrdinal, definitionLevel);
} catch (e) {
return;
}
renderWikitext(wikitext).then(function (html) {
if (cancelled || $li.data("dsbPreview") !== undo || !$li.closest("body").length) {
return;
}
restore = replaceSenseInPlace($li, parsedSenseItem(html, definitionLevel.length - 1));
});
});
return undo;
}
// The real save: re-runs every queued transformFn, in order, against one freshly-fetched revision and
// posts the result as a single edit with a combined summary.
function saveQueueNow() {
if (!dsbQueue.entries.length) {
return;
}
var box = ensureQueueBox();
box.$save.prop("disabled", true);
box.$cancel.prop("disabled", true);
box.$status.removeClass("dsb-status-ok dsb-status-error").text("Tê qeydkirin…");
var entries = orderedEntries();
// Grouped by place, in the order the places were first queued: several changes to one section read
// as "Kurmancî/Navdêr 2: a, b, c" rather than repeating the section name in front of each of them.
var order = [];
var byPlace = {};
entries.forEach(function (entry) {
if (!Object.prototype.hasOwnProperty.call(byPlace, entry.place)) {
byPlace[entry.place] = [];
order.push(entry.place);
}
byPlace[entry.place].push(entry.action);
});
var combinedSummary = order.map(function (place) {
var actions = byPlace[place].join(", ");
return place ? place + ": " + actions : actions;
}).join("; ") + " (DefSideBoxes)";
editPage(
combinedSummary,
function (pageContent) {
var content = pageContent;
entries.forEach(function (entry) {
content = transformedContent(entry, content);
});
return content;
},
function (data) {
forgetPageContent();
clearAllPreviews();
dsbQueue.entries = [];
box.$list.empty();
box.$status
.removeClass("dsb-status-error")
.addClass("dsb-status-ok")
.text("✓ Hemû guhartin hatin qeydkirin.");
box.$save.prop("disabled", true);
box.$cancel.prop("disabled", false);
// A real edit reloads the page and gets MediaWiki's own "Guhartina te hat weşandin." toast, the
// one a normal save shows. A null edit changed nothing, so the page stays as it is.
if (data && data.newrevid) {
reloadWithPostEditNotice();
}
},
function (message) {
box.$save.prop("disabled", false);
box.$cancel.prop("disabled", false);
box.$status.removeClass("dsb-status-ok").addClass("dsb-status-error").text(message);
}
);
}
// "Kurmancî/Navdêr" -- where a queued change lands, for its summary. The language name comes from the
// shipped list; an unknown code is left as the code itself.
// "Kurmancî/Navdêr", or "Kurmancî/Navdêr 2" where the language has more than one section of that
// type. Without the number a summary on a page with two Navdêr sections named neither of them.
// Numbered only when it disambiguates: on the usual page "Navdêr 1" would just be noise.
function placeLabel(language, sectionType, $h3) {
return langLabel(language) + "/" + sectionLabel(sectionType, $h3);
}
// Bilêvkirin sits above the parts of speech and belongs to the whole language, so naming the section
// it was opened from would say something untrue about what the edit touches.
function subsectionPlaceLabel(subsection, language, sectionType, $h3) {
if (subsection && subsection.free) {
return langLabel(language) + "/" + subsection.header;
}
return subsection && subsection.place === "pron"
? langLabel(language)
: placeLabel(language, sectionType, $h3);
}
function sectionLabel(sectionType, $h3) {
if ($h3 && $h3.length && sections.sectionTypeCountWithinLanguage($h3) > 1) {
return sectionType + " " + sections.sectionOrdinalWithinLanguage($h3);
}
return sectionType;
}
// Capitalised because it opens the summary; Kurdish otherwise writes language names lower-case.
function langLabel(language) {
var names = langs.names();
return util.capitalize(names[language] || language);
}
// The parts of a sense the form actually changed, so the summary lists them instead of saying nothing.
function senseChangeLabels(changes) {
var parts = [];
var changed = changes.changed || {};
if (changes.gloss) {
parts.push("mane");
}
if (changes.newSense) {
parts.push("maneyeke nû");
}
SENSE_GROUPS.forEach(function (group) {
if (changed["word:" + group.key]) {
parts.push(group.label.toLowerCase());
}
});
if (changed.maneid) {
parts.push("id");
}
if (changed.etiket) {
parts.push("etîket");
}
if (changed.kategori) {
parts.push("kategorî");
}
return parts;
}
// Queues transformFn(baseWikitext) -> {content, warnings} for the real save to run later against fresh
// content (see saveQueueNow()); nothing here touches the page yet. Also runs previewFn(), which drops a
// small "not saved yet" preview into the live DOM at the change's own spot on the page. Shared by every
// panel that queues a wikitext change: buildAdvancedPanel, buildSubsectionPanel, buildConvertPosPanel.
// place is what the change is being made to ("Kurmancî/Navdêr 2"), action is what is being done to it.
// Kept apart rather than pre-joined so saveQueueNow() can name a section once and list everything
// queued against it after it, instead of repeating the place before every item.
function queueChange(place, action, transformFn, $save, $status, previewFn, opts) {
opts = opts || {};
var entry = {
key: opts.key || null,
place: place || "",
action: action,
summary: place ? place + ": " + action : action,
transformFn: transformFn,
runLast: !!opts.runLast,
pagePosition: opts.pagePosition || 0,
// Kept, not just run: redrawPreviews() calls it again when another entry leaves the queue.
previewFn: typeof previewFn === "function" ? previewFn : null,
removePreview: null
};
// Queuing the same target twice replaces the pending change rather than stacking a second one --
// two "+Têkildar" entries would both run, and the second would abort on "Ev beş jixwe heye".
var superseded = false;
if (entry.key) {
for (var i = dsbQueue.entries.length - 1; i >= 0; i--) {
if (dsbQueue.entries[i].key === entry.key) {
dropPreview(dsbQueue.entries[i]);
dsbQueue.entries.splice(i, 1);
superseded = true;
}
}
}
dsbQueue.entries.push(entry);
$status.removeClass("dsb-status-error").addClass("dsb-status-ok").text(
"✓ li rêza guhartinan hate zêdekirin — pêl «Guhartinan qeyd bike» bike da ku bi cih bibe."
);
$save.prop("disabled", false);
if (previewFn) {
try {
var removePreview = previewFn();
if (typeof removePreview === "function") {
entry.removePreview = removePreview;
}
} catch (e) { /* a broken preview should never stop the change from being queued */ }
}
// What the superseded entry drew is gone from the queue, so whatever else is drawn from it is stale.
if (superseded) {
dsbQueue.entries.forEach(function (other) {
if (other !== entry) {
dropPreview(other);
}
});
redrawPreviews();
}
renderQueueBox();
}
// Runs text through the ext.gadget.linkify gadget ($.kuLinkify) and calls back with the linkified result.
// Passes the text through unchanged if the gadget can't be loaded, so it never blocks a save.
var linkifyText = util.linkifyText;
// ---- wikitext location ----
//
// One copy for both editing gadgets, in wikt.edit: add-examples writes into the same places.
var langSectionRange = wt.langSectionRange;
var locateSection = wt.locateSection;
var findDefinitionLine = wt.findDefinitionLine;
/**
* The wikitext of one sense's own block: its "#" line plus everything nested under it -- the "#:" word
* lines, the "#*" citations and any sub-senses -- stopping at the next line of the same depth that
* starts a new sense. Parsed on its own that block renders as exactly the <li> the page shows.
*/
function senseBlockWikitext(pageContent, language, sectionType, sectionOrdinal, definitionLevel) {
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel);
var depth = definitionLevel.length - 1;
var out = [lines[defLine]];
for (var i = defLine + 1; i < lines.length; i++) {
var m = /^(#+)([:*]?)/.exec(lines[i]);
if (!m || m[1].length < depth) {
break;
}
// Same depth and no ":" or "*" after the hashes is the next sense, not part of this one.
if (m[1].length === depth && !m[2]) {
break;
}
out.push(lines[i]);
}
return out.join("\n");
}
// Inserts or extends a "#: {{tplKey|lang|word1|word2}}" sub-line for one sense (start.js's wordLine()
// format). If a line for this tplKey already exists under the definition, missing words are appended to
// it; otherwise a new line lands after the last existing group line, always before any "#*" citation lines.
function insertSenseWords(pageContent, language, sectionType, sectionOrdinal, definitionLevel, tplKey, words, opts) {
opts = opts || {};
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel);
var marker = new Array(definitionLevel.length).join("#"); // definitionLevel.length - 1 "#" characters
// Group 1 is the spelling the page uses, group 2 the parameters: an existing {{hevwate}} stays
// {{hevwate}} rather than being silently renamed to {{hevmane}}.
var tplLineRegex = new RegExp("^" + marker + ":\\s*\\{\\{\\s*(" + aliasPattern(tplKey) + ")\\s*\\|([^}]*)\\}\\}\\s*$");
var groupKeysPattern = SENSE_GROUPS.map(function (g) { return aliasPattern(g.key); }).join("|");
var groupLineRegex = new RegExp("^" + marker + ":\\s*\\{\\{\\s*(" + groupKeysPattern + ")\\s*\\|");
var anyBlockLineRegex = new RegExp("^" + marker + "[:*]");
var lastGroupLine = -1;
for (var i = defLine + 1; i < lines.length; i++) {
if (!anyBlockLineRegex.test(lines[i])) {
break;
}
var tplMatch = tplLineRegex.exec(lines[i]);
if (tplMatch) {
var foundKey = tplMatch[1];
if (opts.replace) {
// Editing an existing list: an empty result means the user cleared it, so drop the line.
if (words.length) {
lines[i] = marker + ": {{" + foundKey + "|" + language + "|" + words.join("|") + "}}";
} else {
lines.splice(i, 1);
}
return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n");
}
var params = tplMatch[2].split("|"); // [lang, word1, word2, ...]
var existingWords = params.slice(1);
words.forEach(function (w) {
if (existingWords.indexOf(w) === -1) {
existingWords.push(w);
}
});
lines[i] = marker + ": {{" + foundKey + "|" + language + "|" + existingWords.join("|") + "}}";
return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n");
}
if (groupLineRegex.test(lines[i])) {
lastGroupLine = i;
}
}
var insertAt = lastGroupLine >= 0 ? lastGroupLine + 1 : defLine + 1;
lines.splice(insertAt, 0, marker + ": {{" + tplKey + "|" + language + "|" + words.join("|") + "}}");
return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n");
}
// Canonical left-to-right order of the small templates that can prefix a definition line's gloss text:
// maneid, then kategori (K), then etîket (e).
var LEADING_TPL_ORDER = startData.leadingTplOrder;
// True for a leading call the advanced panel edits in a box of its own -- those are kept out of the
// gloss box so the same template is never editable in two places at once. Redirect spellings count:
// {{f}} and {{etîket}} are {{e}}.
function hasOwnFieldBox(key) {
return LEADING_TPL_ORDER.indexOf(canonicalTemplateKey(key)) !== -1;
}
// Inserts, extends, or (with opts.replace) overwrites one of the small templates that prefix a definition
// line's gloss text -- {{maneid|lang|id}}, {{K|lang|kat1|...}} or {{e|lang|etîket1|...}}. Under
// opts.replace an empty values list removes the call rather than writing an empty one.
function insertLeadingSenseTpl(pageContent, language, sectionType, sectionOrdinal, definitionLevel, tplKey, values, opts) {
opts = opts || {};
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel);
var marker = /^#+/.exec(lines[defLine])[0];
var afterMarker = lines[defLine].slice(marker.length).replace(/^\s+/, "");
// Collecting the whole leading-call run means an existing tplKey call is found and merged wherever it
// already sits, not just when it happens to be first.
var split = splitLeadingCalls(afterMarker);
var calls = split.calls;
var rest = split.rest;
var existing = null;
calls.forEach(function (c) {
if (canonicalTemplateKey(c.key) === tplKey) {
existing = c;
}
});
if (existing) {
if (opts.replace) {
// Editing an existing call: an empty result means the user cleared it, so drop the call.
if (values.length) {
existing.params = [language].concat(values);
} else {
calls = calls.filter(function (c) { return c !== existing; });
}
} else {
var existingVals = existing.params.slice(1);
values.forEach(function (v) {
if (existingVals.indexOf(v) === -1) {
existingVals.push(v);
}
});
existing.params = [language].concat(existingVals);
}
} else if (!values.length) {
return pageContent; // nothing to add, and nothing there to clear
} else {
// Not present yet -- insert right before the first existing call that outranks tplKey in
// LEADING_TPL_ORDER (an unrecognized call always outranks everything), or at the end of the run.
var myRank = LEADING_TPL_ORDER.indexOf(tplKey);
var insertAt = calls.length;
for (var i = 0; i < calls.length; i++) {
var otherRank = LEADING_TPL_ORDER.indexOf(canonicalTemplateKey(calls[i].key));
if (otherRank === -1 || otherRank > myRank) {
insertAt = i;
break;
}
}
calls.splice(insertAt, 0, { key: tplKey, params: [language].concat(values) });
}
var rebuilt = calls.map(function (c) {
return "{{" + c.key + "|" + c.params.join("|") + "}}";
}).join(" ");
lines[defLine] = marker + " " + (rebuilt ? rebuilt + " " : "") + rest;
return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n");
}
// Replaces just the gloss text of a definition line, leaving any leading template calls untouched --
// the save half of "Maneyê biguhêre" (edit sense).
function updateSenseGloss(pageContent, language, sectionType, sectionOrdinal, definitionLevel, newGloss) {
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel);
var marker = /^#+/.exec(lines[defLine])[0];
var afterMarker = lines[defLine].slice(marker.length).replace(/^\s+/, "");
// The box holds everything except the calls with their own field, so those are put back in front.
// Dropping "{{mane?}}" here is what clears start.js's placeholder once a real gloss is written.
var kept = splitLeadingCalls(afterMarker).calls.filter(function (c) {
return hasOwnFieldBox(c.key);
});
var leadingText = kept.map(function (c) {
return "{{" + c.key + "|" + c.params.join("|") + "}}";
}).join(" ");
lines[defLine] = marker + " " + (leadingText ? leadingText + " " : "") + newGloss;
return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n");
}
// Deletes one sense: its definition line plus everything indented under it (its "#:" groups, "#*"
// citations, any sub-senses). Refuses to empty a section, since a POS heading with no senses is worse
// than the sense the user wanted gone.
// A new sense goes directly below the one whose pencil asked for it -- after the lines that sense owns
// (its "#:" examples, "#*" citations and "##" sub-senses), so it reads as the next sense rather than
// landing at the foot of the section. It takes the same marker depth as its neighbour, so asking from
// a "##" sub-sense adds a sibling sub-sense.
function insertNewSense(pageContent, language, sectionType, sectionOrdinal, definitionLevel, text) {
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel);
var marker = /^#+/.exec(lines[defLine])[0];
var end = defLine + 1;
var ownedRegex = new RegExp("^" + marker + "[#:*]");
while (end < lines.length && ownedRegex.test(lines[end])) {
end++;
}
lines.splice(end, 0, marker + " " + text);
return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n");
}
function removeSense(pageContent, language, sectionType, sectionOrdinal, definitionLevel) {
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel);
var marker = /^#+/.exec(lines[defLine])[0];
var end = defLine + 1;
var ownedRegex = new RegExp("^" + marker + "[#:*]");
while (end < lines.length && ownedRegex.test(lines[end])) {
end++;
}
// Top-level senses of this section only -- "##" sub-senses go with their parent either way.
if (definitionLevel.length === 2) {
var siblings = 0;
for (var i = loc.posLineIndex + 1; i < lines.length && !/^==/.test(lines[i]); i++) {
if (/^#[^*#:]/.test(lines[i])) {
siblings++;
}
}
if (siblings < 2) {
throw new SubmitAbort("Ev maneya dawî ya vê beşê ye. Ji bo rakirinê divê tu tevahiya beşê rakî.");
}
}
lines.splice(defLine, end - defLine);
return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n");
}
// Fetches the page's current wikitext and pulls out just this sense's gloss text to prefill the "Maneyê
// biguhêre" form. A plain read, not part of the hardened save path -- the actual save still re-fetches
// fresh content, so only the prefilled text itself could be a little stale.
// Current contents of one existing subsection, for prefilling the edit form.
// This page's current wikitext.
// One fetch for the whole queue: every preview reads the same revision, and asking per preview meant
// downloading the page again for each queued change. Dropped after a save, when the page has moved on.
var pageContentPromise = null;
function forgetPageContent() {
pageContentPromise = null;
}
function fetchPageContent() {
if (pageContentPromise) {
return pageContentPromise;
}
pageContentPromise = rawPageContent();
// A failed read must not be remembered as the answer.
pageContentPromise.fail(forgetPageContent);
return pageContentPromise;
}
function rawPageContent() {
return api.get({
action: "query",
prop: "revisions",
rvprop: "content",
titles: mw.config.get("wgPageName"),
formatversion: 2
}).then(function (data) {
var page = data.query && data.query.pages && data.query.pages[0];
var content = page && !page.missing && page.revisions && page.revisions[0] && page.revisions[0].content;
if (!content) {
throw new SubmitAbort("Nikare muhtewaya rûpelê bixwîne.");
}
return content;
});
}
function fetchPageSubsection(language, sectionType, sectionOrdinal, subsection) {
return fetchPageContent().then(function (content) {
return readPageSubsection(content, language, sectionType, sectionOrdinal, subsection);
});
}
function fetchSenseFields(language, sectionType, sectionOrdinal, definitionLevel) {
return fetchPageContent().then(function (content) {
return readSenseFields(content, language, sectionType, sectionOrdinal, definitionLevel);
});
}
// Everything the advanced panel can edit about one sense, read off its definition line and the "#:" lines
// under it: the raw gloss (templates included), the leading maneid/K/e values, and each word-list group.
function readSenseFields(pageContent, language, sectionType, sectionOrdinal, definitionLevel) {
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel);
var defMarker = /^#+/.exec(lines[defLine])[0];
var afterMarker = lines[defLine].slice(defMarker.length).replace(/^\s+/, "");
var leading = {};
splitLeadingCalls(afterMarker).calls.forEach(function (c) {
leading[canonicalTemplateKey(c.key)] = c.params.slice(1);
});
// Only start.js's "{{mane?|lang}}" placeholder is hidden; every other template stays visible so it can
// be edited by hand in the gloss box.
// The gloss box shows the line minus the calls that have their own box ({{maneid}}, {{K}}, {{e}} and
// their redirects) and minus start.js's "{{mane?}}" placeholder. Everything else -- a {{g}} link, a
// {{guharto}} -- stays visible and editable there.
var split = splitLeadingCalls(afterMarker);
var glossCalls = split.calls.filter(function (c) {
return !hasOwnFieldBox(c.key) && canonicalTemplateKey(c.key) !== "mane?";
});
var glossLead = glossCalls.map(function (c) {
return "{{" + c.key + "|" + c.params.join("|") + "}}";
}).join(" ");
var gloss = $.trim((glossLead ? glossLead + " " : "") + split.rest);
var marker = new Array(definitionLevel.length).join("#");
var groupKeysPattern = SENSE_GROUPS.map(function (g) { return aliasPattern(g.key); }).join("|");
var groupLineRegex = new RegExp("^" + marker + ":\\s*\\{\\{\\s*(" + groupKeysPattern + ")\\s*\\|([^}]*)\\}\\}\\s*$");
var anyBlockLineRegex = new RegExp("^" + marker + "[:*]");
var words = {};
for (var i = defLine + 1; i < lines.length; i++) {
if (!anyBlockLineRegex.test(lines[i])) {
break;
}
var m = groupLineRegex.exec(lines[i]);
if (m) {
words[canonicalTemplateKey(m[1])] = m[2].split("|").slice(1);
}
}
return {
gloss: gloss,
maneid: leading.maneid ? leading.maneid[0] : "",
etiket: leading.e || [],
kategori: leading.K || [],
words: words
};
}
// Finds a POS block's body range (up to, but not including, the next heading of level <= 3), and the
// header text + line index of any "====" subsections it already contains.
// depth is the part-of-speech heading's own ("===" on most entries, "====" where the senses are
// grouped under numbered etymologies). Its block runs to the next heading at that depth or shallower,
// and its subsections are the headings one deeper.
function posBlockBounds(lines, posLineIndex, depth) {
depth = depth || 3;
var blockEnd = wt.headingAtOrAbove(depth);
var subsectionHeading = wt.headingAtDepth(depth + 1);
var end = lines.length;
var existingHeaders = [];
for (var i = posLineIndex + 1; i < lines.length; i++) {
if (blockEnd.test(lines[i])) {
end = i;
break;
}
var sub = subsectionHeading.exec(lines[i]);
if (sub) {
existingHeaders.push({ header: $.trim(sub[1]), lineIndex: i });
}
}
return { end: end, existingHeaders: existingHeaders, depth: depth };
}
// Looks up a header's rank in SUBSECTION_ORDER. -1 for a header that isn't one of ours; such a header is
// never used as an insertion anchor.
function subsectionRankForHeader(header) {
return SUBSECTION_ORDER.indexOf(header);
}
// Body line range of one "====" subsection inside a POS block: everything after its heading up to the next
// "====" heading, or the end of the block. Null if the block has no such subsection.
function subsectionBodyRange(bounds, header) {
var headers = bounds.existingHeaders;
for (var i = 0; i < headers.length; i++) {
if (headers[i].header === header) {
return {
start: headers[i].lineIndex + 1,
end: i + 1 < headers.length ? headers[i + 1].lineIndex : bounds.end
};
}
}
return null;
}
// ---- template-parameter editing -------------------------------------------------------------------
// A gloss that is nothing but one template call gets a labelled box per parameter instead of a raw
// wikitext line, the way VisualEditor's template dialog works.
// The single template call a gloss is made of, or null when the line is anything less tidy. {{g|...}} is a
// link inside the gloss rather than the gloss itself, so it neither disqualifies the line nor gets a form.
function glossTemplateTarget(gloss) {
var parsed = parseTemplateCalls(gloss || "");
if (parsed.otherContent) {
return null;
}
var editable = parsed.calls.filter(function (c) {
return canonicalTemplateKey(c.name) !== "g";
});
return editable.length === 1 ? editable[0] : null;
}
// ---- the three places that carry no "====" heading of their own ----------------------------------
// Bilêvkirin is a "===" section above the POS blocks, images sit at the top of a POS block, and the
// h-bnr hatnote goes above the first language heading. Each is located here and then read, written or
// inserted through the same three lines of splice, so nothing below needs to know about them.
var IMAGE_LINE = /^\[\[\s*(?:Wêne|File|Image|Dosya)\s*:/i;
/**
* {lines, langSectionIndex, exists, start, end, insertAt} for a subsection carrying a "place", or null
* for an ordinary one. start..end is the body as it stands; insertAt is where a missing one goes.
*/
function locateLoosePlace(pageContent, language, sectionType, sectionOrdinal, subsection) {
var place = subsection.place;
if (!place) {
return null;
}
var i, end;
if (place === "page-top") {
// Above every language section, so the whole page is the search space. The call is found under
// any of its names, and its own name is carried back so a save never renames it.
var pageLines = pageContent.split("\n");
var call = wt.findHbnrCall(pageContent);
if (call) {
return { lines: pageLines, langSectionIndex: 0, exists: true, call: call,
start: call.lineIndex, end: call.lineIndex + 1, insertAt: call.lineIndex };
}
return { lines: pageLines, langSectionIndex: 0, exists: false, start: 0, end: 0, insertAt: 0 };
}
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
if (place === "pron") {
// One per language, not one per part of speech, so it is looked for above the POS heading.
for (i = 0; i < loc.posLineIndex; i++) {
var h3 = /^===\s*([^=]+?)\s*===/.exec(lines[i]);
if (h3 && $.trim(h3[1]) === subsection.header) {
end = i + 1;
while (end < lines.length && !/^==/.test(lines[end])) {
end++;
}
return { lines: lines, langSectionIndex: loc.langSectionIndex, exists: true,
start: i + 1, end: end, insertAt: i };
}
}
// Straight after the language heading, which puts it before every POS block.
return { lines: lines, langSectionIndex: loc.langSectionIndex, exists: false,
start: 1, end: 1, insertAt: 1 };
}
if (place === "pos-top") {
// Between the conjugation line and the headword template -- where the wizard writes them.
var at = loc.posLineIndex + 1;
while (at < lines.length && /^\{\{\s*ku-tewîn/.test($.trim(lines[at]))) {
at++;
}
var from = at;
while (at < lines.length && IMAGE_LINE.test($.trim(lines[at]))) {
at++;
}
return { lines: lines, langSectionIndex: loc.langSectionIndex, exists: at > from,
start: from, end: at, insertAt: from };
}
return null;
}
// The wikitext a "place" section's content becomes. A word list there is one template call, not a
// {{kol3}} block, so the words are joined into it -- and any ⊕ modifier a row picked up is dropped,
// since a page name is all the call can carry.
function loosePlaceBody(subsection, content, language) {
if (subsection.kind === "images") {
return $.grep($.map(content || [], function (image) {
return wt.buildImageLine({
file: image.file,
caption: wt.captionForLang(image.caption, language),
alt: image.alt,
size: image.size,
extra: image.extra
});
}), Boolean).join("\n");
}
return content;
}
// The words a "place" word list holds, flattened out of its single group. Any ⊕ modifier a row picked
// up is dropped: a page name is all the call can carry.
function loosePlaceWords(content) {
var words = [];
$.each(content || [], function (_, group) {
$.each(group.words || [], function (_, raw) {
var plain = $.trim(util.parseWordValue(raw).word);
if (plain && $.inArray(plain, words) === -1) {
words.push(plain);
}
});
});
return words;
}
// Writes one of those places, inserting it when it is not there yet and replacing it when it is. Only
// Bilêvkirin carries a heading; the other two are bare lines.
function writeLoosePlace(pageContent, language, sectionType, sectionOrdinal, subsection, content) {
var at = locateLoosePlace(pageContent, language, sectionType, sectionOrdinal, subsection);
if (!at) {
throw new SubmitAbort("Cih nehate dîtin: " + subsection.header);
}
// A call naming a subpage -- "{{h-bnr/-ane}}" -- holds a list shared by every page transcluding
// it. Writing here would change this page alone and desync the rest, so the edit is refused and
// the template that actually owns the list is named instead.
if (at.call && at.call.subpage) {
throw new SubmitAbort("Ev rûpel «{{" + at.call.name + "}}» bi kar tîne — lîste li " +
"[[Şablon:" + at.call.subpage + "]] ye, lê wê zêde bike, ne li vê rûpelê.");
}
// A word list here is one template call, so it is built where the existing call's own name is
// known -- editing "{{bnr-h|...}}" must not turn it into "{{h-bnr|...}}".
var body = subsection.kind === "wordlist"
? wt.buildHbnrCall(loosePlaceWords(content), at.call && at.call.name)
: $.trim(content || "");
// A "===" section is separated from what is above and below it by a blank line, the way the rest
// of an entry is written. The other two places are bare lines inside a block and take none.
var heading = subsection.place === "pron";
function blank(index) {
return $.trim(at.lines[index] || "") === "";
}
if (at.exists) {
if (body) {
var replacement = [body];
// end is the next "==" heading; the blank line before it is inside the range being replaced.
if (heading && /^==/.test(at.lines[at.end] || "")) {
replacement.push("");
}
at.lines.splice.apply(at.lines, [at.start, at.end - at.start].concat(replacement));
} else {
// Emptying the box removes the section rather than leaving an empty heading behind.
at.lines.splice(at.start, at.end - at.start);
if (heading) {
at.lines.splice(at.insertAt, 1);
// The blank line that separated it goes with it, rather than doubling up.
if (blank(at.insertAt) && blank(at.insertAt - 1)) {
at.lines.splice(at.insertAt, 1);
}
}
}
} else {
if (!body) {
throw new SubmitAbort("Tiştek nehate nivîsandin.");
}
var block = heading ? ["=== " + subsection.header + " ===", body] : [body];
if (heading) {
if (!blank(at.insertAt - 1)) {
block.unshift("");
}
if (!blank(at.insertAt)) {
block.push("");
}
}
at.lines.splice.apply(at.lines, [at.insertAt, 0].concat(block));
}
return pageContent.slice(0, at.langSectionIndex) + at.lines.join("\n");
}
// What a section body holds: its {{kol3}} groups, the plain bullet list that stands in for them, or
// the raw wikitext when it is neither. A free section is read this way before its kind is known.
function readSubsectionBody(body, subsection) {
if (subsection.kind === "wordlist" || subsection.free) {
var calls = parseWordListCalls(body);
if (calls.length) {
return {
kind: "wordlist",
groups: calls.map(function (call) {
return { sernav: namedParam(call.named, "sernav"), words: call.words };
})
};
}
var bullets = parseBulletWordList(body);
if (bullets) {
// Editable as a word list; saving rewrites the bullets as {{kol3}}.
return { kind: "wordlist", groups: [{ sernav: "", words: bullets }], fromBullets: true };
}
}
return { kind: "text", text: $.trim(body) };
}
// The wikitext a section body becomes after an edit. A wordlist keeps its own template name, language
// and named params ("cure=Jê", ...) and only has its positional words replaced; a text one is
// replaced whole.
function rewriteSubsectionBody(body, language, subsection, content) {
if (subsection.kind !== "wordlist") {
// Replacing the body wholesale drops that separator, so put it back.
return content + (/\n\s*$/.test(body) ? "\n" : "");
}
var calls = parseWordListCalls(body);
if (calls.length) {
// Each call is rewritten where it stands, so text between and around them survives untouched.
// Last to first, so the offsets of the earlier ones stay valid as we go.
var replacement = body;
for (var gi = calls.length - 1; gi >= 0; gi--) {
var call = calls[gi];
var group = content[gi];
// A group emptied in the form drops its call entirely rather than leaving "{{kol3|ku}}".
var rebuilt = group && group.words.length
? buildWordListCall(call.name, call.lang, withNamedParam(call.named, "sernav", group.sernav), group.words)
: "";
replacement = replacement.slice(0, call.start) + rebuilt + replacement.slice(call.end);
}
// Groups the form added beyond the ones already there go after the last of them.
var added = content.slice(calls.length).filter(function (group) {
return group.words.length;
}).map(function (group) {
return buildWordListCall(WORDLIST_TEMPLATE, language,
withNamedParam(["cure=" + subsection.header], "sernav", group.sernav), group.words);
});
if (added.length) {
replacement = replacement.replace(/\s*$/, "") + "\n\n" + added.join("\n\n") + "\n";
}
return replacement.replace(/\n{3,}/g, "\n\n"); // gaps left by any dropped call
}
if (parseBulletWordList(body)) {
// A plain bullet list is replaced wholesale by a real {{kol3}} on its first edit.
return content.map(function (group) {
return buildWordListCall(WORDLIST_TEMPLATE, language,
withNamedParam(["cure=" + subsection.header], "sernav", group.sernav), group.words);
}).join("\n\n") + (/\n\s*$/.test(body) ? "\n" : "");
}
throw new SubmitAbort("Nikare lîsteya vê beşê bixwîne: " + subsection.header);
}
// ---- sections that are not subsections of a part of speech ----
// A "=== Etîmolojî ===" that the parts of speech hang under, a "=== Çavkanî ===" at the foot of a
// language, a heading nobody planned for. Located by its own text, and edited as the wikitext under
// it -- or as a {{kol3}} list when that is what it holds.
function freeSectionBody(pageContent, language, subsection) {
var loc = wt.locateHeadingByText(pageContent, language, subsection.header, subsection.free.ordinal);
return { loc: loc, body: loc.lines.slice(loc.bodyStart, loc.bodyEnd).join("\n") };
}
function readFreeSection(pageContent, language, subsection) {
var at = freeSectionBody(pageContent, language, subsection);
return readSubsectionBody(at.body, subsection);
}
function updateFreeSection(pageContent, language, subsection, content) {
var at = freeSectionBody(pageContent, language, subsection);
at.loc.lines.splice(at.loc.bodyStart, at.loc.bodyEnd - at.loc.bodyStart,
rewriteSubsectionBody(at.body, language, subsection, content));
return pageContent.slice(0, at.loc.langSectionIndex) + at.loc.lines.join("\n");
}
// ---- removing and renaming a heading ----
// A subsection's heading line and the end of what it owns, as {loc, heading, end, depth, bounds}. A
// "====" subsection runs to the next one, taking deeper headings with it. A free section owns only its
// own text: what sits under it belongs to the parts of speech (see removeSubsection).
function headingSpan(pageContent, language, sectionType, sectionOrdinal, subsection) {
if (subsection.free) {
var free = wt.locateHeadingByText(pageContent, language, subsection.header, subsection.free.ordinal);
return { loc: free, heading: free.headingLineIndex, end: free.bodyEnd, depth: free.depth };
}
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var bounds = posBlockBounds(loc.lines, loc.posLineIndex, loc.depth);
var range = subsectionBodyRange(bounds, subsection.header);
if (!range) {
throw new SubmitAbort(util.msg.sectionMissing + subsection.header);
}
return { loc: loc, heading: range.start - 1, end: range.end, depth: bounds.depth + 1, bounds: bounds };
}
// A free section with deeper headings under it is refused: removing it would leave them under the
// section before, and taking them along would remove whole parts of speech.
function hasDeeperHeadingAfter(lines, index, depth) {
var m = /^(=+)[^=]/.exec(lines[index] || "");
return !!m && m[1].length > depth;
}
function removeSubsection(pageContent, language, sectionType, sectionOrdinal, subsection) {
var span = headingSpan(pageContent, language, sectionType, sectionOrdinal, subsection);
var lines = span.loc.lines;
if (subsection.free && hasDeeperHeadingAfter(lines, span.end, span.depth)) {
throw new SubmitAbort("Di bin «" + subsection.header + "» de beşên din hene; pêşî wan jê bibe.");
}
lines.splice(span.heading, span.end - span.heading);
// The blank line that separated it goes with it, rather than doubling up.
if (span.heading > 0 && !$.trim(lines[span.heading - 1]) && !$.trim(lines[span.heading] || "x")) {
lines.splice(span.heading, 1);
}
return pageContent.slice(0, span.loc.langSectionIndex) + lines.join("\n");
}
function renameSubsection(pageContent, language, sectionType, sectionOrdinal, subsection, newHeader) {
var span = headingSpan(pageContent, language, sectionType, sectionOrdinal, subsection);
var lines = span.loc.lines;
if (span.bounds && span.bounds.existingHeaders.some(function (h) {
return h.header === newHeader;
})) {
throw new SubmitAbort("Ev beş jixwe heye: " + newHeader);
}
var marks = wt.headingMarks(span.depth);
lines[span.heading] = marks + " " + newHeader + " " + marks;
// A {{kol3}} names its section in cure=, which follows the heading. Read across lines: a call is
// often written one parameter per line.
var cure = new RegExp("(\\|\\s*cure\\s*=\\s*)" + escapeRegExp(subsection.header) + "(\\s*[|}])", "g");
var body = lines.slice(span.heading + 1, span.end).join("\n").replace(cure, "$1" + newHeader + "$2");
lines.splice.apply(lines, [span.heading + 1, span.end - span.heading - 1].concat(body.split("\n")));
return pageContent.slice(0, span.loc.langSectionIndex) + lines.join("\n");
}
// Current contents of an existing "====" subsection. A wordlist one whose template can't be parsed comes
// back as {kind: "text"} so the caller can still edit it as raw wikitext instead of refusing outright.
function readPageSubsection(pageContent, language, sectionType, sectionOrdinal, subsection) {
if (subsection.free) {
return readFreeSection(pageContent, language, subsection);
}
var loose = locateLoosePlace(pageContent, language, sectionType, sectionOrdinal, subsection);
if (loose) {
if (!loose.exists) {
return null;
}
if (loose.call) {
return { kind: "wordlist", groups: [{ sernav: "", words: loose.call.words }] };
}
var looseBody = $.trim(loose.lines.slice(loose.start, loose.end).join("\n"));
if (subsection.kind === "images") {
return {
kind: "images",
images: $.grep($.map(looseBody.split("\n"), wt.parseImageLine), Boolean)
};
}
if (subsection.kind !== "wordlist") {
return { kind: "text", text: looseBody };
}
// One template call rather than a {{kol3}} block: its positional parameters are the words.
var looseCall = parseTemplateCalls(looseBody).calls[0];
return { kind: "wordlist", groups: [{ sernav: "", words: (looseCall && looseCall.params) || [] }] };
}
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var bounds = posBlockBounds(loc.lines, loc.posLineIndex, loc.depth);
var range = subsectionBodyRange(bounds, subsection.header);
if (!range) {
return null;
}
return readSubsectionBody(loc.lines.slice(range.start, range.end).join("\n"), subsection);
}
// Rewrites an existing "====" subsection in place. A wordlist one keeps its own template name, language and
// named params ("cure=Jê", ...) and only has its positional words replaced; a text one is replaced whole.
function updatePageSubsection(pageContent, language, sectionType, sectionOrdinal, subsection, content) {
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var bounds = posBlockBounds(lines, loc.posLineIndex, loc.depth);
var range = subsectionBodyRange(bounds, subsection.header);
if (!range) {
throw new SubmitAbort(util.msg.sectionMissing + subsection.header);
}
var body = lines.slice(range.start, range.end).join("\n");
lines.splice(range.start, range.end - range.start,
rewriteSubsectionBody(body, language, subsection, content));
return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n");
}
// Inserts a new "==== Header ====" subsection into its SUBSECTION_ORDER position within a POS block, right
// before the first ranked subsection that outranks it, or at the end if none does. Either a
// {{kol3|...}} word list or a plain paragraph, matching start.js's own subsection formats.
function insertPageSubsection(pageContent, language, sectionType, sectionOrdinal, subsection, content) {
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var bounds = posBlockBounds(lines, loc.posLineIndex, loc.depth);
var alreadyThere = false;
bounds.existingHeaders.forEach(function (h) {
if (h.header === subsection.header) {
alreadyThere = true;
}
});
if (alreadyThere) {
throw new SubmitAbort("Ev beş jixwe heye: " + subsection.header);
}
var body = subsection.kind === "wordlist"
? content.map(function (group) {
return buildWordListCall(WORDLIST_TEMPLATE, language,
withNamedParam(["cure=" + subsection.header], "sernav", group.sernav), group.words);
}).join("\n\n")
: content;
var myRank = subsectionRankForHeader(subsection.header);
var headers = bounds.existingHeaders;
var insertAt = bounds.end;
for (var i = 0; i < headers.length; i++) {
var otherRank = subsectionRankForHeader(headers[i].header);
if (otherRank !== -1 && otherRank > myRank) {
insertAt = headers[i].lineIndex;
break;
}
}
// Exactly one blank line on each side: the line before the insertion point is normally already blank
// (it separated the previous subsection from the next heading), so only add one where there isn't one.
var block = [];
if (insertAt > 0 && $.trim(lines[insertAt - 1]) !== "") {
block.push("");
}
var marks = wt.headingMarks(bounds.depth + 1);
block.push(marks + " " + subsection.header + " " + marks, body);
if (insertAt < lines.length) {
block.push("");
}
lines.splice.apply(lines, [insertAt, 0].concat(block));
return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n");
}
// ---- converting an unclassified "=== Mane ===" placeholder heading into a real POS heading ----
// Some pages carry a heading literally named "Mane" (optionally "Mane 2" etc.) instead of a real
// part-of-speech name, tagged right below with {{cure?|<lang>}} (ku.wiktionary's "part of speech not yet
// determined" maintenance flag). It is a section key of its own (sections.MANE_SECTION), so the shared
// locator finds it like any other heading; only the rewriting below is particular to it.
// Renames the "=== Mane ===" placeholder to the chosen POS heading, drops the maintenance tag line right
// after it if present (MANE_TAG_REGEX -- cure? or any of its known aliases), and inserts the matching
// "{{<pos>|<lang>}}" call in its place (skipped when the section has no template of its own).
// Other content under the heading is left untouched.
/**
* Where a section's own headword template sits, as {index, text}, or {index: -1} when it has none.
*
* Not always the line under the heading: a "{{ku-tewîn-lk}}" line and any number of "[[Wêne:...]]"
* images can come first. Everything down to the first definition line is searched, and index doubles
* as the slot a new call belongs in when there is no old one.
*/
function findPosTemplateLine(lines, headingLine, sectionType) {
var oldSpec = posTemplateFor(sectionType);
var oldTemplate = oldSpec ? oldSpec.name : (sectionType === "Biwêj" ? "biwêj" : null);
var oldTemplateRegex = oldTemplate &&
new RegExp("^\\{\\{\\s*" + escapeRegExp(oldTemplate) + "\\s*[|}]");
var at = headingLine + 1;
while (at < lines.length && !/^#/.test(lines[at]) && !/^==/.test(lines[at])) {
if (MANE_TAG_REGEX.test(lines[at]) ||
(oldTemplateRegex && oldTemplateRegex.test(lines[at]))) {
return { index: at, text: lines[at], end: at };
}
at++;
}
return { index: -1, text: "", end: at };
}
// Named parameters merged in order, each written once: a later value replaces an earlier one of the
// same name. Positional values are kept as they come.
function mergeCallParams() {
var out = [];
var seen = {};
$.each(Array.prototype.slice.call(arguments), function (_, list) {
$.each(list || [], function (__, param) {
var m = /^\s*([^=|]+?)\s*=([\s\S]*)$/.exec(param);
if (!m) {
out.push(param);
return;
}
// "z" and "c" are one name to Modul:rêziman, so the form's "c=m" meets the page's "z=".
var key = wt.canonicalParamName(m[1]);
if (!Object.prototype.hasOwnProperty.call(seen, key)) {
seen[key] = out.length;
out.push(param);
return;
}
// The page's own spelling stays when it carried a value; an empty one gives way entirely.
var earlier = /^\s*([^=|]+?)\s*=([\s\S]*)$/.exec(out[seen[key]]);
// "?" asks for a value, so it never replaces one the page already has.
if ($.trim(earlier[2]) && $.trim(m[2]) === "?") {
return;
}
out[seen[key]] =$.trim(earlier[2]) ? earlier[1] + "=" + m[2] : param;
});
});
return out;
}
// What the call on the page already says, minus its language. Carried over only when the new section
// uses that same template -- "z=m" survives Navdêr becoming Formeke navdêrê, while a verb's "c=h-gh"
// has no meaning on a noun and is left behind.
function keptCallParams(line, templateName) {
var call = parseTemplateCalls($.trim(line || "")).calls[0];
if (!call || canonicalTemplateKey(call.name) !== canonicalTemplateKey(templateName)) {
return [];
}
return call.params.slice(1).filter(function (param) {
return /=/.test(param);
});
}
// The headword call a converted section gets, or "" when the new section has none. What the old call
// (found, from findPosTemplateLine) said keeps its place, then the section's own defaults, then what the
// form was filled in with -- each name written once, the last value winning, so a converted call reads
// as small a change from the old one as it can.
function posCallLine(found, language, newSectionType, posParams) {
var spec = posTemplateFor(newSectionType);
if (!spec) {
return "";
}
var kept = found.index !== -1 ? keptCallParams(found.text, spec.name) : [];
// A lemma is not an inflected form, so the old section's form=erê stays behind.
if (spec.params.indexOf("form=erê") === -1) {
kept = kept.filter(function (param) {
return !/^\s*form\s*=\s*erê\s*$/.test(param);
});
}
var params = mergeCallParams(kept, spec.params, posParams ? posParams.split("|") : []);
return "{{" + spec.name + "|" + language + (params.length ? "|" + params.join("|") : "") + "}}";
}
function convertSectionToPos(pageContent, language, sectionType, sectionOrdinal, newSectionType, posParams) {
if (!sectionNames[newSectionType]) {
throw new SubmitAbort("Navê cureyê rêzimanî yê hilbijartî nediyar e.");
}
// locateSection() already handles the "Mane" placeholder as a section type of its own.
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var lines = loc.lines;
var headingLine = loc.posLineIndex;
var depth = loc.depth;
// A section straight under a numbered group heading takes that heading's place: the group heading
// held nothing but its gloss.
var group = depth > 3 ? wt.numberedGroupAbove(lines, headingLine, depth) : -1;
if (group !== -1) {
lines.splice(group, headingLine - group);
headingLine = group;
depth--;
}
// At the heading's own depth. Written without a number: the renumbering pass below decides every
// number in this language section at once, so one carried over from the old name would just be
// overwritten.
var marks = wt.headingMarks(depth);
lines[headingLine] = marks + " " + newSectionType + " " + marks;
// The line under the heading is either the old section's own template call ("{{biwêj|ku}}") or, for a
// Mane placeholder, the "needs a POS" maintenance tag. Both are replaced by the new POS's call.
// The new call takes the old one's own place -- or, when there was none, the slot just above the
// definitions, which is where the wizard writes it.
var found = findPosTemplateLine(lines, headingLine, sectionType);
var insertAt = found.index !== -1 ? found.index : found.end;
if (found.index !== -1) {
lines.splice(found.index, 1);
}
var call = posCallLine(found, language, newSectionType, posParams);
if (call) {
lines.splice(insertAt, 0, call);
}
// Renaming a section can make it repeat one the page already had, and can equally leave a name that
// is no longer repeated. Both are settled by renumbering the whole language section: a "Rengdêr"
// beside a new "Rengdêr" becomes "Rengdêr 1" and "Rengdêr 2", and a number left behind by a name
// that is now unique is dropped.
var body = lines.join("\n");
var nextLang = body.indexOf("\n== ", 1);
var end = nextLang === -1 ? body.length : nextLang;
body = wt.numberRepeatedPosHeadings(body.slice(0, end)) + body.slice(end);
return pageContent.slice(0, loc.langSectionIndex) + body;
}
// ---- "guhartina pêşketî" (advanced editing): combine several independent per-sense edits into ONE save ----
// Threads pageContent through the same pure functions every single-field form uses, applying only the
// pieces the caller actually filled in. A piece that conflicts with the page (maneid already set, a
// subsection that's already there) is skipped with a warning rather than failing the whole save. Throws
// SubmitAbort if nothing was filled in, so this can never turn into a no-op save.
function applyAdvancedChanges(pageContent, language, sectionType, sectionOrdinal, definitionLevel, changes) {
var content = pageContent;
var warnings = [];
var appliedAnything = false;
if (changes.gloss) {
content = updateSenseGloss(content, language, sectionType, sectionOrdinal, definitionLevel, changes.gloss);
appliedAnything = true;
}
if (changes.newSense) {
content = insertNewSense(content, language, sectionType, sectionOrdinal, definitionLevel, changes.newSense);
appliedAnything = true;
}
// Every box below is prefilled with what the sense already has, so a save replaces that value rather
// than merging into it -- and clearing a box removes the template. changes.changed marks the boxes
// whose contents actually differ from the page, so an opened-but-untouched box writes nothing.
var replace = { replace: true };
if (changes.changed.maneid) {
content = insertLeadingSenseTpl(content, language, sectionType, sectionOrdinal, definitionLevel, "maneid", changes.maneid ? [changes.maneid] : [], replace);
appliedAnything = true;
}
if (changes.changed.etiket) {
content = insertLeadingSenseTpl(content, language, sectionType, sectionOrdinal, definitionLevel, "e", changes.etiket, replace);
appliedAnything = true;
}
if (changes.changed.kategori) {
content = insertLeadingSenseTpl(content, language, sectionType, sectionOrdinal, definitionLevel, "K", changes.kategori, replace);
appliedAnything = true;
}
SENSE_GROUPS.forEach(function (group) {
if (changes.changed["word:" + group.key]) {
content = insertSenseWords(content, language, sectionType, sectionOrdinal, definitionLevel, group.key, changes.words[group.key], replace);
appliedAnything = true;
}
});
if (!appliedAnything) {
throw new SubmitAbort("Tiştek nehat guhartin.");
}
return { content: content, warnings: warnings };
}
// ---- per-definition UI: a small always-visible "+" toggle (no hover, so it works on mobile/touch too) ----
// A growing list of word rows. The row itself is util.js's, shared with the wizard; this owns the list:
// typing in the last row appends a fresh empty one, so there is always somewhere to type.
var WORDLIST_COLUMN_THRESHOLD = 6;
function buildWordListField(placeholder, opts) {
opts = opts || {};
var $list = $("<ol class='dsb-wordlist'></ol>");
// One column is a long scroll once a list gets past a handful of words. The class only asks for
// two; the stylesheet still gives one on a narrow screen. Two columns inside the panel's usual
// 520px would leave each word about 250px, so the panel drops its width cap for as long as any
// list in it is in two columns -- checked across the whole panel, since a "Herwiha binêre" holds
// several groups and one of them going wide settles it for all.
function updateColumns() {
$list.toggleClass("dsb-wordlist-2col",
$list.children("li").length > WORDLIST_COLUMN_THRESHOLD);
var $panel = $list.closest(".dsb-subsection-panel");
$panel.toggleClass("dsb-panel-wide", !!$panel.find(".dsb-wordlist-2col").length);
}
function makeRow() {
var row = util.makeModifierRow({
prefix: "dsb-",
placeholder: placeholder,
modTitle: util.msg.addModifier,
removeTitle: util.msg.removeWord,
removeModTitle: util.msg.removeModifier,
modifiers: opts.modifiers,
// "bixe qutiyan" puts each comma-separated word in a row of its own, right after the row it
// was typed in, and the caret follows to the last of them. One word per row is also one
// word per template parameter, which both {{hevmane}} and {{kol3}} read the same way --
// a comma left inside a parameter would not be.
onSplit: function (rest) {
var $after = row.$li;
var last = null;
rest.forEach(function (raw) {
var extra = makeRow();
$after.after(extra.$li);
$after = extra.$li;
if (raw) extra.setRaw(raw);
last = extra;
});
// Always an empty row at the end to type the next word into.
var $tail = $list.children("li").last();
if ($.trim($tail.data("row").getRaw())) {
last = makeRow();
$list.append(last.$li);
}
updateColumns();
if (last) last.focus();
},
// raw === null means the row removed itself, so the count has changed either way.
onChange: function (raw) {
if (raw !== null) {
var isLast = row.$li.is($list.children("li").last());
if (isLast && raw) $list.append(makeRow().$li);
}
updateColumns();
}
});
row.$li.data("row", row);
return row;
}
$list.append(makeRow().$li);
return {
$element: $list,
values: function () {
var vals = [];
$list.children("li").each(function () {
var raw = $(this).data("row").getRaw();
if (raw) vals.push(raw);
});
return vals;
},
// Replaces the whole list, keeping one empty trailing row to type into.
setValues: function (raws) {
$list.empty();
raws.forEach(function (raw) {
var row = makeRow();
$list.append(row.$li);
row.setRaw(raw);
});
$list.append(makeRow().$li);
updateColumns();
},
focus: function () {
$list.children("li").first().data("row").focus();
}
};
}
// Plain removable-tag field, used for Etîket and Kategorî (simple value lists with no per-word modifiers).
// Enter or "," commits the current text as a tag; Backspace on an empty input removes the last tag;
// values() also commits whatever is still typed but not yet confirmed.
function buildTagField(placeholder) {
var $input = $("<input type='text' class='dsb-input dsb-tag-input'>").attr("placeholder", placeholder);
var $element = $("<span class='dsb-tagfield'></span>").append($input);
function currentValues() {
var vals = [];
$element.children(".dsb-tag").each(function () {
vals.push($(this).data("value"));
});
return vals;
}
function addTag(val) {
val = $.trim(val || "");
if (!val || currentValues().indexOf(val) !== -1) {
return;
}
var $tag = $("<span class='dsb-tag'></span>").text(val).data("value", val);
var $remove = $("<button type='button' class='dsb-tag-remove' title='Jê bibe'>×</button>");
$remove.on("click", function () {
$tag.remove();
$input.trigger("focus");
});
$tag.append($remove);
$tag.insertBefore($input);
}
$input.on("keydown", function (e) {
if (e.which === 13 || e.which === 188) { // Enter or comma
e.preventDefault();
addTag($input.val());
$input.val("");
} else if (e.which === 8 && !$input.val()) {
$element.children(".dsb-tag").last().remove();
}
});
$input.on("blur", function () {
addTag($input.val());
$input.val("");
});
return {
$element: $element,
// Replaces every tag, for prefilling from what the sense already has.
setValues: function (vals) {
$element.children(".dsb-tag").remove();
vals.forEach(function (v) {
addTag(v);
});
$input.val("");
},
values: function () {
addTag($input.val());
$input.val("");
return currentValues();
},
focus: function () {
$input.trigger("focus");
}
};
}
// The wizard's own etymology templates, straight out of data-main.json's "etymTpls" -- the same list start.js's
// insert menu offers, so the two can never drift apart. CODE/SOURCELANG are its placeholders.
// The wizard's own template lists, straight out of data-main.json, so both gadgets offer the same
// templates in the same order. A pronunciation template names the languages it is for; one that names
// none is offered everywhere.
function templateChoices(pool, language) {
var defs = startData[pool] || {};
return Object.keys(defs).filter(function (name) {
var langs = defs[name].langs;
return !langs || !langs.length || $.inArray(language, langs) !== -1;
}).map(function (name) {
return { name: name, desc: defs[name].desc, snippet: defs[name].snippet };
});
}
// One template call inside the surface: shown as its own wikitext, but atomic -- contenteditable="false"
// keeps the caret out of it, so it can only be changed through the dialog.
function makeTemplateChip(wikitext) {
// The × is its own element rather than the chip's only way out: on a phone there is no reliable
// backspace onto a contenteditable="false" span, so without it the dialog is the only way to take
// a call off the line. readChipSurface() reads chips from data-wikitext, so the extra child does
// not reach the saved text.
var $remove = $("<span class='dsb-tpl-chip-remove' contenteditable='false'>×</span>")
.attr("title", "Vê şablonê jê bibe");
return $("<span class='dsb-tpl-chip' contenteditable='false' role='button' tabindex='0'></span>")
.attr("data-wikitext", wikitext)
.attr("title", "Bitikîne da ku parametreyan biguhêrî")
.text(wikitext)
.append($remove);
}
// wikitext -> surface DOM: template calls become chips, everything else stays plain editable text.
function renderChipSurface($surface, wikitext) {
var text = wikitext || "";
var calls = parseTemplateCalls(text).calls;
var pos = 0;
$surface.empty();
calls.forEach(function (call) {
if (call.start > pos) {
$surface.append(document.createTextNode(text.slice(pos, call.start)));
}
$surface.append(makeTemplateChip(text.slice(call.start, call.end)));
pos = call.end;
});
if (pos < text.length) {
$surface.append(document.createTextNode(text.slice(pos)));
}
}
// surface DOM -> wikitext. Chips give back their stored call; anything the browser inserted while typing
// (a <br>, a wrapper <div>) degrades to its text, so the result is always plain wikitext.
function readChipSurface(node) {
var out = "";
$(node).contents().each(function () {
if (this.nodeType === 3) {
out += this.nodeValue;
return;
}
var $el = $(this);
if ($el.hasClass("dsb-tpl-chip")) {
out += $el.attr("data-wikitext");
return;
}
if (this.nodeName === "BR") {
out += "\n";
return;
}
if (this.nodeName === "DIV" || this.nodeName === "P") {
out += "\n" + readChipSurface(this);
return;
}
out += readChipSurface(this);
});
return out;
}
// Drops a node in at the caret, or at the end when the caret is not inside the surface.
function insertAtCaret($surface, node) {
var sel = window.getSelection();
if (sel && sel.rangeCount && $.contains($surface.get(0), sel.getRangeAt(0).commonAncestorContainer)) {
var range = sel.getRangeAt(0);
range.deleteContents();
range.insertNode(node);
range.setStartAfter(node);
range.collapse(true);
sel.removeAllRanges();
sel.addRange(range);
} else {
$surface.append(node);
}
}
// The template-param dialog (openTemplateDialog/buildTemplateParamForm) moved to wikt.cite, shared with
// start.js's own Etîmolojî and Çavkanî pickers: cite.openTemplateDialog / cite.buildTemplateParamForm.
// Each new example queued is its own entry, so several can be waiting at once.
var exampleSeq = 0;
// Takes the save over from add-examples while its form is open for one sense: its "Qeyd bike" becomes
// "Lê zêde bike" and the edit joins the pending queue instead of publishing on its own, so examples and
// whatever else is queued go up as one edit. Installed on every open, so the handler always closes over
// the sense whose form is actually open. ctx: {$li, $h3, language, sectionType, sectionOrdinal,
// definitionLevel, $save, $status, afterQueue}.
function takeOverExampleSave(ctx) {
if (!(wikt.addExamples && wikt.addExamples.setSubmitHandler)) {
return; // older add-examples: it publishes on its own, as before
}
// Lets the form read an example as the queue has already changed it.
wikt.addExamples.pendingContent = queuedContent;
wikt.addExamples.setSubmitHandler(function (job) {
exampleSeq++;
queueChange(
placeLabel(ctx.language, ctx.sectionType, ctx.$h3),
// add-examples' own summary, so the combined edit still credits the tool and names its
// version. The trailing stop goes: this is one item in a list, not a sentence of its own.
(job.summary || "nimûne/jêgirtin hate zêdekirin").replace(/\.\s*$/, ""),
function (pageContent) {
// add-examples builds against a revision object, and returns {text, summary}.
var built = job.transform({ content: pageContent });
return { content: built.text, warnings: [] };
},
ctx.$save,
ctx.$status,
// Drawn like any other queued change, in the sense it belongs to.
function () {
return previewSense(ctx.$li, ctx.language, ctx.sectionType, ctx.sectionOrdinal, ctx.definitionLevel);
},
// An edit to an example already on the page brings its own key, so editing it again replaces it.
{ key: job.key || ("example:" + ctx.sectionType + "|" + ctx.sectionOrdinal + "|" +
ctx.definitionLevel.join(".") + "|" + exampleSeq) }
);
job.done();
if (ctx.afterQueue) {
ctx.afterQueue();
}
});
}
// Opens add-examples' form on one example already under a sense -- dsb.js's pencil on it. Its save joins
// the queue like any other change.
function editExample($li, $h3, language, sectionType, sectionOrdinal, definitionLevel, itemEl) {
takeOverExampleSave({ $li: $li, $h3: $h3, language: language, sectionType: sectionType,
sectionOrdinal: sectionOrdinal, definitionLevel: definitionLevel, $save: $(), $status: $(),
afterQueue: openQueueBox });
if (!(wikt.addExamples && wikt.addExamples.editFor && wikt.addExamples.editFor($li.get(0), itemEl))) {
mw.notify("Amûra nimûneyan li vê maneyê nehat dîtin.");
}
}
// Builds the whole "guhartina pêşketî" panel into $quickRow: gloss and the two most-used word lists
// (Hevmane/Dijmane) sit directly in the picker row; the remaining word lists, maneid, etîket, kategorî
// and Nimûne/jêgirtin live behind a "Hevmane û Bêhtir" dropdown; one shared "Lê zêde bike" queues everything the
// user filled in as a single edit via applyAdvancedChanges() and queueChange(). Nimûne/jêgirtin is an
// immediate proxy-click into a different gadget's own form, not part of this combined save.
function buildAdvancedPanel($quickRow, $li, $h3, language, sectionType, sectionOrdinal, definitionLevel, isLastSense) {
// "+" marks the actions that add something, matching the dropdown's own "+ Hevmane" labels.
var $nimune = $("<a href='#' class='dsb-quick-link'></a>").text("+ Nimûne/jêgirtin");
$nimune.on("click", function (e) {
e.preventDefault();
takeOverExampleSave({ $li: $li, $h3: $h3, language: language, sectionType: sectionType,
sectionOrdinal: sectionOrdinal, definitionLevel: definitionLevel, $save: $save, $status: $status });
// Toggle, so clicking this a second time closes the form again. add-examples builds nothing
// on the page of its own, so this is the only way its form opens.
var drive = wikt.addExamples.toggleFor || wikt.addExamples.openFor;
if (!(drive && drive($li.get(0)))) {
mw.notify("Amûra nimûneyan li vê maneyê nehat dîtin.");
}
$moreMenu.slideUp();
});
// getters holds one function per currently-open box (key -> () => value); collectChanges() only ever
// reads from a box the user actually clicked to open.
var getters = {};
// What the sense currently holds, fetched once and shared by every box that prefills from it.
// collectChanges() also diffs against it, so an untouched box never queues a change.
var original = null;
var sensePromise = null;
function loadSense() {
if (!sensePromise) {
sensePromise = fetchSenseFields(language, sectionType, sectionOrdinal, definitionLevel).then(function (fields) {
original = fields;
return fields;
});
}
return sensePromise;
}
function sameList(a, b) {
return (a || []).join("\u0000") === (b || []).join("\u0000");
}
// -- gloss ("Maneyê biguhêre" -- the one box that EDITS the sense's wording; everything else here only ADDS) --
function addGlossField() {
var $fields = $("<div class='dsb-gloss-fields'></div>");
var $textarea = $("<textarea class='dsb-input dsb-edit-gloss' rows='2'></textarea>")
.attr("placeholder", util.msg.loading).prop("disabled", true);
var $autoLink = $("<button type='button' class='dsb-autolink'>Oto-lînk bike</button>").prop("disabled", true);
var $toRaw = $("<a href='#' class='dsb-quick-link dsb-gloss-raw'>Wekî wîkîtekst biguhêre</a>").hide();
var $status = $("<span class='dsb-status'></span>");
var originalGloss = null;
var tplForm = null; // set while the parameter boxes are showing instead of the raw line
var tplCall = null;
// The gloss of a non-Kurdish entry is a translation followed by {{îzah|…}} explaining it. That
// is one field on the page, so it stays one box here; the explanation opens beside it only when
// asked for, and the two are joined back into a single gloss on save. A Kurdish sense is its
// own definition, so it is never offered one -- though a ku gloss that somehow already carries
// an {{îzah}} still opens its box below, rather than being edited blind.
var offerIzah = language !== "ku";
var $izah = $("<textarea class='dsb-input dsb-edit-izah' rows='2'></textarea>")
.attr("placeholder", "Îzaha maneyî… ji bo school-a îngilîzî 'cihê tehsîlgirtinê'");
// A non-Kurdish gloss is a translation and its explanation, so both boxes open together. A Kurdish
// sense is its own definition and gets no îzah box, unless its gloss already carries one.
var $izahWrap = $("<div class='dsb-izah-wrap'></div>")
.append($("<label class='dsb-adv-label'>Îzaha maneyî</label>").append($izah))
.toggle(offerIzah);
$fields.append($textarea);
// The template form edits one call inside the line, so its result is spliced back into the rest.
function currentGloss() {
if (tplForm) {
return $.trim(originalGloss.slice(0, tplCall.start) + tplForm.values() + originalGloss.slice(tplCall.end));
}
return joinGloss($.trim($textarea.val()), $.trim($izah.val()));
}
function showRaw() {
tplForm = null;
tplCall = null;
$fields.empty().append($textarea);
$autoLink.show();
$toRaw.hide();
}
loadSense().then(
function (fields) {
originalGloss = fields.gloss;
// An existing gloss that already ends in {{îzah|…}} comes apart into the two boxes, so
// editing it does not mean editing template syntax by hand.
var parts = util.splitTercimeIzah(fields.gloss);
$textarea.val(parts ? $.trim(parts.tercime) : fields.gloss)
.prop("disabled", false)
// A non-Kurdish gloss is a translation; the box under it takes the explanation.
.attr("placeholder", offerIzah ? util.msg.tercimePrompt : "Maneyê binivîse…");
if (parts) {
$izah.val($.trim(parts.izah));
$izahWrap.show();
}
$autoLink.prop("disabled", false);
var target = glossTemplateTarget(fields.gloss);
if (!target) {
return;
}
fetchTemplateData(target.name).then(function (td) {
// The fetch is async; leave the raw box alone if it has already been typed into.
if ($.trim($textarea.val()) !== $.trim(originalGloss)) {
return;
}
tplCall = target;
tplForm = cite.buildTemplateParamForm(target, td);
$fields.empty().append(tplForm.$element);
$autoLink.hide(); // linkifying a bare template call makes no sense
// A gloss that is one template call carries no separate explanation.
$izahWrap.hide();
$toRaw.show();
});
},
function (codeOrAbort, result) {
$textarea.attr("placeholder", "");
var message = codeOrAbort instanceof SubmitAbort ? codeOrAbort.message : "Nikare maneya heyî bar bike: " + apiErrorMessage(codeOrAbort, result);
$status.removeClass("dsb-status-ok").addClass("dsb-status-error").text(message);
}
);
$autoLink.on("click", function () {
var mane = $.trim($textarea.val());
var izah = $.trim($izah.val());
if (!mane && !izah) {
return;
}
$autoLink.prop("disabled", true);
$status.removeClass("dsb-status-ok dsb-status-error").text("Tê lînkkirin…");
linkifyGlossParts(mane, izah, function (linkedMane, linkedIzah, error) {
$textarea.val(linkedMane);
$izah.val(linkedIzah);
$autoLink.prop("disabled", false);
if (error) {
$status.addClass("dsb-status-error").text(error);
} else {
$status.text("");
}
});
});
$toRaw.on("click", function (e) {
e.preventDefault();
$textarea.val(currentGloss()); // read the form before showRaw() discards it
showRaw();
});
getters.gloss = function () {
var v = currentGloss();
return (v && v !== originalGloss) ? v : null;
};
return $("<div class='dsb-adv-group'></div>").append(
$("<div class='dsb-adv-label'></div>").text("Mane"),
$fields,
$izahWrap,
$("<div class='dsb-form-actions'></div>").append($autoLink, $toRaw, $status)
);
}
// -- one SENSE_GROUPS word-list box (Hevmane/Dijmane/etc.) --
function addWordField(group) {
var field = buildWordListField(group.label + "…");
loadSense().then(function (fields) {
var current = fields.words[group.key];
if (current && current.length) {
field.setValues(current);
}
});
getters["word:" + group.key] = function () {
return field.values();
};
// The hint is senseGroups' own, so the box carries the same example sentence the wizard puts
// beside its copy of this list.
var $label = $("<div class='dsb-adv-label'></div>").text(group.label);
if (group.hint) {
$label.append($("<span class='dsb-adv-hint'></span>").text(group.hint));
}
return $("<div class='dsb-adv-group'></div>").append($label, field.$element);
}
// -- maneid (single value; re-adding one that already exists is rejected -- see applyAdvancedChanges) --
function addNewSenseField() {
var $textarea = $("<textarea class='dsb-input' rows='2'></textarea>").attr("placeholder", "Maneya nû binivîse…");
getters.newSense = function () {
return $.trim($textarea.val());
};
return $("<div class='dsb-adv-group'></div>").append(
$("<div class='dsb-adv-label'></div>").text(util.msg.anotherSense),
$textarea
);
}
function addManeidField() {
var $input = $("<input type='text' class='dsb-input' placeholder='id…'>");
loadSense().then(function (fields) {
$input.val(fields.maneid);
});
getters.maneid = function () {
return $.trim($input.val());
};
return $("<div class='dsb-adv-group'></div>").append($("<div class='dsb-adv-label'></div>").text("Maneid"), $input);
}
// -- etîket / kategorî --
function addEtiketField() {
var field = buildTagField("Etîket…");
loadSense().then(function (fields) {
field.setValues(fields.etiket);
});
getters.etiket = function () {
return field.values();
};
return $("<div class='dsb-adv-group'></div>").append($("<div class='dsb-adv-label'></div>").text("Etîket"), field.$element);
}
function addKategoriField() {
var field = buildTagField("Kategorî…");
loadSense().then(function (fields) {
field.setValues(fields.kategori);
});
getters.kategori = function () {
return field.values();
};
return $("<div class='dsb-adv-group'></div>").append($("<div class='dsb-adv-label'></div>").text("Kategorî"), field.$element);
}
// -- the picker row: the gloss and Nimûne/jêgirtin links sit directly in the row; every word group and
// the rest live behind a "Hevmane û Bêhtir" dropdown. Clicking any link builds and appends its box
// to $openBoxes and hides that link; the box's own "×" removes it, clears its getter, and un-hides the
// link -- several boxes can be open at once. No "Beşek (====)" entry here: buildSubsectionPanel()'s
// own "+ Beşek lê zêde bike" trigger already covers page-level subsections. ----
var FIELD_DEFS = [{ key: "gloss", label: "Maneyê biguhêre", build: addGlossField, primary: true }]
.concat(SENSE_GROUPS.map(function (group) {
return { key: "word:" + group.key, label: group.label, build: function () { return addWordField(group); }, primary: false };
}))
.concat([
{ key: "maneid", label: "Maneid", build: addManeidField, primary: false },
{ key: "etiket", label: "Etîket", build: addEtiketField, primary: false },
{ key: "kategori", label: "Kategorî", build: addKategoriField, primary: false }
]);
// Every sense offers this: the new one lands directly below whichever sense asked for it (see
// insertNewSense), so it is no longer only the last one that can add to the end.
FIELD_DEFS.push({ key: "newSense", label: util.msg.addAnotherSense, build: addNewSenseField, primary: false });
var $picker = $("<div class='dsb-field-picker'></div>");
var $moreMenu = $("<div class='dsb-more-menu'></div>").hide();
var $openBoxes = $("<div class='dsb-open-boxes'></div>");
// $actions (built below) stays hidden until at least one field box is actually open -- otherwise
// "Lê zêde bike" sits there enabled with nothing to queue, which just produces an empty no-op change.
var openBoxCount = 0;
function updateActionsVisibility() {
$actions.toggle(openBoxCount > 0);
}
function makeFieldLink(def) {
var $link = $("<a href='#' class='dsb-quick-link dsb-field-pick'></a>").text(def.key === "gloss" ? def.label : "+ " + def.label);
$link.on("click", function (e) {
e.preventDefault();
openQueueBox();
var $box = def.build();
var $remove = $("<a href='#' class='dsb-box-remove' title='Rake'>×</a>");
$remove.on("click", function (e2) {
e2.preventDefault();
delete getters[def.key];
$box.remove();
$link.show();
openBoxCount--;
updateActionsVisibility();
});
$box.prepend($remove);
$openBoxes.append($box);
util.initManualResize($box);
$link.hide();
$moreMenu.slideUp();
openBoxCount++;
updateActionsVisibility();
});
return $link;
}
// Destructive, so it lives at the bottom of the dropdown behind a confirmation, and shares the
// sense's queue key: deleting supersedes any edit still pending on the same sense.
function makeDeleteLink() {
var $link = $("<a href='#' class='dsb-quick-link dsb-field-delete'>Maneyê rake</a>");
$link.on("click", function (e) {
e.preventDefault();
$moreMenu.slideUp();
OO.ui.confirm("Ev mane û hemû rêzên bin wê dê werin rakirin. Dewam bike?").done(function (ok) {
if (!ok) {
return;
}
queueChange(
placeLabel(language, sectionType, $h3),
"maneyek hate rakirin",
function (baseContent) {
return removeSense(baseContent, language, sectionType, sectionOrdinal, definitionLevel);
},
$save,
$note,
function () {
$li.addClass("dsb-sense-doomed");
return function () {
$li.removeClass("dsb-sense-doomed");
};
},
{ key: senseQueueKey() }
);
$note.show();
});
});
return $link;
}
// Only the links the row actually shows are built now; the dropdown's nine are 43% of the work and
// nobody sees them until "Hevmane û Bêhtir" is clicked, so buildMenuLinks() waits for that.
FIELD_DEFS.forEach(function (def) {
if (!def.primary) {
return;
}
$picker.append(makeFieldLink(def));
if (def.key === "gloss") {
$picker.append($nimune); // directly after "Maneyê biguhêre"
}
});
// Three sections, ruled apart: what labels this sense, the word lists that hang off it, and adding
// another sense. "Maneyê rake" is appended after these by makeDeleteLink() and so closes the last
// one. The word lists follow senseGroups' "order" -- that array's own order is the order the "#:"
// lines are written to the page in, which is not a reading order; the wizard's boxes read the same
// field, so both gadgets list them alike. Anything not named here still appears, after these, so a
// field added later is never silently dropped from the menu.
var MENU_GROUPS = [
["etiket", "kategori", "maneid"],
SENSE_GROUPS.slice().sort(function (a, b) {
return (a.order || 0) - (b.order || 0);
}).map(function (g) {
return "word:" + g.key;
}),
["newSense"]
];
var menuBuilt = false;
function buildMenuLinks() {
if (menuBuilt) {
return;
}
menuBuilt = true;
var byKey = {};
FIELD_DEFS.forEach(function (def) {
if (!def.primary) {
byKey[def.key] = def;
}
});
var placed = {};
MENU_GROUPS.forEach(function (group, groupIndex) {
var defs = group.map(function (key) {
return byKey[key];
}).filter(Boolean);
defs.forEach(function (def, i) {
placed[def.key] = true;
var $link = makeFieldLink(def);
// The rule goes on the first entry of every group after the first.
if (groupIndex > 0 && i === 0) {
$link.addClass("dsb-menu-group-start");
}
$moreMenu.append($link);
});
});
FIELD_DEFS.forEach(function (def) {
if (!def.primary && !placed[def.key]) {
$moreMenu.append(makeFieldLink(def));
}
});
$moreMenu.append(makeDeleteLink());
}
// Lives inside $picker (not appended straight to $quickRow) so .dsb-more-menu's CSS can position it as
// an overlay anchored to $picker, instead of pushing $openBoxes/the rest of the page down when it opens.
var $moreArrow = $("<span class='dsb-more-arrow'></span>").text("▸");
var $moreToggle = $("<a href='#' class='dsb-quick-link dsb-more-toggle'></a>")
.text(util.msg.moreMenu + " ").append($moreArrow);
$moreToggle.on("click", function (e) {
e.preventDefault();
buildMenuLinks();
$moreMenu.slideToggle(function () {
$moreArrow.text($moreMenu.is(":visible") ? "▾" : "▸");
});
});
$picker.append($moreToggle, $moreMenu);
// Outside clicks are handled by one shared document listener (see closeMoreMenus), not one per panel:
// hovering a sense builds its panel, so a long entry would otherwise accumulate dozens of them.
$moreMenu.data("dsbArrow", $moreArrow);
// -- combined save: whatever boxes are open right now, queued together via queueChange(); the actual
// save happens when the user clicks "Guhartinan qeyd bike" on the floating queue box. ----
// Small "not saved yet" preview of everything this queued change will do, appended right under the
// sense's gloss (plain text, not a real render of {{hevmane}}/etc.).
function collectChanges() {
var base = original || { maneid: "", etiket: [], kategori: [], words: {} };
var changed = {};
var words = {};
SENSE_GROUPS.forEach(function (group) {
var getter = getters["word:" + group.key];
words[group.key] = getter ? getter() : [];
if (getter && !sameList(words[group.key], base.words[group.key])) {
changed["word:" + group.key] = true;
}
});
var maneid = getters.maneid ? getters.maneid() : "";
var etiket = getters.etiket ? getters.etiket() : [];
var kategori = getters.kategori ? getters.kategori() : [];
if (getters.maneid && maneid !== (base.maneid || "")) {
changed.maneid = true;
}
if (getters.etiket && !sameList(etiket, base.etiket)) {
changed.etiket = true;
}
if (getters.kategori && !sameList(kategori, base.kategori)) {
changed.kategori = true;
}
return {
gloss: getters.gloss ? getters.gloss() : null,
newSense: getters.newSense ? getters.newSense() : null,
maneid: maneid,
etiket: etiket,
kategori: kategori,
words: words,
changed: changed
};
}
// Both the field save and "Maneyê rake" queue under this, so the later one supersedes the earlier.
function senseQueueKey() {
return "sense:" + sectionType + "|" + sectionOrdinal + "|" + definitionLevel.join(".");
}
var $save = $("<button type='button' class='dsb-save'></button>").text(util.msg.add);
// Where queueChange() writes its confirmation for actions that have no box of their own.
var $note = $("<div class='dsb-status dsb-quick-note'></div>").hide();
var $cancel = $("<button type='button' class='dsb-cancel'></button>").text(util.msg.cancel);
var $status = $("<span class='dsb-status'></span>");
var $actions = $("<div class='dsb-form-actions'></div>").append($save, $cancel, $status).hide();
$cancel.on("click", function () {
// Close the boxes too, not just the row. Hiding alone left every field still open with its
// text in it, so the next click on the pencil reopened the half-filled panel that had just
// been cancelled. Each box's own "x" already clears its getter, restores its link and updates
// the counter, so those are triggered rather than repeating the teardown here.
$openBoxes.find(".dsb-box-remove").trigger("click");
$note.hide().text("");
// dsb.js owns the pencil's pinned state; tell it rather than hiding behind its back, or the
// next click on the pencil would only toggle "pinned" off and appear to do nothing.
$quickRow.trigger("dsbCancel");
hideQueueIfIdle();
});
$save.on("click", function () {
var changes = collectChanges();
function afterLinkify() {
var parts = senseChangeLabels(changes);
queueChange(
placeLabel(language, sectionType, $h3),
parts.length
? parts.join(", ") + (parts.length > 1 ? " hatin guhartin" : " hate guhartin")
: "mane hate guhartin",
function (baseContent) {
return applyAdvancedChanges(baseContent, language, sectionType, sectionOrdinal, definitionLevel, changes);
},
$save,
$status,
function () {
var undoPreview = previewSense($li, language, sectionType, sectionOrdinal,
definitionLevel);
// A new sense has no place on the page yet, so it gets a row of its own directly
// after this one -- the list numbers it, so where it will land is visible.
var $newSense = null;
if (changes.newSense) {
$newSense = $("<li class='dsb-sense-preview'></li>");
$li.after($newSense);
fillWithRendered($newSense, changes.newSense, function () {
$newSense.text(changes.newSense);
});
}
return function () {
undoPreview();
if ($newSense) {
$newSense.remove();
}
};
},
// Re-saving this same sense supersedes its pending change rather than queuing another.
{ key: senseQueueKey() }
);
}
$save.prop("disabled", true);
// Auto-linkify the gloss as part of this save, but only a half nobody has linked by hand.
// Split back into its two halves first, so the explanation is linked on its own rather than
// sitting unseen inside {{îzah|…}}.
if (changes.gloss) {
$status.removeClass("dsb-status-ok dsb-status-error").text("Tê lînkkirin…");
var glossParts = util.splitTercimeIzah(changes.gloss);
linkifyGlossParts(
glossParts ? $.trim(glossParts.tercime) : changes.gloss,
glossParts ? $.trim(glossParts.izah) : "",
function (linkedMane, linkedIzah, error) {
// The change is queued either way, so a gloss that came back empty is not written
// back -- that would save the sense with its wording gone.
var joined = joinGloss(linkedMane, linkedIzah);
if ($.trim(joined)) {
changes.gloss = joined;
}
if (error) {
$status.removeClass("dsb-status-ok").addClass("dsb-status-error").text(error);
}
afterLinkify();
},
true
);
} else {
afterLinkify();
}
});
// The links sit under the buttons, so each open box pushes them down rather than leaving them far above.
$quickRow.empty().append($openBoxes, $actions, $picker, $note);
}
// Attaches the pencil toggle to one leaf definition <li> -- clicking it reveals the "guhartina pêşketî"
// (advanced editing) panel built by buildAdvancedPanel() above.
// ---- per-section UI: "+ Beşek lê zêde bike" after a POS block's own content ----
// Reads the header text of "====" subsections already rendered under this POS heading, straight from the DOM.
// The subsections of a part of speech are the headings one deeper than it is.
function subsectionDepthFor($h3) {
return (sections.headingDepth($h3) || 3) + 1;
}
function isSubsectionHeading($el, depth) {
return sections.headingDepth($el) === depth;
}
function existingSubsectionHeadersInDom($h3) {
var depth = subsectionDepthFor($h3);
var headers = [];
for (var $cursor = headingOuter($h3).next(); $cursor.length; $cursor = $cursor.next()) {
var here = sections.headingDepth($cursor);
if (here && here < depth) {
break; // out of this part of speech
}
if (isSubsectionHeading($cursor, depth)) {
var $hh = $cursor.is("h2, h3, h4, h5, h6") ? $cursor : $cursor.find("h2, h3, h4, h5, h6").first();
headers.push(headingText($hh));
}
}
return headers;
}
// Finds where a new "====" subsection preview belongs in the live DOM, using the same SUBSECTION_ORDER rank
// insertPageSubsection() uses. Returns {insertBefore: $el} (a ranked subsection that outranks this one) or
// {insertAfter: $el} (goes at the end of the block).
function domSubsectionInsertAnchor($h3, header) {
var depth = subsectionDepthFor($h3);
var myRank = subsectionRankForHeader(header);
var $last = headingOuter($h3);
for (var $cursor = headingOuter($h3).next(); $cursor.length; $cursor = $cursor.next()) {
var here = sections.headingDepth($cursor);
if (here && here < depth) {
break; // out of this part of speech
}
if (isSubsectionHeading($cursor, depth)) {
var $hh = $cursor.is("h2, h3, h4, h5, h6") ? $cursor : $cursor.find("h2, h3, h4, h5, h6").first();
var otherRank = subsectionRankForHeader(headingText($hh));
if (otherRank !== -1 && otherRank > myRank) {
return { insertBefore: $cursor };
}
}
$last = $cursor;
}
return { insertAfter: $last };
}
// The wikitext one subsection's content becomes, exactly as insertPageSubsection() writes it -- so the
// preview parses the same string the save will produce.
function subsectionBodyWikitext(language, s, content) {
if (s.kind !== "wordlist") {
return content;
}
return content.filter(function (group) {
return group.words.length;
}).map(function (group) {
return buildWordListCall(WORDLIST_TEMPLATE, language,
withNamedParam(["cure=" + s.header], "sernav", group.sernav), group.words);
}).join("\n\n");
}
// The plain word list this preview falls back to when the parse fails: the values that were typed,
// without the template around them. Right, but not what the page will look like.
function subsectionPlainDom($wrap, s, content) {
if (s.kind !== "wordlist") {
$wrap.append($("<p class='dsb-preview-text'></p>").text(content));
return;
}
content.forEach(function (group) {
if (group.sernav) {
$wrap.append($("<div class='dsb-preview-subheading'></div>").text(group.sernav));
}
var $list = $("<ul class='dsb-preview-list'></ul>");
group.words.forEach(function (w) {
$list.append($("<li></li>").text(w.replace(/<[^<>]*>/g, "")));
});
$wrap.append($list);
});
}
// A "not saved yet" preview of a page-level "====" subsection, dropped into the live page at the
// position the save will put it, with its body rendered the way the page renders it -- real {{kol3}}
// columns and real links, not a list of the words that went into them. Returns the inserted element so
// the caller can remove it again.
function buildSubsectionPreviewDom($h3, s, content, language) {
var $wrap = $("<div class='dsb-preview-block'></div>");
// A styled <div>, not a real <h4>, so existingSubsectionHeadersInDom() never mistakes this live-only
// preview for an actual subsection already on the page.
$wrap.append($("<div class='dsb-preview-heading' role='heading' aria-level='4'></div>").text(s.header));
$wrap.append($("<span class='dsb-preview-badge'></span>").text("nû — hîn nehatiye qeydkirin"));
// Placed before it is filled: a cached render resolves almost at once, and filling a wrap that is
// still detached would announce content nobody can see.
var anchor = domSubsectionInsertAnchor($h3, s.header);
if (anchor.insertBefore) {
anchor.insertBefore.before($wrap);
} else {
anchor.insertAfter.after($wrap);
}
var wikitext = language ? subsectionBodyWikitext(language, s, content) : "";
if ($.trim(wikitext)) {
var $body = $("<div class='dsb-preview-rendered'></div>").appendTo($wrap);
fillWithRendered($body, wikitext, function () {
$body.remove();
subsectionPlainDom($wrap, s, content);
});
} else {
subsectionPlainDom($wrap, s, content);
}
return $wrap;
}
// A free section owns what lies between its own heading and the next heading of any depth, matching
// the range locateHeadingByText() edits. Returns a function that puts the page back, or null.
function replaceFreeSectionInPlace($heading, wikitext) {
var $start = headingOuter($heading);
var body = [];
for (var $cursor = $start.next(); $cursor.length; $cursor = $cursor.next()) {
if (sections.headingDepth($cursor)) {
break;
}
if (!isOwnFurniture($cursor)) {
body.push($cursor.get(0));
}
}
if (!body.length) {
return null;
}
var $slot = $("<div class='dsb-sense-preview'></div>").insertAfter($start);
var $body = $(body).detach();
fillWithRendered($slot, wikitext, function () {
$slot.remove();
$slot = null;
$body.insertAfter($start);
});
return function () {
if ($slot) {
$body.insertAfter($start);
$slot.remove();
$slot = null;
}
};
}
/**
* Redraws a subsection that is already on the page with the content this edit would give it.
*
* The section's own nodes -- everything between its heading and the next heading of the same rank or
* higher -- are detached rather than dropped, so the returned function puts the page back exactly as it
* was when the change is cancelled or superseded.
*/
function replaceSubsectionInPlace($h3, header, wikitext) {
var depth = subsectionDepthFor($h3);
// Walked the same way existingSubsectionHeadersInDom() walks it, so "which nodes are this
// subsection" is decided once and the same way everywhere.
var $start = null;
var body = [];
for (var $cursor = headingOuter($h3).next(); $cursor.length; $cursor = $cursor.next()) {
var here = sections.headingDepth($cursor);
if (here && here < depth) {
break; // out of this part of speech
}
if (isSubsectionHeading($cursor, depth)) {
if ($start) {
break; // the next subsection starts here
}
var $hh = $cursor.is("h2, h3, h4, h5, h6") ? $cursor : $cursor.find("h2, h3, h4, h5, h6").first();
if (headingText($hh) === header) {
$start = $cursor;
}
continue;
}
// This gadget's own furniture stays where it is: the subsection's editing panel is the sibling
// right after its heading, so sweeping it into the body would detach the very panel the change
// was made in and leave the pencil toggling an element that is no longer on the page.
if ($start && !isOwnFurniture($cursor)) {
body.push($cursor.get(0));
}
}
if (!$start || !body.length) {
return null;
}
var $slot = $("<div class='dsb-sense-preview'></div>").insertAfter($start);
var $body = $(body).detach();
fillWithRendered($slot, wikitext, function () {
$slot.remove();
$slot = null;
$body.insertAfter($start);
});
return function () {
if ($slot) {
$body.insertAfter($start);
$slot.remove();
$slot = null;
}
};
}
/**
* The live DOM one "place" section occupies: {nodes, insert}. nodes are what a render replaces --
* empty when the section is not on the page yet -- and insert() puts an element where the section
* belongs, so a new one appears exactly where the save will put it.
*/
// This gadget's own panels sit between a heading and the page's content, so every walk steps over
// them rather than counting one as content.
function isOwnFurniture($el) {
return $el.is(".dsb-toolbar, .dsb-quick-row, .dsb-subsection-panel, .dsb-convert-pos-panel," +
" .dsb-preview-block, .dsb-sense-preview, .dsb-preview-inline");
}
// A heading's place in the page, which orders queued renames and removals bottom-up.
function headingPosition($el) {
var $h = $el.is("h2, h3, h4, h5, h6") ? $el : $el.find("h2, h3, h4, h5, h6").first();
return $("h2, h3, h4, h5, h6").index($h);
}
// One subsection's own nodes on the page, read the way headingSpan() reads the wikitext: a "===="
// subsection down to the next heading at its depth or shallower, a free section ($h3 is its heading)
// down to the next heading of any depth. hasDeeper says a free section has headings under it.
function subsectionDom($h3, s) {
var $start = null;
var depth;
if (s.free) {
$start = headingOuter($h3);
depth = sections.headingDepth($start) || sections.headingDepth($h3);
} else {
depth = subsectionDepthFor($h3);
for (var $c = headingOuter($h3).next(); $c.length; $c = $c.next()) {
var d = sections.headingDepth($c);
if (d && d < depth) {
break;
}
if (d === depth) {
var $hh = $c.is("h2, h3, h4, h5, h6") ? $c : $c.find("h2, h3, h4, h5, h6").first();
if (headingText($hh) === s.header) {
$start = $c;
break;
}
}
}
}
if (!$start) {
return null;
}
var body = [];
var hasDeeper = false;
for (var $cursor = $start.next(); $cursor.length; $cursor = $cursor.next()) {
var here = sections.headingDepth($cursor);
if (here && (s.free || here <= depth)) {
hasDeeper = !!s.free && here > depth;
break;
}
if (!isOwnFurniture($cursor)) {
body.push($cursor.get(0));
}
}
return { $heading: $start, $body: $(body), hasDeeper: hasDeeper };
}
function loosePlaceDom($h3, subsection) {
var place = subsection.place;
var nodes = [];
var $cursor;
if (place === "page-top") {
// Şablon:herwiha binêre renders as <div class="rellink binere"> at the head of the content.
var $out = $("#mw-content-text .mw-parser-output").first();
var $hat = $out.children(".binere, .rellink").first();
if ($hat.length) {
return { nodes: $hat.get(), insert: function ($el) { $hat.before($el); } };
}
return { nodes: [], insert: function ($el) { $out.prepend($el); } };
}
var $start = headingOuter($h3);
if (place === "pron") {
// A "===" heading above this POS block, under the language one.
for (var $back = $start.prev(); $back.length; $back = $back.prev()) {
if ($back.is(".mw-heading2, h2")) {
break;
}
if ($back.is(".mw-heading3, h3")) {
var $hh = $back.is("h3") ? $back : $back.find("h3").first();
if (headingText($hh) === subsection.header) {
for ($cursor = $back.next();
$cursor.length && !$cursor.is(".mw-heading2, .mw-heading3, h2, h3");
$cursor = $cursor.next()) {
if (!isOwnFurniture($cursor)) {
nodes.push($cursor.get(0));
}
}
return { nodes: nodes, insert: function ($el) { $back.after($el); } };
}
}
}
return { nodes: [], insert: function ($el) { $start.before($el); } };
}
if (place === "pos-top") {
// The thumbnails between the heading and the headword line.
for ($cursor = $start.next(); $cursor.length; $cursor = $cursor.next()) {
if (isOwnFurniture($cursor)) {
continue;
}
if (!$cursor.is(".thumb, figure, .floatright, .floatleft")) {
break;
}
nodes.push($cursor.get(0));
}
return { nodes: nodes, insert: function ($el) { $start.after($el); } };
}
return null;
}
// The wikitext a "place" section's pending content renders as. A word list is its one call; everything
// else is already the body that will be written.
function loosePlacePreviewWikitext(subsection, content, language) {
return subsection.kind === "wordlist"
? wt.buildHbnrCall(loosePlaceWords(content))
: loosePlaceBody(subsection, content, language);
}
// Draws a section's headword line from wikitext where the page's own line stands, or above the
// definitions when the section has none. The page's line is detached rather than dropped, so the
// returned function puts it back.
function replaceHeadwordInPlace($h3, wikitext) {
if (!$.trim(wikitext || "")) {
return null;
}
var $old = $();
var $at = $();
for (var $cursor = headingOuter($h3).next(); $cursor.length; $cursor = $cursor.next()) {
if ($cursor.is("p")) {
$old = $cursor;
break;
}
if (sections.headingDepth($cursor) || $cursor.is("ol")) {
$at = $cursor;
break;
}
}
var $slot = $("<div class='dsb-sense-preview'></div>");
if ($old.length) {
$old.before($slot);
} else if ($at.length) {
$at.before($slot);
} else {
return null;
}
var $body = $old.detach();
function restore() {
if (!$slot) {
return;
}
$body.insertBefore($slot);
$slot.remove();
$slot = null;
}
fillWithRendered($slot, wikitext, restore);
return restore;
}
// Redraws one of those places where it stands, the same way replaceSubsectionInPlace() redraws a
// "====" one. The page's own nodes are detached rather than dropped, so cancelling puts them back.
function replaceLoosePlaceInPlace($h3, subsection, wikitext) {
if (!$.trim(wikitext || "")) {
return null;
}
var at = loosePlaceDom($h3, subsection);
if (!at) {
return null;
}
var $slot = $("<div class='dsb-sense-preview'></div>");
at.insert($slot);
var $body = $(at.nodes).detach();
function restore() {
if (!$slot) {
return;
}
$body.insertBefore($slot);
$slot.remove();
$slot = null;
}
fillWithRendered($slot, wikitext, restore);
return restore;
}
// Builds the subsection picker + its word-list/text field. A subsection that isn't on the page yet is saved
// via insertPageSubsection(); one that already is gets prefilled and saved via updatePageSubsection().
// onlyHeader pins the panel to a single subsection (the per-heading pencil); omit it for the full picker.
// free pins the panel to a heading that is not a subsection of a part of speech, located by its own
// text: {header, ordinal}.
function buildSubsectionPanel($panel, $h3, language, sectionType, sectionOrdinal, onlyHeader, free) {
var existing = existingSubsectionHeadersInDom($h3);
// A heading the data does not name is still editable. It is declared a word list so the reader
// tries, in order, its {{kol3}} calls and then a plain bullet list; anything else falls through to
// raw wikitext, which is what prefill() does with a list it cannot read.
// Hidden counts as unknown here: the picker does not offer to build a Werger box, but one already
// on the page still opens, as the wikitext it is.
var unknown = onlyHeader && !PAGE_SUBSECTIONS.some(function (s) {
return s.header === onlyHeader && !s.hidden;
});
// A free section starts as wikitext: what it holds is only known once it has been read, and
// prefill() swaps in the {{kol3}} form there if it turns out to be a list.
var available = free ? [{
header: onlyHeader,
id: "free",
kind: "text",
free: free,
existing: true
}] : unknown ? [{
header: onlyHeader,
id: "unknown",
kind: "wordlist",
unknown: true,
existing: true
}] : PAGE_SUBSECTIONS.filter(function (s) {
// "hidden" takes a section out of the picker without removing it: Werger waits for the
// translation tools it belongs to, and offering a box those cannot yet fill misleads.
// Werger also carries lang: "ku" -- it is a Kurdish-entry section, so it is not offered
// elsewhere either.
return !s.hidden && (!s.lang || s.lang === language) &&
(!onlyHeader || s.header === onlyHeader);
}).map(function (s) {
return $.extend({}, s, { existing: existing.indexOf(s.header) !== -1 });
});
if (!available.length) {
$panel.text("Ji bo vê beşê guhartin tune.");
return;
}
var $select = $("<select class='dsb-subsection-select'></select>");
if (!onlyHeader) {
// Label-less on purpose: it holds the "nothing chosen yet" value without becoming a row in the
// list (makeSearchable() skips a blank option that has no label), so the prompt lives in the
// input's placeholder instead.
$select.append($("<option value=''></option>"));
}
available.forEach(function (s) {
// A "place" entry has no "====" heading of its own, so it is marked rather than left looking
// like the subsections around it.
var label = s.place ? s.header + " (ne binebeş e)"
: (s.existing ? s.header + " (biguhêre)" : s.header);
$select.append($("<option></option>").val(s.id).text(label));
});
var $selectWrap = makeSearchable($select, "Binebeşek hilbijêre");
if (onlyHeader) {
$selectWrap.hide(); // pinned to one subsection: nothing to choose
}
var $fieldWrap = $("<div class='dsb-subsection-field'></div>");
var $save = $("<button type='button' class='dsb-save'></button>").text(util.msg.add);
var $cancel = $("<button type='button' class='dsb-cancel'></button>").text(util.msg.cancel);
var $status = $("<span class='dsb-status'></span>");
var $actions = $("<div class='dsb-form-actions'></div>").append($save, $cancel, $status);
$cancel.on("click", function () {
resetForm();
$panel.hide();
hideQueueIfIdle();
});
// A panel pinned to a heading on the page can rename or remove it. Bilêvkirin and the other places
// have no heading of their own to change.
var headingEditable = !!onlyHeader && available.length === 1 && available[0].existing && !available[0].place;
var $nameWrap = null;
// Only a panel pinned to one heading renames it; elsewhere the name is the picked subsection's own.
var readName = function (s) {
return s.header;
};
if (headingEditable) {
var subject = available[0];
var $nameLabel = $("<div class='dsb-adv-label'>Nav</div>");
if (subject.free) {
var $nameInput = $("<input type='text' class='dsb-input dsb-heading-name'>").val(onlyHeader);
readName = function () {
return $.trim($nameInput.val());
};
$nameWrap = $("<div class='dsb-heading-name-wrap'></div>").append($nameLabel, $nameInput);
} else {
// The names the gadget knows, for a subsection of a part of speech; one this part of speech
// already has is left out.
var $nameSelect = $("<select class='dsb-heading-name'></select>");
var names = [onlyHeader];
PAGE_SUBSECTIONS.forEach(function (s) {
if (!s.place && !s.hidden && (!s.lang || s.lang === language) &&
names.indexOf(s.header) === -1 && existing.indexOf(s.header) === -1) {
names.push(s.header);
}
});
names.forEach(function (name) {
$nameSelect.append($("<option></option>").val(name).text(name));
});
var $nameSearch = makeSearchable($nameSelect, "Nav");
$nameSelect.val(onlyHeader).trigger("wiktku:refresh");
readName = function () {
return $nameSelect.val() || onlyHeader;
};
$nameWrap = $("<div class='dsb-heading-name-wrap'></div>").append($nameLabel, $nameSearch);
}
var subjectDom = subsectionDom($h3, subject);
if (!(subjectDom && subjectDom.hasDeeper)) {
var $delete = $("<button type='button' class='dsb-delete'>Beşê jê bibe</button>");
$cancel.after($delete);
$delete.on("click", function () {
OO.ui.confirm("Beşa «" + subject.header + "» dê were rakirin. Dewam bike?").done(function (ok) {
if (!ok) {
return;
}
queueHeadingChange(subject, "beşa «" + subject.header + "» hate rakirin",
function (pageContent) {
return removeSubsection(pageContent, language, sectionType, sectionOrdinal, subject);
},
function () {
var dom = subsectionDom($h3, subject);
if (!dom) {
return null;
}
var $doomed = dom.$heading.add(dom.$body).addClass("dsb-preview-removed");
return function () {
$doomed.removeClass("dsb-preview-removed");
};
});
});
});
}
}
// Renaming and removing share one queue key, so the later choice replaces the earlier one. Both run
// last and bottom-up, since other queued changes find the section by the heading they change.
function queueHeadingChange(s, action, transform, previewFn) {
var dom = subsectionDom($h3, s);
queueChange(subsectionPlaceLabel(s, language, sectionType, $h3), action,
function (pageContent) {
return { content: transform(pageContent), warnings: [] };
},
$save, $status, previewFn,
{
runLast: true,
key: "heading:" + (s.free ? s.header + "|" + s.free.ordinal
: sectionType + "|" + sectionOrdinal + "|" + s.header),
pagePosition: dom ? headingPosition(dom.$heading) : 0
});
}
function queueRename(s, newName) {
queueHeadingChange(s, "beşa «" + s.header + "» bû «" + newName + "»",
function (pageContent) {
return renameSubsection(pageContent, language, sectionType, sectionOrdinal, s, newName);
},
function () {
var dom = subsectionDom($h3, s);
if (!dom) {
return null;
}
var $note = $("<div class='dsb-preview-inline dsb-preview-heading-note'></div>")
.text("→ " + newName + " — nû, hîn nehatiye qeydkirin");
dom.$heading.after($note);
return function () {
$note.remove();
};
});
}
// Undefined while the placeholder option is selected.
function currentSubsection() {
var id = $select.val();
return id ? available.filter(function (s) {
return s.id === id;
})[0] : undefined;
}
// One entry per "{{kol3}}" group in the current wordlist section; empty for any other kind.
var groupFields = [];
var $groups = null;
var editAsText = false; // set when an existing wordlist section turns out to be unparseable
// Whatever has been typed into each subsection's box, so switching the picker away and back restores it
// instead of rebuilding an empty field. Keyed by subsection id; lastId is whichever box is on screen.
var drafts = {};
var lastId = null;
// Called before renderField() rebuilds, while the group fields still hold the outgoing box.
function captureDraft() {
if (!lastId) {
return;
}
drafts[lastId] = imagesField
? { asText: false, images: imagesField.values() }
: (groupFields.length
? { asText: false, groups: readGroups() }
: { asText: editAsText, text: fieldText() });
}
function restoreDraft(s, draft) {
// An existing wordlist we previously fell back to raw wikitext for stays in that mode.
if (draft.asText && s.kind === "wordlist") {
editAsText = true;
groupFields = [];
renderTextArea(s, 6);
}
if (imagesField) {
imagesField.setValues(draft.images);
} else if (groupFields.length) {
setGroups(s, draft.groups);
} else {
setFieldText(draft.text);
}
}
// Etîmolojî is edited on a live surface (see renderChipSurface) rather than in a textarea, so every
// read and write of the field goes through these two instead of touching .dsb-subsection-text.
var chipSurface = null;
function fieldText() {
if (wergerForm) {
return buildWergerBlock(wergerForm.read());
}
return chipSurface
? $.trim(readChipSurface(chipSurface.get(0)))
: $.trim($fieldWrap.find(".dsb-subsection-text").val() || "");
}
function setFieldText(value) {
if (wergerForm) {
wergerForm.set(parseWergerBlock(value));
return;
}
if (chipSurface) {
renderChipSurface(chipSurface, value || "");
var schedule = chipSurface.data("dsbSchedulePreview");
if (schedule) {
schedule(); // show what the loaded etymology renders as
}
} else {
$fieldWrap.find(".dsb-subsection-text").val(value || "");
}
}
// The contenteditable surface: text typed directly, template calls as chips that open the dialog,
// plus start.js's etymology templates in a searchable insert menu.
// A live surface where a template shows as a chip, with a menu that inserts one. Etîmolojî and
// Bilêvkirin are both written this way; they differ only in which templates the menu offers.
function renderTemplateEditor(s, templates) {
$fieldWrap.empty();
var $select = $("<select class='dsb-subsection-select'></select>");
$select.append($("<option value=''></option>"));
templates.forEach(function (t) {
$select.append($("<option></option>").val(t.snippet).text(t.name + " — " + t.desc));
});
var $surface = $("<div class='dsb-tpl-surface' contenteditable='true'></div>")
.attr("role", "textbox")
.attr("aria-multiline", "true");
chipSurface = $surface;
// Clicking the insert menu moves focus out of the surface and the browser forgets the caret, so
// the last caret position inside the surface is kept and restored before inserting -- otherwise
// focus() drops it back to the very start and every template lands at the beginning of the line.
var savedRange = null;
function rememberCaret() {
var sel = window.getSelection();
if (!sel || !sel.rangeCount) {
return;
}
var range = sel.getRangeAt(0);
var root = $surface.get(0);
if (range.commonAncestorContainer === root || $.contains(root, range.commonAncestorContainer)) {
savedRange = range.cloneRange();
}
}
$surface.on("keyup mouseup focusout", rememberCaret);
function restoreCaret() {
if (!savedRange) {
return;
}
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(savedRange);
}
$select.on("change", function () {
var snippet = $select.val();
if (!snippet) {
return;
}
// Same substitution start.js makes: CODE is this section's language, SOURCELANG is left for
// the user to fill in.
snippet = snippet.replace(/CODE/g, language).replace(/SOURCELANG/g, "?");
// A pronunciation template is a bullet of its own ("* {{ku-IPA}}"), so it starts a line
// rather than landing in the middle of one.
var ownLine = /^\*\s/.test(snippet);
if (ownLine) {
snippet = $.trim(snippet.replace(/^\*\s*/, ""));
}
$surface.focus();
restoreCaret();
var $chip = makeTemplateChip(snippet);
var piece = document.createDocumentFragment();
if (ownLine) {
// The bullet, and a line of its own unless the caret already starts one.
var at = caretOffset();
var before = at >= 0 ? readChipSurface($surface.get(0)).slice(0, at) : "";
piece.appendChild(document.createTextNode(!before || /\n$/.test(before) ? "* " : "\n* "));
}
piece.appendChild($chip.get(0));
insertAtCaret($surface, piece);
rememberCaret(); // so a second insert lands after the first, not back at the old spot
$select.val("");
// Straight into the dialog: the snippet is placeholders ("?", "…") until someone fills it in.
cite.openTemplateDialog(snippet).then(function (edited) {
applyChipEdit($chip, edited);
syncPanelWidth();
});
});
// Paste as plain text: pasted markup would otherwise become real nodes in the surface.
$surface.on("paste", function (e) {
var clip = e.originalEvent && e.originalEvent.clipboardData;
if (!clip) {
return;
}
e.preventDefault();
document.execCommand("insertText", false, clip.getData("text/plain"));
});
// The chip the dialog was opened for, or the one that has taken its place. renderChipSurface()
// rebuilds the surface from its wikitext whenever a call is typed in as text, which throws away
// the element this closure is holding; without this, "Jê bibe" would remove a node that is no
// longer on screen and appear to do nothing.
function liveChip($chip, wikitext) {
if ($.contains($surface.get(0), $chip.get(0))) {
return $chip;
}
return $surface.find(".dsb-tpl-chip").filter(function () {
return $(this).attr("data-wikitext") === wikitext;
}).first();
}
function applyChipEdit($chip, edited) {
if (edited === null || !$chip.length) {
return;
}
if (!$.trim(edited)) {
$chip.remove();
return;
}
// Edited into something that is no longer one template call: let it fall back to plain text
// rather than keeping a chip that lies about its contents.
var call = parseTemplateCalls(edited);
if (call.otherContent || call.calls.length !== 1) {
$chip.replaceWith(document.createTextNode(edited));
return;
}
$chip.replaceWith(makeTemplateChip(edited));
}
// Double-click edits the call's wikitext in place; single click opens the parameter dialog. The
// click is held back briefly so the first of a double-click does not open the dialog underneath.
var chipClickTimer = null;
var lastChipTap = 0;
var lastChipNode = null;
var DOUBLE_TAP_MS = 300;
// Double-tap drops the chip back to plain wikitext in the surface, rather than making the chip
// itself editable: a contenteditable inside a contenteditable gives Android a selection handle and
// no usable caret. As plain text the browser's own editing works, and chipifyTyped() puts the chip
// back once the caret leaves the call.
// A collapsed caret inside the text just inserted: at the character tapped where the browser can
// say which that is, otherwise just inside the closing braces so the caret stays within the call
// (which is what stops chipifyTyped putting the chip straight back).
function caretRangeIn(node, event) {
var range;
var x = event && event.clientX;
var y = event && event.clientY;
if (x !== undefined && document.caretRangeFromPoint) {
range = document.caretRangeFromPoint(x, y);
} else if (x !== undefined && document.caretPositionFromPoint) {
var pos = document.caretPositionFromPoint(x, y);
if (pos) {
range = document.createRange();
range.setStart(pos.offsetNode, pos.offset);
}
}
if (range && range.startContainer === node) {
range.collapse(true);
return range;
}
var text = node.nodeValue;
range = document.createRange();
range.setStart(node, /\}\}$/.test(text) ? text.length - 2 : text.length);
range.collapse(true);
return range;
}
function startInlineEdit($chip, event) {
if (!$.contains($surface.get(0), $chip.get(0))) {
return; // the tap timer and dblclick can both fire; only the first one has a chip left
}
var node = document.createTextNode($chip.attr("data-wikitext"));
$chip.replaceWith(node);
$surface.get(0).focus();
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(caretRangeIn(node, event));
}
// Bound before the chip's own handler and stopping there, so removing a call never opens the
// dialog for it on the way out.
$surface.on("click", ".dsb-tpl-chip-remove", function (e) {
e.preventDefault();
e.stopImmediatePropagation();
clearTimeout(chipClickTimer);
lastChipNode = null;
$(this).closest(".dsb-tpl-chip").remove();
syncPanelWidth();
});
$surface.on("click keydown", ".dsb-tpl-chip", function (e) {
if (e.type === "keydown" && e.which !== 13 && e.which !== 32) {
return;
}
e.preventDefault();
var $chip = $(this);
clearTimeout(chipClickTimer);
// A second tap on the same chip edits it inline. Timed here rather than left to "dblclick",
// which mobile browsers fire unreliably or not at all for a double-tap.
var now = new Date().getTime();
if (lastChipNode === this && now - lastChipTap < DOUBLE_TAP_MS) {
lastChipNode = null;
startInlineEdit($chip, e);
return;
}
lastChipTap = now;
lastChipNode = this;
var wikitext = $chip.attr("data-wikitext");
chipClickTimer = setTimeout(function () {
cite.openTemplateDialog(wikitext).then(function (edited) {
applyChipEdit(liveChip($chip, wikitext), edited);
syncPanelWidth();
});
}, DOUBLE_TAP_MS);
});
$surface.on("dblclick", ".dsb-tpl-chip", function (e) {
e.preventDefault();
clearTimeout(chipClickTimer);
startInlineEdit($(this), e);
});
// A long etymology cannot be read in the panel's usual 520px column, so the panel drops its
// width cap once there is enough text to need it. What it will look like is shown by the
// in-place render on the page itself, not by a second copy inside the form.
var WIDE_AT = 240; // characters
function syncPanelWidth() {
var wikitext = readChipSurface($surface.get(0));
if (wikitext.length > WIDE_AT || wikitext.indexOf("\n") !== -1) {
$surface.closest(".dsb-subsection-panel").addClass("dsb-panel-wide");
}
}
// A template typed by hand becomes a chip once typing settles, so it behaves like an inserted one:
// click for the parameter dialog, double-click for its raw wikitext.
var composing = false;
// The caret as an offset into the surface's wikitext, which is what survives rebuilding the DOM.
function caretOffset() {
var sel = window.getSelection();
var root = $surface.get(0);
if (!sel || !sel.rangeCount) {
return -1;
}
var range = sel.getRangeAt(0);
if (range.startContainer !== root && !$.contains(root, range.startContainer)) {
return -1; // caret is somewhere else on the page
}
var pre = document.createRange();
pre.selectNodeContents(root);
pre.setEnd(range.startContainer, range.startOffset);
var holder = document.createElement("div");
holder.appendChild(pre.cloneContents());
return readChipSurface(holder).length;
}
// Puts the caret back at that wikitext offset. Only runs straight after a rebuild, so the surface
// holds nothing but text nodes and chips.
function placeCaret(offset) {
var root = $surface.get(0);
var range = document.createRange();
var nodes = root.childNodes;
root.focus();
for (var i = 0; i < nodes.length; i++) {
var node = nodes[i];
var len = node.nodeType === 3
? node.nodeValue.length
: ($(node).attr("data-wikitext") || $(node).text()).length;
if (offset <= len) {
if (node.nodeType === 3) {
range.setStart(node, offset);
} else {
range.setStartAfter(node); // a chip is atomic; the caret goes after it
}
break;
}
offset -= len;
}
if (!range.startContainer || range.startContainer === document) {
range.selectNodeContents(root);
}
range.collapse(true);
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
}
// True when the selection overlaps the inside of a template call. A caret resting exactly at the
// closing "}}" does not count -- that is someone who has just finished typing one.
function selectionTouchesCall(wikitext) {
var sel = window.getSelection();
if (!sel || !sel.rangeCount) {
return false;
}
var range = sel.getRangeAt(0);
var root = $surface.get(0);
if (range.startContainer !== root && !$.contains(root, range.startContainer)) {
return false;
}
var from = caretOffset();
var to = from;
if (!range.collapsed) {
var pre = document.createRange();
pre.selectNodeContents(root);
pre.setEnd(range.endContainer, range.endOffset);
var holder = document.createElement("div");
holder.appendChild(pre.cloneContents());
to = readChipSurface(holder).length;
}
return parseTemplateCalls(wikitext).calls.some(function (call) {
return from < call.end && to > call.start;
});
}
function chipifyTyped() {
if (composing) {
return; // never rebuild under an IME
}
var wikitext = readChipSurface($surface.get(0));
// Chips already hold one call each, so a higher call count means one was typed in as text.
if (parseTemplateCalls(wikitext).calls.length <= $surface.find(".dsb-tpl-chip").length) {
return;
}
var offset = caretOffset();
if (selectionTouchesCall(wikitext)) {
return; // still inside a call: leave it as text until the caret moves out
}
renderChipSurface($surface, wikitext);
savedRange = null; // the old range points at nodes that no longer exist
if (offset >= 0) {
placeCaret(offset);
rememberCaret();
}
}
$surface.on("compositionstart", function () {
composing = true;
});
$surface.on("compositionend", function () {
composing = false;
schedulePreview();
});
var previewTimer = null;
function schedulePreview() {
clearTimeout(previewTimer);
previewTimer = setTimeout(function () {
chipifyTyped();
syncPanelWidth();
}, 700);
}
$surface.on("input", schedulePreview);
$surface.data("dsbSchedulePreview", schedulePreview);
$fieldWrap.append(makeSearchable($select, util.msg.addTemplate), $surface);
// Bilêvkirin is written in IPA, so it gets the same character palette the wizard shows. Its
// characters go in as text and its two template buttons as chips, which is what the rest of
// this surface is made of.
if (s.place === "pron") {
$fieldWrap.append(util.buildIpaPalette({
insertText: function (text) {
$surface.focus();
restoreCaret();
insertAtCaret($surface, document.createTextNode(text));
rememberCaret();
schedulePreview();
},
insertTemplate: function (snippet) {
$surface.focus();
restoreCaret();
var $chip = makeTemplateChip(snippet.replace(/\|\s*\}\}$/, "}}"));
insertAtCaret($surface, $chip.get(0));
rememberCaret();
cite.openTemplateDialog($chip.attr("data-wikitext")).then(function (edited) {
applyChipEdit($chip, edited);
syncPanelWidth();
});
}
}));
}
}
// The three "place" sections are wikitext with a shape worth spelling out, since nothing on screen
// says what belongs in the box.
var PLACE_PLACEHOLDERS = {
"page-top": "{{h-bnr|Kelîme|Kelîmeyeke din}} an jî {{herwiha binêre/ane}}",
"pos-top": "[[Wêne:Navê pelî.jpg|thumb|Binnivîs]]",
"pron": "* {{ku-IPA}}"
};
function renderTextArea(s, rows) {
$fieldWrap.empty().append(
$("<textarea class='dsb-input dsb-subsection-text'></textarea>")
.attr("rows", rows)
.attr("placeholder", PLACE_PLACEHOLDERS[s.place] || (s.header + "…"))
);
util.initManualResize($fieldWrap);
}
// A translation box: the {{werger-ser}}/{{werger-bin}} pair, with the sense it covers and the
// layout parameters that template accepts. The rows in between are left to the translation editor
// gadget, which is what edits them on the rendered page.
// Reads and writes through fieldText()/setFieldText() as wikitext, so drafts, save and the queue
// need no special case beyond the append below.
var wergerForm = null;
var imagesField = null;
function renderWergerField(s) {
var inputs = {};
// Its own row class rather than .dsb-tpl-param-row: that one is styled in cite.css, which is
// only on the page when wikt.cite happens to be loaded, and without it the label falls back to
// sitting inline and a short one ("id") is overlapped by its own box.
function row(key, label, placeholder) {
inputs[key] = $("<input type='text' class='dsb-input'>").attr("placeholder", placeholder || "");
return $("<div class='dsb-werger-row'></div>").append(
$("<label class='dsb-adv-label'></label>").text(label).append(inputs[key])
);
}
// {{werger-ser}} also takes stûn, firehî, bgcolor, valign and align, but they only restyle the
// box and its defaults are what these pages use, so the form does not offer them. They are
// still in WERGER_NAMED, so a block that already sets one is read back correctly.
var $main = $("<div class='dsb-werger-main'></div>").append(
row("1", "Mane", "ava vexwarinê"),
row("2", "Mane no", "ne mecbûrî — di parantezê de xuya dike"),
row("id", "id", "ne mecbûrî — IDya tercimeyê")
);
var $note = $("<p class='dsb-werger-note'></p>").text(
"Qutiyeke Wergerê ya vala lê zêde dikî. Tercimeyan bi amûra wergerê dûre binivîse."
);
wergerForm = {
read: function () {
var out = {};
$.each(inputs, function (key, $input) {
var value = $.trim($input.val() || "");
if (value) {
out[key] = value;
}
});
return out;
},
set: function (params) {
$.each(inputs, function (key, $input) {
$input.val((params && params[key]) || "");
});
}
};
$fieldWrap.empty().append($note, $main);
}
// Same [[Kategorî:Çavkanî]] search widget start.js's own picker uses: choosing an entry inserts
// "* {{Target}}" at the cursor. The field itself stays the plain ".dsb-subsection-text" textarea
// every other "kind: text" subsection already uses, so save/prefill/drafts need no changes.
function renderCavkaniField(s) {
var $ta = $("<textarea class='dsb-input dsb-subsection-text'></textarea>")
.attr("rows", 4)
.attr("placeholder", util.msg.pickOrTypeTemplate);
var picker = cite.buildCategoryTemplateSearch({
placeholder: util.msg.addTemplate,
describe: true,
// Same param dialog Etîmolojî opens on a fresh insert: filled from the picked template's own
// TemplateData, so the user adds "rûpel=", "sernav=", ... before anything lands in the field
// rather than typing a bare {{Target}} and going back to fill params in by hand.
onPick: function (entry) {
cite.openTemplateDialog("{{" + entry.target + "}}").then(function (edited) {
if (!edited) {
return; // cancelled, or "Jê bibe" on a call that was never inserted
}
util.insertAtCursor($ta.get(0), "* " + edited + "\n");
$ta.trigger("focus");
});
}
});
var $picker = $("<div class='dsb-cavkani-picker'></div>").append(picker.$element);
$fieldWrap.empty().append($picker, $ta);
}
// One "{{kol3}}" group: its "sernav=" heading and its words. Several of these make up one section --
// "Herwiha binêre" typically carries an unheaded list plus a few headed ones.
function addGroup(s, group) {
var $sernav = $("<input type='text' class='dsb-input'>").attr("placeholder", "ne mecbûrî…");
// {{h-bnr}} takes bare page names, so its rows carry no ⊕: there is nowhere in the call for a
// modifier to go.
var words = buildWordListField(s.header + "…", { modifiers: !s.single });
var $remove = $("<a href='#' class='dsb-quick-link dsb-group-remove'>Komê rake</a>");
var $element = $("<div class='dsb-wordgroup'></div>").append(
// Label beside the box, not above it: stacked, "Sernav" read as a heading for the whole
// group rather than as the name of the field under it. The input is nested in the label so
// clicking the word focuses the box, without needing an id per group.
// A single-call list has no "sernav=" to carry, so the row is built (readGroups still reads
// it) but never shown. Hidden here rather than in renderField: setGroups() rebuilds every
// group on prefill, which would put a visible one back.
$("<div class='dsb-tpl-param-row dsb-param-row-inline'></div>").append(
$("<label class='dsb-adv-label'></label>").text("Sernav").append($sernav)
).toggle(!s.single),
words.$element,
$remove
);
var field = {
$element: $element,
read: function () {
return { sernav: $.trim($sernav.val()), words: words.values() };
},
set: function (g) {
$sernav.val((g && g.sernav) || "");
words.setValues((g && g.words) || []);
}
};
$remove.on("click", function (e) {
e.preventDefault();
var at = $.inArray(field, groupFields);
if (at !== -1) {
groupFields.splice(at, 1);
}
$element.remove();
updateGroupChrome();
});
field.set(group);
groupFields.push(field);
$groups.append($element);
updateGroupChrome();
return field;
}
// With a single group there is nothing to tell apart, so it needs neither a remove link nor a label.
function updateGroupChrome() {
var many = groupFields.length > 1;
$groups.toggleClass("dsb-wordgroups-many", many);
$groups.find(".dsb-group-remove").toggle(many);
}
function readGroups() {
return groupFields.map(function (field) {
return field.read();
});
}
// Rebuilds the blocks to match what the page (or the draft) holds, always leaving at least one.
function setGroups(s, groups) {
groupFields = [];
$groups.empty();
(groups && groups.length ? groups : [null]).forEach(function (group) {
addGroup(s, group);
});
}
// Loads what the page already has into the form, so an edit starts from the current list rather than
// from an empty one. A wordlist section we can't parse degrades to raw wikitext editing.
function prefill(s) {
$status.removeClass("dsb-status-error dsb-status-ok").text("Tê barkirin…");
$save.prop("disabled", true);
fetchPageSubsection(language, sectionType, sectionOrdinal, s).then(function (current) {
$save.prop("disabled", false);
$status.text("");
if (!current) {
return;
}
// A "place" section has no heading of its own, so whether the page already has one cannot
// be seen in the DOM the way a "====" subsection can -- it is known only once its content
// has been read. That is what decides "nûkirin" or "zêdekirin" in the edit summary.
if (s.place) {
s.existing = !!(current.images ? current.images.length : $.trim(current.text || ""));
// The label was set before this content arrived, when nothing yet said one was there.
$save.text(s.existing && s.kind !== "werger" ? util.msg.edit : util.msg.add);
}
if (current.kind === "images" && imagesField) {
imagesField.setValues(current.images);
return;
}
// A free section's field was built before its content was known: a list turns it into the
// {{kol3}} form, anything else leaves it the wikitext box it already is.
if (s.free && current.kind === "wordlist" && !groupFields.length) {
s.kind = "wordlist";
renderWordListField(s);
setGroups(s, current.groups);
if (current.fromBullets) {
$status.text("Ev lîste made bi made hatiye nivîsîn — bi qeydkirinê dibe {{kol3}}.");
}
return;
}
if (current.kind === "wordlist" && groupFields.length) {
setGroups(s, current.groups);
if (current.fromBullets) {
$status.text("Ev lîste made bi made hatiye nivîsîn — bi qeydkirinê dibe {{kol3}}.");
}
return;
}
if (s.kind === "wordlist") {
editAsText = true;
groupFields = [];
renderTextArea(s, 6);
$status.text(s.unknown
? "Ev beş nayê naskirin — wekî wîkîtekst tê guhartin."
: "Şablona vê lîsteyê nehate naskirin — wekî wîkîtekst biguhêre.");
}
setFieldText(current.text);
}, function () {
$save.prop("disabled", false);
$status.addClass("dsb-status-error").text("Nikare muhtewaya heyî bixwîne.");
}).then(function () {
if (currentSubsection() === s) {
loadedSnapshot = contentSnapshot();
}
});
}
// What the box held when the page's content was put in it, so a save that changed nothing queues
// nothing -- renaming a heading does not also rewrite its body.
var loadedSnapshot = null;
function contentSnapshot() {
if (imagesField) {
return JSON.stringify(imagesField.values());
}
return JSON.stringify(groupFields.length ? readGroups() : fieldText());
}
// One "{{kol3}}" group per block, plus a way out to raw wikitext for a list no row can express --
// a shared subpage list like {{herwiha binêre/ane}}, say.
function renderWordListField(s) {
$fieldWrap.empty();
chipSurface = null;
editAsText = false;
var $addGroup = $("<a href='#' class='dsb-quick-link'>+ Komek lê zêde bike</a>");
$addGroup.on("click", function (e) {
e.preventDefault();
addGroup(s, null);
});
$groups = $("<div class='dsb-wordgroups'></div>");
$fieldWrap.append($groups, $addGroup);
addGroup(s, null);
// One call takes one flat list of names, so there is no second group to add.
if (s.single) {
$addGroup.hide();
}
var $toRaw = $("<a href='#' class='dsb-quick-link'>Wekî wîkîtext biguhêre</a>");
$toRaw.on("click", function (e) {
e.preventDefault();
var current = s.place
? wt.buildHbnrCall(loosePlaceWords(readGroups()))
: subsectionBodyWikitext(language, s, readGroups());
editAsText = true;
groupFields = [];
$groups = null;
renderTextArea(s, 3);
setFieldText(current);
util.initManualResize($fieldWrap);
});
$fieldWrap.append($toRaw);
util.initManualResize($fieldWrap);
}
function renderField() {
var s = currentSubsection();
loadedSnapshot = null;
$fieldWrap.empty();
groupFields = [];
$groups = null;
editAsText = false;
chipSurface = null;
wergerForm = null;
imagesField = null;
$status.removeClass("dsb-status-error dsb-status-ok").text("");
// Save stays disabled (but "Betal bike" usable) until something is actually chosen.
$save.prop("disabled", !s);
if (!s) {
$save.text(util.msg.add);
lastId = null;
return; // still on "Binebeşekê hilbijêre"
}
if (s.kind === "wordlist") {
renderWordListField(s);
} else if (s.kind === "images") {
imagesField = util.buildImageListField({
prefix: "dsb-",
rowClass: "dsb-tpl-param-row dsb-param-row-inline",
inputClass: "dsb-input",
addClass: "dsb-quick-link",
pageName: mw.config.get("wgTitle")
});
$fieldWrap.append(imagesField.$element);
} else if (s.header === "Etîmolojî") {
renderTemplateEditor(s, templateChoices("etymTpls", language));
} else if (s.place === "pron") {
renderTemplateEditor(s, templateChoices("pronTpls", language));
} else if (s.kind === "werger") {
renderWergerField(s);
} else if (s.header === "Çavkanî") {
renderCavkaniField(s);
} else {
renderTextArea(s, 3);
}
// Werger always adds a box, even to a section that is already there, so its button never says
// "Biguhêre".
$save.text(s.existing && s.kind !== "werger" ? util.msg.edit : util.msg.add);
// Covers whichever branch above built the field. Idempotent, so a textarea already carrying a
// grip is skipped.
util.initManualResize($fieldWrap);
lastId = s.id;
// A draft always wins over re-reading the page: it is the newer, unsaved state.
if (drafts[s.id]) {
restoreDraft(s, drafts[s.id]);
} else if ((s.existing || s.place) && s.kind !== "werger") {
prefill(s);
}
}
$select.on("change", function () {
captureDraft();
renderField();
});
renderField();
// Back to the state a fresh open would show: no draft, no picked subsection. Called directly
// rather than through the "change" handler above, so the discarded draft is never captured first.
function resetForm() {
drafts = {};
if (!onlyHeader) {
$select.val("").trigger("wiktku:refresh");
}
renderField();
}
$save.on("click", function () {
var s = currentSubsection();
if (!s) {
return;
}
var newName = readName(s);
if (!newName) {
$status.removeClass("dsb-status-ok").addClass("dsb-status-error").text("Navê beşê vala ye.");
return;
}
var asText = editAsText || (s.kind !== "wordlist" && s.kind !== "images");
var effective = asText ? $.extend({}, s, { kind: "text" }) : s;
var content;
var hasContent;
if (asText) {
content = fieldText();
hasContent = !!content;
} else if (s.kind === "images") {
content = imagesField ? imagesField.values() : [];
hasContent = content.length > 0;
} else {
content = readGroups();
hasContent = content.some(function (group) { return group.words.length; });
}
var renaming = newName !== s.header;
if (renaming) {
queueRename(s, newName);
}
var unchanged = loadedSnapshot !== null && contentSnapshot() === loadedSnapshot;
if (!hasContent || unchanged) {
if (unchanged && !renaming) {
$status.removeClass("dsb-status-ok").addClass("dsb-status-error").text("Tiştek nehatiye guhartin.");
}
return;
}
$save.prop("disabled", true);
// A Werger section holds any number of boxes, so an existing one is appended to rather than
// replaced; every other kind edits the single body it owns.
var appending = s.kind === "werger" && s.existing;
queueChange(
subsectionPlaceLabel(s, language, sectionType, $h3),
s.kind === "werger"
? "qutiyeke wergerê hate zêdekirin"
: "beşa «" + s.header + "» hate " + (s.existing ? "nûkirin" : "zêdekirin"),
function (pageContent) {
var body = content;
if (appending) {
var current = readPageSubsection(pageContent, language, sectionType, sectionOrdinal, effective);
var existingText = current ? $.trim(current.text || "") : "";
body = existingText ? existingText + "\n\n" + content : content;
}
return {
content: s.free
? updateFreeSection(pageContent, language, effective, body)
: (s.place
? writeLoosePlace(pageContent, language, sectionType, sectionOrdinal, effective,
loosePlaceBody(effective, body, language))
: (s.existing
? updatePageSubsection(pageContent, language, sectionType, sectionOrdinal, effective, body)
: insertPageSubsection(pageContent, language, sectionType, sectionOrdinal, effective, body))),
warnings: []
};
},
$save,
$status,
// Werger is a box the translation tools fill in afterwards, so there is nothing to draw for
// it. A new subsection gets a block of its own at the position it will land in; one already
// on the page is redrawn where it stands.
s.kind === "werger" ? null : function () {
// A free section is redrawn under its own heading, which is the element the panel hangs
// on.
if (s.free) {
var restoreFree = replaceFreeSectionInPlace($h3,
subsectionBodyWikitext(language, effective, content));
return function () {
if (restoreFree) {
restoreFree();
restoreFree = null;
}
};
}
// A "place" section has no heading to redraw between, so it is found in the DOM by what
// it renders as and replaced there.
if (s.place) {
var restoreLoose = replaceLoosePlaceInPlace($h3, effective,
loosePlacePreviewWikitext(effective, content, language));
return function () {
if (restoreLoose) {
restoreLoose();
restoreLoose = null;
}
};
}
if (!s.existing) {
var $preview = buildSubsectionPreviewDom($h3, s, content, language);
return function () {
$preview.remove();
};
}
var restore = replaceSubsectionInPlace($h3, effective.header,
subsectionBodyWikitext(language, effective, content));
return function () {
if (restore) {
restore();
restore = null;
}
};
},
{ key: s.free
? "section:" + s.header + "|" + s.free.ordinal
: "subsection:" + sectionType + "|" + sectionOrdinal + "|" + s.header }
);
});
$panel.empty().append($selectWrap, $nameWrap, $fieldWrap, $actions);
}
// Builds the "choose a part of speech" picker that reclassifies a section -- an unclassified
// "=== Mane ===" placeholder, or a "=== Biwêj ===" that turns out to be a real part of speech. Saved via
// convertSectionToPos(); lists every name from sectionNames except the one the section already is.
function buildConvertPosPanel($panel, $h3, language, sectionType, sectionOrdinal) {
var $select = $("<select class='dsb-convert-pos-select'></select>");
// Label-less, like the subsection picker's: it holds the "nothing chosen yet" value without showing
// up as a row, so the prompt lives in the input's placeholder instead.
$select.append($("<option value=''></option>"));
Object.keys(sectionNames).forEach(function (name) {
// The section's own part of speech is listed too, marked: picking it changes nothing about the
// heading and leaves the parameters below to be edited on their own.
$select.append($("<option></option>").val(name)
.text(name === sectionType ? name + " (ya niha)" : name));
});
var $selectWrap = makeSearchable($select, "Li cureyekî rêzimanî bigere");
// Opens on the section's own part of speech, so editing only its parameters needs no pick.
if (sectionNames[sectionType]) {
$select.val(sectionType).trigger("wiktku:refresh");
}
// The same card the entry wizard shows under its part-of-speech question -- gender, transitivity,
// the transliteration boxes and everything behind "Tercîhên pêşketî". Shared from
// wikt.edit/posparams.js, so reclassifying a section here offers exactly what creating one in the
// wizard does.
var card = posparams.build({ lang: language, pos: "" });
// Opened on the call the section already has, so this edits the current template rather than
// starting from a blank line. setContext() rebuilds the line whenever the part of speech moves,
// so the prefill is only the starting point.
var spec0 = posTemplateFor(sectionType);
card.setContext(language, spec0 ? spec0.name : "", /^Formeke /.test(sectionType));
fetchPageContent().then(function (pageContent) {
try {
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
var found = findPosTemplateLine(loc.lines, loc.posLineIndex, sectionType);
if (found.index !== -1 && ($select.val() || sectionType) === sectionType) {
card.setWikitext(found.text);
}
} catch (e) { /* an unreadable section just leaves the card as it was */ }
});
$select.on("change", function () {
var spec = posTemplateFor($select.val());
card.setContext(language, spec ? spec.name : "", /^Formeke /.test($select.val() || ""));
});
// "gh" on its own, or "<form>-<base>" once a structural form is picked -- start.js's own composition.
// convertSectionToPos() writes the template itself, so only what follows "{{pos|lang" is wanted
// from the card's line.
function posParams() {
var m = /^\{\{[^|}]*\|[^|}]*\|?([\s\S]*)\}\}$/.exec(card.wikitext());
return m ? m[1] : "";
}
var $save = $("<button type='button' class='dsb-save'></button>").text(util.msg.add);
var $cancel = $("<button type='button' class='dsb-cancel'></button>").text(util.msg.cancel);
var $status = $("<span class='dsb-status'></span>");
var $actions = $("<div class='dsb-form-actions'></div>").append($save, $cancel, $status);
// dsb.js owns the pencil and the panel's built state, so it does the closing.
$cancel.on("click", function () {
$panel.trigger("dsbCancel");
hideQueueIfIdle();
});
$save.on("click", function () {
var chosen = $select.val();
if (!chosen) {
$status.removeClass("dsb-status-ok").addClass("dsb-status-error").text("Pêşî cureyekî rêzimanî hilbijêre.");
return;
}
var params = posParams();
$save.prop("disabled", true);
$status.removeClass("dsb-status-error").text("");
queueChange(
langLabel(language),
"beşa «" + sectionLabel(sectionType, $h3) + "» bû «" + chosen + "»",
function (pageContent) {
return { content: convertSectionToPos(pageContent, language, sectionType, sectionOrdinal, chosen, params), warnings: [] };
},
$save,
$status,
function () {
// The heading keeps its text, which every other queued change finds the section by; a
// note under it names the new one. The headword line is drawn as the save will write it.
var $note = $("<div class='dsb-preview-inline dsb-preview-heading-note'></div>")
.text("→ " + chosen + (params ? " (" + params + ")" : "") + " — nû, hîn nehatiye qeydkirin");
headingOuter($h3).after($note);
var dropped = false;
var restoreHeadword = null;
fetchPageContent().then(function (pageContent) {
if (dropped) {
return;
}
var call;
try {
var loc = locateSection(pageContent, language, sectionType, sectionOrdinal);
call = posCallLine(findPosTemplateLine(loc.lines, loc.posLineIndex, sectionType),
language, chosen, params);
} catch (e) {
return;
}
restoreHeadword = replaceHeadwordInPlace($h3, call);
});
return function () {
dropped = true;
$note.remove();
if (restoreHeadword) {
restoreHeadword();
restoreHeadword = null;
}
};
},
// Runs after every other queued change: it renames the "Mane" heading those changes locate
// themselves by, so anything edited on this section has to be applied first.
{ runLast: true, key: "convert:" + sectionType + "|" + sectionOrdinal, pagePosition: headingPosition($h3) }
);
});
$panel.empty().append($selectWrap, card.$element, $actions);
}
// Attaches the "+ Beşek lê zêde bike" trigger right after a POS block's own last element.
// Puts the same pencil the definitions use on every existing "====" subsection heading the gadget knows how
// to edit, opening buildSubsectionPanel() pinned to that one subsection.
module.exports = {
buildAdvancedPanel: buildAdvancedPanel,
buildSubsectionPanel: buildSubsectionPanel,
buildConvertPosPanel: buildConvertPosPanel,
editExample: editExample,
clearQueue: clearQueue,
closeAllPanels: closeAllPanels,
openQueueBox: openQueueBox
};
}());
// </nowiki>
fynxq22uwjg4hvllodyqzzjbn8dxcd1
MediaWiki:Gadget-wikt.dsb-panels.css
8
1359174
6533075
6426124
2026-09-19T10:15:16Z
Wikihez
7344
DefSideBoxes: numbered sense-group headings, subsection rename and removal, bottom-up conversions, bracketed examples, and the add-subsection form fix
6533075
css
text/css
/* <nowiki> */
/*
* Page: [[MediaWiki:Gadget-wikt.dsb-panels.css]]
*/
/* ── Searchable select ───────────────────────────────────────────────
The native <select> is hidden inside the wrapper and still holds the value; the input filters the list. */
.dsb-ac-wrap {
position: relative;
display: block;
}
.dsb-ac-input {
width: 100%;
box-sizing: border-box;
}
.dsb-ac-results {
position: absolute;
z-index: 30;
top: 100%;
left: 0;
right: 0;
max-height: 260px;
margin: 2px 0 0;
padding: 4px;
overflow-y: auto;
list-style: none;
font-family: var(--wikt-sans);
font-size: 13px;
background: var(--wikt-field-bg);
border: 1px solid var(--wikt-field-edge);
border-radius: var(--wikt-r-field);
box-shadow: 0 6px 18px rgba(0, 0, 0, 0.12);
}
.dsb-ac-results li {
padding: 6px 8px;
border-radius: 6px;
cursor: pointer;
}
.dsb-ac-results li:hover,
.dsb-ac-results li.dsb-ac-active {
background: var(--wikt-accent-tint);
}
/* ── Etîmolojî editing surface ───────────────────────────────────────
A contenteditable line of wikitext: text is typed straight into it, template calls sit in it as chips. */
.dsb-tpl-surface {
min-height: 72px;
margin-top: 6px;
padding: 8px 10px;
font-family: var(--wikt-sans);
font-size: 14px;
line-height: 1.6;
color: var(--wikt-ink);
white-space: pre-wrap;
word-wrap: break-word;
background: var(--wikt-field-bg);
border: 1px solid var(--wikt-field-edge);
border-radius: var(--wikt-r-field);
}
.dsb-tpl-surface:focus {
outline: none;
border-color: var(--wikt-accent);
box-shadow: 0 0 0 2px var(--wikt-accent-tint);
}
/* The chips: visibly not prose, and atomic to the caret. */
/* Takes the call off the line without going through the parameter dialog -- on a phone there is no
reliable backspace onto a contenteditable="false" chip. */
.dsb-tpl-chip-remove {
position: relative;
margin-left: 5px;
padding: 0 2px;
font-family: var(--wikt-sans);
font-size: 13px;
line-height: 1;
color: var(--wikt-accent-deep);
opacity: 0.6;
cursor: pointer;
}
.dsb-tpl-chip-remove:hover {
color: var(--wikt-danger);
opacity: 1;
}
/* The glyph stays small; the tap target grows invisibly around it. */
@media (max-width: 720px), (pointer: coarse) {
.dsb-tpl-chip-remove {
opacity: 1;
}
.dsb-tpl-chip-remove::after {
content: "";
position: absolute;
inset: -10px -8px;
}
}
.dsb-tpl-chip {
display: inline-block;
margin: 0 1px;
padding: 1px 6px;
font-family: var(--wikt-mono);
font-size: 12.5px;
color: var(--wikt-accent-deep);
max-width: 100%;
white-space: normal;
overflow-wrap: anywhere;
vertical-align: baseline;
background: var(--wikt-accent-tint);
border: 1px solid var(--wikt-accent-edge);
border-radius: var(--wikt-r-pill);
touch-action: manipulation;
cursor: pointer;
user-select: none;
}
.dsb-tpl-chip:hover,
.dsb-tpl-chip:focus {
background: var(--wikt-field-bg);
border-color: var(--wikt-accent);
outline: none;
}
/* ── Template parameter form ─────────────────────────────────────────
.dsb-tpl-name/-desc/-param-row/-help/-undocumented/-modifier-list and the deprecated-label override now
live in cite.css (wikt.cite's own stylesheet): buildTemplateParamForm() moved there so start.js's own
Etîmolojî/Çavkanî pickers can open the same dialog. */
/* One-line variant: label beside its box rather than above it, for a single field whose name would
otherwise read as a heading for everything below it (the word groups' "Sernav"). */
.dsb-param-row-inline > .dsb-adv-label {
display: flex;
gap: 8px;
align-items: center;
}
/* Sernav is optional and names the group; the word boxes under it are what the form is actually for.
Letting it stretch to the full row made the one thing you may leave blank the widest box on the
card, so it takes only the space its own content needs. */
.dsb-param-row-inline .dsb-input {
flex: 0 1 auto;
width: 12em;
max-width: 40%;
/* .dsb-input's own 16em floor would win over the width above and make this the widest box on the
card, which is the opposite of the point. */
min-width: 0;
max-width: 100%;
min-width: 0;
}
.dsb-gloss-raw {
font-size: 12px;
}
/* Disclosure arrow on "Hevmane û Bêhtir", flipped when the menu is open. */
.dsb-more-arrow {
font-size: 10px;
vertical-align: 1px;
}
/* The POS panel's follow-up questions (cinsiyet / lektur): label above its select, like the field boxes. */
.dsb-pos-param-row {
display: flex;
flex-direction: column;
gap: 4px;
margin-top: 8px;
}
/* ── "Guhartina pêşketî" (advanced editing) panel ──────────────────────
Revealed by the pencil toggle above: every per-sense action this gadget offers, queued together with one
"Lê zêde bike". A plain inline row, not a bordered/background card. */
.dsb-quick-row {
display: flex;
flex-direction: column;
align-items: stretch;
gap: 4px;
box-sizing: border-box;
max-width: 520px;
margin: 4px 0 0 16px;
font-family: var(--wikt-sans);
font-size: 12px;
color: var(--wikt-ink-2);
}
.dsb-quick-link {
align-self: flex-start;
margin-bottom: 10px;
font-size: 12px;
color: var(--wikt-accent);
text-decoration: none;
white-space: nowrap;
cursor: pointer;
}
/* The links under a word list ("+ Komek lê zêde bike", "Wekî wîkîtext biguhêre") sit in the field wrap
rather than in a flex column, so they need their own spacing or they run together. */
.dsb-subsection-field > .dsb-quick-link {
display: inline-block;
margin-right: 14px;
}
.dsb-quick-link:hover,
.dsb-quick-link:focus {
color: var(--wikt-accent-deep);
text-decoration: underline;
}
/* The picker row: gloss + the two primary word groups as direct "+ <field>" links, plus a "Hevmane û Bêhtir" toggle
for the rest -- clicking a link opens its box above the buttons and hides the link; .dsb-box-remove un-hides it.
position: relative anchors .dsb-more-menu's overlay below (see there). */
.dsb-field-picker {
position: relative;
display: flex;
flex-wrap: wrap;
align-items: baseline;
gap: 4px 14px;
}
.dsb-field-picker .dsb-quick-link {
margin-bottom: 0;
}
/* Under the buttons once a box is open: a little space so the links do not read as part of the buttons. */
.dsb-open-boxes:not(:empty) ~ .dsb-field-picker {
margin-top: 8px;
}
/* The "Hevmane û Bêhtir" dropdown: every non-primary field link (plus Nimûne/jêgirtin, which sits first) stacked as a
plain vertical list. Floats over the page as an overlay (positioned against .dsb-field-picker) instead of
pushing $openBoxes/the rest of the definition down when it opens. */
.dsb-more-menu {
position: absolute;
top: 100%;
left: 0;
z-index: 10;
display: flex;
flex-direction: column;
align-items: flex-start;
width: max-content;
max-width: min(320px, calc(100vw - 40px));
gap: 6px;
margin: 2px 0 0 4px;
padding: 8px 12px;
background: var(--wikt-card);
border: 1px solid var(--wikt-rule);
border-radius: var(--wikt-r-field);
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.06);
}
.dsb-more-menu .dsb-quick-link {
margin-bottom: 0;
}
/* Boxes the user has actually opened, stacked in the order they were added -- several can be open at once. */
.dsb-open-boxes {
display: flex;
flex-direction: column;
}
/* Nothing open: take it out of the flow so the links do not sit above an empty gap. */
.dsb-open-boxes:empty {
display: none;
}
/* One field (its label + input) within the panel -- always a currently-open, removable box. */
.dsb-adv-group {
position: relative;
margin-bottom: 14px;
padding-right: 20px;
}
.dsb-adv-label {
margin-bottom: 4px;
font-size: 12px;
font-weight: 600;
color: var(--wikt-ink-3);
}
/* The example sentence beside a word list's name: same text the wizard shows, so it reads as the
quieter half of the label rather than a second heading. */
.dsb-adv-hint {
margin-left: 6px;
font-weight: 400;
font-style: italic;
color: var(--wikt-muted);
}
/* The shared image rows (util.js's buildImageListField): one label + box per line, like the parameter
rows above them. Three identical boxes twice over is unreadable without a break between them, so each
image is its own block with its own name. */
.dsb-resim-list {
margin: 0;
padding-left: 0;
}
.dsb-resim-item {
list-style: none;
margin-top: 12px;
padding-top: 12px;
border-top: 1px solid var(--wikt-rule-soft);
}
.dsb-resim-item:first-child {
margin-top: 0;
padding-top: 0;
border-top: 0;
}
.dsb-resim-index {
margin-bottom: 6px;
font-size: 12px;
font-weight: 600;
color: var(--wikt-ink-3);
}
.dsb-box-remove {
position: absolute;
top: 0;
right: 0;
color: var(--wikt-ink-3);
text-decoration: none;
font-size: 14px;
line-height: 1;
cursor: pointer;
}
.dsb-box-remove:hover,
.dsb-box-remove:focus {
color: var(--wikt-accent-deep);
}
.dsb-form-actions {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
}
.dsb-input {
box-sizing: border-box;
min-width: 16em;
padding: 6px 10px;
font-family: var(--wikt-sans);
font-size: 13px;
color: var(--wikt-ink);
background: var(--wikt-field-bg);
border: 1px solid var(--wikt-field-edge);
border-radius: var(--wikt-r-field);
transition: border-color 0.12s ease, box-shadow 0.12s ease;
}
/* The native corner is replaced by util.js's grip (see wikt-edit.css), which drags vertically only and
remembers the height. */
.dsb-subsection-panel textarea.dsb-input,
.dsb-adv-group textarea.dsb-input {
resize: none;
}
.dsb-input::placeholder {
color: var(--wikt-placeholder);
opacity: 1;
}
.dsb-input:focus {
border-color: var(--wikt-accent);
box-shadow: 0 0 0 3px var(--wikt-accent-tint);
outline: 0;
}
/* ── Plain tag field (Etîket, Kategorî) ────────────────────────────────
Plain type-and-commit tags with no suggestion panel; unlike Hevmane/Dijmane/etc., these carry no modifiers. */
.dsb-tagfield {
box-sizing: border-box;
display: inline-flex;
flex-wrap: wrap;
align-items: center;
gap: 6px;
min-width: 16em;
padding: 4px 6px;
background: var(--wikt-field-bg);
border: 1px solid var(--wikt-field-edge);
border-radius: var(--wikt-r-field);
transition: border-color 0.12s ease, box-shadow 0.12s ease;
}
.dsb-tagfield:focus-within {
border-color: var(--wikt-accent);
box-shadow: 0 0 0 3px var(--wikt-accent-tint);
}
.dsb-tag {
display: inline-flex;
align-items: center;
gap: 6px;
background: var(--wikt-accent-tint);
color: var(--wikt-accent-deep);
border: 1px solid var(--wikt-accent-edge);
border-radius: var(--wikt-r-pill);
font-size: 12px;
padding: 3px 6px 3px 10px;
}
.dsb-tag-remove {
border: 0;
background: transparent;
color: var(--wikt-muted);
font-size: 13px;
line-height: 1;
cursor: pointer;
padding: 0 2px;
}
.dsb-tag-remove:hover {
color: var(--wikt-danger);
}
.dsb-tagfield .dsb-input {
flex: 1 1 8em;
min-width: 8em;
border: 0;
padding: 3px 2px;
background: transparent;
box-shadow: none;
}
.dsb-tagfield .dsb-input:focus {
box-shadow: none;
}
.dsb-save,
.dsb-cancel,
.dsb-delete,
.dsb-autolink {
font-family: var(--wikt-sans);
font-size: 13px;
font-weight: 500;
padding: 6px 14px;
border-radius: var(--wikt-r-pill);
cursor: pointer;
transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease;
}
/* One filled pill per row — the same rule the form's footer follows. */
.dsb-save {
background: var(--wikt-accent);
border: 1px solid var(--wikt-accent);
color: #fff;
}
.dsb-save:hover {
background: var(--wikt-accent-deep);
border-color: var(--wikt-accent-deep);
}
.dsb-save:disabled {
opacity: 0.55;
cursor: progress;
}
.dsb-cancel {
background: transparent;
border: 1px solid transparent;
color: var(--wikt-ink-3);
}
.dsb-cancel:hover {
border-color: var(--wikt-field-edge);
color: var(--wikt-ink);
}
/* Removing a heading: plain like Betal bike, in the danger colour, pushed to the far end of the row. */
.dsb-delete {
margin-left: auto;
background: transparent;
border: 1px solid transparent;
color: var(--wikt-danger);
}
.dsb-delete:hover {
border-color: var(--wikt-danger);
}
/* The heading's name, above the section's own box. */
.dsb-heading-name-wrap {
margin-bottom: 10px;
}
/* A heading queued for removal, with everything it owns, until the queue is saved or the change dropped. */
.dsb-preview-removed {
opacity: 0.5;
text-decoration: line-through;
text-decoration-color: var(--wikt-danger);
}
/* An outline pill, distinct from both the filled .dsb-save and the plain-text .dsb-cancel -- a secondary
utility action, not the primary save nor a dismissal. */
.dsb-autolink {
background: transparent;
border: 1px solid var(--wikt-accent-edge);
color: var(--wikt-accent);
}
.dsb-autolink:hover {
border-color: var(--wikt-accent);
color: var(--wikt-accent-deep);
}
.dsb-autolink:disabled {
opacity: 0.55;
cursor: progress;
}
/* Status line. Color comes from .dsb-status-ok/.dsb-status-error (added by the .js on success/failure)
rather than an inline style, so these tokens (and dark mode) apply. */
.dsb-status {
font-family: var(--wikt-sans);
font-size: 12.5px;
color: var(--wikt-muted);
}
.dsb-status-ok { color: var(--wikt-ok); }
.dsb-status-error { color: var(--wikt-danger); }
/* ── "+ Beşek lê zêde bike" ──────────────────────────────────────────
An accent-coloured action link, like the form's .wiktku-adv-toggle:
it opens something, so it is not muted grey. */
/* iOS Safari zooms the page in whenever a field it focuses has text under 16px, and everything here is
12-13px for density. On touch the form controls go up to the size that stops it; the pointer query
leaves the desktop layout alone. */
@media (pointer: coarse) {
.dsb-input,
.dsb-tag-input,
.dsb-subsection-select,
.dsb-convert-pos-select {
font-size: 16px;
}
/* Full width, whatever the viewport reports: a phone asked to render the desktop site says ~980px and
would otherwise leave these at their desktop size. */
.dsb-subsection-panel .dsb-input,
.dsb-subsection-panel .dsb-subsection-select,
.dsb-convert-pos-panel .dsb-convert-pos-select {
width: 100%;
max-width: 100%;
}
/* Sernav is the exception: it names the group, so it stays visibly smaller than the boxes it heads.
The cap matters more than the em width -- at 16px, 12em came out the same size as a word box. */
.dsb-subsection-panel .dsb-param-row-inline .dsb-input {
width: 8em;
max-width: 40%;
}
}
/* The image rows reuse the inline row, but nothing here is optional the way a group's "Sernav" is:
a file name and a caption want the whole row. */
.dsb-resim-list .dsb-param-row-inline > .dsb-adv-label,
.dsb-resim-list .dsb-tpl-param-row > label {
display: flex;
gap: 8px;
align-items: center;
}
.dsb-resim-list .dsb-param-row-inline .dsb-input,
.dsb-resim-list .dsb-tpl-param-row .dsb-input {
flex: 1 1 auto;
width: auto;
max-width: 100%;
}
/* ── Subsection panel ────────────────────────────────────────────────
A sunken card rather than a grey utility box; fields stack so the
picker and its input are not competing for one narrow row. */
.dsb-subsection-select,
.dsb-convert-pos-select {
box-sizing: border-box;
width: 100%;
max-width: 100%;
padding: 6px 10px;
font-family: var(--wikt-sans);
font-size: 13px;
color: var(--wikt-ink);
background: var(--wikt-field-bg);
border: 1px solid var(--wikt-field-edge);
border-radius: var(--wikt-r-field);
}
.dsb-subsection-select:focus,
.dsb-convert-pos-select:focus {
border-color: var(--wikt-accent);
box-shadow: 0 0 0 3px var(--wikt-accent-tint);
outline: 0;
}
/* The template-insert picker sits above the Çavkanî textarea, not in place of it -- a little breathing
room so the two don't read as one control. */
.dsb-cavkani-picker {
margin-bottom: 6px;
}
.dsb-subsection-field {
min-width: 0;
}
.dsb-subsection-words,
.dsb-subsection-text {
box-sizing: border-box;
width: 100%;
min-width: 0;
}
.dsb-subsection-text {
line-height: 1.6;
resize: vertical;
}
/* ── Gloss field inside the advanced-editing panel ────────────────────
Same shape as .dsb-subsection-text. */
.dsb-edit-gloss {
width: 100%;
line-height: 1.6;
resize: vertical;
}
/* ── Live "not saved yet" previews ─────────────────────────────────────
Dropped into the rendered page at the change's own spot. Dashed edge + a small badge mark them as
pending, not real content; they disappear on "Betal bike" or once the real save lands. */
.dsb-preview-block,
.dsb-preview-inline {
margin: 8px 0;
padding: 8px 12px;
font-family: var(--wikt-sans);
font-size: 13px;
color: var(--wikt-ink-2);
background: var(--wikt-accent-tint);
border: 1px dashed var(--wikt-accent-edge);
border-radius: var(--wikt-r-field);
}
.dsb-preview-inline {
margin-left: 26px;
max-width: 520px;
}
.dsb-preview-heading {
margin: 0 0 4px;
font-size: 15px;
font-weight: 600;
color: var(--wikt-ink);
}
.dsb-preview-badge {
display: inline-block;
margin-bottom: 6px;
padding: 1px 8px;
font-size: 11px;
font-weight: 500;
color: var(--wikt-accent-deep);
background: var(--wikt-card);
border: 1px solid var(--wikt-accent-edge);
border-radius: var(--wikt-r-pill);
}
/* Parser output goes in here, so it drops the panel's own font and colour and takes the page's \u2014 the
point of the box is that what is inside it looks exactly like what will be saved. */
.dsb-preview-rendered,
.dsb-preview-rendered-inline {
font-family: inherit;
font-size: 14px;
color: var(--wikt-ink);
}
.dsb-preview-rendered-inline {
display: inline;
}
.dsb-preview-rendered-inline .mw-parser-output,
.dsb-preview-rendered-inline .mw-parser-output > p {
display: inline;
}
.dsb-preview-list,
.dsb-preview-text {
margin: 0;
padding-left: 18px;
}
.dsb-preview-text {
padding-left: 0;
}
/* ── Floating save-queue widget ─────────────────────────────────────
This gadget's own small floating box. One "Lê zêde bike" click anywhere on the page adds a line here;
"Guhertinan qeyd bike" makes the one real save; "Betal bike" drops everything queued without touching the page. */
.dsb-queue-box {
position: fixed;
top: 60px;
right: 16px;
z-index: 1000;
box-sizing: border-box;
width: 280px;
max-width: calc(100vw - 32px);
max-height: calc(100vh - 90px);
overflow-y: auto;
padding: 12px 14px;
font-family: var(--wikt-sans);
font-size: 13px;
color: var(--wikt-ink-2);
background: var(--wikt-card);
border: 1px solid var(--wikt-accent);
border-radius: var(--wikt-r-card);
box-shadow: 0 4px 18px rgba(0, 0, 0, 0.16);
}
/* An OOUI dialog sits low in the page's stacking order (z-index 4), so no z-index here can go under it
without dropping behind the article as well. While one is open -- on a phone it fills the screen --
the box is taken off instead; wikt.cite puts the class on while its dialogs are showing. */
body.wikt-dialog-open .dsb-queue-box {
display: none;
}
.dsb-queue-title {
margin-right: 20px;
font-size: 13px;
font-weight: 600;
color: var(--wikt-ink);
}
.dsb-queue-close {
float: right;
color: var(--wikt-ink-3);
text-decoration: none;
font-size: 14px;
line-height: 1;
cursor: pointer;
}
.dsb-queue-close:hover,
.dsb-queue-close:focus {
color: var(--wikt-accent-deep);
}
/* Stands in for the list before anything is queued, saying what the save button is for. */
.dsb-queue-empty {
margin: 8px 0;
font-size: 12px;
line-height: 1.5;
color: var(--wikt-ink-3);
}
.dsb-queue-list {
margin: 8px 0;
padding-left: 18px;
max-height: 160px;
overflow-y: auto;
}
.dsb-queue-list li {
margin-bottom: 4px;
}
/* Drops one queued change. Dim until its line is hovered, so the list stays a list and not a row of
buttons. */
.dsb-queue-drop {
margin-left: 6px;
padding: 0 3px;
border: 0;
background: transparent;
color: var(--wikt-muted);
font-size: 13px;
line-height: 1;
cursor: pointer;
opacity: 0;
transition: opacity 0.12s ease, color 0.12s ease;
}
.dsb-queue-list li:hover .dsb-queue-drop,
.dsb-queue-drop:focus {
opacity: 1;
}
.dsb-queue-drop:hover {
color: var(--wikt-danger);
opacity: 1;
}
/* No hover on touch, so the button is simply there. */
@media (hover: none), (pointer: coarse) {
.dsb-queue-drop {
opacity: 1;
}
}
.dsb-queue-actions {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 4px;
}
.dsb-queue-save,
.dsb-queue-cancel {
font-family: var(--wikt-sans);
font-size: 13px;
font-weight: 500;
padding: 6px 14px;
border-radius: var(--wikt-r-pill);
cursor: pointer;
transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease;
}
.dsb-queue-save {
background: var(--wikt-accent);
border: 1px solid var(--wikt-accent);
color: #fff;
}
.dsb-queue-save:hover {
background: var(--wikt-accent-deep);
border-color: var(--wikt-accent-deep);
}
.dsb-queue-save:disabled {
opacity: 0.55;
cursor: progress;
}
.dsb-queue-cancel {
background: transparent;
border: 1px solid var(--wikt-field-edge);
color: var(--wikt-ink-3);
}
.dsb-queue-cancel:hover {
border-color: var(--wikt-ink-3);
color: var(--wikt-ink);
}
.dsb-queue-status {
margin-top: 6px;
font-size: 12.5px;
color: var(--wikt-muted);
}
.dsb-queue-status.dsb-status-ok { color: var(--wikt-ok); }
.dsb-queue-status.dsb-status-error { color: var(--wikt-danger); }
/* ── Minerva (mobile) ────────────────────────────────────────────────
Narrower viewport: keep the panel on screen and give every tap
target the form's 44px minimum. */
@media (max-width: 720px), (pointer: coarse) {
.dsb-quick-row {
font-size: 13px;
margin-left: 20px;
}
.dsb-input,
.dsb-subsection-select,
.dsb-convert-pos-select {
min-height: 40px;
/* >=16px stops iOS Safari zooming the page on focus. */
font-size: 16px;
}
.dsb-tagfield .dsb-input {
min-height: 32px;
}
.dsb-tag-remove {
padding: 0 6px;
}
.dsb-save,
.dsb-cancel,
.dsb-autolink,
.dsb-queue-save,
.dsb-queue-cancel {
min-height: 40px;
padding: 8px 16px;
}
.dsb-queue-box {
top: auto;
bottom: 8px;
right: 8px;
left: 8px;
width: auto;
}
}
/* ── Dark mode ───────────────────────────────────────────────────────
Same warm dark palette and same explicit-signal-only rule as the
form's stylesheet: no bare prefers-color-scheme fallback, since
legacy Vector sets no theme class and would go dark on its own. */
html.skin-theme-clientpref-night .dsb-save,
html.skin-nightmode .dsb-save,
html.skin-theme-clientpref-night .dsb-queue-save,
html.skin-nightmode .dsb-queue-save {
color: #14213a;
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .dsb-save,
html.skin-theme-clientpref-os .dsb-queue-save {
color: #14213a;
}
}
/* Rules the menu's three sections apart (see MENU_GROUPS). */
.dsb-more-menu .dsb-menu-group-start {
margin-top: 7px;
padding-top: 7px;
border-top: 1px solid var(--wikt-rule-soft);
}
/* Deleting a sense is destructive, so it reads in the danger colour -- but it shares the last section
with "Maneyeke din zêde bike" (both act on the sense itself), so it carries no rule of its own. */
.dsb-more-menu .dsb-field-delete {
color: var(--wikt-danger);
}
.dsb-more-menu .dsb-field-delete:hover,
.dsb-more-menu .dsb-field-delete:focus {
color: var(--wikt-danger);
text-decoration: underline;
}
/* A sense queued for deletion, struck through until the queue is saved or the change dropped. */
li.dsb-sense-doomed {
text-decoration: line-through;
text-decoration-color: var(--wikt-danger);
}
li.dsb-sense-doomed .dsb-quick-row {
text-decoration: none;
}
/* Queue confirmation for row actions that have no field box of their own. */
.dsb-quick-note {
display: block;
margin-top: 6px;
}
/* Dropped by anything that cannot live in a 520px column: a long etymology, and a word list wide
enough to have gone to two columns. */
.dsb-subsection-panel.dsb-panel-wide {
max-width: none;
}
/* Word-list groups: one "{{kol3}}" per block, told apart only when there is more than one. */
.dsb-wordgroups-many .dsb-wordgroup {
padding-top: 10px;
border-top: 1px solid var(--wikt-rule-soft);
}
.dsb-wordgroups-many .dsb-wordgroup:first-child {
padding-top: 0;
border-top: 0;
}
.dsb-group-remove {
color: var(--wikt-danger);
}
/* A sernav-headed group inside an unsaved-section preview. */
.dsb-preview-subheading {
margin-top: 6px;
font-weight: 600;
}
/* ── Werger box form ──
The {{werger-ser}} parameters. Reuses .dsb-input / .dsb-adv-label from the other panels; only the
note and the disclosure body need anything of their own. */
.dsb-werger-note {
margin: 0 0 10px;
color: var(--wikt-muted);
font-size: 12px;
line-height: 1.5;
}
.dsb-werger-main {
display: flex;
flex-direction: column;
gap: 10px;
}
/* The box is nested inside its label, so it is made a block to sit under the label text instead of
beside it -- inline, a short label like "id" ends up behind its own box. */
.dsb-werger-row .dsb-adv-label {
display: block;
margin-bottom: 0;
}
.dsb-werger-row .dsb-input {
display: block;
width: 100%;
margin-top: 4px;
}
/* ── Îzaha maneyî ──
Opens under the Mane box; the two are one gloss, so it sits tight against it. */
.dsb-izah-wrap {
margin-top: 6px;
}
.dsb-izah-wrap .dsb-adv-label {
display: block;
}
.dsb-izah-wrap .dsb-input {
display: block;
width: 100%;
margin-top: 4px;
}
/* A sense redrawn from the change that is queued for it, or a whole new sense waiting in the list's own
numbering. No badge and no frame: the point is that it reads the way it will read once saved. The tint
is the only sign, and the queue box is what actually says nothing is published yet. */
.dsb-sense-preview {
background: var(--wikt-accent-tint);
box-shadow: -3px 0 0 var(--wikt-accent-edge);
}
/* Kept in the tree so another gadget's form still has somewhere to open, but out of sight while the
preview above draws the same content. */
.dsb-preview-hidden {
display: none !important;
}
li.dsb-sense-preview {
display: list-item;
padding-left: 4px;
}
/* </nowiki> */
g70qepztny4ega5cqy8kvkuiulpq7ou
Modul:etymon/ceribandin
828
1359184
6532033
6531678
2026-09-18T16:07:22Z
Wikihez
7344
sync test copy
6532033
Scribunto
text/plain
--[=[
This module implements the {{etymon}} template for structured etymology data on Wiktionary.
It enables the creation of etymology trees and text by parsing etymon chains,
scraping linked pages for their own {{etymon}} data, and recursively building a tree
of derivational relationships.
Authors:
- Original implementation: [[User:Ioaxxere]]
- Full refactor (September 2025): [[User:Fenakhay]] ([[Special:Diff/86717746]])
Modules:
- [[Module:etymon]]: main module handling parsing, validation, tree building, and page scraping
- [[Module:etymon/data]]: keyword definitions, configuration, and status constants
- [[Module:etymon/tree]]: etymology tree rendering
- [[Module:etymon/text]]: etymology text generation
- [[Module:etymon/categories]]: category generation logic
- [[Module:etymon/tracking]]: tracking
]=]
local export = {}
local __state = {
cached_etymon_args = {},
cached_etymon_pages = {},
cached_descendants_checks = {},
senseid_parent_etymon = {},
available_etymon_ids = {},
single_etymons = {},
entry_title = nil,
entry_lang_code = nil,
current_page_has_inline_etymology = false,
current_page_has_redundant_etymology = false,
used_idless_etymon = false,
toplevel_has_inline_etymology = false,
toplevel_redundant_etymology = false,
toplevel_idless_etymon = false,
has_mismatched_id = false,
linked_page_multiple_etymons_idless = false,
linked_page_partial_etymology_sections = false,
partial_etymology_targets = {},
skip_partial_etymology_category = false,
max_depth_reached = 0,
total_nodes = 0,
language_count = {},
toplevel_keyword_stats = {},
id_stats = nil,
warnings = {},
}
local function reset_invocation_state()
__state.current_page_has_inline_etymology = false
__state.current_page_has_redundant_etymology = false
__state.used_idless_etymon = false
__state.toplevel_has_inline_etymology = false
__state.toplevel_redundant_etymology = false
__state.toplevel_idless_etymon = false
__state.has_mismatched_id = false
__state.linked_page_multiple_etymons_idless = false
__state.linked_page_partial_etymology_sections = false
__state.max_depth_reached = 0
__state.total_nodes = 0
__state.language_count = {}
__state.toplevel_keyword_stats = {}
__state.warnings = {}
end
local M = require("Module:module loader").init({
require = {
data = "Module:etymon/data/ceribandin",
tree = "Module:etymon/tree/ceribandin",
text = "Module:etymon/text/ceribandin",
categories = "Module:etymon/categories/ceribandin",
tracking = "Module:etymon/tracking",
descendants = "Module:etymon/descendants/ceribandin",
anchors = "Module:anchors",
etydate = "Module:etydate",
etymology = "Module:etymology",
families = "Module:families",
languages = "Module:languages",
languages_errorgetby = "Module:languages/errorGetBy",
links = "Module:links",
pages = "Module:pages",
parameters = "Module:parameters",
string_utilities = "Module:string utilities",
template_parser = "Module:template parser",
utilities = "Module:utilities",
debug = "Module:debug",
en_utilities = "Module:en-utilities",
parse_utilities = "Module:parse utilities",
references = "Module:references",
template_styles = "Module:TemplateStyles",
script_utilities = "Module:script utilities",
JSON = "Module:JSON",
yesno = "Module:yesno",
},
loadData = {
headword_data = "Module:headword/data",
parameters_data = "Module:parameters/data/ceribandin",
text_allowed = "Module:etymon/data/text_allowed",
},
})
-- Template names that carry etymon data, and the heading that opens an etymology section.
-- Pages are scraped for these, so both must match what ku.wiktionary actually uses:
-- the section is "Etîmolojî", and the new template is "etîmon".
-- Only the new template: pages still using Şablon:etymon carry the old ">"-separated syntax, which
-- this module would misparse into garbage node labels. Add "etymon" here only once
-- Şablon:etymon itself invokes this module.
local ETYMON_TEMPLATES = {
["etîmon"] = true,
["etymon/nû"] = true, -- redirect to Şablon:etîmon; still recognised if written out
-- Do NOT add "etymon" here while Şablon:etymon still uses the old ">"-separated syntax:
-- this module would read those calls and parse the bare keyword ("inh") as a term.
}
local ETYMOLOGY_HEADING = "^Etîmolojî"
-- ku's reconstruction namespace is "Jinûvesazî" (id 108), where en.wiktionary uses
-- "Reconstruction" (id 118). A page here is a reconstructed term, so its title needs the
-- leading "*" that Modul:links requires for reconstructed languages.
local RECONSTRUCTION_NS_NAME = "Jinûvesazî"
local RECONSTRUCTION_NS_ID = 108
local Util = {}
function Util.format_error(message, preview_only)
if preview_only and not M.pages.is_preview() then
return nil
end
return '<span class="error">' .. message .. '</span>'
end
function Util.add_warning(message, preview_only)
local formatted = Util.format_error(message, preview_only)
if formatted then
table.insert(__state.warnings, formatted)
end
end
function Util.is_text_param_allowed_for_lang(lang)
if not lang or type(lang) ~= "table" then
return false
end
local types = lang.getTypes and lang:getTypes()
if types and types.family then
local code = lang.getCode and lang:getCode()
return code and M.text_allowed.families[code] == true
end
local full_code = lang.getFullCode and lang:getFullCode()
if full_code and M.text_allowed.langs[full_code] then
return true
end
if lang.inFamily then
for family_code in pairs(M.text_allowed.families) do
if lang:inFamily(family_code) then
return true
end
end
end
return false
end
function Util.get_lang(code, no_error)
if no_error then
return M.languages.getByCode(code, nil, true)
end
return M.languages.getByCode(code, nil, true) or M.languages_errorgetby.code(code, true, true)
end
-- Match a term language against a text=:lang stop target (supports etymology-only codes).
function Util.lang_matches_stop_code(term_lang, stop_code)
if not term_lang or not stop_code or stop_code == "" then
return false
end
local stop_lang = Util.get_lang(stop_code, true)
if not stop_lang then
return false
end
if term_lang:getCode() == stop_lang:getCode() then
return true
end
if stop_lang:getFullCode() == stop_lang:getCode() then
return term_lang:getFullCode() == stop_lang:getCode()
end
return false
end
function Util.get_family(code)
return M.families.getByCode(code)
end
function Util.get_lang_exception(lang)
-- Families have no language-specific exceptions
if lang.getTypes and lang:getTypes().family then
return nil
end
local code = lang:getCode()
local lang_exceptions = M.data.config.lang_exceptions
if lang_exceptions[code] then
return lang_exceptions[code]
end
for norm_code, exc in pairs(lang_exceptions) do
if exc.normalize_to and code == exc.normalize_to then
return exc
end
if exc.normalize_from_families then
local should_normalize = false
for _, family in ipairs(exc.normalize_from_families) do
if lang:inFamily(family) then
should_normalize = true
break
end
end
if should_normalize and exc.normalize_exclude_families then
for _, family in ipairs(exc.normalize_exclude_families) do
if lang:inFamily(family) then
should_normalize = false
break
end
end
end
if should_normalize then
local ret = {}
for k, v in pairs(exc) do
ret[k] = v
end
ret.suppress_tr = nil
return ret
end
end
end
return nil
end
function Util.get_norm_lang(lang)
local exc = Util.get_lang_exception(lang)
if exc and exc.normalize_to then
return M.languages.getByCode(exc.normalize_to)
end
return lang
end
function Util.resolve_context_lang(lang, node_args)
if type(node_args) ~= "table" then return lang end
if node_args.status == M.data.STATUS.INLINE then return lang end
if not (lang.hasType and lang:hasType("etymology-only")) then return lang end
local full = lang.getFull and lang:getFull()
if not full or full:getCode() == lang:getCode() then return lang end
if full.hasAncestor and full:hasAncestor(lang) then return lang end
return full
end
-- Add default values for boolean modifiers (e.g., <unc> becomes <unc:1>)
-- This is needed because Module:parse utilities expects boolean modifiers to have explicit values
function Util.add_boolean_defaults(str, param_mods)
local result = str
for name, spec in pairs(param_mods) do
if spec.type == "boolean" then
-- Replace <name> with <name:1> (but not <name:...> which already has a value)
result = result:gsub("<" .. name .. ">", "<" .. name .. ":1>")
end
end
return result
end
local REQUEST_TEMPLATE_PARAM_MODS = {
rfe = {
nocat = { type = "boolean" },
sort = {},
y = {},
m = {},
fragment = {},
section = {},
box = { type = "boolean" },
noes = { type = "boolean" },
},
etystub = {
nocat = { type = "boolean" },
sort = {},
nocap = { type = "boolean" },
nodot = { type = "boolean" },
},
}
function Util.expand_request_template(frame, template_name, param_value, lang_code)
local param_mods = REQUEST_TEMPLATE_PARAM_MODS[template_name]
local with_defaults = Util.add_boolean_defaults(param_value, param_mods)
local parsed = M.parse_utilities.parse_inline_modifiers(with_defaults, {
param_mods = param_mods,
generate_obj = function(text)
if M.yesno(text, false) then
return { is_boolean = true }
end
return { text = text }
end,
})
local template_args = { [1] = lang_code }
for name in pairs(param_mods) do
template_args[name] = parsed[name]
end
if not parsed.is_boolean then
template_args[2] = parsed.text
end
return " " .. frame:expandTemplate({
title = template_name,
args = template_args,
})
end
-- Kurdish values accepted for |pos= (|crz=) and <postype:>, mapped to the English values the rest of
-- the module compares against.
local POS_ALIASES = {
["reh"] = "root",
["kelîme"] = "word",
["pêşgir"] = "prefix",
["paşgir"] = "suffix",
["navgir"] = "interfix",
}
function Util.normalize_pos(value)
if type(value) ~= "string" then
return value
end
value = mw.text.trim(value)
return POS_ALIASES[value] or value
end
-- {{etîmon}} arguments read straight from another page skip Module:parameters, so `crz` (the Kurdish
-- name of `pos`) and the Kurdish values are resolved here.
function Util.normalize_raw_etymon_args(args)
if args.pos == nil and args.crz ~= nil then
args.pos = args.crz
end
args.pos = Util.normalize_pos(args.pos)
return args
end
-- Centralized term formatting: handles suppress_term (-), unknown_term (empty/+), and regular terms
function Util.format_term(term, is_toplevel, opts)
opts = opts or {}
-- suppress_term (-) returns nil
if term.suppress_term then
return nil
end
local lang = term.lang
local exc = Util.get_lang_exception(lang)
if is_toplevel then
local display_text = term.alt or term.title or ""
local sc = term.sc or lang:findBestScript(display_text)
local bold_text = tostring(mw.html.create("strong")
:addClass("selflink")
:wikitext(display_text))
return M.script_utilities.tag_text(bold_text, lang, sc, "term")
end
local link_params = { lang = lang }
link_params.term = not term.unknown_term and term.title or nil
link_params.alt = term.alt
link_params.id = (not term.unknown_term and term.id and term.id ~= "") and term.id or nil
if not (exc and exc.suppress_tr) then
link_params.tr = term.tr
link_params.ts = term.ts
else
link_params.suppress_tr = true
end
link_params.lit = (opts.lit ~= "suppress") and term.lit or nil
-- An explicit <t:...> wins; otherwise fall back to the etymon id, which on ku is usually a
-- Kurdish gloss in its own right ("berik", "hêştir"). An id that is a key rather than a
-- translation ("H2O", "paşgira meslekî") can be overridden with a <t:...>.
local t = (term.t and term.t ~= "") and term.t or nil
local id_gloss = (term.id and term.id ~= "") and term.id or nil
local gloss = t or id_gloss
-- gloss = "separate" leaves the gloss out of the link and returns it as a second value, so
-- the tree can put it on its own line.
if opts.gloss ~= "suppress" and opts.gloss ~= "separate" then
link_params.gloss = gloss
end
if term.g and term.g ~= "" then
local genders = M.string_utilities.split(term.g, ",")
for i = 1, #genders do
genders[i] = M.string_utilities.trim(genders[i])
end
link_params.genders = genders
end
if opts.pos ~= "suppress" then
link_params.pos = term.pos
link_params.ng = term.ng
end
if exc and exc.suppress_tr then
link_params.lit = nil
end
local show_qualifiers
if opts.tree_ql ~= "suppress" then
if term.q then
link_params.q = term.q
end
if term.qq then
link_params.qq = term.qq
end
if term.l then
link_params.l = term.l
end
if term.ll then
link_params.ll = term.ll
end
show_qualifiers = term.q or term.qq or term.l or term.ll
end
local link = M.links.full_link(link_params, "term", nil, show_qualifiers and true or nil)
if opts.gloss == "separate" then
return link, gloss
end
return link
end
local __is_content_page_cached
function Util.is_content_page()
if __is_content_page_cached == nil then
__is_content_page_cached = M.pages.is_content_page(mw.title.getCurrentTitle())
end
return __is_content_page_cached
end
local __page_data_cached
function Util.get_page_data()
if not __page_data_cached then
__page_data_cached = M.headword_data.page
end
return __page_data_cached
end
-- Extract base keyword from param (without modifiers)
local function get_keyword_base(param)
if type(param) ~= "string" then return nil end
local base = param:match("^:?([^<]+)") or param:gsub("^:", "")
return base
end
local function is_keyword(param, allow_colon_less)
if type(param) ~= "string" then return false end
local keywords = M.data.keywords
if param:sub(1, 1) == ":" then
local base = get_keyword_base(param)
return keywords[base] ~= nil
end
if allow_colon_less then
local base = get_keyword_base(param)
return keywords[base] ~= nil
end
return false
end
local function get_keyword(param, allow_colon_less)
if type(param) ~= "string" then return nil end
local keywords = M.data.keywords
if param:sub(1, 1) == ":" then
return get_keyword_base(param)
end
if allow_colon_less then
local base = get_keyword_base(param)
if keywords[base] then
return base
end
end
return nil
end
local function normalize_keyword(keyword)
if keyword:sub(1, 1) == ":" then
return keyword
end
return ":" .. keyword
end
-- Resolve keyword (possibly an alias) to its canonical form. Used only at input boundaries
local function get_canonical_keyword(keyword)
if not keyword then return keyword end
return M.data.keyword_canonical[keyword] or keyword
end
local function is_affix_group_keyword(keyword)
local config = keyword and M.data.keywords[keyword]
return config and config.affix_categories or false
end
local function reject_removed_surf_keyword(param)
local base = get_keyword_base(param)
if base == "surf" then
error("The `:surf` keyword has been removed. Use `<surf>` on a formation keyword instead (e.g. `:af<surf>`, `:bor<surf>`).")
end
end
local function copy_keyword_info(source)
local copy = {}
for k, v in pairs(source) do
copy[k] = v
end
return copy
end
local function lowercase_glossary_display(text)
return text:gsub("(%[%[Nimînok:Ferhengok#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest)
return prefix .. mw.ustring.lower(first) .. rest .. "]]"
end)
end
local function surf_should_keep_formation_phrase(base)
if not base.phrase then
return false
end
if base.glossary then
return true
end
return not (base.phrase == "from" and (base.text == "From" or base.text == "from"))
end
-- Runtime overrides when <surf> is present on a keyword.
local function get_effective_keyword_info(keyword, modifiers)
local base = M.data.keywords[keyword]
if not base or not modifiers or not modifiers.surf then
return base
end
local effective = copy_keyword_info(base)
local surf_text = "By [[Nimînok:Ferhengok#surface_analysis|surface analysis]],"
local surf_phrase = "by surface analysis,"
effective.new_sentence = true
effective.invisible = "tree"
if surf_should_keep_formation_phrase(base) then
effective.phrase = surf_phrase .. " " .. base.phrase
if base.text then
effective.text = surf_text .. " " .. lowercase_glossary_display(base.text)
else
effective.text = surf_text .. " " .. base.phrase
end
else
effective.text = surf_text
effective.phrase = surf_phrase
end
return effective
end
-- Build text/phrase for nominalization with <g:code> (uses data module for codes only).
local function get_nominalization_label_for_g(code)
if not code or code == "" then return nil end
local codes = M.data.nominalization_g_codes
local adj = codes[code]
if not adj and code:find("-", 1, true) then
-- ku combines a gender with a number by hyphenating them ("m-p"), where en.wikt runs the
-- letters together ("mp"); build the label from the parts. Splitting two-letter codes the
-- en.wikt way would mislabel ku codes that are not combinations at all, such as "np"
-- (nepersonel).
local parts, all_known = {}, true
for part in code:gmatch("[^-]+") do
local part_adj = codes[part]
if part_adj then
table.insert(parts, part_adj)
else
all_known = false
end
end
if all_known and parts[1] then
adj = table.concat(parts, " ")
end
end
if not adj then return nil end
local text = adj:gsub("^%l", function(c) return string.upper(c) end) .. " [[Nimînok:Ferhengok#nominalization|nominalization]] of"
local phrase = M.en_utilities.add_indefinite_article(adj .. " [[Nimînok:Ferhengok#nominalization|nominalization]] of", false)
return { text = text, phrase = phrase }
end
local EtymonParser = {}
-- Keyword modifier definitions
EtymonParser.keyword_param_mods = {
unc = { type = "boolean" },
ref = {},
text = { restrict = { keywords = { "from", "derived" } } },
lit = { restrict = { affix_group = true } },
conj = {}, -- conjunction for alternatives: "and", "or", "and/or", etc.
g = { restrict = { keywords = { "nominalization" } } },
surf = { type = "boolean" },
senseid = { restrict = { keywords = { "semantic loan" } } },
-- Kurdish names, resolved by resolve_modifier_aliases() below.
maneid = { alias_of = "senseid", restrict = { keywords = { "semantic loan" } } },
}
-- Term modifier definitions
EtymonParser.etymon_param_mods = {
id = {},
t = {},
tr = {},
ts = {},
q = {},
qq = {},
l = {},
ll = {},
pos = {},
ng = {},
alt = {},
g = {},
ety = {},
lit = {},
unc = { type = "boolean" },
ref = {},
aftype = { restrict = { affix_group = true } },
postype = {},
bor = { type = "boolean", restrict = { affix_group = true } },
slbor = { type = "boolean", restrict = { affix_group = true } },
lbor = { type = "boolean", restrict = { affix_group = true } },
-- Kurdish names for the same modifiers, resolved by resolve_modifier_aliases() below.
-- cuda/t/w/crz are the names ku's own templates already accept; the affix-group
-- borrowing flags reuse the Kurdish keyword names.
cuda = { alias_of = "alt" },
-- ASCII only: Modul:parse utilities matches a modifier prefix with "^([a-zA-Z0-9+_-]+):",
-- so a name containing "î" can never be recognised as a prefix.
etimon = { alias_of = "ety" },
w = { alias_of = "t" },
crz = { alias_of = "pos" },
nediyar = { type = "boolean", alias_of = "unc" },
deyn = { type = "boolean", alias_of = "bor", restrict = { affix_group = true } },
deynh = { type = "boolean", alias_of = "lbor", restrict = { affix_group = true } },
deynhq = { type = "boolean", alias_of = "slbor", restrict = { affix_group = true } },
}
--[==[
Move any Kurdish modifier onto the canonical name it aliases, so the rest of the module only ever
sees the canonical set. Called right after the inline modifiers are parsed.
]==]
function EtymonParser.resolve_modifier_aliases(obj, param_mods)
for name, def in pairs(param_mods) do
if def.alias_of and obj[name] ~= nil then
if obj[def.alias_of] ~= nil then
error("`<" .. name .. ":>` and `<" .. def.alias_of .. ":>` are the same modifier; use one.")
end
obj[def.alias_of] = obj[name]
obj[name] = nil
end
end
return obj
end
local function get_clean_param_mods(param_mods)
local clean = {}
for mod_name, mod_def in pairs(param_mods) do
clean[mod_name] = {}
for key, value in pairs(mod_def) do
if key ~= "restrict" and key ~= "alias_of" then
clean[mod_name][key] = value
end
end
end
return clean
end
function EtymonParser.check_modifier_restrictions(modifiers, current_keyword, param_mods)
for mod_name, mod_value in pairs(modifiers) do
-- Only check restrictions if the modifier has a non-false/nil value
if mod_value then
local mod_def = param_mods[mod_name]
if mod_def and mod_def.restrict then
if mod_def.restrict.affix_group then
if not is_affix_group_keyword(current_keyword) then
local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">"
error("The modifier `" .. mod_display .. "` is only allowed for affix-group keywords (e.g. `:af`, `:blend`, `:univ`).")
end
elseif mod_def.restrict.keywords then
local allowed_keywords = mod_def.restrict.keywords
local is_allowed = false
for _, allowed_keyword in ipairs(allowed_keywords) do
if current_keyword == allowed_keyword then
is_allowed = true
break
end
end
if not is_allowed then
local keyword_list = {}
for _, kw in ipairs(allowed_keywords) do
table.insert(keyword_list, ":" .. kw)
end
local keyword_str = table.concat(keyword_list, #keyword_list == 2 and " or " or ", ")
if #keyword_list > 2 then
-- Replace last comma with "or"
keyword_str = keyword_str:gsub(", ([^,]+)$", " or %1")
end
local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">"
error("The modifier `" .. mod_display .. "` is only allowed for the keyword" .. (#keyword_list > 1 and "s " or " ") .. keyword_str .. ".")
end
end
end
end
end
end
local TERM_RULE_DISALLOW = {
suppress = { field = "suppress_term", label = "suppressed" },
unknown = { field = "unknown_term", label = "unknown" },
family = { field = "is_family", label = "family" },
}
function EtymonParser.check_etymon_limits(count, limits, label, opts)
if not limits then
return
end
opts = opts or {}
local min_etymons = limits.min_etymons
if min_etymons == nil and not opts.skip_default_min then
min_etymons = 1
end
if min_etymons and count < min_etymons then
if min_etymons > 1 then
error("Detected " .. label .. " group with fewer than " .. min_etymons .. " etymons.")
else
error("Detected " .. label .. " with no etymons.")
end
end
if limits.max_etymons and count > limits.max_etymons then
local unit = (limits.max_etymons == 1) and "etymon" or "etymons"
error("Detected " .. label .. " with more than " .. limits.max_etymons .. " " .. unit .. ".")
end
end
function EtymonParser.check_term_rules(etymon_data, entry_lang, rules, label)
label = label or "term"
if rules and rules.disallow then
local disallowed = {}
for _, typ in ipairs(rules.disallow) do
local spec = TERM_RULE_DISALLOW[typ]
if spec and etymon_data[spec.field] then
table.insert(disallowed, spec.label)
end
end
if #disallowed > 0 then
error(label .. " does not support " ..
mw.text.listToText(disallowed, "or") .. " etymons.")
end
end
if etymon_data.is_family then
if rules and rules.family == "disallowed" then
error(label .. " does not support family codes" .. (rules.family_suffix or "."))
elseif not etymon_data.suppress_term then
error("Family codes require suppressed term (use family:-).")
end
end
if rules then
if rules.require_term and (not etymon_data.term or etymon_data.term == "") then
error(label .. " requires a term for each listed form.")
end
if rules.entry_lang then
if Util.get_norm_lang(etymon_data.lang):getFullCode() ~=
Util.get_norm_lang(entry_lang):getFullCode() then
error(label .. " terms must be in the entry language (" ..
entry_lang:getFullCode() .. "), got '" .. etymon_data.lang:getFullCode() .. "'.")
end
end
if rules.ancestor_check then
M.etymology.check_ancestor(entry_lang, etymon_data.lang)
end
elseif etymon_data.is_family and not etymon_data.suppress_term then
error("Family codes require suppressed term (use family:-).")
end
end
function EtymonParser.check_keyword_term(etymon_data, entry_lang, keyword)
local config = M.data.keywords[keyword]
EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "`:" .. keyword .. "`")
end
function EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type)
local config = M.data.supplements[supplement_type]
EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "|" .. supplement_type .. "=")
end
-- Parse keyword with modifiers (e.g., ":bor<unc>" or ":bor<ref:{{R:example}}>")
function EtymonParser.parse_keyword_modifiers(param)
if type(param) ~= "string" then return nil, {} end
local base_keyword = get_keyword_base(param)
if not base_keyword then return nil, {} end
local canonical_keyword = get_canonical_keyword(base_keyword)
-- Check if there are any modifiers
if not param:find("<", 1, true) then
return canonical_keyword, {}
end
-- Parse modifiers using the same mechanism as etymon parsing
local rest_with_defaults = Util.add_boolean_defaults(param, EtymonParser.keyword_param_mods)
local function generate_obj(ignored)
return {}
end
local parsed = M.parse_utilities.parse_inline_modifiers(rest_with_defaults:gsub("^:?[^<]+", ""),
{ param_mods = get_clean_param_mods(EtymonParser.keyword_param_mods), generate_obj = generate_obj })
EtymonParser.resolve_modifier_aliases(parsed, EtymonParser.keyword_param_mods)
local modifiers = {
unc = parsed.unc or false,
ref = parsed.ref,
text = parsed.text,
lit = parsed.lit,
conj = parsed.conj,
g = parsed.g,
surf = parsed.surf or false,
senseid = parsed.senseid,
}
-- Validate modifiers against restrictions
EtymonParser.check_modifier_restrictions(modifiers, canonical_keyword, EtymonParser.keyword_param_mods)
return canonical_keyword, modifiers
end
local function normalize_keyword_param(keyword_with_mods)
local trimmed = M.string_utilities.trim(keyword_with_mods)
reject_removed_surf_keyword(trimmed:match("^:") and trimmed or (":" .. trimmed))
local base = get_keyword_base(trimmed)
if not base or not M.data.keywords[base] then
error("Invalid keyword '" .. trimmed .. "' in inline etymology")
end
local canonical_base = get_canonical_keyword(base)
local without_colon = trimmed:gsub("^:", "")
local mods_part = without_colon:sub(#base + 1)
local kw_param = normalize_keyword(canonical_base .. mods_part)
EtymonParser.parse_keyword_modifiers(kw_param)
return kw_param
end
local function get_keyword_mod_names()
local names = {}
for mod_name in pairs(EtymonParser.keyword_param_mods) do
names[mod_name] = true
end
return names
end
local function parse_inline_ety_run(ety_string)
local body = ety_string or ""
if body == "" then
error("Empty inline etymology")
end
local keyword_mod_names = get_keyword_mod_names()
local pos = 1
local len = #body
local function parse_err(msg)
error(msg .. " in inline etymology: '" .. body .. "'")
end
local function peek_double()
return body:sub(pos, pos + 1) == "<<"
end
local function mod_name_from_unwrapped(unwrapped)
return unwrapped:match("^<([^:>]+)")
end
local function is_keyword_mod(unwrapped)
local name = mod_name_from_unwrapped(unwrapped)
return name and keyword_mod_names[name] or false
end
local function read_double_bracket()
if not peek_double() then
return nil
end
local start = pos
pos = pos + 2
while pos <= len - 1 do
if body:sub(pos, pos + 1) == ">>" then
local token = body:sub(start, pos + 1)
pos = pos + 2
return token, token:sub(2, -2)
end
pos = pos + 1
end
parse_err("Unmatched <<")
end
local function read_angle_cell()
if body:sub(pos, pos) ~= "<" or peek_double() then
return nil
end
local open = pos
pos = pos + 1
local depth = 1
local i = pos
while i <= len do
local ch = body:sub(i, i)
if ch == "<" then
depth = depth + 1
elseif ch == ">" then
depth = depth - 1
if depth == 0 then
local inner = body:sub(open + 1, i - 1)
pos = i + 1
return inner
end
end
i = i + 1
end
parse_err("Unmatched <")
end
local function read_bare_run()
local start = pos
while pos <= len and body:sub(pos, pos) ~= "<" do
pos = pos + 1
end
return body:sub(start, pos - 1)
end
local function absorb_double_keyword_mods(keyword_str)
while peek_double() do
local saved = pos
local _, unwrapped = read_double_bracket()
if is_keyword_mod(unwrapped) then
keyword_str = keyword_str .. unwrapped
else
pos = saved
break
end
end
return keyword_str
end
local kw_start = pos
while pos <= len and body:sub(pos, pos) ~= "<" do
pos = pos + 1
end
local keyword = body:sub(kw_start, pos - 1)
if keyword:match("^%s*$") then
parse_err("Missing keyword")
end
keyword = absorb_double_keyword_mods(keyword)
local cells = {}
while pos <= len do
if peek_double() then
local _, unwrapped = read_double_bracket()
if is_keyword_mod(unwrapped) then
parse_err("Unexpected keyword modifier " .. unwrapped .. " outside of a keyword")
end
table.insert(cells, "+" .. unwrapped)
elseif body:sub(pos, pos) == "<" then
local inner = read_angle_cell()
if inner ~= "" then
table.insert(cells, inner)
end
else
local bare = read_bare_run()
if bare ~= "" then
if bare:sub(1, 1) ~= ":" then
parse_err("Unexpected bare text '" .. bare .. "' (use :keyword for nested keywords in inline etymology)")
end
if not is_keyword(bare, true) then
parse_err("Invalid keyword '" .. bare .. "' in inline etymology")
end
table.insert(cells, absorb_double_keyword_mods(bare))
end
end
end
return {
keyword = keyword,
cells = cells,
}
end
function EtymonParser.inline_ety_to_pipe(ety_string)
local run = parse_inline_ety_run(ety_string)
if not run.keyword or run.keyword:match("^%s*$") then
return "|"
end
local pipe_parts = { normalize_keyword_param(M.string_utilities.trim(run.keyword)) }
for _, segment in ipairs(run.cells) do
if is_keyword(segment, true) then
table.insert(pipe_parts, normalize_keyword_param(segment))
else
table.insert(pipe_parts, segment)
end
end
return "|" .. table.concat(pipe_parts, "|") .. "|"
end
function EtymonParser.pipe_to_inline_ety(pipe_string)
local cells = {}
for cell in pipe_string:gmatch("([^|]+)") do
if cell ~= "" then
table.insert(cells, cell)
end
end
if #cells == 0 then
return ""
end
local inline_parts = {}
for index, cell in ipairs(cells) do
local base = get_keyword_base(cell)
if base and M.data.keywords[base] then
local without_colon = cell:gsub("^:", "")
local kw_base, mods = without_colon:match("^([^<]+)(.*)$")
local inline_kw = (kw_base or without_colon) .. (mods or ""):gsub("<([^>]+)>", "<<%1>>")
if index > 1 then
inline_kw = ":" .. inline_kw
end
table.insert(inline_parts, inline_kw)
elseif cell:sub(1, 1) == "+" then
local mod = cell:sub(2)
if mod:match("^<.->$") then
mod = mod:sub(2, -2)
end
table.insert(inline_parts, "<<" .. mod .. ">>")
else
table.insert(inline_parts, "<" .. cell .. ">")
end
end
return table.concat(inline_parts, "")
end
function EtymonParser.parse_inline_ety(ety_string, context_lang)
local run = parse_inline_ety_run(ety_string)
local keyword = M.string_utilities.trim(run.keyword)
reject_removed_surf_keyword(":" .. keyword)
if not is_keyword(keyword, true) then
error("Invalid keyword '" .. keyword .. "' in inline etymology <ety:" .. keyword .. "...>")
end
local args = { context_lang:getCode(), normalize_keyword_param(keyword) }
for _, segment in ipairs(run.cells) do
if is_keyword(segment, true) then
table.insert(args, normalize_keyword_param(segment))
else
table.insert(args, segment)
end
end
return args
end
function EtymonParser.parse_etymon(param, context_lang)
if is_keyword(param) then
return nil
end
if type(param) ~= "string" then
return nil
end
local lang, rest
local is_family = false
local before_bracket = param:match("^([^<]*)") or param
local lang_code, rest_match = before_bracket:match("^([a-zA-Z][a-zA-Z0-9._-]*):(.*)$")
if lang_code then
local potential_lang = Util.get_lang(lang_code, true)
if potential_lang then
lang = potential_lang
rest = param:sub(#lang_code + 2)
else
local potential_family = Util.get_family(lang_code)
if potential_family then
lang = potential_family
rest = param:sub(#lang_code + 2)
is_family = true
else
lang = context_lang
rest = param
end
end
else
lang = context_lang
rest = param
end
M.tracking.track_term(rest)
if rest == "" or rest == "+" then
return {
lang = lang,
term = nil,
unknown_term = true,
is_family = is_family,
}
end
if rest == "-" then
return {
lang = lang,
term = nil,
suppress_term = true,
is_family = is_family,
}
end
if not rest:find("<", 1, true) then
return {
lang = lang,
term = M.string_utilities.trim(rest),
is_family = is_family,
}
end
local term_text = rest:match("^([^<]*)") or ""
local is_unknown = (term_text == "" or term_text == "+")
local is_suppress = (term_text == "-")
local function generate_obj(ignored_term)
return { term = (is_unknown or is_suppress) and nil or M.string_utilities.trim(term_text) }
end
local rest_with_defaults = Util.add_boolean_defaults(rest, EtymonParser.etymon_param_mods)
local parsed_obj = M.parse_utilities.parse_inline_modifiers(rest_with_defaults,
{ param_mods = get_clean_param_mods(EtymonParser.etymon_param_mods), generate_obj = generate_obj })
EtymonParser.resolve_modifier_aliases(parsed_obj, EtymonParser.etymon_param_mods)
parsed_obj.postype = Util.normalize_pos(parsed_obj.postype)
if parsed_obj.id and parsed_obj.id:match("^!") then
parsed_obj.id = parsed_obj.id:sub(2)
parsed_obj.override = true
end
parsed_obj.lang = lang
parsed_obj.is_family = is_family
if is_unknown then
parsed_obj.unknown_term = true
elseif is_suppress then
parsed_obj.suppress_term = true
end
return parsed_obj
end
function EtymonParser.validate(lang, args, id, title, pos, starts_with_lang_code)
-- id is now optional, so only validate if provided
if id then
if mw.ustring.len(id) < 2 then
error("The `id` parameter must have at least two characters.")
end
if id == title or id == Util.get_page_data().pagename then
error("The `id` parameter must not be the same as the page title.")
end
end
local valid_pos = { prefix = true, suffix = true, interfix = true, infix = true, root = true, word = true }
if pos and not valid_pos[pos] then
error("Unknown value provided for `pos`. Valid values: " .. table.concat(require("Module:table").keysToList(valid_pos), ", ")
.. " (Kurdish: " .. table.concat(require("Module:table").keysToList(POS_ALIASES), ", ") .. ").")
end
local current_keyword = "from"
local current_keyword_explicit = false
local keyword_etymons = {}
local keywords = M.data.keywords
local function checkKeyword()
local config = keywords[current_keyword]
if current_keyword == "from" and not current_keyword_explicit and #keyword_etymons == 0 then
keyword_etymons = {}
return
end
EtymonParser.check_etymon_limits(#keyword_etymons, config, "`:" .. current_keyword .. "`")
keyword_etymons = {}
end
local start_index = starts_with_lang_code and 2 or 1
for i = start_index, #args do
local param = args[i]
if type(param) ~= "string" then
elseif param:sub(1, 1) == ":" and not is_keyword(param) then
reject_removed_surf_keyword(param)
error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?")
elseif is_keyword(param) then
checkKeyword()
current_keyword = get_canonical_keyword(get_keyword(param))
current_keyword_explicit = true
else
local etymon_data = EtymonParser.parse_etymon(param, lang)
if etymon_data then
table.insert(keyword_etymons, param)
EtymonParser.check_keyword_term(etymon_data, lang, current_keyword)
-- Check modifier restrictions
EtymonParser.check_modifier_restrictions(etymon_data, current_keyword, EtymonParser.etymon_param_mods)
-- postype must be "root" or "word"
local VALID_POSTYPES = { root = true, word = true }
if etymon_data.postype and not VALID_POSTYPES[etymon_data.postype] then
error("Invalid <postype:" .. etymon_data.postype .. ">; must be \"root\" or \"word\" (Kurdish \"reh\" or \"kelîme\").")
end
if etymon_data.ety then
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
EtymonParser.validate(etymon_data.lang, inline_args, nil, nil, nil, true)
end
else
table.insert(keyword_etymons, param)
end
end
end
checkKeyword()
end
local DataRetriever = {}
local function format_etymon_id_hint(id_data, idx)
local id = type(id_data) == "table" and id_data.id or id_data
local pos = type(id_data) == "table" and id_data.pos
if id and id ~= "" and id ~= "*" then
return '"' .. id .. '"'
end
if pos and pos ~= "" then
return "unnamed (|pos=" .. pos .. "|)"
end
return "etymon #" .. idx .. " (no |id= on page)"
end
local function etymon_target_page_link(page, norm_lang)
-- `page` is an already-resolved page name ("Jinûvesazî:proto-îranî/hižwáH"), so link to it
-- directly. Passing it back through full_link() with a reconstructed language raises an error,
-- because the resolved name no longer carries the leading "*" those languages require -- and
-- this link is built even when the warning it belongs to is later discarded outside preview.
return "[[" .. page .. "]]"
end
-- Summarize {{etymon}} id slots on a linked page for preview warnings.
local function summarize_available_etymon_ids(ids)
local id_list = {}
local all_idless = true
local target_has_idless = false
local any_pos = false
for i, id_data in ipairs(ids) do
local id = type(id_data) == "table" and id_data.id or id_data
local pos = type(id_data) == "table" and id_data.pos
if id and id ~= "" and id ~= "*" then
all_idless = false
else
target_has_idless = true
end
if pos and pos ~= "" then
any_pos = true
end
table.insert(id_list, format_etymon_id_hint(id_data, i))
end
return {
id_list = id_list,
all_idless = all_idless,
target_has_idless = target_has_idless,
any_pos = any_pos,
count = #ids,
options_text = mw.text.listToText(id_list),
}
end
local function ambiguous_etymon_suggestion(page_link, summary)
if summary.all_idless then
if summary.any_pos then
return " None set `|id=` yet; add a unique `|id=` to each on " .. page_link
.. ", then `<id:identifier>` after the term here. Section order / hints: "
.. summary.options_text .. "."
end
return " None set `|id=` yet; add a unique `|id=` to each {{etymon}} in that section from top to bottom, then `<id:identifier>` after the term here (same value as `|id=`)."
end
return " Specify which one with `<id:identifier>` after the term. Options: " .. summary.options_text .. "."
end
local function warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel)
local page_link = etymon_target_page_link(page, norm_lang)
local summary = summarize_available_etymon_ids(ids)
if is_toplevel and summary.target_has_idless then
__state.linked_page_multiple_etymons_idless = true
end
local lang_name = norm_lang:getCanonicalName()
local lead = "Etymology link to " .. page_link .. " is ambiguous (" .. summary.count
.. " {{etymon}} templates for " .. lang_name .. ")."
Util.add_warning(lead .. ambiguous_etymon_suggestion(page_link, summary), true)
end
local function is_mismatched_explicit_id(base_key, cached_args, parent_etymon)
return cached_args == M.data.STATUS.MISSING and not parent_etymon
and #(__state.available_etymon_ids[base_key] or {}) > 0
end
local function maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel)
if not is_toplevel or __state.skip_partial_etymology_category then
return
end
if not __state.partial_etymology_targets[base_key] then
return
end
if etymon_data.id and type(cached_args) == "table" then
return
end
__state.linked_page_partial_etymology_sections = true
end
local function is_nonlemma_etymon_template(template_args)
return template_args and M.yesno(template_args.nl, false)
end
local function warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_id)
local page_link = etymon_target_page_link(page, norm_lang)
local summary = summarize_available_etymon_ids(__state.available_etymon_ids[base_key] or {})
local lang_name = norm_lang:getCanonicalName()
local lead = "Etymology link to " .. page_link .. " uses `<id:" .. etymon_id
.. ">`, but no {{etymon}} on that page has `|id=" .. etymon_id .. "|` for " .. lang_name .. "."
Util.add_warning(lead .. " Valid IDs: " .. summary.options_text .. ".", true)
end
-- Given an etymon data, scrape its page and cache the result in the global state object.
function DataRetriever.cache_page_etymons(etymon_page, etymon_title, key, etymon_lang, etymon_id, redirected_from, descendants_is_toplevel)
local content = etymon_title:getContent()
if not content then
__state.cached_etymon_args[key] = M.data.STATUS.REDLINK
return
end
-- Check if the linked page is a redirect. If it is, the template parsing
-- code below will be effectively skipped, and `scrape_page` will be called
-- again on the redirect target (see the bottom of this function)
local lang_section_for_descendants = nil
local redirect_target = etymon_title.redirect_target
if not redirect_target then
-- ku.wiktionary writes L2 headings as "== {{ziman|CODE}} ==" rather than the language
-- name, and this scrape runs on raw wikitext, so the template form has to be tried too.
content = M.pages.get_section(content, etymon_lang:getFullName(), 2)
or M.pages.get_section(content, "{{ziman|" .. etymon_lang:getFullCode() .. "}}", 2)
if not content then
__state.cached_etymon_args[key] = M.data.STATUS.MISSING
return
end
lang_section_for_descendants = content
end
local etymon_lang_code = etymon_lang:getFullCode()
local lang_page_key = etymon_lang_code .. ":" .. etymon_page
local found_templates_for_lang = {}
local found_ids = {}
local get_node_class = M.template_parser.class_else_type
-- Look for all {{etymon}} templates within the page content using the template parser
-- This way the same page is never parsed more than once
-- Build a map from senseids to their parent etymonids.
local active_etymon_args = nil
local etymology_section_count = 0
local etymology_sections_with_etymon = 0
local current_etymology_has_etymon = false
local current_etymology_has_nonlemma = false
local function finalize_current_etymology_section()
if etymology_section_count == 0 then
return
end
if current_etymology_has_etymon or current_etymology_has_nonlemma then
etymology_sections_with_etymon = etymology_sections_with_etymon + 1
end
current_etymology_has_etymon = false
current_etymology_has_nonlemma = false
end
for node in M.template_parser.parse(content):iterate_nodes() do
local node_class = get_node_class(node)
if node_class == "heading" then
-- A new L2 or etymology section acts as a barrier: an {{etymon}} usage
-- used previously cannot be the parent of any subsequent senseids.
-- Note that we don't have to check for L2s due to the usage of `M.pages.get_section` above.
if node:get_name():find(ETYMOLOGY_HEADING) then
finalize_current_etymology_section()
etymology_section_count = etymology_section_count + 1
active_etymon_args = nil
end
elseif node_class == "template" then
local template_name = node:get_name()
if ETYMON_TEMPLATES[template_name] then
local template_args = Util.normalize_raw_etymon_args(node:get_arguments())
-- Check if this etymon is for our language
if template_args[1] == etymon_lang_code then
if is_nonlemma_etymon_template(template_args) then
if etymology_section_count > 0 then
current_etymology_has_nonlemma = true
end
else
if etymology_section_count > 0 then
current_etymology_has_etymon = true
end
table.insert(found_templates_for_lang, template_args)
if template_args.id then
local etymon_key = lang_page_key .. ":" .. template_args.id
__state.cached_etymon_args[etymon_key] = template_args
__state.cached_etymon_pages[etymon_key] = tostring(etymon_page)
table.insert(found_ids, template_args.id)
active_etymon_args = template_args
else
-- Store idless etymon with default key
local etymon_key = lang_page_key .. ":*"
__state.cached_etymon_args[etymon_key] = template_args
__state.cached_etymon_pages[etymon_key] = tostring(etymon_page)
table.insert(found_ids, "*")
active_etymon_args = template_args
end
end
end
elseif active_etymon_args and template_name == "senseid" then
local template_args = node:get_arguments()
-- This should always be true for proper usages of {{senseid}}.
if template_args[1] == etymon_lang_code and template_args[2] then
local sense_id_key = lang_page_key .. ":" .. template_args[2]
__state.senseid_parent_etymon[sense_id_key] = active_etymon_args
__state.cached_etymon_pages[sense_id_key] = tostring(etymon_page)
end
end
end
end
finalize_current_etymology_section()
if lang_section_for_descendants
and etymology_section_count > 1
and etymology_sections_with_etymon > 0
and etymology_sections_with_etymon < etymology_section_count
then
__state.partial_etymology_targets[lang_page_key] = true
end
if descendants_is_toplevel and lang_section_for_descendants and #found_templates_for_lang > 0 then
M.descendants.cache_page_checks({
lang_section = lang_section_for_descendants,
etymon_lang_code = etymon_lang_code,
found_templates_for_lang = found_templates_for_lang,
entry_title = __state.entry_title,
entry_lang_code = __state.entry_lang_code,
entry_lang = __state.entry_lang_code and Util.get_lang(__state.entry_lang_code, true) or nil,
cached_descendants_checks = __state.cached_descendants_checks,
lang_page_key = lang_page_key,
redirected_from = redirected_from,
})
end
local id_data_list = {}
for _, args in ipairs(found_templates_for_lang) do
local id = args.id or "*"
table.insert(id_data_list, { id = id, pos = args.pos })
end
__state.available_etymon_ids[lang_page_key] = id_data_list
if #found_templates_for_lang == 1 then
__state.single_etymons[lang_page_key] = found_templates_for_lang[1]
end
if redirected_from and __state.available_etymon_ids[lang_page_key] then
__state.available_etymon_ids[redirected_from] = __state.available_etymon_ids[redirected_from] or {}
for _, id_data in ipairs(__state.available_etymon_ids[lang_page_key]) do
table.insert(__state.available_etymon_ids[redirected_from], id_data)
end
end
if __state.cached_etymon_args[key] ~= nil or __state.senseid_parent_etymon[key] ~= nil then
-- All done!
return
elseif redirect_target and not redirected_from then
-- Try scraping the redirect.
etymon_page = redirect_target.prefixedText
DataRetriever.cache_page_etymons(etymon_page, redirect_target, lang_page_key .. ":" .. etymon_id, etymon_lang, etymon_id, lang_page_key, descendants_is_toplevel)
__state.cached_etymon_args[key] = __state.cached_etymon_args[etymon_lang_code .. ":" .. etymon_page .. ":" .. etymon_id]
else
__state.cached_etymon_args[key] = M.data.STATUS.MISSING
end
end
local function has_linkable_term(etymon_data)
if etymon_data.is_family or etymon_data.suppress_term or etymon_data.unknown_term then
return false
end
local term = etymon_data.term
if term == nil or term == "" then
return false
end
return M.string_utilities.trim(term) ~= ""
end
local function record_term_id_tracking(etymon_data)
if not has_linkable_term(etymon_data) then
return
end
local term_page = M.links.get_link_page(etymon_data.term, etymon_data.lang)
M.tracking.record_term_id_usage(__state.id_stats, etymon_data, term_page)
end
-- Given an etymon object, scrape its page (if necessary) and return its own etymon arguments as well as the page name.
function DataRetriever.get_etymon_args(etymon_data, is_toplevel)
if not has_linkable_term(etymon_data) then
return M.data.STATUS.MISSING, nil, nil, nil
end
local page = M.links.get_link_page(etymon_data.term, etymon_data.lang)
local norm_lang = Util.get_norm_lang(etymon_data.lang)
local base_key = norm_lang:getFullCode() .. ":" .. page
if etymon_data.id then
local key = base_key .. ":" .. etymon_data.id
local cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key]
if cached_args == nil then
local title = mw.title.new(page)
if not title then error('Invalid page title "' .. page .. '" encountered.') end
DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, is_toplevel)
end
cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key] -- refresh
-- Get etymon_id from parent if this was resolved via senseid
local parent_etymon = __state.senseid_parent_etymon[key]
local resolved_etymon_id = parent_etymon and parent_etymon.id
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = {
explicit_id = etymon_data.id,
parent_etymon = parent_etymon,
},
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = {
explicit_id = etymon_data.id,
parent_etymon = parent_etymon,
},
})
end
end
local mismatched_id = is_mismatched_explicit_id(base_key, cached_args, parent_etymon)
if mismatched_id and is_toplevel then
__state.has_mismatched_id = true
M.tracking.record_mismatched_id_usage(__state.id_stats, norm_lang, page, etymon_data.id)
warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_data.id)
end
maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel)
return cached_args, __state.cached_etymon_pages[key], resolved_etymon_id, descendants_check
else
__state.used_idless_etymon = true
if is_toplevel then
__state.toplevel_idless_etymon = true
end
if __state.available_etymon_ids[base_key] == nil then
local title = mw.title.new(page)
if not title then error('Invalid page title "' .. page .. '" encountered.') end
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, is_toplevel)
end
local ids = __state.available_etymon_ids[base_key] or {}
local count = #ids
-- Try to filter by postype if available and we have multiple candidates
if count > 1 and etymon_data.postype then
local matching_ids = {}
for _, id_data in ipairs(ids) do
if id_data.pos == etymon_data.postype then
table.insert(matching_ids, id_data)
end
end
if #matching_ids == 1 then
local matched_id = matching_ids[1].id
local matched_key = base_key .. ":" .. matched_id
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "postype")
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = { id = matched_id },
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = { id = matched_id },
})
end
end
local matched_args = __state.cached_etymon_args[matched_key]
maybe_flag_partial_etymology_reference(base_key, etymon_data, matched_args, is_toplevel)
return matched_args, __state.cached_etymon_pages[matched_key], nil, descendants_check
end
end
if count == 1 then
local only_id_data = ids[1]
local only_id = (type(only_id_data) == "table" and only_id_data.id) or only_id_data or "*"
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "single")
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = { id_data = only_id_data },
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = { id_data = only_id_data },
})
end
end
local single_args = __state.single_etymons[base_key]
maybe_flag_partial_etymology_reference(base_key, etymon_data, single_args, is_toplevel)
return single_args, __state.cached_etymon_pages[base_key .. ":" .. only_id], nil, descendants_check
elseif count > 1 then
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "ambiguous")
warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel)
maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.AMBIGUOUS, is_toplevel)
return M.data.STATUS.AMBIGUOUS, nil, nil, nil
else
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "missing")
maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.MISSING, is_toplevel)
return M.data.STATUS.MISSING, nil, nil, nil
end
end
end
local function keyword_invisible_in_tree(keyword_info)
if not keyword_info then
return false
end
local inv = keyword_info.invisible
return inv == "all" or inv == true or inv == "tree"
end
-- True when the node has at least one top-level child container visible in the tree.
local function node_has_visible_tree_children(node)
for _, container in ipairs(node.children or {}) do
if not keyword_invisible_in_tree(container.keyword_info) then
return true
end
end
return false
end
-- Count visible term nodes in the tree.
local function get_visible_tree_depth(node, skip_child_rendering)
local max_depth = 1
if skip_child_rendering or not node then
return max_depth
end
for _, container in ipairs(node.children or {}) do
local keyword_info = container.keyword_info
if not keyword_invisible_in_tree(keyword_info) then
local skip_grandchildren = keyword_info and keyword_info.no_child_categories
for _, term in ipairs(container.terms or {}) do
if term.is_duplicate then
if term.original_has_children then
max_depth = math.max(max_depth, 2)
end
else
max_depth = math.max(max_depth, 1 + get_visible_tree_depth(term, skip_grandchildren))
end
end
end
end
return max_depth
end
local function as_param_list(val)
if val == nil then
return {}
end
if type(val) == "table" then
return val
end
if type(val) == "string" and val ~= "" then
return { val }
end
return {}
end
local TreeBuilder = {}
local function parse_etymon_references(refs_text)
if not refs_text or refs_text == "" then
return ""
end
return M.references.parse_references(refs_text)
end
local function parse_tree_references(node)
if node.ref then
node.parsed_ref = parse_etymon_references(node.ref)
end
if node.children then
for _, container in ipairs(node.children) do
if container.terms then
for _, term in ipairs(container.terms) do
parse_tree_references(term)
end
end
end
end
if node.supplements then
for _, supplement in ipairs(node.supplements) do
if supplement.terms then
for _, term in ipairs(supplement.terms) do
parse_tree_references(term)
end
end
end
end
end
-- Build a unique key for deduplication in the seen table
function TreeBuilder.build_key(lang, title, args)
local norm_lang_code = Util.get_norm_lang(lang):getFullCode()
local is_table = type(args) == "table"
local id = (is_table and args.id) or ""
if title then
return norm_lang_code .. ":" .. M.links.get_link_page(title, lang) .. ":" .. id
end
if is_table and args.status == M.data.STATUS.INLINE then
local content_parts = {}
for i = 1, #args do
content_parts[i] = tostring(args[i])
end
return norm_lang_code .. ":*:" .. id .. "\0" .. table.concat(content_parts, "\0")
end
return norm_lang_code .. ":*:" .. id
end
-- Copy parsed etymon modifiers onto a tree/supplement term node.
function TreeBuilder.apply_etymon_fields(term, etymon_data)
-- A reference without <id:> still resolves when the target page has a single etymon, and the
-- node already carries that etymon's own id. Keep it instead of clearing it, so the tree shows
-- the target's id as the gloss without every reference having to repeat it. An explicit
-- <id:...> still wins.
term.id = etymon_data.id or term.id
term.t = etymon_data.t
term.tr = etymon_data.tr
term.ts = etymon_data.ts
term.alt = etymon_data.alt
term.g = etymon_data.g
term.pos = etymon_data.pos
term.ng = etymon_data.ng
term.ref = etymon_data.ref
term.is_uncertain = etymon_data.unc
term.lit = etymon_data.lit
term.q = etymon_data.q
term.qq = etymon_data.qq
term.l = etymon_data.l
term.ll = etymon_data.ll
term.suppress_term = etymon_data.suppress_term
term.unknown_term = etymon_data.unknown_term
term.is_family = etymon_data.is_family
term.override = etymon_data.override
term.aftype = etymon_data.aftype
term.postype = etymon_data.postype
term.bor = etymon_data.bor
term.lbor = etymon_data.lbor
term.slbor = etymon_data.slbor
end
function TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type)
EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type)
local term = {
lang = etymon_data.lang,
title = etymon_data.term,
children = {},
status = M.data.STATUS.OK,
}
TreeBuilder.apply_etymon_fields(term, etymon_data)
return term
end
function TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value)
local terms = {}
for _, term_param in ipairs(as_param_list(param_value)) do
if type(term_param) == "string" and term_param ~= "" then
local etymon_data = EtymonParser.parse_etymon(term_param, entry_lang)
if etymon_data then
table.insert(terms, TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type))
end
end
end
return terms
end
-- Attach a |param= supplement defined in etymon_data.supplements (e.g. doublet=).
function TreeBuilder.append_term_supplement(data_tree, entry_lang, supplement_type, param_value)
local config = M.data.supplements[supplement_type]
if not config then
error("Unknown supplement '" .. tostring(supplement_type) .. "'.")
end
local terms = TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value)
if #terms == 0 then
return
end
data_tree.supplements = data_tree.supplements or {}
table.insert(data_tree.supplements, {
type = supplement_type,
config = config,
terms = terms,
})
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, supplement_type, entry_lang, entry_lang, true)
end
function TreeBuilder.build(lang, title, args, seen, depth, stop_recursion)
seen = seen or {}
depth = depth or 0
local is_toplevel = (depth == 0)
if depth > __state.max_depth_reached then
__state.max_depth_reached = depth
end
__state.total_nodes = __state.total_nodes + 1
local lang_code = lang:getCode()
__state.language_count[lang_code] = (__state.language_count[lang_code] or 0) + 1
local current_id = (type(args) == "table" and args.id) or ""
local key = TreeBuilder.build_key(lang, title, args)
local node = { lang = lang, title = title, id = current_id, args = args, children = {}, status = M.data.STATUS.OK }
if type(args) ~= "table" or seen[key] then
node.status = args or M.data.STATUS.MISSING
-- Mark as duplicate if we've seen this node before
if seen[key] then
node.is_duplicate = true
node.duplicate_key = key
local original_node = seen[key]
if type(original_node) == "table" and original_node.children and #original_node.children > 0 then
node.original_has_children = true
end
end
return node
end
node.status = args.status or M.data.STATUS.OK
seen[key] = node
-- If stop_recursion is set, skip parsing children but check for visible children
if stop_recursion then
local keywords = M.data.keywords
local has_visible_children = false
for i = 2, #args do
local param = args[i]
if type(param) == "string" then
local keyword_base = get_keyword_base(param)
if keyword_base and keywords[keyword_base] then
local _, kw_modifiers = EtymonParser.parse_keyword_modifiers(param:sub(1, 1) == ":" and param or (":" .. param))
if not keyword_invisible_in_tree(get_effective_keyword_info(keyword_base, kw_modifiers)) then
has_visible_children = true
break
end
elseif param:sub(1, 1) ~= ":" then
-- It's a term (not a keyword), so there are visible children
has_visible_children = true
break
end
end
end
node.has_visible_children = has_visible_children
return node
end
-- Parse args into keyword containers
local current_keyword = "from"
local current_keyword_modifiers = {}
local current_container = nil
local function ensure_container()
if not current_container or current_container.keyword ~= current_keyword then
local keyword_info = get_effective_keyword_info(current_keyword, current_keyword_modifiers)
current_container = {
keyword = current_keyword,
keyword_info = keyword_info,
keyword_modifiers = current_keyword_modifiers,
terms = {},
}
table.insert(node.children, current_container)
-- Override keyword text/phrase for nominalization with <g:code>
if current_keyword_modifiers.g and current_keyword == "nominalization" then
local labels = get_nominalization_label_for_g(current_keyword_modifiers.g)
if not labels then
local codes = {}
for c in pairs(M.data.nominalization_g_codes) do table.insert(codes, c) end
table.sort(codes)
error("Invalid <g:" .. tostring(current_keyword_modifiers.g) .. ">. Supported codes for nominalization: " .. table.concat(codes, ", "))
end
current_container.keyword_info = copy_keyword_info(keyword_info)
current_container.keyword_info.text = labels.text
current_container.keyword_info.phrase = labels.phrase
end
end
return current_container
end
local parse_context_lang = Util.resolve_context_lang(lang, args)
for i = 2, #args do
local param = args[i]
if is_keyword(param) then
local keyword, modifiers = EtymonParser.parse_keyword_modifiers(param)
if not keyword then
error("Invalid keyword '" .. param .. "'.")
end
current_keyword = keyword
current_keyword_modifiers = modifiers
current_container = nil -- Force new container for new keyword
elseif type(param) == "string" and param:sub(1, 1) == ":" then
reject_removed_surf_keyword(param)
error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?")
elseif type(param) == "string" then
local etymon_data = EtymonParser.parse_etymon(param, parse_context_lang)
if etymon_data then
-- Track keyword usage at top level
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, current_keyword, lang, etymon_data.lang, is_toplevel)
local term_node = {}
local container
-- Handle suppress_term (-) and unknown_term (empty or +) directly
if etymon_data.suppress_term or etymon_data.unknown_term then
container = ensure_container()
if etymon_data.ety then
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
inline_args.id = etymon_data.id
inline_args.status = M.data.STATUS.INLINE
term_node = TreeBuilder.build(etymon_data.lang, nil, inline_args, seen, depth + 1)
else
term_node = {
lang = etymon_data.lang,
children = {},
status = M.data.STATUS.OK,
}
end
TreeBuilder.apply_etymon_fields(term_node, etymon_data)
else
-- Regular term: fetch arguments from page
record_term_id_tracking(etymon_data)
local etymon_args, page_of, resolved_etymon_id, descendants_check =
DataRetriever.get_etymon_args(etymon_data, is_toplevel)
-- Check for <ety> inline parameter doesn't override the scraped arguments, unless the latter are missing
if etymon_data.ety then
if etymon_args == M.data.STATUS.REDLINK or etymon_args == M.data.STATUS.MISSING then
__state.current_page_has_inline_etymology = true
if is_toplevel then
__state.toplevel_has_inline_etymology = true
end
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
-- Track inline ety keywords too
local inline_keyword = get_keyword(inline_args[2], true)
if inline_keyword and #inline_args >= 3 then
local inline_etymon = EtymonParser.parse_etymon(inline_args[3], etymon_data.lang)
if inline_etymon then
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, inline_keyword, etymon_data.lang, inline_etymon.lang, is_toplevel)
end
end
inline_args.id = etymon_data.id
inline_args.status = M.data.STATUS.INLINE
etymon_args = inline_args
term_node.page_of = __state.cached_etymon_pages[key] -- term node is on the same page as the parent
else
-- Scraped arguments exist, <ety> is redundant and ignored
__state.current_page_has_redundant_etymology = true
if is_toplevel then
__state.toplevel_redundant_etymology = true
end
end
end
-- Ensure container exists before checking keyword info
container = ensure_container()
-- Check if current keyword has no_child_categories - if so, stop recursion
local keyword_info = container.keyword_info
local should_stop_recursion = (stop_recursion or (keyword_info and keyword_info.no_child_categories))
term_node = TreeBuilder.build(etymon_data.lang, etymon_data.term, etymon_args, seen, depth + 1, should_stop_recursion)
term_node.target_key = Util.get_norm_lang(etymon_data.lang):getFullCode() ..
":" .. M.links.get_link_page(etymon_data.term, etymon_data.lang)
term_node.etymon_id = resolved_etymon_id -- The actual etymon id when resolved via senseid
term_node.page_of = page_of
TreeBuilder.apply_etymon_fields(term_node, etymon_data)
term_node.missing_descendants_header, term_node.missing_descendants_entry =
M.descendants.get_term_sync_flags(current_keyword, term_node.status, descendants_check)
end
table.insert(container.terms, term_node)
end
end
end
return node
end
-- Convert etymology tree to JSON-serializable table
local function tree_to_json(node)
local obj = {
term = node.title,
lang = node.lang:getCode(),
lang_name = node.lang:getCanonicalName(),
id = (node.id and node.id ~= "") and node.id or nil,
status = node.status,
is_uncertain = node.is_uncertain or nil,
is_duplicate = node.is_duplicate or nil,
gloss = node.t,
transliteration = node.tr,
transcription = node.ts,
alt = node.alt,
g = node.g,
pos = node.pos,
ng = node.ng,
children = {},
}
for _, container in ipairs(node.children or {}) do
local keyword_info = container.keyword_info
if keyword_info then
local container_obj = {
keyword = container.keyword,
keyword_label = keyword_info.text,
keyword_abbrev = keyword_info.abbrev,
is_group = keyword_info.is_group or nil,
is_invisible = keyword_info.invisible or nil,
is_uncertain = (container.keyword_modifiers and container.keyword_modifiers.unc) or nil,
terms = {},
}
for _, term in ipairs(container.terms or {}) do
table.insert(container_obj.terms, tree_to_json(term))
end
table.insert(obj.children, container_obj)
end
end
return obj
end
-- Build and return the etymology data tree for a given term.
function export.get_tree(lang, title, args, options)
options = options or {}
__state.entry_title = title
__state.entry_lang_code = lang:getCode()
__state.id_stats = M.tracking.new_id_stats()
__state.skip_partial_etymology_category = options.skip_partial_etymology_category == true
if options.validate then
EtymonParser.validate(lang, args, options.id, title, options.pos, false)
end
local lang_code = lang:getCode()
local start_index = (args[1] == lang_code) and 2 or 1
local tree_args = { [1] = lang_code, id = options.id or args.id }
for i = start_index, #args do
table.insert(tree_args, args[i])
end
__state.cached_etymon_args[lang_code .. ":" .. title .. ":" .. (tree_args.id or "")] = tree_args
local ety_data_tree = TreeBuilder.build(lang, title, tree_args)
parse_tree_references(ety_data_tree)
if options.json then
return M.JSON.toJSON(tree_to_json(ety_data_tree))
end
return ety_data_tree
end
-- Given a language code, page name and optionally the id= parameter,
-- render the tree and only the etymology tree for the relevant page.
-- Fetches and parses the corresponding {{etymon}} from the requested page,
-- and any further pages needed to render the tree.
-- Parameters can be passed either through the #invoke or as
-- template parameters *through* an #invoke.
function export.render_tree_for_etymon_on_page(frame)
local frame_args = frame.args
local parent_args = frame:getParent().args
local langcode = frame_args[1] or parent_args[1]
local pagename = frame_args[2] or parent_args[2]
local id = frame_args["id"] or parent_args["id"]
local display_title = frame_args["title"] or parent_args["title"]
local parsed_title = mw.title.new(pagename, 0)
local title
if parsed_title.namespace == 0 then
title = M.pages.safe_page_name(parsed_title)
elseif parsed_title.namespace == RECONSTRUCTION_NS_ID then
title = "*" .. M.pages.safe_page_name(parsed_title)
else
error("Unsupported namespace for render_tree_for_etymon_on_page: " .. parsed_title.namespace)
end
local lang = Util.get_lang(langcode)
__state.entry_title = title
__state.entry_lang_code = lang:getCode()
__state.id_stats = M.tracking.new_id_stats()
-- Construct etymon_data for DataRetriever.get_args.
local etymon_data = {
lang = lang,
term = title,
id = id
}
local args, pagename = DataRetriever.get_etymon_args(etymon_data, true)
if args == M.data.STATUS.MISSING then
error("The etymon template was not found (language " ..
langcode ..
", title '" ..
title ..
"'" ..
(id and ", ID '" .. id .. "'" or ", no ID given") .. "). Page contents may have changed in the interim.")
end
local tree_title = display_title or title
if lang:makeEntryName(M.links.remove_links(tree_title)) ~= lang:makeEntryName(M.links.remove_links(title)) then
M.tracking.track_title_pagename_mismatch(lang)
end
reset_invocation_state()
local ety_data_tree = export.get_tree(lang, tree_title, args, {
validate = true,
id = id,
})
local output = {}
table.insert(output, M.template_styles("Module:etymon/ceribandin/styles.css"))
table.insert(output, M.tree.render({
data_tree = ety_data_tree,
format_term_func = function(term, is_toplevel)
return Util.format_term(term, is_toplevel, {
pos = "suppress",
lit = "suppress",
tree_ql = "suppress",
gloss = "separate",
})
end,
}))
return table.concat(output)
end
function export.main(frame)
local parent_args = frame:getParent().args
local args = M.parameters.process(parent_args, M.parameters_data.etymon)
args.pos = Util.normalize_pos(args.pos)
local lang = args[1]
local etymon_args = args[2]
local id = args.id
local title = args.title
local text = args.text
local tree = args.tree
local etydate = args.etydate
local doublet = args.doublet
local rfe = args.rfe
local etystub = args.etystub
local is_nonlemma = M.yesno(args.nl, false)
local page_data = Util.get_page_data()
if not title then
title = page_data.pagename
if page_data.namespace == RECONSTRUCTION_NS_NAME then title = "*" .. title end
end
local entry_pagename = page_data.pagename
if page_data.namespace == RECONSTRUCTION_NS_NAME then
entry_pagename = "*" .. entry_pagename
end
if lang:makeEntryName(M.links.remove_links(title)) ~= lang:makeEntryName(M.links.remove_links(entry_pagename)) then
M.tracking.track_title_pagename_mismatch(lang)
end
local current_L2 = M.pages.get_current_L2()
if current_L2 then
local norm_lang = Util.get_norm_lang(lang)
local norm_name = norm_lang:getCanonicalName()
if current_L2 ~= norm_name then
local lang_desc = lang:getCode() .. " (" .. lang:getCanonicalName() .. ")"
if norm_lang:getCode() ~= lang:getCode() then
lang_desc = lang_desc .. ", normalized to " .. norm_lang:getCode() .. " (" .. norm_name .. ")"
end
error("Language '" .. lang_desc .. "' does not match the L2 header (" .. current_L2 .. ").")
end
end
reset_invocation_state()
local ety_data_tree = export.get_tree(lang, title, etymon_args, {
validate = true,
pos = args.pos,
id = id,
json = args.json,
skip_partial_etymology_category = is_nonlemma,
})
if args.json then
return ety_data_tree
end
local output = {}
local text_allowlist_mode = M.text_allowed.default_mode or "off"
if text and text_allowlist_mode ~= "off" and not Util.is_text_param_allowed_for_lang(lang) then
local msg = "Etymology texts (parameter <code>text=</code>) are not allowed for " .. lang:getFullName() ..
"; see [[Template:etymon#Text allowlist|Template:etymon § Text allowlist]] for the list of languages that may use the <code>text=</code> parameter."
if text_allowlist_mode == "error" then
error(msg)
else
Util.add_warning(msg, true)
end
end
local lang_exc = Util.get_lang_exception(lang)
if lang_exc and lang_exc.disallow then
local disallow = lang_exc.disallow
local error_text = " for " .. lang:getFullName()
if disallow.ref then
error_text = error_text .. "; see " .. disallow.ref
else
error_text = error_text .. "."
end
if tree and disallow.tree then
error("Etymology trees are not allowed" .. error_text)
end
if text and disallow.text then
error("Etymology texts are not allowed" .. error_text)
end
end
if etydate then
local etydate_param_mods = {
ref = { list = true, type = "references", allow_holes = true },
refn = { list = true, allow_holes = true },
nocap = { type = "boolean" },
}
local function generate_etydate_obj(etydate_text)
local etydate_specs = {}
for spec in etydate_text:gmatch("[^,]+") do
table.insert(etydate_specs, mw.text.trim(spec))
end
return { [1] = etydate_specs }
end
local parsed_etydate = M.parse_utilities.parse_inline_modifiers(etydate, { param_mods = etydate_param_mods, generate_obj = generate_etydate_obj })
local etydate_args = {
[1] = parsed_etydate[1],
nocap = parsed_etydate.nocap or false,
}
ety_data_tree.supplements = ety_data_tree.supplements or {}
table.insert(ety_data_tree.supplements, {
type = "etydate",
etydate_text = M.etydate.format_etydate(etydate_args, { omit_refs = true }),
etydate_refs = (parsed_etydate.ref and #parsed_etydate.ref > 0) and parsed_etydate.ref or nil,
})
end
TreeBuilder.append_term_supplement(ety_data_tree, lang, "doublet", doublet)
if ety_data_tree.supplements then
parse_tree_references(ety_data_tree)
end
local has_visible_children = node_has_visible_tree_children(ety_data_tree)
-- Suppress trees for multiword entries and one-step chains
local visible_tree_depth = get_visible_tree_depth(ety_data_tree)
local is_trivial_tree = visible_tree_depth <= 2
local is_multiword = title:find("%s") ~= nil or title:find("_") ~= nil
if tree and (is_multiword or is_trivial_tree) then
tree = false
end
if tree then
table.insert(output, M.template_styles("Module:etymon/ceribandin/styles.css"))
table.insert(output, M.tree.render({
data_tree = ety_data_tree,
format_term_func = function(term, is_toplevel)
return Util.format_term(term, is_toplevel, {
pos = "suppress",
lit = "suppress",
tree_ql = "suppress",
gloss = "separate",
})
end,
}))
end
local tree_disallowed = lang_exc and lang_exc.disallow and lang_exc.disallow.tree
local ety_tree_json = M.JSON.toJSON(tree_to_json(ety_data_tree))
local anchor = M.anchors.etymonid(lang, id, {
no_tree = args.notree,
title = title,
empty_tree = (not has_visible_children) or tree_disallowed,
ety_tree_json = ety_tree_json,
})
table.insert(output, anchor)
local text_stop_lang_missing = nil
if text then
local max_depth, stop_at_blue_link, stop_at_lang, stop_at_lang_or_bluelink
if text == "++" then
max_depth, stop_at_blue_link = false, false
elseif text == "+" then
max_depth, stop_at_blue_link = 1, false
elseif text == "*" then
max_depth, stop_at_blue_link = false, true
elseif text:match("^:[^*]+%*$") then
-- Stop at a specific language OR first bluelink after it, e.g., ":ota*"
-- If the target language is a redlink, continue to the first bluelink
local lang_code = text:match("^:([^*]+)%*$")
if lang_code and lang_code ~= "" then
local lang_obj = Util.get_lang(lang_code, true)
if lang_obj then
stop_at_lang_or_bluelink = lang_code
else
Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false
end
else
Util.add_warning('Empty language code in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false
end
elseif text:sub(1, 1) == ":" then
-- Stop at a specific language, e.g., ":ar" stops at first Arabic term
local lang_code = text:sub(2)
if lang_code ~= "" then
-- Validate the language code
local lang_obj = Util.get_lang(lang_code, true)
if lang_obj then
stop_at_lang = lang_code
else
Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false -- default to ++
end
else
Util.add_warning('Empty language code in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false -- default to ++
end
else
local num = tonumber(text)
if num and num >= 1 then
max_depth, stop_at_blue_link = num, false
else
error('Invalid text value "' ..
text .. '". Valid values are: "++" (full chain), "+" (first step only), "*" (until first blue link), a number (max steps), ":lang" (stop at language), or ":lang*" (stop at language or first bluelink if redlink)')
end
end
local text_output, text_render_meta = M.text.render({
data_tree = ety_data_tree,
format_term_func = Util.format_term,
lang_matches_stop_code = Util.lang_matches_stop_code,
max_depth = max_depth,
stop_at_blue_link = stop_at_blue_link,
curr_page = page_data.pagename,
nodot = args.nodot,
dot = args.dot,
stop_at_lang = stop_at_lang,
stop_at_lang_or_bluelink = stop_at_lang_or_bluelink,
})
table.insert(output, text_output)
if stop_at_lang and text_render_meta and not text_render_meta.stop_lang_reached then
M.tracking.track_text_stop_lang_missing(lang, stop_at_lang)
text_stop_lang_missing = stop_at_lang
end
end
if rfe then
table.insert(output, Util.expand_request_template(frame, "rfe", rfe, lang:getCode()))
end
if etystub then
table.insert(output, Util.expand_request_template(frame, "etystub", etystub, lang:getCode()))
end
if is_nonlemma then
table.insert(output, " " .. frame:expandTemplate({
title = "nonlemma",
args = {},
}))
end
local categories = {}
if Util.is_content_page() then
M.tracking.track_tree_metrics({
max_depth_reached = __state.max_depth_reached,
total_nodes = __state.total_nodes,
language_count = __state.language_count,
lang = lang,
})
categories = M.categories.build({
data_tree = ety_data_tree,
page_lang = lang,
available_etymon_ids = __state.available_etymon_ids,
senseid_parent_etymon = __state.senseid_parent_etymon,
get_norm_lang_func = Util.get_norm_lang,
lang_exc = lang_exc,
suppress_categories = lang_exc and lang_exc.suppress_categories,
nocat = args.nocat,
tree = tree,
text = text,
exnihilo = args.exnihilo,
toplevel_has_inline_etymology = __state.toplevel_has_inline_etymology,
toplevel_redundant_etymology = __state.toplevel_redundant_etymology,
toplevel_idless_etymon = __state.toplevel_idless_etymon,
has_mismatched_id = __state.has_mismatched_id,
linked_page_multiple_etymons_idless = __state.linked_page_multiple_etymons_idless,
linked_page_partial_etymology_sections = __state.linked_page_partial_etymology_sections,
text_stop_lang_missing = text_stop_lang_missing,
})
M.tracking.track_keywords(__state.toplevel_keyword_stats, lang)
M.tracking.track_page_id(lang, id)
M.tracking.track_ids(__state.id_stats, lang)
end
if #categories > 0 then
table.insert(output, M.categories.format(categories, lang))
end
if __state.warnings then
for i, warning in ipairs(__state.warnings) do
table.insert(output, (i == 1 and "\n" or "") .. warning .. "\n")
end
end
return table.concat(output)
end
return export
hnilsgqvid6wczxab95eoymmlieznpe
6532073
6532033
2026-09-18T18:40:20Z
Wikihez
7344
sync test copy
6532073
Scribunto
text/plain
--[=[
This module implements the {{etymon}} template for structured etymology data on Wiktionary.
It enables the creation of etymology trees and text by parsing etymon chains,
scraping linked pages for their own {{etymon}} data, and recursively building a tree
of derivational relationships.
Authors:
- Original implementation: [[User:Ioaxxere]]
- Full refactor (September 2025): [[User:Fenakhay]] ([[Special:Diff/86717746]])
Modules:
- [[Module:etymon]]: main module handling parsing, validation, tree building, and page scraping
- [[Module:etymon/data]]: keyword definitions, configuration, and status constants
- [[Module:etymon/tree]]: etymology tree rendering
- [[Module:etymon/text]]: etymology text generation
- [[Module:etymon/categories]]: category generation logic
- [[Module:etymon/tracking]]: tracking
]=]
local export = {}
local __state = {
cached_etymon_args = {},
cached_etymon_pages = {},
cached_descendants_checks = {},
senseid_parent_etymon = {},
available_etymon_ids = {},
single_etymons = {},
entry_title = nil,
entry_lang_code = nil,
current_page_has_inline_etymology = false,
current_page_has_redundant_etymology = false,
used_idless_etymon = false,
toplevel_has_inline_etymology = false,
toplevel_redundant_etymology = false,
toplevel_idless_etymon = false,
has_mismatched_id = false,
linked_page_multiple_etymons_idless = false,
linked_page_partial_etymology_sections = false,
partial_etymology_targets = {},
skip_partial_etymology_category = false,
max_depth_reached = 0,
total_nodes = 0,
language_count = {},
toplevel_keyword_stats = {},
id_stats = nil,
warnings = {},
}
local function reset_invocation_state()
__state.current_page_has_inline_etymology = false
__state.current_page_has_redundant_etymology = false
__state.used_idless_etymon = false
__state.toplevel_has_inline_etymology = false
__state.toplevel_redundant_etymology = false
__state.toplevel_idless_etymon = false
__state.has_mismatched_id = false
__state.linked_page_multiple_etymons_idless = false
__state.linked_page_partial_etymology_sections = false
__state.max_depth_reached = 0
__state.total_nodes = 0
__state.language_count = {}
__state.toplevel_keyword_stats = {}
__state.warnings = {}
end
local M = require("Module:module loader").init({
require = {
data = "Module:etymon/data/ceribandin",
tree = "Module:etymon/tree/ceribandin",
text = "Module:etymon/text/ceribandin",
categories = "Module:etymon/categories/ceribandin",
tracking = "Module:etymon/tracking",
descendants = "Module:etymon/descendants/ceribandin",
anchors = "Module:anchors",
etydate = "Module:etydate",
etymology = "Module:etymology",
families = "Module:families",
languages = "Module:languages",
languages_errorgetby = "Module:languages/errorGetBy",
links = "Module:links",
pages = "Module:pages",
parameters = "Module:parameters",
string_utilities = "Module:string utilities",
template_parser = "Module:template parser",
utilities = "Module:utilities",
debug = "Module:debug",
en_utilities = "Module:en-utilities",
parse_utilities = "Module:parse utilities",
references = "Module:references",
template_styles = "Module:TemplateStyles",
script_utilities = "Module:script utilities",
JSON = "Module:JSON",
yesno = "Module:yesno",
},
loadData = {
headword_data = "Module:headword/data",
parameters_data = "Module:parameters/data/ceribandin",
text_allowed = "Module:etymon/data/text_allowed",
},
})
-- Template names that carry etymon data, and the heading that opens an etymology section.
-- Pages are scraped for these, so both must match what ku.wiktionary actually uses:
-- the section is "Etîmolojî", and the new template is "etîmon".
-- Only the new template: pages still using Şablon:etymon carry the old ">"-separated syntax, which
-- this module would misparse into garbage node labels. Add "etymon" here only once
-- Şablon:etymon itself invokes this module.
local ETYMON_TEMPLATES = {
["etîmon"] = true,
["etymon/nû"] = true, -- redirect to Şablon:etîmon; still recognised if written out
-- Do NOT add "etymon" here while Şablon:etymon still uses the old ">"-separated syntax:
-- this module would read those calls and parse the bare keyword ("inh") as a term.
}
local ETYMOLOGY_HEADING = "^Etîmolojî"
-- ku's reconstruction namespace is "Jinûvesazî" (id 108), where en.wiktionary uses
-- "Reconstruction" (id 118). A page here is a reconstructed term, so its title needs the
-- leading "*" that Modul:links requires for reconstructed languages.
local RECONSTRUCTION_NS_NAME = "Jinûvesazî"
local RECONSTRUCTION_NS_ID = 108
local Util = {}
function Util.format_error(message, preview_only)
if preview_only and not M.pages.is_preview() then
return nil
end
return '<span class="error">' .. message .. '</span>'
end
function Util.add_warning(message, preview_only)
local formatted = Util.format_error(message, preview_only)
if formatted then
table.insert(__state.warnings, formatted)
end
end
function Util.is_text_param_allowed_for_lang(lang)
if not lang or type(lang) ~= "table" then
return false
end
local types = lang.getTypes and lang:getTypes()
if types and types.family then
local code = lang.getCode and lang:getCode()
return code and M.text_allowed.families[code] == true
end
local full_code = lang.getFullCode and lang:getFullCode()
if full_code and M.text_allowed.langs[full_code] then
return true
end
if lang.inFamily then
for family_code in pairs(M.text_allowed.families) do
if lang:inFamily(family_code) then
return true
end
end
end
return false
end
function Util.get_lang(code, no_error)
if no_error then
return M.languages.getByCode(code, nil, true)
end
return M.languages.getByCode(code, nil, true) or M.languages_errorgetby.code(code, true, true)
end
-- Match a term language against a text=:lang stop target (supports etymology-only codes).
function Util.lang_matches_stop_code(term_lang, stop_code)
if not term_lang or not stop_code or stop_code == "" then
return false
end
local stop_lang = Util.get_lang(stop_code, true)
if not stop_lang then
return false
end
if term_lang:getCode() == stop_lang:getCode() then
return true
end
if stop_lang:getFullCode() == stop_lang:getCode() then
return term_lang:getFullCode() == stop_lang:getCode()
end
return false
end
function Util.get_family(code)
return M.families.getByCode(code)
end
function Util.get_lang_exception(lang)
-- Families have no language-specific exceptions
if lang.getTypes and lang:getTypes().family then
return nil
end
local code = lang:getCode()
local lang_exceptions = M.data.config.lang_exceptions
if lang_exceptions[code] then
return lang_exceptions[code]
end
for norm_code, exc in pairs(lang_exceptions) do
if exc.normalize_to and code == exc.normalize_to then
return exc
end
if exc.normalize_from_families then
local should_normalize = false
for _, family in ipairs(exc.normalize_from_families) do
if lang:inFamily(family) then
should_normalize = true
break
end
end
if should_normalize and exc.normalize_exclude_families then
for _, family in ipairs(exc.normalize_exclude_families) do
if lang:inFamily(family) then
should_normalize = false
break
end
end
end
if should_normalize then
local ret = {}
for k, v in pairs(exc) do
ret[k] = v
end
ret.suppress_tr = nil
return ret
end
end
end
return nil
end
function Util.get_norm_lang(lang)
local exc = Util.get_lang_exception(lang)
if exc and exc.normalize_to then
return M.languages.getByCode(exc.normalize_to)
end
return lang
end
function Util.resolve_context_lang(lang, node_args)
if type(node_args) ~= "table" then return lang end
if node_args.status == M.data.STATUS.INLINE then return lang end
if not (lang.hasType and lang:hasType("etymology-only")) then return lang end
local full = lang.getFull and lang:getFull()
if not full or full:getCode() == lang:getCode() then return lang end
if full.hasAncestor and full:hasAncestor(lang) then return lang end
return full
end
-- Add default values for boolean modifiers (e.g., <unc> becomes <unc:1>)
-- This is needed because Module:parse utilities expects boolean modifiers to have explicit values
function Util.add_boolean_defaults(str, param_mods)
local result = str
for name, spec in pairs(param_mods) do
if spec.type == "boolean" then
-- Replace <name> with <name:1> (but not <name:...> which already has a value)
result = result:gsub("<" .. name .. ">", "<" .. name .. ":1>")
end
end
return result
end
local REQUEST_TEMPLATE_PARAM_MODS = {
rfe = {
nocat = { type = "boolean" },
sort = {},
y = {},
m = {},
fragment = {},
section = {},
box = { type = "boolean" },
noes = { type = "boolean" },
},
etystub = {
nocat = { type = "boolean" },
sort = {},
nocap = { type = "boolean" },
nodot = { type = "boolean" },
},
}
function Util.expand_request_template(frame, template_name, param_value, lang_code)
local param_mods = REQUEST_TEMPLATE_PARAM_MODS[template_name]
local with_defaults = Util.add_boolean_defaults(param_value, param_mods)
local parsed = M.parse_utilities.parse_inline_modifiers(with_defaults, {
param_mods = param_mods,
generate_obj = function(text)
if M.yesno(text, false) then
return { is_boolean = true }
end
return { text = text }
end,
})
local template_args = { [1] = lang_code }
for name in pairs(param_mods) do
template_args[name] = parsed[name]
end
if not parsed.is_boolean then
template_args[2] = parsed.text
end
return " " .. frame:expandTemplate({
title = template_name,
args = template_args,
})
end
-- Kurdish values accepted for |pos= (|crz=) and <postype:>, mapped to the English values the rest of
-- the module compares against.
local POS_ALIASES = {
["reh"] = "root",
["kelîme"] = "word",
["pêşgir"] = "prefix",
["paşgir"] = "suffix",
["navgir"] = "interfix",
}
function Util.normalize_pos(value)
if type(value) ~= "string" then
return value
end
value = mw.text.trim(value)
return POS_ALIASES[value] or value
end
-- {{etîmon}} arguments read straight from another page skip Module:parameters, so `crz` (the Kurdish
-- name of `pos`) and the Kurdish values are resolved here.
function Util.normalize_raw_etymon_args(args)
if args.pos == nil and args.crz ~= nil then
args.pos = args.crz
end
args.pos = Util.normalize_pos(args.pos)
return args
end
-- Centralized term formatting: handles suppress_term (-), unknown_term (empty/+), and regular terms
function Util.format_term(term, is_toplevel, opts)
opts = opts or {}
-- suppress_term (-) returns nil
if term.suppress_term then
return nil
end
local lang = term.lang
local exc = Util.get_lang_exception(lang)
if is_toplevel then
local display_text = term.alt or term.title or ""
local sc = term.sc or lang:findBestScript(display_text)
local bold_text = tostring(mw.html.create("strong")
:addClass("selflink")
:wikitext(display_text))
return M.script_utilities.tag_text(bold_text, lang, sc, "term")
end
local link_params = { lang = lang }
link_params.term = not term.unknown_term and term.title or nil
link_params.alt = term.alt
link_params.id = (not term.unknown_term and term.id and term.id ~= "") and term.id or nil
if not (exc and exc.suppress_tr) then
link_params.tr = term.tr
link_params.ts = term.ts
else
link_params.suppress_tr = true
end
link_params.lit = (opts.lit ~= "suppress") and term.lit or nil
-- An explicit <t:...> wins; otherwise fall back to the etymon id, which on ku is usually a
-- Kurdish gloss in its own right ("berik", "hêştir"). An id that is a key rather than a
-- translation ("H2O", "paşgira meslekî") can be overridden with a <t:...>.
local t = (term.t and term.t ~= "") and term.t or nil
local id_gloss = (term.id and term.id ~= "") and term.id or nil
local gloss = t or id_gloss
-- gloss = "separate" leaves the gloss out of the link and returns it as a second value, so
-- the tree can put it on its own line.
if opts.gloss ~= "suppress" and opts.gloss ~= "separate" then
link_params.gloss = gloss
end
if term.g and term.g ~= "" then
local genders = M.string_utilities.split(term.g, ",")
for i = 1, #genders do
genders[i] = M.string_utilities.trim(genders[i])
end
link_params.genders = genders
end
if opts.pos ~= "suppress" then
link_params.pos = term.pos
link_params.ng = term.ng
end
if exc and exc.suppress_tr then
link_params.lit = nil
end
local show_qualifiers
if opts.tree_ql ~= "suppress" then
if term.q then
link_params.q = term.q
end
if term.qq then
link_params.qq = term.qq
end
if term.l then
link_params.l = term.l
end
if term.ll then
link_params.ll = term.ll
end
show_qualifiers = term.q or term.qq or term.l or term.ll
end
local link = M.links.full_link(link_params, "term", nil, show_qualifiers and true or nil)
if opts.gloss == "separate" then
return link, gloss
end
return link
end
local __is_content_page_cached
function Util.is_content_page()
if __is_content_page_cached == nil then
__is_content_page_cached = M.pages.is_content_page(mw.title.getCurrentTitle())
end
return __is_content_page_cached
end
local __page_data_cached
function Util.get_page_data()
if not __page_data_cached then
__page_data_cached = M.headword_data.page
end
return __page_data_cached
end
-- Extract base keyword from param (without modifiers)
local function get_keyword_base(param)
if type(param) ~= "string" then return nil end
local base = param:match("^:?([^<]+)") or param:gsub("^:", "")
return base
end
local function is_keyword(param, allow_colon_less)
if type(param) ~= "string" then return false end
local keywords = M.data.keywords
if param:sub(1, 1) == ":" then
local base = get_keyword_base(param)
return keywords[base] ~= nil
end
if allow_colon_less then
local base = get_keyword_base(param)
return keywords[base] ~= nil
end
return false
end
local function get_keyword(param, allow_colon_less)
if type(param) ~= "string" then return nil end
local keywords = M.data.keywords
if param:sub(1, 1) == ":" then
return get_keyword_base(param)
end
if allow_colon_less then
local base = get_keyword_base(param)
if keywords[base] then
return base
end
end
return nil
end
local function normalize_keyword(keyword)
if keyword:sub(1, 1) == ":" then
return keyword
end
return ":" .. keyword
end
-- Resolve keyword (possibly an alias) to its canonical form. Used only at input boundaries
local function get_canonical_keyword(keyword)
if not keyword then return keyword end
return M.data.keyword_canonical[keyword] or keyword
end
local function is_affix_group_keyword(keyword)
local config = keyword and M.data.keywords[keyword]
return config and config.affix_categories or false
end
local function reject_removed_surf_keyword(param)
local base = get_keyword_base(param)
if base == "surf" then
error("The `:surf` keyword has been removed. Use `<surf>` on a formation keyword instead (e.g. `:af<surf>`, `:bor<surf>`).")
end
end
local function copy_keyword_info(source)
local copy = {}
for k, v in pairs(source) do
copy[k] = v
end
return copy
end
local function lowercase_glossary_display(text)
return text:gsub("(%[%[Nimînok:Ferhengok#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest)
return prefix .. mw.ustring.lower(first) .. rest .. "]]"
end)
end
local function surf_should_keep_formation_phrase(base)
if not base.phrase then
return false
end
if base.glossary then
return true
end
return not (base.phrase == "from" and (base.text == "From" or base.text == "from"))
end
-- Runtime overrides when <surf> is present on a keyword.
local function get_effective_keyword_info(keyword, modifiers)
local base = M.data.keywords[keyword]
if not base or not modifiers or not modifiers.surf then
return base
end
local effective = copy_keyword_info(base)
local surf_text = "By [[Nimînok:Ferhengok#surface_analysis|surface analysis]],"
local surf_phrase = "by surface analysis,"
effective.new_sentence = true
effective.invisible = "tree"
if surf_should_keep_formation_phrase(base) then
effective.phrase = surf_phrase .. " " .. base.phrase
if base.text then
effective.text = surf_text .. " " .. lowercase_glossary_display(base.text)
else
effective.text = surf_text .. " " .. base.phrase
end
else
effective.text = surf_text
effective.phrase = surf_phrase
end
return effective
end
-- Build text/phrase for nominalization with <g:code> (uses data module for codes only).
local function get_nominalization_label_for_g(code)
if not code or code == "" then return nil end
local codes = M.data.nominalization_g_codes
local adj = codes[code]
if not adj and code:find("-", 1, true) then
-- ku combines a gender with a number by hyphenating them ("m-p"), where en.wikt runs the
-- letters together ("mp"); build the label from the parts. Splitting two-letter codes the
-- en.wikt way would mislabel ku codes that are not combinations at all, such as "np"
-- (nepersonel).
local parts, all_known = {}, true
for part in code:gmatch("[^-]+") do
local part_adj = codes[part]
if part_adj then
table.insert(parts, part_adj)
else
all_known = false
end
end
if all_known and parts[1] then
adj = table.concat(parts, " ")
end
end
if not adj then return nil end
local text = adj:gsub("^%l", function(c) return string.upper(c) end) .. " [[Nimînok:Ferhengok#nominalization|nominalization]] of"
local phrase = M.en_utilities.add_indefinite_article(adj .. " [[Nimînok:Ferhengok#nominalization|nominalization]] of", false)
return { text = text, phrase = phrase }
end
local EtymonParser = {}
-- Keyword modifier definitions
EtymonParser.keyword_param_mods = {
unc = { type = "boolean" },
ref = {},
text = { restrict = { keywords = { "from", "derived" } } },
lit = { restrict = { affix_group = true } },
conj = {}, -- conjunction for alternatives: "and", "or", "and/or", etc.
g = { restrict = { keywords = { "nominalization" } } },
surf = { type = "boolean" },
senseid = { restrict = { keywords = { "semantic loan" } } },
-- Kurdish names, resolved by resolve_modifier_aliases() below.
maneid = { alias_of = "senseid", restrict = { keywords = { "semantic loan" } } },
grdk = { alias_of = "conj" },
anlz = { type = "boolean", alias_of = "surf" },
metn = { alias_of = "text", restrict = { keywords = { "from", "derived" } } },
}
-- Term modifier definitions
EtymonParser.etymon_param_mods = {
id = {},
t = {},
tr = {},
ts = {},
q = {},
qq = {},
l = {},
ll = {},
pos = {},
ng = {},
alt = {},
g = {},
ety = {},
lit = {},
unc = { type = "boolean" },
ref = {},
aftype = { restrict = { affix_group = true } },
postype = {},
bor = { type = "boolean", restrict = { affix_group = true } },
slbor = { type = "boolean", restrict = { affix_group = true } },
lbor = { type = "boolean", restrict = { affix_group = true } },
-- Kurdish names for the same modifiers, resolved by resolve_modifier_aliases() below.
-- cuda/t/w/crz are the names ku's own templates already accept; the affix-group
-- borrowing flags reuse the Kurdish keyword names.
cuda = { alias_of = "alt" },
-- ASCII only: Modul:parse utilities matches a modifier prefix with "^([a-zA-Z0-9+_-]+):",
-- so a name containing "î" can never be recognised as a prefix.
etimon = { alias_of = "ety" },
w = { alias_of = "t" },
crz = { alias_of = "pos" },
crztip = { alias_of = "postype" },
hrf = { alias_of = "lit" },
nediyar = { type = "boolean", alias_of = "unc" },
deyn = { type = "boolean", alias_of = "bor", restrict = { affix_group = true } },
deynh = { type = "boolean", alias_of = "lbor", restrict = { affix_group = true } },
deynhq = { type = "boolean", alias_of = "slbor", restrict = { affix_group = true } },
}
--[==[
Move any Kurdish modifier onto the canonical name it aliases, so the rest of the module only ever
sees the canonical set. Called right after the inline modifiers are parsed.
]==]
function EtymonParser.resolve_modifier_aliases(obj, param_mods)
for name, def in pairs(param_mods) do
if def.alias_of and obj[name] ~= nil then
if obj[def.alias_of] ~= nil then
error("`<" .. name .. ":>` and `<" .. def.alias_of .. ":>` are the same modifier; use one.")
end
obj[def.alias_of] = obj[name]
obj[name] = nil
end
end
return obj
end
local function get_clean_param_mods(param_mods)
local clean = {}
for mod_name, mod_def in pairs(param_mods) do
clean[mod_name] = {}
for key, value in pairs(mod_def) do
if key ~= "restrict" and key ~= "alias_of" then
clean[mod_name][key] = value
end
end
end
return clean
end
function EtymonParser.check_modifier_restrictions(modifiers, current_keyword, param_mods)
for mod_name, mod_value in pairs(modifiers) do
-- Only check restrictions if the modifier has a non-false/nil value
if mod_value then
local mod_def = param_mods[mod_name]
if mod_def and mod_def.restrict then
if mod_def.restrict.affix_group then
if not is_affix_group_keyword(current_keyword) then
local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">"
error("The modifier `" .. mod_display .. "` is only allowed for affix-group keywords (e.g. `:af`, `:blend`, `:univ`).")
end
elseif mod_def.restrict.keywords then
local allowed_keywords = mod_def.restrict.keywords
local is_allowed = false
for _, allowed_keyword in ipairs(allowed_keywords) do
if current_keyword == allowed_keyword then
is_allowed = true
break
end
end
if not is_allowed then
local keyword_list = {}
for _, kw in ipairs(allowed_keywords) do
table.insert(keyword_list, ":" .. kw)
end
local keyword_str = table.concat(keyword_list, #keyword_list == 2 and " or " or ", ")
if #keyword_list > 2 then
-- Replace last comma with "or"
keyword_str = keyword_str:gsub(", ([^,]+)$", " or %1")
end
local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">"
error("The modifier `" .. mod_display .. "` is only allowed for the keyword" .. (#keyword_list > 1 and "s " or " ") .. keyword_str .. ".")
end
end
end
end
end
end
local TERM_RULE_DISALLOW = {
suppress = { field = "suppress_term", label = "suppressed" },
unknown = { field = "unknown_term", label = "unknown" },
family = { field = "is_family", label = "family" },
}
function EtymonParser.check_etymon_limits(count, limits, label, opts)
if not limits then
return
end
opts = opts or {}
local min_etymons = limits.min_etymons
if min_etymons == nil and not opts.skip_default_min then
min_etymons = 1
end
if min_etymons and count < min_etymons then
if min_etymons > 1 then
error("Detected " .. label .. " group with fewer than " .. min_etymons .. " etymons.")
else
error("Detected " .. label .. " with no etymons.")
end
end
if limits.max_etymons and count > limits.max_etymons then
local unit = (limits.max_etymons == 1) and "etymon" or "etymons"
error("Detected " .. label .. " with more than " .. limits.max_etymons .. " " .. unit .. ".")
end
end
function EtymonParser.check_term_rules(etymon_data, entry_lang, rules, label)
label = label or "term"
if rules and rules.disallow then
local disallowed = {}
for _, typ in ipairs(rules.disallow) do
local spec = TERM_RULE_DISALLOW[typ]
if spec and etymon_data[spec.field] then
table.insert(disallowed, spec.label)
end
end
if #disallowed > 0 then
error(label .. " does not support " ..
mw.text.listToText(disallowed, "or") .. " etymons.")
end
end
if etymon_data.is_family then
if rules and rules.family == "disallowed" then
error(label .. " does not support family codes" .. (rules.family_suffix or "."))
elseif not etymon_data.suppress_term then
error("Family codes require suppressed term (use family:-).")
end
end
if rules then
if rules.require_term and (not etymon_data.term or etymon_data.term == "") then
error(label .. " requires a term for each listed form.")
end
if rules.entry_lang then
if Util.get_norm_lang(etymon_data.lang):getFullCode() ~=
Util.get_norm_lang(entry_lang):getFullCode() then
error(label .. " terms must be in the entry language (" ..
entry_lang:getFullCode() .. "), got '" .. etymon_data.lang:getFullCode() .. "'.")
end
end
if rules.ancestor_check then
M.etymology.check_ancestor(entry_lang, etymon_data.lang)
end
elseif etymon_data.is_family and not etymon_data.suppress_term then
error("Family codes require suppressed term (use family:-).")
end
end
function EtymonParser.check_keyword_term(etymon_data, entry_lang, keyword)
local config = M.data.keywords[keyword]
EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "`:" .. keyword .. "`")
end
function EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type)
local config = M.data.supplements[supplement_type]
EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "|" .. supplement_type .. "=")
end
-- Parse keyword with modifiers (e.g., ":bor<unc>" or ":bor<ref:{{R:example}}>")
function EtymonParser.parse_keyword_modifiers(param)
if type(param) ~= "string" then return nil, {} end
local base_keyword = get_keyword_base(param)
if not base_keyword then return nil, {} end
local canonical_keyword = get_canonical_keyword(base_keyword)
-- Check if there are any modifiers
if not param:find("<", 1, true) then
return canonical_keyword, {}
end
-- Parse modifiers using the same mechanism as etymon parsing
local rest_with_defaults = Util.add_boolean_defaults(param, EtymonParser.keyword_param_mods)
local function generate_obj(ignored)
return {}
end
local parsed = M.parse_utilities.parse_inline_modifiers(rest_with_defaults:gsub("^:?[^<]+", ""),
{ param_mods = get_clean_param_mods(EtymonParser.keyword_param_mods), generate_obj = generate_obj })
EtymonParser.resolve_modifier_aliases(parsed, EtymonParser.keyword_param_mods)
local modifiers = {
unc = parsed.unc or false,
ref = parsed.ref,
text = parsed.text,
lit = parsed.lit,
conj = parsed.conj,
g = parsed.g,
surf = parsed.surf or false,
senseid = parsed.senseid,
}
-- Validate modifiers against restrictions
EtymonParser.check_modifier_restrictions(modifiers, canonical_keyword, EtymonParser.keyword_param_mods)
return canonical_keyword, modifiers
end
local function normalize_keyword_param(keyword_with_mods)
local trimmed = M.string_utilities.trim(keyword_with_mods)
reject_removed_surf_keyword(trimmed:match("^:") and trimmed or (":" .. trimmed))
local base = get_keyword_base(trimmed)
if not base or not M.data.keywords[base] then
error("Invalid keyword '" .. trimmed .. "' in inline etymology")
end
local canonical_base = get_canonical_keyword(base)
local without_colon = trimmed:gsub("^:", "")
local mods_part = without_colon:sub(#base + 1)
local kw_param = normalize_keyword(canonical_base .. mods_part)
EtymonParser.parse_keyword_modifiers(kw_param)
return kw_param
end
local function get_keyword_mod_names()
local names = {}
for mod_name in pairs(EtymonParser.keyword_param_mods) do
names[mod_name] = true
end
return names
end
local function parse_inline_ety_run(ety_string)
local body = ety_string or ""
if body == "" then
error("Empty inline etymology")
end
local keyword_mod_names = get_keyword_mod_names()
local pos = 1
local len = #body
local function parse_err(msg)
error(msg .. " in inline etymology: '" .. body .. "'")
end
local function peek_double()
return body:sub(pos, pos + 1) == "<<"
end
local function mod_name_from_unwrapped(unwrapped)
return unwrapped:match("^<([^:>]+)")
end
local function is_keyword_mod(unwrapped)
local name = mod_name_from_unwrapped(unwrapped)
return name and keyword_mod_names[name] or false
end
local function read_double_bracket()
if not peek_double() then
return nil
end
local start = pos
pos = pos + 2
while pos <= len - 1 do
if body:sub(pos, pos + 1) == ">>" then
local token = body:sub(start, pos + 1)
pos = pos + 2
return token, token:sub(2, -2)
end
pos = pos + 1
end
parse_err("Unmatched <<")
end
local function read_angle_cell()
if body:sub(pos, pos) ~= "<" or peek_double() then
return nil
end
local open = pos
pos = pos + 1
local depth = 1
local i = pos
while i <= len do
local ch = body:sub(i, i)
if ch == "<" then
depth = depth + 1
elseif ch == ">" then
depth = depth - 1
if depth == 0 then
local inner = body:sub(open + 1, i - 1)
pos = i + 1
return inner
end
end
i = i + 1
end
parse_err("Unmatched <")
end
local function read_bare_run()
local start = pos
while pos <= len and body:sub(pos, pos) ~= "<" do
pos = pos + 1
end
return body:sub(start, pos - 1)
end
local function absorb_double_keyword_mods(keyword_str)
while peek_double() do
local saved = pos
local _, unwrapped = read_double_bracket()
if is_keyword_mod(unwrapped) then
keyword_str = keyword_str .. unwrapped
else
pos = saved
break
end
end
return keyword_str
end
local kw_start = pos
while pos <= len and body:sub(pos, pos) ~= "<" do
pos = pos + 1
end
local keyword = body:sub(kw_start, pos - 1)
if keyword:match("^%s*$") then
parse_err("Missing keyword")
end
keyword = absorb_double_keyword_mods(keyword)
local cells = {}
while pos <= len do
if peek_double() then
local _, unwrapped = read_double_bracket()
if is_keyword_mod(unwrapped) then
parse_err("Unexpected keyword modifier " .. unwrapped .. " outside of a keyword")
end
table.insert(cells, "+" .. unwrapped)
elseif body:sub(pos, pos) == "<" then
local inner = read_angle_cell()
if inner ~= "" then
table.insert(cells, inner)
end
else
local bare = read_bare_run()
if bare ~= "" then
if bare:sub(1, 1) ~= ":" then
parse_err("Unexpected bare text '" .. bare .. "' (use :keyword for nested keywords in inline etymology)")
end
if not is_keyword(bare, true) then
parse_err("Invalid keyword '" .. bare .. "' in inline etymology")
end
table.insert(cells, absorb_double_keyword_mods(bare))
end
end
end
return {
keyword = keyword,
cells = cells,
}
end
function EtymonParser.inline_ety_to_pipe(ety_string)
local run = parse_inline_ety_run(ety_string)
if not run.keyword or run.keyword:match("^%s*$") then
return "|"
end
local pipe_parts = { normalize_keyword_param(M.string_utilities.trim(run.keyword)) }
for _, segment in ipairs(run.cells) do
if is_keyword(segment, true) then
table.insert(pipe_parts, normalize_keyword_param(segment))
else
table.insert(pipe_parts, segment)
end
end
return "|" .. table.concat(pipe_parts, "|") .. "|"
end
function EtymonParser.pipe_to_inline_ety(pipe_string)
local cells = {}
for cell in pipe_string:gmatch("([^|]+)") do
if cell ~= "" then
table.insert(cells, cell)
end
end
if #cells == 0 then
return ""
end
local inline_parts = {}
for index, cell in ipairs(cells) do
local base = get_keyword_base(cell)
if base and M.data.keywords[base] then
local without_colon = cell:gsub("^:", "")
local kw_base, mods = without_colon:match("^([^<]+)(.*)$")
local inline_kw = (kw_base or without_colon) .. (mods or ""):gsub("<([^>]+)>", "<<%1>>")
if index > 1 then
inline_kw = ":" .. inline_kw
end
table.insert(inline_parts, inline_kw)
elseif cell:sub(1, 1) == "+" then
local mod = cell:sub(2)
if mod:match("^<.->$") then
mod = mod:sub(2, -2)
end
table.insert(inline_parts, "<<" .. mod .. ">>")
else
table.insert(inline_parts, "<" .. cell .. ">")
end
end
return table.concat(inline_parts, "")
end
function EtymonParser.parse_inline_ety(ety_string, context_lang)
local run = parse_inline_ety_run(ety_string)
local keyword = M.string_utilities.trim(run.keyword)
reject_removed_surf_keyword(":" .. keyword)
if not is_keyword(keyword, true) then
error("Invalid keyword '" .. keyword .. "' in inline etymology <ety:" .. keyword .. "...>")
end
local args = { context_lang:getCode(), normalize_keyword_param(keyword) }
for _, segment in ipairs(run.cells) do
if is_keyword(segment, true) then
table.insert(args, normalize_keyword_param(segment))
else
table.insert(args, segment)
end
end
return args
end
function EtymonParser.parse_etymon(param, context_lang)
if is_keyword(param) then
return nil
end
if type(param) ~= "string" then
return nil
end
local lang, rest
local is_family = false
local before_bracket = param:match("^([^<]*)") or param
local lang_code, rest_match = before_bracket:match("^([a-zA-Z][a-zA-Z0-9._-]*):(.*)$")
if lang_code then
local potential_lang = Util.get_lang(lang_code, true)
if potential_lang then
lang = potential_lang
rest = param:sub(#lang_code + 2)
else
local potential_family = Util.get_family(lang_code)
if potential_family then
lang = potential_family
rest = param:sub(#lang_code + 2)
is_family = true
else
lang = context_lang
rest = param
end
end
else
lang = context_lang
rest = param
end
M.tracking.track_term(rest)
if rest == "" or rest == "+" then
return {
lang = lang,
term = nil,
unknown_term = true,
is_family = is_family,
}
end
if rest == "-" then
return {
lang = lang,
term = nil,
suppress_term = true,
is_family = is_family,
}
end
if not rest:find("<", 1, true) then
return {
lang = lang,
term = M.string_utilities.trim(rest),
is_family = is_family,
}
end
local term_text = rest:match("^([^<]*)") or ""
local is_unknown = (term_text == "" or term_text == "+")
local is_suppress = (term_text == "-")
local function generate_obj(ignored_term)
return { term = (is_unknown or is_suppress) and nil or M.string_utilities.trim(term_text) }
end
local rest_with_defaults = Util.add_boolean_defaults(rest, EtymonParser.etymon_param_mods)
local parsed_obj = M.parse_utilities.parse_inline_modifiers(rest_with_defaults,
{ param_mods = get_clean_param_mods(EtymonParser.etymon_param_mods), generate_obj = generate_obj })
EtymonParser.resolve_modifier_aliases(parsed_obj, EtymonParser.etymon_param_mods)
parsed_obj.postype = Util.normalize_pos(parsed_obj.postype)
if parsed_obj.id and parsed_obj.id:match("^!") then
parsed_obj.id = parsed_obj.id:sub(2)
parsed_obj.override = true
end
parsed_obj.lang = lang
parsed_obj.is_family = is_family
if is_unknown then
parsed_obj.unknown_term = true
elseif is_suppress then
parsed_obj.suppress_term = true
end
return parsed_obj
end
function EtymonParser.validate(lang, args, id, title, pos, starts_with_lang_code)
-- id is now optional, so only validate if provided
if id then
if mw.ustring.len(id) < 2 then
error("The `id` parameter must have at least two characters.")
end
if id == title or id == Util.get_page_data().pagename then
error("The `id` parameter must not be the same as the page title.")
end
end
local valid_pos = { prefix = true, suffix = true, interfix = true, infix = true, root = true, word = true }
if pos and not valid_pos[pos] then
error("Unknown value provided for `pos`. Valid values: " .. table.concat(require("Module:table").keysToList(valid_pos), ", ")
.. " (Kurdish: " .. table.concat(require("Module:table").keysToList(POS_ALIASES), ", ") .. ").")
end
local current_keyword = "from"
local current_keyword_explicit = false
local keyword_etymons = {}
local keywords = M.data.keywords
local function checkKeyword()
local config = keywords[current_keyword]
if current_keyword == "from" and not current_keyword_explicit and #keyword_etymons == 0 then
keyword_etymons = {}
return
end
EtymonParser.check_etymon_limits(#keyword_etymons, config, "`:" .. current_keyword .. "`")
keyword_etymons = {}
end
local start_index = starts_with_lang_code and 2 or 1
for i = start_index, #args do
local param = args[i]
if type(param) ~= "string" then
elseif param:sub(1, 1) == ":" and not is_keyword(param) then
reject_removed_surf_keyword(param)
error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?")
elseif is_keyword(param) then
checkKeyword()
current_keyword = get_canonical_keyword(get_keyword(param))
current_keyword_explicit = true
else
local etymon_data = EtymonParser.parse_etymon(param, lang)
if etymon_data then
table.insert(keyword_etymons, param)
EtymonParser.check_keyword_term(etymon_data, lang, current_keyword)
-- Check modifier restrictions
EtymonParser.check_modifier_restrictions(etymon_data, current_keyword, EtymonParser.etymon_param_mods)
-- postype must be "root" or "word"
local VALID_POSTYPES = { root = true, word = true }
if etymon_data.postype and not VALID_POSTYPES[etymon_data.postype] then
error("Invalid <postype:" .. etymon_data.postype .. ">; must be \"root\" or \"word\" (Kurdish \"reh\" or \"kelîme\").")
end
if etymon_data.ety then
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
EtymonParser.validate(etymon_data.lang, inline_args, nil, nil, nil, true)
end
else
table.insert(keyword_etymons, param)
end
end
end
checkKeyword()
end
local DataRetriever = {}
local function format_etymon_id_hint(id_data, idx)
local id = type(id_data) == "table" and id_data.id or id_data
local pos = type(id_data) == "table" and id_data.pos
if id and id ~= "" and id ~= "*" then
return '"' .. id .. '"'
end
if pos and pos ~= "" then
return "unnamed (|pos=" .. pos .. "|)"
end
return "etymon #" .. idx .. " (no |id= on page)"
end
local function etymon_target_page_link(page, norm_lang)
-- `page` is an already-resolved page name ("Jinûvesazî:proto-îranî/hižwáH"), so link to it
-- directly. Passing it back through full_link() with a reconstructed language raises an error,
-- because the resolved name no longer carries the leading "*" those languages require -- and
-- this link is built even when the warning it belongs to is later discarded outside preview.
return "[[" .. page .. "]]"
end
-- Summarize {{etymon}} id slots on a linked page for preview warnings.
local function summarize_available_etymon_ids(ids)
local id_list = {}
local all_idless = true
local target_has_idless = false
local any_pos = false
for i, id_data in ipairs(ids) do
local id = type(id_data) == "table" and id_data.id or id_data
local pos = type(id_data) == "table" and id_data.pos
if id and id ~= "" and id ~= "*" then
all_idless = false
else
target_has_idless = true
end
if pos and pos ~= "" then
any_pos = true
end
table.insert(id_list, format_etymon_id_hint(id_data, i))
end
return {
id_list = id_list,
all_idless = all_idless,
target_has_idless = target_has_idless,
any_pos = any_pos,
count = #ids,
options_text = mw.text.listToText(id_list),
}
end
local function ambiguous_etymon_suggestion(page_link, summary)
if summary.all_idless then
if summary.any_pos then
return " None set `|id=` yet; add a unique `|id=` to each on " .. page_link
.. ", then `<id:identifier>` after the term here. Section order / hints: "
.. summary.options_text .. "."
end
return " None set `|id=` yet; add a unique `|id=` to each {{etymon}} in that section from top to bottom, then `<id:identifier>` after the term here (same value as `|id=`)."
end
return " Specify which one with `<id:identifier>` after the term. Options: " .. summary.options_text .. "."
end
local function warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel)
local page_link = etymon_target_page_link(page, norm_lang)
local summary = summarize_available_etymon_ids(ids)
if is_toplevel and summary.target_has_idless then
__state.linked_page_multiple_etymons_idless = true
end
local lang_name = norm_lang:getCanonicalName()
local lead = "Etymology link to " .. page_link .. " is ambiguous (" .. summary.count
.. " {{etymon}} templates for " .. lang_name .. ")."
Util.add_warning(lead .. ambiguous_etymon_suggestion(page_link, summary), true)
end
local function is_mismatched_explicit_id(base_key, cached_args, parent_etymon)
return cached_args == M.data.STATUS.MISSING and not parent_etymon
and #(__state.available_etymon_ids[base_key] or {}) > 0
end
local function maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel)
if not is_toplevel or __state.skip_partial_etymology_category then
return
end
if not __state.partial_etymology_targets[base_key] then
return
end
if etymon_data.id and type(cached_args) == "table" then
return
end
__state.linked_page_partial_etymology_sections = true
end
local function is_nonlemma_etymon_template(template_args)
return template_args and M.yesno(template_args.nl, false)
end
local function warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_id)
local page_link = etymon_target_page_link(page, norm_lang)
local summary = summarize_available_etymon_ids(__state.available_etymon_ids[base_key] or {})
local lang_name = norm_lang:getCanonicalName()
local lead = "Etymology link to " .. page_link .. " uses `<id:" .. etymon_id
.. ">`, but no {{etymon}} on that page has `|id=" .. etymon_id .. "|` for " .. lang_name .. "."
Util.add_warning(lead .. " Valid IDs: " .. summary.options_text .. ".", true)
end
-- Given an etymon data, scrape its page and cache the result in the global state object.
function DataRetriever.cache_page_etymons(etymon_page, etymon_title, key, etymon_lang, etymon_id, redirected_from, descendants_is_toplevel)
local content = etymon_title:getContent()
if not content then
__state.cached_etymon_args[key] = M.data.STATUS.REDLINK
return
end
-- Check if the linked page is a redirect. If it is, the template parsing
-- code below will be effectively skipped, and `scrape_page` will be called
-- again on the redirect target (see the bottom of this function)
local lang_section_for_descendants = nil
local redirect_target = etymon_title.redirect_target
if not redirect_target then
-- ku.wiktionary writes L2 headings as "== {{ziman|CODE}} ==" rather than the language
-- name, and this scrape runs on raw wikitext, so the template form has to be tried too.
content = M.pages.get_section(content, etymon_lang:getFullName(), 2)
or M.pages.get_section(content, "{{ziman|" .. etymon_lang:getFullCode() .. "}}", 2)
if not content then
__state.cached_etymon_args[key] = M.data.STATUS.MISSING
return
end
lang_section_for_descendants = content
end
local etymon_lang_code = etymon_lang:getFullCode()
local lang_page_key = etymon_lang_code .. ":" .. etymon_page
local found_templates_for_lang = {}
local found_ids = {}
local get_node_class = M.template_parser.class_else_type
-- Look for all {{etymon}} templates within the page content using the template parser
-- This way the same page is never parsed more than once
-- Build a map from senseids to their parent etymonids.
local active_etymon_args = nil
local etymology_section_count = 0
local etymology_sections_with_etymon = 0
local current_etymology_has_etymon = false
local current_etymology_has_nonlemma = false
local function finalize_current_etymology_section()
if etymology_section_count == 0 then
return
end
if current_etymology_has_etymon or current_etymology_has_nonlemma then
etymology_sections_with_etymon = etymology_sections_with_etymon + 1
end
current_etymology_has_etymon = false
current_etymology_has_nonlemma = false
end
for node in M.template_parser.parse(content):iterate_nodes() do
local node_class = get_node_class(node)
if node_class == "heading" then
-- A new L2 or etymology section acts as a barrier: an {{etymon}} usage
-- used previously cannot be the parent of any subsequent senseids.
-- Note that we don't have to check for L2s due to the usage of `M.pages.get_section` above.
if node:get_name():find(ETYMOLOGY_HEADING) then
finalize_current_etymology_section()
etymology_section_count = etymology_section_count + 1
active_etymon_args = nil
end
elseif node_class == "template" then
local template_name = node:get_name()
if ETYMON_TEMPLATES[template_name] then
local template_args = Util.normalize_raw_etymon_args(node:get_arguments())
-- Check if this etymon is for our language
if template_args[1] == etymon_lang_code then
if is_nonlemma_etymon_template(template_args) then
if etymology_section_count > 0 then
current_etymology_has_nonlemma = true
end
else
if etymology_section_count > 0 then
current_etymology_has_etymon = true
end
table.insert(found_templates_for_lang, template_args)
if template_args.id then
local etymon_key = lang_page_key .. ":" .. template_args.id
__state.cached_etymon_args[etymon_key] = template_args
__state.cached_etymon_pages[etymon_key] = tostring(etymon_page)
table.insert(found_ids, template_args.id)
active_etymon_args = template_args
else
-- Store idless etymon with default key
local etymon_key = lang_page_key .. ":*"
__state.cached_etymon_args[etymon_key] = template_args
__state.cached_etymon_pages[etymon_key] = tostring(etymon_page)
table.insert(found_ids, "*")
active_etymon_args = template_args
end
end
end
elseif active_etymon_args and template_name == "senseid" then
local template_args = node:get_arguments()
-- This should always be true for proper usages of {{senseid}}.
if template_args[1] == etymon_lang_code and template_args[2] then
local sense_id_key = lang_page_key .. ":" .. template_args[2]
__state.senseid_parent_etymon[sense_id_key] = active_etymon_args
__state.cached_etymon_pages[sense_id_key] = tostring(etymon_page)
end
end
end
end
finalize_current_etymology_section()
if lang_section_for_descendants
and etymology_section_count > 1
and etymology_sections_with_etymon > 0
and etymology_sections_with_etymon < etymology_section_count
then
__state.partial_etymology_targets[lang_page_key] = true
end
if descendants_is_toplevel and lang_section_for_descendants and #found_templates_for_lang > 0 then
M.descendants.cache_page_checks({
lang_section = lang_section_for_descendants,
etymon_lang_code = etymon_lang_code,
found_templates_for_lang = found_templates_for_lang,
entry_title = __state.entry_title,
entry_lang_code = __state.entry_lang_code,
entry_lang = __state.entry_lang_code and Util.get_lang(__state.entry_lang_code, true) or nil,
cached_descendants_checks = __state.cached_descendants_checks,
lang_page_key = lang_page_key,
redirected_from = redirected_from,
})
end
local id_data_list = {}
for _, args in ipairs(found_templates_for_lang) do
local id = args.id or "*"
table.insert(id_data_list, { id = id, pos = args.pos })
end
__state.available_etymon_ids[lang_page_key] = id_data_list
if #found_templates_for_lang == 1 then
__state.single_etymons[lang_page_key] = found_templates_for_lang[1]
end
if redirected_from and __state.available_etymon_ids[lang_page_key] then
__state.available_etymon_ids[redirected_from] = __state.available_etymon_ids[redirected_from] or {}
for _, id_data in ipairs(__state.available_etymon_ids[lang_page_key]) do
table.insert(__state.available_etymon_ids[redirected_from], id_data)
end
end
if __state.cached_etymon_args[key] ~= nil or __state.senseid_parent_etymon[key] ~= nil then
-- All done!
return
elseif redirect_target and not redirected_from then
-- Try scraping the redirect.
etymon_page = redirect_target.prefixedText
DataRetriever.cache_page_etymons(etymon_page, redirect_target, lang_page_key .. ":" .. etymon_id, etymon_lang, etymon_id, lang_page_key, descendants_is_toplevel)
__state.cached_etymon_args[key] = __state.cached_etymon_args[etymon_lang_code .. ":" .. etymon_page .. ":" .. etymon_id]
else
__state.cached_etymon_args[key] = M.data.STATUS.MISSING
end
end
local function has_linkable_term(etymon_data)
if etymon_data.is_family or etymon_data.suppress_term or etymon_data.unknown_term then
return false
end
local term = etymon_data.term
if term == nil or term == "" then
return false
end
return M.string_utilities.trim(term) ~= ""
end
local function record_term_id_tracking(etymon_data)
if not has_linkable_term(etymon_data) then
return
end
local term_page = M.links.get_link_page(etymon_data.term, etymon_data.lang)
M.tracking.record_term_id_usage(__state.id_stats, etymon_data, term_page)
end
-- Given an etymon object, scrape its page (if necessary) and return its own etymon arguments as well as the page name.
function DataRetriever.get_etymon_args(etymon_data, is_toplevel)
if not has_linkable_term(etymon_data) then
return M.data.STATUS.MISSING, nil, nil, nil
end
local page = M.links.get_link_page(etymon_data.term, etymon_data.lang)
local norm_lang = Util.get_norm_lang(etymon_data.lang)
local base_key = norm_lang:getFullCode() .. ":" .. page
if etymon_data.id then
local key = base_key .. ":" .. etymon_data.id
local cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key]
if cached_args == nil then
local title = mw.title.new(page)
if not title then error('Invalid page title "' .. page .. '" encountered.') end
DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, is_toplevel)
end
cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key] -- refresh
-- Get etymon_id from parent if this was resolved via senseid
local parent_etymon = __state.senseid_parent_etymon[key]
local resolved_etymon_id = parent_etymon and parent_etymon.id
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = {
explicit_id = etymon_data.id,
parent_etymon = parent_etymon,
},
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = {
explicit_id = etymon_data.id,
parent_etymon = parent_etymon,
},
})
end
end
local mismatched_id = is_mismatched_explicit_id(base_key, cached_args, parent_etymon)
if mismatched_id and is_toplevel then
__state.has_mismatched_id = true
M.tracking.record_mismatched_id_usage(__state.id_stats, norm_lang, page, etymon_data.id)
warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_data.id)
end
maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel)
return cached_args, __state.cached_etymon_pages[key], resolved_etymon_id, descendants_check
else
__state.used_idless_etymon = true
if is_toplevel then
__state.toplevel_idless_etymon = true
end
if __state.available_etymon_ids[base_key] == nil then
local title = mw.title.new(page)
if not title then error('Invalid page title "' .. page .. '" encountered.') end
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, is_toplevel)
end
local ids = __state.available_etymon_ids[base_key] or {}
local count = #ids
-- Try to filter by postype if available and we have multiple candidates
if count > 1 and etymon_data.postype then
local matching_ids = {}
for _, id_data in ipairs(ids) do
if id_data.pos == etymon_data.postype then
table.insert(matching_ids, id_data)
end
end
if #matching_ids == 1 then
local matched_id = matching_ids[1].id
local matched_key = base_key .. ":" .. matched_id
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "postype")
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = { id = matched_id },
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = { id = matched_id },
})
end
end
local matched_args = __state.cached_etymon_args[matched_key]
maybe_flag_partial_etymology_reference(base_key, etymon_data, matched_args, is_toplevel)
return matched_args, __state.cached_etymon_pages[matched_key], nil, descendants_check
end
end
if count == 1 then
local only_id_data = ids[1]
local only_id = (type(only_id_data) == "table" and only_id_data.id) or only_id_data or "*"
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "single")
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = { id_data = only_id_data },
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = { id_data = only_id_data },
})
end
end
local single_args = __state.single_etymons[base_key]
maybe_flag_partial_etymology_reference(base_key, etymon_data, single_args, is_toplevel)
return single_args, __state.cached_etymon_pages[base_key .. ":" .. only_id], nil, descendants_check
elseif count > 1 then
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "ambiguous")
warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel)
maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.AMBIGUOUS, is_toplevel)
return M.data.STATUS.AMBIGUOUS, nil, nil, nil
else
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "missing")
maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.MISSING, is_toplevel)
return M.data.STATUS.MISSING, nil, nil, nil
end
end
end
local function keyword_invisible_in_tree(keyword_info)
if not keyword_info then
return false
end
local inv = keyword_info.invisible
return inv == "all" or inv == true or inv == "tree"
end
-- True when the node has at least one top-level child container visible in the tree.
local function node_has_visible_tree_children(node)
for _, container in ipairs(node.children or {}) do
if not keyword_invisible_in_tree(container.keyword_info) then
return true
end
end
return false
end
-- Count visible term nodes in the tree.
local function get_visible_tree_depth(node, skip_child_rendering)
local max_depth = 1
if skip_child_rendering or not node then
return max_depth
end
for _, container in ipairs(node.children or {}) do
local keyword_info = container.keyword_info
if not keyword_invisible_in_tree(keyword_info) then
local skip_grandchildren = keyword_info and keyword_info.no_child_categories
for _, term in ipairs(container.terms or {}) do
if term.is_duplicate then
if term.original_has_children then
max_depth = math.max(max_depth, 2)
end
else
max_depth = math.max(max_depth, 1 + get_visible_tree_depth(term, skip_grandchildren))
end
end
end
end
return max_depth
end
local function as_param_list(val)
if val == nil then
return {}
end
if type(val) == "table" then
return val
end
if type(val) == "string" and val ~= "" then
return { val }
end
return {}
end
local TreeBuilder = {}
local function parse_etymon_references(refs_text)
if not refs_text or refs_text == "" then
return ""
end
return M.references.parse_references(refs_text)
end
local function parse_tree_references(node)
if node.ref then
node.parsed_ref = parse_etymon_references(node.ref)
end
if node.children then
for _, container in ipairs(node.children) do
if container.terms then
for _, term in ipairs(container.terms) do
parse_tree_references(term)
end
end
end
end
if node.supplements then
for _, supplement in ipairs(node.supplements) do
if supplement.terms then
for _, term in ipairs(supplement.terms) do
parse_tree_references(term)
end
end
end
end
end
-- Build a unique key for deduplication in the seen table
function TreeBuilder.build_key(lang, title, args)
local norm_lang_code = Util.get_norm_lang(lang):getFullCode()
local is_table = type(args) == "table"
local id = (is_table and args.id) or ""
if title then
return norm_lang_code .. ":" .. M.links.get_link_page(title, lang) .. ":" .. id
end
if is_table and args.status == M.data.STATUS.INLINE then
local content_parts = {}
for i = 1, #args do
content_parts[i] = tostring(args[i])
end
return norm_lang_code .. ":*:" .. id .. "\0" .. table.concat(content_parts, "\0")
end
return norm_lang_code .. ":*:" .. id
end
-- Copy parsed etymon modifiers onto a tree/supplement term node.
function TreeBuilder.apply_etymon_fields(term, etymon_data)
-- A reference without <id:> still resolves when the target page has a single etymon, and the
-- node already carries that etymon's own id. Keep it instead of clearing it, so the tree shows
-- the target's id as the gloss without every reference having to repeat it. An explicit
-- <id:...> still wins.
term.id = etymon_data.id or term.id
term.t = etymon_data.t
term.tr = etymon_data.tr
term.ts = etymon_data.ts
term.alt = etymon_data.alt
term.g = etymon_data.g
term.pos = etymon_data.pos
term.ng = etymon_data.ng
term.ref = etymon_data.ref
term.is_uncertain = etymon_data.unc
term.lit = etymon_data.lit
term.q = etymon_data.q
term.qq = etymon_data.qq
term.l = etymon_data.l
term.ll = etymon_data.ll
term.suppress_term = etymon_data.suppress_term
term.unknown_term = etymon_data.unknown_term
term.is_family = etymon_data.is_family
term.override = etymon_data.override
term.aftype = etymon_data.aftype
term.postype = etymon_data.postype
term.bor = etymon_data.bor
term.lbor = etymon_data.lbor
term.slbor = etymon_data.slbor
end
function TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type)
EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type)
local term = {
lang = etymon_data.lang,
title = etymon_data.term,
children = {},
status = M.data.STATUS.OK,
}
TreeBuilder.apply_etymon_fields(term, etymon_data)
return term
end
function TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value)
local terms = {}
for _, term_param in ipairs(as_param_list(param_value)) do
if type(term_param) == "string" and term_param ~= "" then
local etymon_data = EtymonParser.parse_etymon(term_param, entry_lang)
if etymon_data then
table.insert(terms, TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type))
end
end
end
return terms
end
-- Attach a |param= supplement defined in etymon_data.supplements (e.g. doublet=).
function TreeBuilder.append_term_supplement(data_tree, entry_lang, supplement_type, param_value)
local config = M.data.supplements[supplement_type]
if not config then
error("Unknown supplement '" .. tostring(supplement_type) .. "'.")
end
local terms = TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value)
if #terms == 0 then
return
end
data_tree.supplements = data_tree.supplements or {}
table.insert(data_tree.supplements, {
type = supplement_type,
config = config,
terms = terms,
})
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, supplement_type, entry_lang, entry_lang, true)
end
function TreeBuilder.build(lang, title, args, seen, depth, stop_recursion)
seen = seen or {}
depth = depth or 0
local is_toplevel = (depth == 0)
if depth > __state.max_depth_reached then
__state.max_depth_reached = depth
end
__state.total_nodes = __state.total_nodes + 1
local lang_code = lang:getCode()
__state.language_count[lang_code] = (__state.language_count[lang_code] or 0) + 1
local current_id = (type(args) == "table" and args.id) or ""
local key = TreeBuilder.build_key(lang, title, args)
local node = { lang = lang, title = title, id = current_id, args = args, children = {}, status = M.data.STATUS.OK }
if type(args) ~= "table" or seen[key] then
node.status = args or M.data.STATUS.MISSING
-- Mark as duplicate if we've seen this node before
if seen[key] then
node.is_duplicate = true
node.duplicate_key = key
local original_node = seen[key]
if type(original_node) == "table" and original_node.children and #original_node.children > 0 then
node.original_has_children = true
end
end
return node
end
node.status = args.status or M.data.STATUS.OK
seen[key] = node
-- If stop_recursion is set, skip parsing children but check for visible children
if stop_recursion then
local keywords = M.data.keywords
local has_visible_children = false
for i = 2, #args do
local param = args[i]
if type(param) == "string" then
local keyword_base = get_keyword_base(param)
if keyword_base and keywords[keyword_base] then
local _, kw_modifiers = EtymonParser.parse_keyword_modifiers(param:sub(1, 1) == ":" and param or (":" .. param))
if not keyword_invisible_in_tree(get_effective_keyword_info(keyword_base, kw_modifiers)) then
has_visible_children = true
break
end
elseif param:sub(1, 1) ~= ":" then
-- It's a term (not a keyword), so there are visible children
has_visible_children = true
break
end
end
end
node.has_visible_children = has_visible_children
return node
end
-- Parse args into keyword containers
local current_keyword = "from"
local current_keyword_modifiers = {}
local current_container = nil
local function ensure_container()
if not current_container or current_container.keyword ~= current_keyword then
local keyword_info = get_effective_keyword_info(current_keyword, current_keyword_modifiers)
current_container = {
keyword = current_keyword,
keyword_info = keyword_info,
keyword_modifiers = current_keyword_modifiers,
terms = {},
}
table.insert(node.children, current_container)
-- Override keyword text/phrase for nominalization with <g:code>
if current_keyword_modifiers.g and current_keyword == "nominalization" then
local labels = get_nominalization_label_for_g(current_keyword_modifiers.g)
if not labels then
local codes = {}
for c in pairs(M.data.nominalization_g_codes) do table.insert(codes, c) end
table.sort(codes)
error("Invalid <g:" .. tostring(current_keyword_modifiers.g) .. ">. Supported codes for nominalization: " .. table.concat(codes, ", "))
end
current_container.keyword_info = copy_keyword_info(keyword_info)
current_container.keyword_info.text = labels.text
current_container.keyword_info.phrase = labels.phrase
end
end
return current_container
end
local parse_context_lang = Util.resolve_context_lang(lang, args)
for i = 2, #args do
local param = args[i]
if is_keyword(param) then
local keyword, modifiers = EtymonParser.parse_keyword_modifiers(param)
if not keyword then
error("Invalid keyword '" .. param .. "'.")
end
current_keyword = keyword
current_keyword_modifiers = modifiers
current_container = nil -- Force new container for new keyword
elseif type(param) == "string" and param:sub(1, 1) == ":" then
reject_removed_surf_keyword(param)
error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?")
elseif type(param) == "string" then
local etymon_data = EtymonParser.parse_etymon(param, parse_context_lang)
if etymon_data then
-- Track keyword usage at top level
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, current_keyword, lang, etymon_data.lang, is_toplevel)
local term_node = {}
local container
-- Handle suppress_term (-) and unknown_term (empty or +) directly
if etymon_data.suppress_term or etymon_data.unknown_term then
container = ensure_container()
if etymon_data.ety then
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
inline_args.id = etymon_data.id
inline_args.status = M.data.STATUS.INLINE
term_node = TreeBuilder.build(etymon_data.lang, nil, inline_args, seen, depth + 1)
else
term_node = {
lang = etymon_data.lang,
children = {},
status = M.data.STATUS.OK,
}
end
TreeBuilder.apply_etymon_fields(term_node, etymon_data)
else
-- Regular term: fetch arguments from page
record_term_id_tracking(etymon_data)
local etymon_args, page_of, resolved_etymon_id, descendants_check =
DataRetriever.get_etymon_args(etymon_data, is_toplevel)
-- Check for <ety> inline parameter doesn't override the scraped arguments, unless the latter are missing
if etymon_data.ety then
if etymon_args == M.data.STATUS.REDLINK or etymon_args == M.data.STATUS.MISSING then
__state.current_page_has_inline_etymology = true
if is_toplevel then
__state.toplevel_has_inline_etymology = true
end
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
-- Track inline ety keywords too
local inline_keyword = get_keyword(inline_args[2], true)
if inline_keyword and #inline_args >= 3 then
local inline_etymon = EtymonParser.parse_etymon(inline_args[3], etymon_data.lang)
if inline_etymon then
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, inline_keyword, etymon_data.lang, inline_etymon.lang, is_toplevel)
end
end
inline_args.id = etymon_data.id
inline_args.status = M.data.STATUS.INLINE
etymon_args = inline_args
term_node.page_of = __state.cached_etymon_pages[key] -- term node is on the same page as the parent
else
-- Scraped arguments exist, <ety> is redundant and ignored
__state.current_page_has_redundant_etymology = true
if is_toplevel then
__state.toplevel_redundant_etymology = true
end
end
end
-- Ensure container exists before checking keyword info
container = ensure_container()
-- Check if current keyword has no_child_categories - if so, stop recursion
local keyword_info = container.keyword_info
local should_stop_recursion = (stop_recursion or (keyword_info and keyword_info.no_child_categories))
term_node = TreeBuilder.build(etymon_data.lang, etymon_data.term, etymon_args, seen, depth + 1, should_stop_recursion)
term_node.target_key = Util.get_norm_lang(etymon_data.lang):getFullCode() ..
":" .. M.links.get_link_page(etymon_data.term, etymon_data.lang)
term_node.etymon_id = resolved_etymon_id -- The actual etymon id when resolved via senseid
term_node.page_of = page_of
TreeBuilder.apply_etymon_fields(term_node, etymon_data)
term_node.missing_descendants_header, term_node.missing_descendants_entry =
M.descendants.get_term_sync_flags(current_keyword, term_node.status, descendants_check)
end
table.insert(container.terms, term_node)
end
end
end
return node
end
-- Convert etymology tree to JSON-serializable table
local function tree_to_json(node)
local obj = {
term = node.title,
lang = node.lang:getCode(),
lang_name = node.lang:getCanonicalName(),
id = (node.id and node.id ~= "") and node.id or nil,
status = node.status,
is_uncertain = node.is_uncertain or nil,
is_duplicate = node.is_duplicate or nil,
gloss = node.t,
transliteration = node.tr,
transcription = node.ts,
alt = node.alt,
g = node.g,
pos = node.pos,
ng = node.ng,
children = {},
}
for _, container in ipairs(node.children or {}) do
local keyword_info = container.keyword_info
if keyword_info then
local container_obj = {
keyword = container.keyword,
keyword_label = keyword_info.text,
keyword_abbrev = keyword_info.abbrev,
is_group = keyword_info.is_group or nil,
is_invisible = keyword_info.invisible or nil,
is_uncertain = (container.keyword_modifiers and container.keyword_modifiers.unc) or nil,
terms = {},
}
for _, term in ipairs(container.terms or {}) do
table.insert(container_obj.terms, tree_to_json(term))
end
table.insert(obj.children, container_obj)
end
end
return obj
end
-- Build and return the etymology data tree for a given term.
function export.get_tree(lang, title, args, options)
options = options or {}
__state.entry_title = title
__state.entry_lang_code = lang:getCode()
__state.id_stats = M.tracking.new_id_stats()
__state.skip_partial_etymology_category = options.skip_partial_etymology_category == true
if options.validate then
EtymonParser.validate(lang, args, options.id, title, options.pos, false)
end
local lang_code = lang:getCode()
local start_index = (args[1] == lang_code) and 2 or 1
local tree_args = { [1] = lang_code, id = options.id or args.id }
for i = start_index, #args do
table.insert(tree_args, args[i])
end
__state.cached_etymon_args[lang_code .. ":" .. title .. ":" .. (tree_args.id or "")] = tree_args
local ety_data_tree = TreeBuilder.build(lang, title, tree_args)
parse_tree_references(ety_data_tree)
if options.json then
return M.JSON.toJSON(tree_to_json(ety_data_tree))
end
return ety_data_tree
end
-- Given a language code, page name and optionally the id= parameter,
-- render the tree and only the etymology tree for the relevant page.
-- Fetches and parses the corresponding {{etymon}} from the requested page,
-- and any further pages needed to render the tree.
-- Parameters can be passed either through the #invoke or as
-- template parameters *through* an #invoke.
function export.render_tree_for_etymon_on_page(frame)
local frame_args = frame.args
local parent_args = frame:getParent().args
local langcode = frame_args[1] or parent_args[1]
local pagename = frame_args[2] or parent_args[2]
local id = frame_args["id"] or parent_args["id"]
local display_title = frame_args["title"] or parent_args["title"]
local parsed_title = mw.title.new(pagename, 0)
local title
if parsed_title.namespace == 0 then
title = M.pages.safe_page_name(parsed_title)
elseif parsed_title.namespace == RECONSTRUCTION_NS_ID then
title = "*" .. M.pages.safe_page_name(parsed_title)
else
error("Unsupported namespace for render_tree_for_etymon_on_page: " .. parsed_title.namespace)
end
local lang = Util.get_lang(langcode)
__state.entry_title = title
__state.entry_lang_code = lang:getCode()
__state.id_stats = M.tracking.new_id_stats()
-- Construct etymon_data for DataRetriever.get_args.
local etymon_data = {
lang = lang,
term = title,
id = id
}
local args, pagename = DataRetriever.get_etymon_args(etymon_data, true)
if args == M.data.STATUS.MISSING then
error("The etymon template was not found (language " ..
langcode ..
", title '" ..
title ..
"'" ..
(id and ", ID '" .. id .. "'" or ", no ID given") .. "). Page contents may have changed in the interim.")
end
local tree_title = display_title or title
if lang:makeEntryName(M.links.remove_links(tree_title)) ~= lang:makeEntryName(M.links.remove_links(title)) then
M.tracking.track_title_pagename_mismatch(lang)
end
reset_invocation_state()
local ety_data_tree = export.get_tree(lang, tree_title, args, {
validate = true,
id = id,
})
local output = {}
table.insert(output, M.template_styles("Module:etymon/ceribandin/styles.css"))
table.insert(output, M.tree.render({
data_tree = ety_data_tree,
format_term_func = function(term, is_toplevel)
return Util.format_term(term, is_toplevel, {
pos = "suppress",
lit = "suppress",
tree_ql = "suppress",
gloss = "separate",
})
end,
}))
return table.concat(output)
end
function export.main(frame)
local parent_args = frame:getParent().args
local args = M.parameters.process(parent_args, M.parameters_data.etymon)
args.pos = Util.normalize_pos(args.pos)
local lang = args[1]
local etymon_args = args[2]
local id = args.id
local title = args.title
local text = args.text
local tree = args.tree
local etydate = args.etydate
local doublet = args.doublet
local rfe = args.rfe
local etystub = args.etystub
local is_nonlemma = M.yesno(args.nl, false)
local page_data = Util.get_page_data()
if not title then
title = page_data.pagename
if page_data.namespace == RECONSTRUCTION_NS_NAME then title = "*" .. title end
end
local entry_pagename = page_data.pagename
if page_data.namespace == RECONSTRUCTION_NS_NAME then
entry_pagename = "*" .. entry_pagename
end
if lang:makeEntryName(M.links.remove_links(title)) ~= lang:makeEntryName(M.links.remove_links(entry_pagename)) then
M.tracking.track_title_pagename_mismatch(lang)
end
local current_L2 = M.pages.get_current_L2()
if current_L2 then
local norm_lang = Util.get_norm_lang(lang)
local norm_name = norm_lang:getCanonicalName()
if current_L2 ~= norm_name then
local lang_desc = lang:getCode() .. " (" .. lang:getCanonicalName() .. ")"
if norm_lang:getCode() ~= lang:getCode() then
lang_desc = lang_desc .. ", normalized to " .. norm_lang:getCode() .. " (" .. norm_name .. ")"
end
error("Language '" .. lang_desc .. "' does not match the L2 header (" .. current_L2 .. ").")
end
end
reset_invocation_state()
local ety_data_tree = export.get_tree(lang, title, etymon_args, {
validate = true,
pos = args.pos,
id = id,
json = args.json,
skip_partial_etymology_category = is_nonlemma,
})
if args.json then
return ety_data_tree
end
local output = {}
local text_allowlist_mode = M.text_allowed.default_mode or "off"
if text and text_allowlist_mode ~= "off" and not Util.is_text_param_allowed_for_lang(lang) then
local msg = "Etymology texts (parameter <code>text=</code>) are not allowed for " .. lang:getFullName() ..
"; see [[Template:etymon#Text allowlist|Template:etymon § Text allowlist]] for the list of languages that may use the <code>text=</code> parameter."
if text_allowlist_mode == "error" then
error(msg)
else
Util.add_warning(msg, true)
end
end
local lang_exc = Util.get_lang_exception(lang)
if lang_exc and lang_exc.disallow then
local disallow = lang_exc.disallow
local error_text = " for " .. lang:getFullName()
if disallow.ref then
error_text = error_text .. "; see " .. disallow.ref
else
error_text = error_text .. "."
end
if tree and disallow.tree then
error("Etymology trees are not allowed" .. error_text)
end
if text and disallow.text then
error("Etymology texts are not allowed" .. error_text)
end
end
if etydate then
local etydate_param_mods = {
ref = { list = true, type = "references", allow_holes = true },
refn = { list = true, allow_holes = true },
nocap = { type = "boolean" },
}
local function generate_etydate_obj(etydate_text)
local etydate_specs = {}
for spec in etydate_text:gmatch("[^,]+") do
table.insert(etydate_specs, mw.text.trim(spec))
end
return { [1] = etydate_specs }
end
local parsed_etydate = M.parse_utilities.parse_inline_modifiers(etydate, { param_mods = etydate_param_mods, generate_obj = generate_etydate_obj })
local etydate_args = {
[1] = parsed_etydate[1],
nocap = parsed_etydate.nocap or false,
}
ety_data_tree.supplements = ety_data_tree.supplements or {}
table.insert(ety_data_tree.supplements, {
type = "etydate",
etydate_text = M.etydate.format_etydate(etydate_args, { omit_refs = true }),
etydate_refs = (parsed_etydate.ref and #parsed_etydate.ref > 0) and parsed_etydate.ref or nil,
})
end
TreeBuilder.append_term_supplement(ety_data_tree, lang, "doublet", doublet)
if ety_data_tree.supplements then
parse_tree_references(ety_data_tree)
end
local has_visible_children = node_has_visible_tree_children(ety_data_tree)
-- Suppress trees for multiword entries and one-step chains
local visible_tree_depth = get_visible_tree_depth(ety_data_tree)
local is_trivial_tree = visible_tree_depth <= 2
local is_multiword = title:find("%s") ~= nil or title:find("_") ~= nil
if tree and (is_multiword or is_trivial_tree) then
tree = false
end
if tree then
table.insert(output, M.template_styles("Module:etymon/ceribandin/styles.css"))
table.insert(output, M.tree.render({
data_tree = ety_data_tree,
format_term_func = function(term, is_toplevel)
return Util.format_term(term, is_toplevel, {
pos = "suppress",
lit = "suppress",
tree_ql = "suppress",
gloss = "separate",
})
end,
}))
end
local tree_disallowed = lang_exc and lang_exc.disallow and lang_exc.disallow.tree
local ety_tree_json = M.JSON.toJSON(tree_to_json(ety_data_tree))
local anchor = M.anchors.etymonid(lang, id, {
no_tree = args.notree,
title = title,
empty_tree = (not has_visible_children) or tree_disallowed,
ety_tree_json = ety_tree_json,
})
table.insert(output, anchor)
local text_stop_lang_missing = nil
if text then
local max_depth, stop_at_blue_link, stop_at_lang, stop_at_lang_or_bluelink
if text == "++" then
max_depth, stop_at_blue_link = false, false
elseif text == "+" then
max_depth, stop_at_blue_link = 1, false
elseif text == "*" then
max_depth, stop_at_blue_link = false, true
elseif text:match("^:[^*]+%*$") then
-- Stop at a specific language OR first bluelink after it, e.g., ":ota*"
-- If the target language is a redlink, continue to the first bluelink
local lang_code = text:match("^:([^*]+)%*$")
if lang_code and lang_code ~= "" then
local lang_obj = Util.get_lang(lang_code, true)
if lang_obj then
stop_at_lang_or_bluelink = lang_code
else
Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false
end
else
Util.add_warning('Empty language code in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false
end
elseif text:sub(1, 1) == ":" then
-- Stop at a specific language, e.g., ":ar" stops at first Arabic term
local lang_code = text:sub(2)
if lang_code ~= "" then
-- Validate the language code
local lang_obj = Util.get_lang(lang_code, true)
if lang_obj then
stop_at_lang = lang_code
else
Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false -- default to ++
end
else
Util.add_warning('Empty language code in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false -- default to ++
end
else
local num = tonumber(text)
if num and num >= 1 then
max_depth, stop_at_blue_link = num, false
else
error('Invalid text value "' ..
text .. '". Valid values are: "++" (full chain), "+" (first step only), "*" (until first blue link), a number (max steps), ":lang" (stop at language), or ":lang*" (stop at language or first bluelink if redlink)')
end
end
local text_output, text_render_meta = M.text.render({
data_tree = ety_data_tree,
format_term_func = Util.format_term,
lang_matches_stop_code = Util.lang_matches_stop_code,
max_depth = max_depth,
stop_at_blue_link = stop_at_blue_link,
curr_page = page_data.pagename,
nodot = args.nodot,
dot = args.dot,
stop_at_lang = stop_at_lang,
stop_at_lang_or_bluelink = stop_at_lang_or_bluelink,
})
table.insert(output, text_output)
if stop_at_lang and text_render_meta and not text_render_meta.stop_lang_reached then
M.tracking.track_text_stop_lang_missing(lang, stop_at_lang)
text_stop_lang_missing = stop_at_lang
end
end
if rfe then
table.insert(output, Util.expand_request_template(frame, "rfe", rfe, lang:getCode()))
end
if etystub then
table.insert(output, Util.expand_request_template(frame, "etystub", etystub, lang:getCode()))
end
if is_nonlemma then
table.insert(output, " " .. frame:expandTemplate({
title = "nonlemma",
args = {},
}))
end
local categories = {}
if Util.is_content_page() then
M.tracking.track_tree_metrics({
max_depth_reached = __state.max_depth_reached,
total_nodes = __state.total_nodes,
language_count = __state.language_count,
lang = lang,
})
categories = M.categories.build({
data_tree = ety_data_tree,
page_lang = lang,
available_etymon_ids = __state.available_etymon_ids,
senseid_parent_etymon = __state.senseid_parent_etymon,
get_norm_lang_func = Util.get_norm_lang,
lang_exc = lang_exc,
suppress_categories = lang_exc and lang_exc.suppress_categories,
nocat = args.nocat,
tree = tree,
text = text,
exnihilo = args.exnihilo,
toplevel_has_inline_etymology = __state.toplevel_has_inline_etymology,
toplevel_redundant_etymology = __state.toplevel_redundant_etymology,
toplevel_idless_etymon = __state.toplevel_idless_etymon,
has_mismatched_id = __state.has_mismatched_id,
linked_page_multiple_etymons_idless = __state.linked_page_multiple_etymons_idless,
linked_page_partial_etymology_sections = __state.linked_page_partial_etymology_sections,
text_stop_lang_missing = text_stop_lang_missing,
})
M.tracking.track_keywords(__state.toplevel_keyword_stats, lang)
M.tracking.track_page_id(lang, id)
M.tracking.track_ids(__state.id_stats, lang)
end
if #categories > 0 then
table.insert(output, M.categories.format(categories, lang))
end
if __state.warnings then
for i, warning in ipairs(__state.warnings) do
table.insert(output, (i == 1 and "\n" or "") .. warning .. "\n")
end
end
return table.concat(output)
end
return export
jp7jqevefvzul0r8ehk0js66xswglzg
Modul:etymon/tree/ceribandin
828
1359185
6532034
6434862
2026-09-18T16:07:32Z
Wikihez
7344
sync test copy
6532034
Scribunto
text/plain
local export = {}
local html_create = mw.html.create
local max = math.max
--[==[
The language label on a tree node: a link to the language's category with the first letter
capitalised, the way Modul:etymon kevn rendered it. Families and anything without a category
fall back to the plain canonical name.
]==]
local function language_label(lang)
if lang and lang.makeCategoryLink then
local ok, link = pcall(lang.makeCategoryLink, lang)
if ok and link and link ~= "" then
return link
end
end
local name = lang and lang:getCanonicalName() or ""
return mw.ustring.upper(mw.ustring.sub(name, 1, 1)) .. mw.ustring.sub(name, 2)
end
local function create_vertical_connector()
return html_create('span'):addClass('etytree-connector-vertical')
end
local function create_abbr(text, title, glossary)
local abbr = html_create('abbr')
:attr('title', title)
:wikitext(text)
if glossary then
abbr = '[[Nimînok:Ferhengok#' .. glossary .. '|' .. tostring(abbr) .. ']]'
end
return html_create('span'):addClass('etytree-label'):node(abbr)
end
local function create_uncertainty_marker()
return html_create('abbr')
:addClass('etytree-unc')
:attr('title', 'nediyar')
:wikitext('?')
end
local function create_label_container()
return html_create('span'):addClass('etytree-label-container')
end
local function invisible_in_tree(inv)
return inv == "all" or inv == true or inv == "tree"
end
local function render_label(term_block, keyword_info, keyword_modifiers, is_uncertain, is_group_child, term_labels)
-- Skip label when invisible in tree
local has_label = keyword_info and keyword_info.abbrev and not is_group_child and not invisible_in_tree(keyword_info.invisible)
-- For group children, keyword uncertainty is shown on the group label, not on individual terms
local keyword_uncertain = keyword_modifiers and keyword_modifiers.unc and not is_group_child
local show_term_uncertainty = is_uncertain
-- Check if we have term-specific labels
local has_term_labels = term_labels and #term_labels > 0
if not has_label and not show_term_uncertainty and not keyword_uncertain and not has_term_labels then
return
end
local label_span = create_label_container()
if has_label then
local glossary_title = keyword_info.glossary
and keyword_info.glossary:gsub("_", " ")
or keyword_info.abbrev
label_span:node(create_abbr(
keyword_info.abbrev,
glossary_title,
keyword_info.glossary
))
-- Show uncertainty marker if term or keyword is uncertain
if show_term_uncertainty or keyword_uncertain then
label_span:node(create_uncertainty_marker())
end
else
-- No label, but term or keyword is uncertain
if show_term_uncertainty or keyword_uncertain then
label_span:node(create_uncertainty_marker())
end
end
-- Add term-specific labels
if has_term_labels then
for _, label_info in ipairs(term_labels) do
label_span:node(create_abbr(label_info.abbrev, label_info.title, label_info.glossary))
end
end
term_block:node(label_span)
end
local function render_term_block(node_data, format_term_func, is_toplevel)
local link_content = html_create()
link_content
:tag('span')
:addClass('etyl')
:wikitext(language_label(node_data.lang))
:done()
local term_text, gloss = format_term_func(node_data, is_toplevel)
if term_text then
link_content
:wikitext('<br>')
:tag('span')
:addClass('etytree-term')
:wikitext(term_text)
:done()
end
-- The meaning goes on its own line, smaller and in italics, instead of in (“...”) brackets.
if gloss then
link_content
:wikitext('<br>')
:tag('span')
:addClass('etytree-gloss')
:wikitext(gloss)
:done()
end
local block = html_create('div'):addClass('etytree-block'):node(link_content)
-- Reconstructed languages get their own tint, so an unattested step is obvious at a glance.
local lang = node_data.lang
if lang and lang.hasType then
local ok, is_recon = pcall(lang.hasType, lang, "reconstructed")
if ok and is_recon then
block:addClass('etytree-reconstructed')
end
end
-- Add duplicate styling if this is a duplicate node
if node_data.is_duplicate then
block:addClass('etytree-duplicate')
end
return block
end
local function create_dotted_connector()
return html_create('span'):addClass('etytree-connector-dotted')
end
-- Create an L-shaped connector for nodes with hidden ancestry (duplicate or no_child_categories)
local function create_duplicate_connector()
local container = html_create('div'):addClass('etytree-duplicate-connector')
local inner_wrapper = container:tag('div')
inner_wrapper:tag('span'):addClass('etytree-dup-right')
inner_wrapper:tag('span'):addClass('etytree-dup-horiz')
inner_wrapper:tag('span'):addClass('etytree-dup-left')
inner_wrapper:tag('span'):addClass('etytree-dup-arrow'):wikitext('▲')
return container
end
local function render_group_label(connecting_line, keyword_info, keyword_modifiers)
local has_abbrev = keyword_info and keyword_info.abbrev
local keyword_uncertain = keyword_modifiers and keyword_modifiers.unc
-- Nothing to show if no abbrev and no uncertainty
if not has_abbrev and not keyword_uncertain then
return
end
local label_span = connecting_line:tag('span'):addClass('etytree-group-label')
if has_abbrev then
local glossary_title = keyword_info.glossary
and keyword_info.glossary:gsub("_", " ")
or keyword_info.abbrev
label_span:node(create_abbr(keyword_info.abbrev, glossary_title, nil))
end
-- Add uncertainty marker if keyword has <unc> modifier
if keyword_uncertain then
label_span:node(create_uncertainty_marker())
end
end
local function add_branch_connector(column, index, total)
if index == 1 then
column:tag('span'):addClass('etytree-branch-left')
elseif index == total then
column:tag('span'):addClass('etytree-branch-right')
else
column:tag('span'):addClass('etytree-connector-vertical-short')
column:tag('span'):addClass('etytree-branch-mid')
end
end
function export.render(opts)
opts = opts or {}
local data_tree = opts.data_tree
local format_term_func = opts.format_term_func
-- Forward declaration
local render_term
-- Render a container (keyword + its terms)
local function render_container(container, is_toplevel)
local keyword_info = container.keyword_info
local keyword_modifiers = container.keyword_modifiers or {}
local is_group = keyword_info and keyword_info.is_group
local terms = container.terms or {}
-- Skip container entirely only when invisible = "all" (or true)
if keyword_info and invisible_in_tree(keyword_info.invisible) then
return nil, 0, 0
end
if #terms == 0 then
return nil, 0, 0
end
-- For no_child_categories keywords (calque, semantic loan, etc.), don't render term's children
local skip_child_rendering = keyword_info and keyword_info.no_child_categories
-- Render each term in the container
local rendered_terms = {}
local container_height = 0
local container_width = 0
for _, term in ipairs(terms) do
-- Collect term-specific labels
local term_labels = {}
if term.bor then
table.insert(term_labels, { abbrev = "bor.", title = "borrowed", glossary = "loanword" })
end
if term.slbor then
table.insert(term_labels, { abbrev = "slbor.", title = "semi-learned borrowing", glossary = "semi-learned_borrowing" })
end
if term.lbor then
table.insert(term_labels, { abbrev = "lbor.", title = "learned borrowing", glossary = "learned_borrowing" })
end
local term_tree, term_height, term_width = render_term(term, keyword_info, keyword_modifiers, is_group, false, skip_child_rendering, term_labels)
table.insert(rendered_terms, {
tree = term_tree,
height = term_height,
width = term_width,
is_uncertain = term.is_uncertain,
})
container_height = max(container_height, term_height)
container_width = container_width + term_width
end
local rendered_html
local has_connector = false
if #rendered_terms == 1 then
-- Single term: just return it directly
rendered_html = rendered_terms[1].tree
container_height = rendered_terms[1].height
container_width = rendered_terms[1].width
else
-- Multiple terms: group them together
local subtree_container = html_create('div'):addClass('etytree-branch-group')
for i, term_data in ipairs(rendered_terms) do
local column = html_create('div'):addClass('etytree-branch')
column:node(term_data.tree)
add_branch_connector(column, i, #rendered_terms)
subtree_container:node(column)
end
local connecting_line = create_vertical_connector()
-- Add group label for group keywords
if is_group and not invisible_in_tree(keyword_info.invisible) then
render_group_label(connecting_line, keyword_info, keyword_modifiers)
end
rendered_html = html_create()
:node(subtree_container)
:node(connecting_line)
has_connector = true
end
return rendered_html, container_height, container_width, has_connector
end
-- Render a term node
render_term = function(term_node, keyword_info, keyword_modifiers, is_group_child, is_toplevel_term, skip_child_rendering, term_labels)
local tree_width, tree_height = 0, 0
local subtrees = {}
-- Process term's children (which are containers)
local has_hidden_children = false
if not term_node.is_duplicate and not skip_child_rendering then
for _, container in ipairs(term_node.children or {}) do
local subtree, sub_height, sub_width, subtree_has_connector = render_container(container, is_toplevel_term)
if subtree then
table.insert(subtrees, {
tree = subtree,
height = sub_height,
width = sub_width,
has_connector = subtree_has_connector,
})
tree_height = max(tree_height, sub_height)
tree_width = tree_width + sub_width
end
end
elseif skip_child_rendering then
-- Check if there are any visible children
-- When stop_recursion is true, children aren't parsed, but has_visible_children flag is set
if term_node.has_visible_children then
has_hidden_children = true
elseif term_node.children and #term_node.children > 0 then
-- Fallback: check parsed children for visibility
for _, container in ipairs(term_node.children) do
local child_keyword_info = container.keyword_info
if not (child_keyword_info and (child_keyword_info.invisible == "all" or child_keyword_info.invisible == true)) then
has_hidden_children = true
break
end
end
end
end
local is_toplevel_node = (keyword_info == nil)
local term_block = render_term_block(term_node, format_term_func, is_toplevel_node)
render_label(term_block, keyword_info, keyword_modifiers, term_node.is_uncertain, is_group_child, term_labels or {})
local term_html = html_create()
if #subtrees == 0 then
local show_connector = (term_node.is_duplicate and term_node.original_has_children) or has_hidden_children
if show_connector then
term_html:node(create_duplicate_connector())
end
term_html:node(term_block)
tree_width = tree_width + 1
elseif #subtrees == 1 then
term_html:node(subtrees[1].tree)
if not subtrees[1].has_connector then
term_html:node(create_vertical_connector())
end
term_html:node(term_block)
else
-- Multiple containers: need to merge them
local subtree_container = html_create('div'):addClass('etytree-branch-group')
for i, subtree_data in ipairs(subtrees) do
local column = html_create('div'):addClass('etytree-branch')
column:node(subtree_data.tree)
add_branch_connector(column, i, #subtrees)
subtree_container:node(column)
end
local connecting_line = create_vertical_connector()
term_html
:node(subtree_container)
:node(connecting_line)
:node(term_block)
end
return term_html, tree_height + 1, tree_width
end
local final_tree, final_height, final_width = render_term(data_tree, nil, nil, false, true)
local container = html_create('div')
:addClass('etytree-body')
:node(final_tree)
return tostring(html_create('div')
:addClass('etytree NavFrame')
:attr('data-etytree-height', final_height)
:attr('data-etytree-width', final_width)
:tag('div')
:addClass('NavHead')
:tag('div')
:wikitext('Dara etîmolojiyê')
:done()
:done()
:tag('div')
:addClass('NavContent')
:node(container)
:done())
end
return export
1o0dfpodiydpoylwbnjvcamsapwx2o8
6532036
6532034
2026-09-18T16:10:40Z
Wikihez
7344
sync test copy
6532036
Scribunto
text/plain
local export = {}
local html_create = mw.html.create
local max = math.max
--[==[
The language label on a tree node: a link to the language's category with the first letter
capitalised, the way Modul:etymon kevn rendered it. Families and anything without a category
fall back to the plain canonical name.
]==]
local function language_label(lang)
if lang and lang.makeCategoryLink then
local ok, link = pcall(lang.makeCategoryLink, lang)
if ok and link and link ~= "" then
return link
end
end
local name = lang and lang:getCanonicalName() or ""
return mw.ustring.upper(mw.ustring.sub(name, 1, 1)) .. mw.ustring.sub(name, 2)
end
local function create_vertical_connector()
return html_create('span'):addClass('etytree-connector-vertical')
end
local function create_abbr(text, title, glossary)
local abbr = html_create('abbr')
:attr('title', title)
:wikitext(text)
if glossary then
-- Like Modul:etymon/data: a bare anchor sits on the glossary page, "Rûpel#lenger" is a full target.
local page, anchor = glossary:match("^(.-)#(.+)$")
if not page then
page, anchor = "Nimînok:Ferhengok", glossary
end
abbr = '[[' .. page .. '#' .. anchor:gsub(" ", "_") .. '|' .. tostring(abbr) .. ']]'
end
return html_create('span'):addClass('etytree-label'):node(abbr)
end
local function create_uncertainty_marker()
return html_create('abbr')
:addClass('etytree-unc')
:attr('title', 'nediyar')
:wikitext('?')
end
local function create_label_container()
return html_create('span'):addClass('etytree-label-container')
end
local function invisible_in_tree(inv)
return inv == "all" or inv == true or inv == "tree"
end
local function render_label(term_block, keyword_info, keyword_modifiers, is_uncertain, is_group_child, term_labels)
-- Skip label when invisible in tree
local has_label = keyword_info and keyword_info.abbrev and not is_group_child and not invisible_in_tree(keyword_info.invisible)
-- For group children, keyword uncertainty is shown on the group label, not on individual terms
local keyword_uncertain = keyword_modifiers and keyword_modifiers.unc and not is_group_child
local show_term_uncertainty = is_uncertain
-- Check if we have term-specific labels
local has_term_labels = term_labels and #term_labels > 0
if not has_label and not show_term_uncertainty and not keyword_uncertain and not has_term_labels then
return
end
local label_span = create_label_container()
if has_label then
local glossary_title = keyword_info.glossary
and keyword_info.glossary:gsub("_", " ")
or keyword_info.abbrev
label_span:node(create_abbr(
keyword_info.abbrev,
glossary_title,
keyword_info.glossary
))
-- Show uncertainty marker if term or keyword is uncertain
if show_term_uncertainty or keyword_uncertain then
label_span:node(create_uncertainty_marker())
end
else
-- No label, but term or keyword is uncertain
if show_term_uncertainty or keyword_uncertain then
label_span:node(create_uncertainty_marker())
end
end
-- Add term-specific labels
if has_term_labels then
for _, label_info in ipairs(term_labels) do
label_span:node(create_abbr(label_info.abbrev, label_info.title, label_info.glossary))
end
end
term_block:node(label_span)
end
local function render_term_block(node_data, format_term_func, is_toplevel)
local link_content = html_create()
link_content
:tag('span')
:addClass('etyl')
:wikitext(language_label(node_data.lang))
:done()
local term_text, gloss = format_term_func(node_data, is_toplevel)
if term_text then
link_content
:wikitext('<br>')
:tag('span')
:addClass('etytree-term')
:wikitext(term_text)
:done()
end
-- The meaning goes on its own line, smaller and in italics, instead of in (“...”) brackets.
if gloss then
link_content
:wikitext('<br>')
:tag('span')
:addClass('etytree-gloss')
:wikitext(gloss)
:done()
end
local block = html_create('div'):addClass('etytree-block'):node(link_content)
-- Reconstructed languages get their own tint, so an unattested step is obvious at a glance.
local lang = node_data.lang
if lang and lang.hasType then
local ok, is_recon = pcall(lang.hasType, lang, "reconstructed")
if ok and is_recon then
block:addClass('etytree-reconstructed')
end
end
-- Add duplicate styling if this is a duplicate node
if node_data.is_duplicate then
block:addClass('etytree-duplicate')
end
return block
end
local function create_dotted_connector()
return html_create('span'):addClass('etytree-connector-dotted')
end
-- Create an L-shaped connector for nodes with hidden ancestry (duplicate or no_child_categories)
local function create_duplicate_connector()
local container = html_create('div'):addClass('etytree-duplicate-connector')
local inner_wrapper = container:tag('div')
inner_wrapper:tag('span'):addClass('etytree-dup-right')
inner_wrapper:tag('span'):addClass('etytree-dup-horiz')
inner_wrapper:tag('span'):addClass('etytree-dup-left')
inner_wrapper:tag('span'):addClass('etytree-dup-arrow'):wikitext('▲')
return container
end
local function render_group_label(connecting_line, keyword_info, keyword_modifiers)
local has_abbrev = keyword_info and keyword_info.abbrev
local keyword_uncertain = keyword_modifiers and keyword_modifiers.unc
-- Nothing to show if no abbrev and no uncertainty
if not has_abbrev and not keyword_uncertain then
return
end
local label_span = connecting_line:tag('span'):addClass('etytree-group-label')
if has_abbrev then
local glossary_title = keyword_info.glossary
and keyword_info.glossary:gsub("_", " ")
or keyword_info.abbrev
label_span:node(create_abbr(keyword_info.abbrev, glossary_title, nil))
end
-- Add uncertainty marker if keyword has <unc> modifier
if keyword_uncertain then
label_span:node(create_uncertainty_marker())
end
end
local function add_branch_connector(column, index, total)
if index == 1 then
column:tag('span'):addClass('etytree-branch-left')
elseif index == total then
column:tag('span'):addClass('etytree-branch-right')
else
column:tag('span'):addClass('etytree-connector-vertical-short')
column:tag('span'):addClass('etytree-branch-mid')
end
end
function export.render(opts)
opts = opts or {}
local data_tree = opts.data_tree
local format_term_func = opts.format_term_func
-- Forward declaration
local render_term
-- Render a container (keyword + its terms)
local function render_container(container, is_toplevel)
local keyword_info = container.keyword_info
local keyword_modifiers = container.keyword_modifiers or {}
local is_group = keyword_info and keyword_info.is_group
local terms = container.terms or {}
-- Skip container entirely only when invisible = "all" (or true)
if keyword_info and invisible_in_tree(keyword_info.invisible) then
return nil, 0, 0
end
if #terms == 0 then
return nil, 0, 0
end
-- For no_child_categories keywords (calque, semantic loan, etc.), don't render term's children
local skip_child_rendering = keyword_info and keyword_info.no_child_categories
-- Render each term in the container
local rendered_terms = {}
local container_height = 0
local container_width = 0
for _, term in ipairs(terms) do
-- Collect term-specific labels
local term_labels = {}
if term.bor then
table.insert(term_labels, { abbrev = "bor.", title = "borrowed", glossary = "loanword" })
end
if term.slbor then
table.insert(term_labels, { abbrev = "slbor.", title = "semi-learned borrowing", glossary = "semi-learned_borrowing" })
end
if term.lbor then
table.insert(term_labels, { abbrev = "lbor.", title = "learned borrowing", glossary = "learned_borrowing" })
end
local term_tree, term_height, term_width = render_term(term, keyword_info, keyword_modifiers, is_group, false, skip_child_rendering, term_labels)
table.insert(rendered_terms, {
tree = term_tree,
height = term_height,
width = term_width,
is_uncertain = term.is_uncertain,
})
container_height = max(container_height, term_height)
container_width = container_width + term_width
end
local rendered_html
local has_connector = false
if #rendered_terms == 1 then
-- Single term: just return it directly
rendered_html = rendered_terms[1].tree
container_height = rendered_terms[1].height
container_width = rendered_terms[1].width
else
-- Multiple terms: group them together
local subtree_container = html_create('div'):addClass('etytree-branch-group')
for i, term_data in ipairs(rendered_terms) do
local column = html_create('div'):addClass('etytree-branch')
column:node(term_data.tree)
add_branch_connector(column, i, #rendered_terms)
subtree_container:node(column)
end
local connecting_line = create_vertical_connector()
-- Add group label for group keywords
if is_group and not invisible_in_tree(keyword_info.invisible) then
render_group_label(connecting_line, keyword_info, keyword_modifiers)
end
rendered_html = html_create()
:node(subtree_container)
:node(connecting_line)
has_connector = true
end
return rendered_html, container_height, container_width, has_connector
end
-- Render a term node
render_term = function(term_node, keyword_info, keyword_modifiers, is_group_child, is_toplevel_term, skip_child_rendering, term_labels)
local tree_width, tree_height = 0, 0
local subtrees = {}
-- Process term's children (which are containers)
local has_hidden_children = false
if not term_node.is_duplicate and not skip_child_rendering then
for _, container in ipairs(term_node.children or {}) do
local subtree, sub_height, sub_width, subtree_has_connector = render_container(container, is_toplevel_term)
if subtree then
table.insert(subtrees, {
tree = subtree,
height = sub_height,
width = sub_width,
has_connector = subtree_has_connector,
})
tree_height = max(tree_height, sub_height)
tree_width = tree_width + sub_width
end
end
elseif skip_child_rendering then
-- Check if there are any visible children
-- When stop_recursion is true, children aren't parsed, but has_visible_children flag is set
if term_node.has_visible_children then
has_hidden_children = true
elseif term_node.children and #term_node.children > 0 then
-- Fallback: check parsed children for visibility
for _, container in ipairs(term_node.children) do
local child_keyword_info = container.keyword_info
if not (child_keyword_info and (child_keyword_info.invisible == "all" or child_keyword_info.invisible == true)) then
has_hidden_children = true
break
end
end
end
end
local is_toplevel_node = (keyword_info == nil)
local term_block = render_term_block(term_node, format_term_func, is_toplevel_node)
render_label(term_block, keyword_info, keyword_modifiers, term_node.is_uncertain, is_group_child, term_labels or {})
local term_html = html_create()
if #subtrees == 0 then
local show_connector = (term_node.is_duplicate and term_node.original_has_children) or has_hidden_children
if show_connector then
term_html:node(create_duplicate_connector())
end
term_html:node(term_block)
tree_width = tree_width + 1
elseif #subtrees == 1 then
term_html:node(subtrees[1].tree)
if not subtrees[1].has_connector then
term_html:node(create_vertical_connector())
end
term_html:node(term_block)
else
-- Multiple containers: need to merge them
local subtree_container = html_create('div'):addClass('etytree-branch-group')
for i, subtree_data in ipairs(subtrees) do
local column = html_create('div'):addClass('etytree-branch')
column:node(subtree_data.tree)
add_branch_connector(column, i, #subtrees)
subtree_container:node(column)
end
local connecting_line = create_vertical_connector()
term_html
:node(subtree_container)
:node(connecting_line)
:node(term_block)
end
return term_html, tree_height + 1, tree_width
end
local final_tree, final_height, final_width = render_term(data_tree, nil, nil, false, true)
local container = html_create('div')
:addClass('etytree-body')
:node(final_tree)
return tostring(html_create('div')
:addClass('etytree NavFrame')
:attr('data-etytree-height', final_height)
:attr('data-etytree-width', final_width)
:tag('div')
:addClass('NavHead')
:tag('div')
:wikitext('Dara etîmolojiyê')
:done()
:done()
:tag('div')
:addClass('NavContent')
:node(container)
:done())
end
return export
g28ydu0v7itj59qfvz5j478j5n9s9qj
Modul:etymon/text/ceribandin
828
1359186
6532029
6433856
2026-09-18T15:52:59Z
Wikihez
7344
sync test copy
6532029
Scribunto
text/plain
local export = {}
local loader = require("Module:module loader")
local M = loader.init({
require = {
en_utilities = "Module:en-utilities",
references = "Module:references",
senseno = "Module:senseno",
},
loadData = {
data = "Module:etymon/data/ceribandin",
},
})
function export.render(opts)
opts = opts or {}
local data_tree = opts.data_tree
local format_term_func = opts.format_term_func
local max_depth = opts.max_depth
local stop_at_blue_link = opts.stop_at_blue_link
local curr_page = opts.curr_page
local nodot = opts.nodot and opts.nodot ~= "" and opts.nodot ~= "0"
local function explicit_dot_override()
if opts.dot == nil or opts.dot == false then
return nil
end
local d = mw.text.trim(tostring(opts.dot))
if d == "" or d == "." then
return nil
end
return d
end
local dot_override = explicit_dot_override()
local function find_deepest_last_part(tree)
if not tree or not tree.container_parts or #tree.container_parts == 0 then
return nil
end
local last_part = tree.container_parts[#tree.container_parts]
if last_part.continuation then
return find_deepest_last_part(last_part.continuation)
end
return last_part
end
local function apply_final_punctuation_override(tree, punct)
if not tree or punct == nil then
return
end
local last_part = find_deepest_last_part(tree)
if last_part then
last_part.punctuation = punct
end
end
local function apply_closing_punctuation_override(tree, is_last_segment)
if not is_last_segment then
return
end
local punct
if nodot then
punct = ""
elseif dot_override ~= nil then
punct = dot_override
else
return
end
apply_final_punctuation_override(tree, punct)
end
local function has_supplements()
return data_tree.supplements and #data_tree.supplements > 0
end
local stop_at_lang = opts.stop_at_lang
local stop_at_lang_or_bluelink = opts.stop_at_lang_or_bluelink
local lang_matches_stop_code = opts.lang_matches_stop_code
local stop_lang_reached = false
local function term_matches_stop_code(term_lang, stop_code)
if lang_matches_stop_code then
return lang_matches_stop_code(term_lang, stop_code)
end
return term_lang and term_lang:getCode() == stop_code
end
local children = data_tree.children
local function has_text_supplements()
if not data_tree.supplements then
return false
end
for _, supplement in ipairs(data_tree.supplements) do
if supplement.type == "doublet" and supplement.terms and #supplement.terms > 0 then
return true
end
if supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then
return true
end
end
return false
end
if (not children or #children == 0) and not has_text_supplements() then
if stop_at_lang then
return "", { stop_lang_reached = false }
end
return ""
end
local top_l2 = data_tree.lang:getFullCode() .. ":" .. curr_page
local entry_lang = data_tree.lang
local function lowercase_glossary_link_display(wikitext)
return wikitext:gsub("(%[%[Appendix:Glossary#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest)
return prefix .. mw.ustring.lower(first) .. rest .. "]]"
end)
end
local function format_sl_senseid_intro(senseid, keyword_text, keyword_phrase, capitalize_senseno, is_uncertain)
local senseids = mw.text.split(senseid, "!!", true)
local senseno_parts = {}
for i, id in ipairs(senseids) do
id = mw.text.trim(id)
if id ~= "" then
table.insert(senseno_parts, M.senseno.link_text(entry_lang:getCode(), { id }, {
title = curr_page,
uc = (i == 1 and capitalize_senseno) or nil,
}))
end
end
if #senseno_parts == 0 then
return keyword_text, keyword_phrase
end
local senseno_text = mw.text.listToText(senseno_parts)
local glossary_link = (keyword_text or ""):gsub(" from$", "")
local glossary_lower = lowercase_glossary_link_display(glossary_link)
if #senseno_parts > 1 then
local plural_link = glossary_lower:gsub("|semantic loan%]%]", "|semantic loans]]")
if is_uncertain then
return senseno_text .. " are possibly " .. plural_link .. " from",
senseno_text .. " are possibly semantic loans from"
end
return senseno_text .. " are " .. plural_link .. " from",
senseno_text .. " are semantic loans from"
end
if is_uncertain then
return senseno_text .. " is possibly a " .. glossary_lower .. " from",
senseno_text .. " is possibly a semantic loan from"
end
return senseno_text .. " is a " .. glossary_lower .. " from",
senseno_text .. " is a semantic loan from"
end
-- Get refs for a term
local function get_term_refs(term, term_lang, depth)
local term_l2 = term_lang:getFullCode() .. ":" .. curr_page
if term.parsed_ref and (depth == 1 or term_l2 == top_l2) then
return M.references.format_references(term.parsed_ref)
end
return ""
end
-- Build a text part for a single term
local function build_term_part(term, current_lang, depth)
local text = ""
local new_lang = current_lang
local lang_changed = term.lang:getCanonicalName() ~= current_lang:getCanonicalName()
-- Use centralized format_term (handles suppress_term, unknown_term, and regular terms)
local term_text = format_term_func(term)
if lang_changed then
new_lang = term.lang
if term_text then
text = term.lang:makeWikipediaLink() .. " " .. term_text
elseif term.is_family then
text = "zimanên " .. term.lang:makeWikipediaLink()
else
-- suppress_term with language change: show only language
text = term.lang:makeWikipediaLink()
end
else
text = term_text or ""
end
return {
type = "term",
text = text,
refs = get_term_refs(term, new_lang, depth),
lang = new_lang,
is_uncertain = term.is_uncertain or false,
}
end
-- Build text parts for a container
local function build_container_part(container, node, depth, allow_continuation, fallback_to_bluelink)
local keyword_info = container.keyword_info
local keyword_modifiers = container.keyword_modifiers or {}
local terms = container.terms or {}
if not keyword_info or #terms == 0 then
return nil
end
-- Skip building text part when invisible in text ("all", "text", or true)
local inv = keyword_info.invisible
if inv == "all" or inv == true or inv == "text" then
return nil
end
local is_group = keyword_info.is_group
local keyword_uncertain = keyword_modifiers.unc or false
-- Determine text and phrase (allowing for overrides)
local intro_text = keyword_info.text
local phrase = keyword_info.phrase
local new_sentence = keyword_info.new_sentence or false
if keyword_modifiers.text then
-- User-provided override: assumed to be lowercase
phrase = keyword_modifiers.text
-- Auto-capitalize for intro text (e.g., "derived from" -> "Derived from")
intro_text = mw.ustring.upper(phrase:sub(1, 1)) .. phrase:sub(2)
end
-- Get keyword references
local keyword_refs = ""
if keyword_modifiers.ref then
local parsed_keyword_refs = M.references.parse_references(keyword_modifiers.ref)
if parsed_keyword_refs and parsed_keyword_refs ~= "" then
keyword_refs = M.references.format_references(parsed_keyword_refs)
end
end
-- Build term parts
local term_parts = {}
local current_lang = node.lang
for _, term in ipairs(terms) do
local term_part = build_term_part(term, current_lang, depth)
if term_part.text ~= "" then
table.insert(term_parts, term_part)
current_lang = term_part.lang
end
end
-- Check uncertainty distribution
local uncertain_count = 0
for _, term_part in ipairs(term_parts) do
if term_part.is_uncertain then
uncertain_count = uncertain_count + 1
end
end
-- If keyword itself is uncertain, treat all terms as uncertain
local all_uncertain = keyword_uncertain or (uncertain_count == #term_parts and #term_parts > 0)
if is_group and uncertain_count > 0 then
all_uncertain = true
end
local has_mixed_uncertainty = not all_uncertain and uncertain_count > 0
-- Check if there are more steps (only if continuation is allowed)
local has_more_steps = false
local next_node = nil
local first_term = terms[1]
-- Check if we should stop at this language
local reached_stop_lang = false
if stop_at_lang then
for _, term in ipairs(terms) do
if term.lang and term_matches_stop_code(term.lang, stop_at_lang) then
reached_stop_lang = true
stop_lang_reached = true
break
end
end
elseif stop_at_lang_or_bluelink then
-- Check if we should stop at this language, or at the first bluelink if it's a redlink
for _, term in ipairs(terms) do
if term.lang and term_matches_stop_code(term.lang, stop_at_lang_or_bluelink) then
if first_term.status == M.data.STATUS.OK then
reached_stop_lang = true
else
fallback_to_bluelink = true
end
break
end
end
if fallback_to_bluelink and first_term.status == M.data.STATUS.OK then
reached_stop_lang = true
end
end
if allow_continuation and not is_group and #terms == 1 and not reached_stop_lang then
local first_term_children = first_term.children
if first_term_children and #first_term_children > 0 and (not max_depth or depth < max_depth) then
local next_container = first_term_children[1]
local next_keyword_info = next_container and next_container.keyword_info
if not (next_keyword_info and next_keyword_info.invisible) then
if stop_at_blue_link then
if first_term.status ~= M.data.STATUS.OK then
has_more_steps = true
next_node = first_term
end
else
has_more_steps = true
next_node = first_term
end
end
end
end
return {
type = "container",
intro_text = intro_text,
phrase = phrase,
senseid = keyword_modifiers.senseid,
sl_keyword_text = keyword_modifiers.senseid and keyword_info.text or nil,
is_uncertain = all_uncertain,
has_mixed_uncertainty = has_mixed_uncertainty,
term_parts = term_parts,
is_group = is_group,
has_more_steps = has_more_steps,
next_node = next_node,
new_sentence = new_sentence,
separate_clause = keyword_info.separate_clause or false,
conj = keyword_modifiers.conj or keyword_info.default_conj, -- custom conjunction: "and", "or", "and/or", etc.
lit = keyword_modifiers.lit,
keyword_refs = keyword_refs,
fallback_to_bluelink = fallback_to_bluelink,
}
end
-- Build the full tree of text parts
local function build_text_tree(node, depth, allow_continuation, fallback_to_bluelink)
local containers = node.children
if not containers or #containers == 0 then
return nil
end
local container_parts = {}
-- Count containers that get a text part (invisible in text = "all", "text", or true)
local visible_container_count = 0
for _, container in ipairs(containers) do
local keyword_info = container.keyword_info
local inv = keyword_info and keyword_info.invisible
if not (inv == "all" or inv == true or inv == "text") then
visible_container_count = visible_container_count + 1
end
end
-- If there are multiple visible containers at this level, don't allow continuation for any
local has_multiple_containers = visible_container_count > 1
local should_allow_continuation = allow_continuation and not has_multiple_containers
for _, container in ipairs(containers) do
local part = build_container_part(container, node, depth, should_allow_continuation, fallback_to_bluelink)
if part then
-- Recursively build children if there are more steps
if part.has_more_steps and part.next_node then
part.continuation = build_text_tree(part.next_node, depth + 1, true, part.fallback_to_bluelink)
end
table.insert(container_parts, part)
end
end
if #container_parts == 0 then
return nil
end
return {
type = "tree",
container_parts = container_parts,
depth = depth,
}
end
-- Check if tree has mixed joining types
local function container_join_kind(part)
if part.type == "etydate" then
return nil
end
if part.new_sentence or part.separate_clause then
return "supplement"
end
return "or_join"
end
local function check_complexity(tree)
if not tree then return nil end
local parts = tree.container_parts
if #parts <= 1 then
-- Single container
if parts[1] and parts[1].continuation then
return check_complexity(parts[1].continuation)
end
return nil
end
-- Or-join containers must precede any supplemental (calque-like / influence) containers.
local seen_supplement = false
for _, part in ipairs(parts) do
local kind = container_join_kind(part)
if kind == "supplement" then
seen_supplement = true
elseif kind == "or_join" and seen_supplement then
error(
"Cannot generate etymology text: a main derivation step cannot follow a calque, semantic loan, or influence clause in the same list.")
end
end
for _, part in ipairs(parts) do
if part.continuation then
check_complexity(part.continuation)
end
end
return nil
end
-- Analyze tree and assign punctuation
local function analyze_punctuation(tree, is_toplevel)
if not tree then return end
local parts = tree.container_parts
local num_parts = #parts
for i, part in ipairs(parts) do
local is_first = (i == 1)
local is_last = (i == num_parts)
local next_part = parts[i + 1]
-- Analyze term punctuation within container
if part.term_parts then
-- Terms use Oxford comma style: "A, B, yan jî C"
-- Custom conjunction can be specified via conj modifier (e.g., "and/or", "and")
local num_terms = #part.term_parts
local term_conj = part.conj or "yan jî" -- Kurdish default
for j, term_part in ipairs(part.term_parts) do
local is_last_term = (j == num_terms)
if part.is_group then
-- Group: terms joined with " + "
term_part.joiner = is_last_term and "" or " + "
elseif num_terms > 1 then
-- Multiple terms not in a group: Oxford comma style
if is_last_term then
term_part.joiner = ""
elseif j == num_terms - 1 then
-- Second to last term
if num_terms == 2 then
term_part.joiner = " " .. term_conj .. " "
else
term_part.joiner = ", " .. term_conj .. " "
end
else
term_part.joiner = ", "
end
else
-- Single term
term_part.joiner = ""
end
end
end
-- Determine container punctuation based on what comes next
if part.continuation then
-- Has continuation
part.punctuation = ","
-- Recursively analyze continuation
analyze_punctuation(part.continuation, false)
elseif is_last then
-- Last container at this level (may still continue in part.continuation)
part.punctuation = "."
elseif next_part and next_part.new_sentence then
-- Next container starts a new sentence
part.punctuation = "."
elseif next_part and next_part.separate_clause then
-- Next container is a separate clause
part.punctuation = ","
else
-- Not last, next is joined with the conjunction
-- Containers use repeated conjunction style: "A, yan jî B, yan jî C"
part.punctuation = ","
end
-- Determine joiner to next part
-- Containers use the repeated conjunction between each
-- Custom conjunction can be specified via conj modifier
local container_conj = part.conj or "yan jî" -- Kurdish default
if not is_last then
if next_part and next_part.new_sentence then
-- New sentence
part.joiner = " "
elseif next_part and next_part.separate_clause then
-- Separate clause
part.joiner = " "
else
-- Same sentence: use the custom conjunction, else the default
part.joiner = " " .. container_conj .. " "
end
else
part.joiner = ""
end
-- Determine intro formatting
-- Capitalize if first at top level, OR if this container starts a new sentence
if (is_first and is_toplevel) or part.new_sentence then
part.intro_capitalized = true
part.use_full_intro = true
else
part.intro_capitalized = false
part.use_full_intro = false
end
end
end
-- Assemble text from analyzed tree
local function assemble_text(tree)
if not tree then return "" end
local result = ""
for i, part in ipairs(tree.container_parts) do
if part.type == "etydate" then
result = result .. part.etydate_text
if part.punctuation and part.punctuation ~= "" then
result = result .. part.punctuation
end
if part.etydate_refs and next(part.etydate_refs) then
result = result .. M.references.format_references(part.etydate_refs)
end
if part.joiner and part.joiner ~= "" then
result = result .. part.joiner
end
else
-- Build intro
local intro_text = part.intro_text
local phrase = part.phrase
if part.senseid then
intro_text, phrase = format_sl_senseid_intro(
part.senseid,
part.sl_keyword_text,
part.phrase,
part.intro_capitalized,
part.is_uncertain
)
end
local intro
if part.use_full_intro then
if part.is_uncertain and not part.senseid then
intro = "Mihtemelen " .. phrase
else
intro = intro_text
end
else
if part.is_uncertain and not part.senseid then
intro = "mihtemelen " .. phrase
else
intro = phrase
end
end
result = result .. intro
-- Build terms
if #part.term_parts > 0 then
result = result .. " "
for j, term_part in ipairs(part.term_parts) do
-- Add "possibly" prefix for uncertain terms when there's mixed uncertainty
if part.has_mixed_uncertainty and term_part.is_uncertain then
result = result .. "mihtemelen "
end
result = result .. term_part.text
-- Add joiner between terms
if term_part.joiner ~= "" then
-- Check if joiner contains comma (punctuation)
local comma_pos = term_part.joiner:find(",")
if comma_pos then
-- Add up to and including comma
result = result .. term_part.joiner:sub(1, comma_pos)
-- Add refs after comma
if term_part.refs ~= "" then
result = result .. term_part.refs
end
-- Add rest of joiner
result = result .. term_part.joiner:sub(comma_pos + 1)
else
-- No comma, add refs before joiner
if term_part.refs ~= "" then
result = result .. term_part.refs
end
result = result .. term_part.joiner
end
end
end
-- For the last term, add punctuation then refs
local last_term = part.term_parts[#part.term_parts]
if last_term and last_term.joiner == "" then
if part.punctuation ~= "" then
-- If we have literal text, punctuation goes AFTER it
if part.lit then
-- Add refs first (attached to term)
if last_term.refs ~= "" then
result = result .. last_term.refs
end
-- Add keyword refs
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
-- Add literal text
result = result .. ", literally “" .. part.lit .. "”"
-- Add punctuation
result = result .. part.punctuation
else
-- Normal behavior: punctuation then refs
result = result .. part.punctuation
if last_term.refs ~= "" then
result = result .. last_term.refs
end
-- Add keyword refs after term refs
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
end
else
-- No punctuation
if last_term.refs ~= "" then
result = result .. last_term.refs
end
-- Add keyword refs
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
-- Add literal text if present (even without punctuation)
if part.lit then
result = result .. ", literally “" .. part.lit .. "”"
end
end
end
else
-- No terms, just add punctuation and keyword refs
if part.punctuation ~= "" then
result = result .. part.punctuation
end
-- Add keyword refs even when there are no terms
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
end
-- Add continuation
if part.continuation then
result = result .. " " .. assemble_text(part.continuation)
end
-- Add joiner to next container
if part.joiner ~= "" then
result = result .. part.joiner
end
end
end
return result
end
local text_tree = build_text_tree(data_tree, 1, true, false)
-- Supplements (doublets, etydate, …) are rendered outside the main derivation text tree.
local function assemble_supplements()
if not data_tree.supplements then
return ""
end
local chunks = {}
local pending_trees = {}
local function flush_pending_trees()
local num = #pending_trees
for i, supplement_tree in ipairs(pending_trees) do
analyze_punctuation(supplement_tree, true)
apply_closing_punctuation_override(supplement_tree, i == num)
local chunk = assemble_text(supplement_tree)
if chunk ~= "" then
table.insert(chunks, chunk)
end
end
pending_trees = {}
end
for _, supplement in ipairs(data_tree.supplements) do
local supplement_tree
if supplement.type == "doublet" and supplement.config
and supplement.terms and #supplement.terms > 0 then
local config = supplement.config
local term_parts = {}
for _, term in ipairs(supplement.terms) do
local term_part = build_term_part(term, entry_lang, 1)
if term_part.text ~= "" then
table.insert(term_parts, term_part)
end
end
if #term_parts == 0 then
supplement_tree = nil
else
supplement_tree = {
type = "tree",
container_parts = {
{
type = "doublet",
intro_text = config.text,
phrase = config.phrase,
term_parts = term_parts,
conj = config.default_conj or "û",
new_sentence = true,
},
},
depth = 1,
}
end
elseif supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then
supplement_tree = {
type = "tree",
container_parts = {
{
type = "etydate",
etydate_text = supplement.etydate_text,
etydate_refs = supplement.etydate_refs,
new_sentence = true,
},
},
depth = 1,
}
end
if supplement_tree then
table.insert(pending_trees, supplement_tree)
end
end
flush_pending_trees()
return table.concat(chunks, " ")
end
if not text_tree then
local supplement_text = assemble_supplements()
if supplement_text == "" then
if stop_at_lang then
return "", { stop_lang_reached = false }
end
return ""
end
if stop_at_lang then
return supplement_text, { stop_lang_reached = false }
end
return supplement_text
end
local rendered = ""
if text_tree then
check_complexity(text_tree)
analyze_punctuation(text_tree, true)
apply_closing_punctuation_override(text_tree, not has_supplements())
rendered = assemble_text(text_tree)
end
local supplement_text = assemble_supplements()
if supplement_text ~= "" then
if rendered ~= "" then
rendered = rendered .. " " .. supplement_text
else
rendered = supplement_text
end
end
if stop_at_lang then
return rendered, { stop_lang_reached = stop_lang_reached }
end
return rendered
end
return export
kpz9x75q6ggymvy0y2d3vm1ehr523q0
6532030
6532029
2026-09-18T15:59:41Z
Wikihez
7344
sync test copy
6532030
Scribunto
text/plain
local export = {}
local loader = require("Module:module loader")
local M = loader.init({
require = {
en_utilities = "Module:en-utilities",
references = "Module:references",
senseno = "Module:senseno",
},
loadData = {
data = "Module:etymon/data/ceribandin",
},
})
function export.render(opts)
opts = opts or {}
local data_tree = opts.data_tree
local format_term_func = opts.format_term_func
local max_depth = opts.max_depth
local stop_at_blue_link = opts.stop_at_blue_link
local curr_page = opts.curr_page
local nodot = opts.nodot and opts.nodot ~= "" and opts.nodot ~= "0"
local function explicit_dot_override()
if opts.dot == nil or opts.dot == false then
return nil
end
local d = mw.text.trim(tostring(opts.dot))
if d == "" or d == "." then
return nil
end
return d
end
local dot_override = explicit_dot_override()
local function find_deepest_last_part(tree)
if not tree or not tree.container_parts or #tree.container_parts == 0 then
return nil
end
local last_part = tree.container_parts[#tree.container_parts]
if last_part.continuation then
return find_deepest_last_part(last_part.continuation)
end
return last_part
end
local function apply_final_punctuation_override(tree, punct)
if not tree or punct == nil then
return
end
local last_part = find_deepest_last_part(tree)
if last_part then
last_part.punctuation = punct
end
end
local function apply_closing_punctuation_override(tree, is_last_segment)
if not is_last_segment then
return
end
local punct
if nodot then
punct = ""
elseif dot_override ~= nil then
punct = dot_override
else
return
end
apply_final_punctuation_override(tree, punct)
end
local function has_supplements()
return data_tree.supplements and #data_tree.supplements > 0
end
local stop_at_lang = opts.stop_at_lang
local stop_at_lang_or_bluelink = opts.stop_at_lang_or_bluelink
local lang_matches_stop_code = opts.lang_matches_stop_code
local stop_lang_reached = false
local function term_matches_stop_code(term_lang, stop_code)
if lang_matches_stop_code then
return lang_matches_stop_code(term_lang, stop_code)
end
return term_lang and term_lang:getCode() == stop_code
end
local children = data_tree.children
local function has_text_supplements()
if not data_tree.supplements then
return false
end
for _, supplement in ipairs(data_tree.supplements) do
if supplement.type == "doublet" and supplement.terms and #supplement.terms > 0 then
return true
end
if supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then
return true
end
end
return false
end
if (not children or #children == 0) and not has_text_supplements() then
if stop_at_lang then
return "", { stop_lang_reached = false }
end
return ""
end
local top_l2 = data_tree.lang:getFullCode() .. ":" .. curr_page
local entry_lang = data_tree.lang
local function lowercase_glossary_link_display(wikitext)
return wikitext:gsub("(%[%[Appendix:Glossary#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest)
return prefix .. mw.ustring.lower(first) .. rest .. "]]"
end)
end
local function format_sl_senseid_intro(senseid, keyword_text, keyword_phrase, capitalize_senseno, is_uncertain)
local senseids = mw.text.split(senseid, "!!", true)
local senseno_parts = {}
for i, id in ipairs(senseids) do
id = mw.text.trim(id)
if id ~= "" then
table.insert(senseno_parts, M.senseno.link_text(entry_lang:getCode(), { id }, {
title = curr_page,
uc = (i == 1 and capitalize_senseno) or nil,
}))
end
end
if #senseno_parts == 0 then
return keyword_text, keyword_phrase
end
local senseno_text = mw.text.listToText(senseno_parts)
local glossary_link = (keyword_text or ""):gsub(" from$", "")
local glossary_lower = lowercase_glossary_link_display(glossary_link)
if #senseno_parts > 1 then
local plural_link = glossary_lower:gsub("|semantic loan%]%]", "|semantic loans]]")
if is_uncertain then
return senseno_text .. " are possibly " .. plural_link .. " from",
senseno_text .. " are possibly semantic loans from"
end
return senseno_text .. " are " .. plural_link .. " from",
senseno_text .. " are semantic loans from"
end
if is_uncertain then
return senseno_text .. " is possibly a " .. glossary_lower .. " from",
senseno_text .. " is possibly a semantic loan from"
end
return senseno_text .. " is a " .. glossary_lower .. " from",
senseno_text .. " is a semantic loan from"
end
-- Get refs for a term
local function get_term_refs(term, term_lang, depth)
local term_l2 = term_lang:getFullCode() .. ":" .. curr_page
if term.parsed_ref and (depth == 1 or term_l2 == top_l2) then
return M.references.format_references(term.parsed_ref)
end
return ""
end
-- Build a text part for a single term
local function build_term_part(term, current_lang, depth)
local text = ""
local new_lang = current_lang
local lang_changed = term.lang:getCanonicalName() ~= current_lang:getCanonicalName()
-- Use centralized format_term (handles suppress_term, unknown_term, and regular terms)
local term_text = format_term_func(term)
if lang_changed then
new_lang = term.lang
if term_text then
text = term.lang:makeWikipediaLink() .. " " .. term_text
elseif term.is_family then
text = term.lang:makeCategoryLink() -- a family: "zimanên îranî", linked to its category
else
-- suppress_term with language change: show only language
text = term.lang:makeWikipediaLink()
end
else
text = term_text or ""
end
return {
type = "term",
text = text,
refs = get_term_refs(term, new_lang, depth),
lang = new_lang,
is_uncertain = term.is_uncertain or false,
}
end
-- Build text parts for a container
local function build_container_part(container, node, depth, allow_continuation, fallback_to_bluelink)
local keyword_info = container.keyword_info
local keyword_modifiers = container.keyword_modifiers or {}
local terms = container.terms or {}
if not keyword_info or #terms == 0 then
return nil
end
-- Skip building text part when invisible in text ("all", "text", or true)
local inv = keyword_info.invisible
if inv == "all" or inv == true or inv == "text" then
return nil
end
local is_group = keyword_info.is_group
local keyword_uncertain = keyword_modifiers.unc or false
-- Determine text and phrase (allowing for overrides)
local intro_text = keyword_info.text
local phrase = keyword_info.phrase
local new_sentence = keyword_info.new_sentence or false
if keyword_modifiers.text then
-- User-provided override: assumed to be lowercase
phrase = keyword_modifiers.text
-- Auto-capitalize for intro text (e.g., "derived from" -> "Derived from")
intro_text = mw.ustring.upper(phrase:sub(1, 1)) .. phrase:sub(2)
end
-- Get keyword references
local keyword_refs = ""
if keyword_modifiers.ref then
local parsed_keyword_refs = M.references.parse_references(keyword_modifiers.ref)
if parsed_keyword_refs and parsed_keyword_refs ~= "" then
keyword_refs = M.references.format_references(parsed_keyword_refs)
end
end
-- Build term parts
local term_parts = {}
local current_lang = node.lang
for _, term in ipairs(terms) do
local term_part = build_term_part(term, current_lang, depth)
if term_part.text ~= "" then
table.insert(term_parts, term_part)
current_lang = term_part.lang
end
end
-- Check uncertainty distribution
local uncertain_count = 0
for _, term_part in ipairs(term_parts) do
if term_part.is_uncertain then
uncertain_count = uncertain_count + 1
end
end
-- If keyword itself is uncertain, treat all terms as uncertain
local all_uncertain = keyword_uncertain or (uncertain_count == #term_parts and #term_parts > 0)
if is_group and uncertain_count > 0 then
all_uncertain = true
end
local has_mixed_uncertainty = not all_uncertain and uncertain_count > 0
-- Check if there are more steps (only if continuation is allowed)
local has_more_steps = false
local next_node = nil
local first_term = terms[1]
-- Check if we should stop at this language
local reached_stop_lang = false
if stop_at_lang then
for _, term in ipairs(terms) do
if term.lang and term_matches_stop_code(term.lang, stop_at_lang) then
reached_stop_lang = true
stop_lang_reached = true
break
end
end
elseif stop_at_lang_or_bluelink then
-- Check if we should stop at this language, or at the first bluelink if it's a redlink
for _, term in ipairs(terms) do
if term.lang and term_matches_stop_code(term.lang, stop_at_lang_or_bluelink) then
if first_term.status == M.data.STATUS.OK then
reached_stop_lang = true
else
fallback_to_bluelink = true
end
break
end
end
if fallback_to_bluelink and first_term.status == M.data.STATUS.OK then
reached_stop_lang = true
end
end
if allow_continuation and not is_group and #terms == 1 and not reached_stop_lang then
local first_term_children = first_term.children
if first_term_children and #first_term_children > 0 and (not max_depth or depth < max_depth) then
local next_container = first_term_children[1]
local next_keyword_info = next_container and next_container.keyword_info
if not (next_keyword_info and next_keyword_info.invisible) then
if stop_at_blue_link then
if first_term.status ~= M.data.STATUS.OK then
has_more_steps = true
next_node = first_term
end
else
has_more_steps = true
next_node = first_term
end
end
end
end
return {
type = "container",
intro_text = intro_text,
phrase = phrase,
senseid = keyword_modifiers.senseid,
sl_keyword_text = keyword_modifiers.senseid and keyword_info.text or nil,
is_uncertain = all_uncertain,
has_mixed_uncertainty = has_mixed_uncertainty,
term_parts = term_parts,
is_group = is_group,
has_more_steps = has_more_steps,
next_node = next_node,
new_sentence = new_sentence,
separate_clause = keyword_info.separate_clause or false,
conj = keyword_modifiers.conj or keyword_info.default_conj, -- custom conjunction: "and", "or", "and/or", etc.
lit = keyword_modifiers.lit,
keyword_refs = keyword_refs,
fallback_to_bluelink = fallback_to_bluelink,
}
end
-- Build the full tree of text parts
local function build_text_tree(node, depth, allow_continuation, fallback_to_bluelink)
local containers = node.children
if not containers or #containers == 0 then
return nil
end
local container_parts = {}
-- Count containers that get a text part (invisible in text = "all", "text", or true)
local visible_container_count = 0
for _, container in ipairs(containers) do
local keyword_info = container.keyword_info
local inv = keyword_info and keyword_info.invisible
if not (inv == "all" or inv == true or inv == "text") then
visible_container_count = visible_container_count + 1
end
end
-- If there are multiple visible containers at this level, don't allow continuation for any
local has_multiple_containers = visible_container_count > 1
local should_allow_continuation = allow_continuation and not has_multiple_containers
for _, container in ipairs(containers) do
local part = build_container_part(container, node, depth, should_allow_continuation, fallback_to_bluelink)
if part then
-- Recursively build children if there are more steps
if part.has_more_steps and part.next_node then
part.continuation = build_text_tree(part.next_node, depth + 1, true, part.fallback_to_bluelink)
end
table.insert(container_parts, part)
end
end
if #container_parts == 0 then
return nil
end
return {
type = "tree",
container_parts = container_parts,
depth = depth,
}
end
-- Check if tree has mixed joining types
local function container_join_kind(part)
if part.type == "etydate" then
return nil
end
if part.new_sentence or part.separate_clause then
return "supplement"
end
return "or_join"
end
local function check_complexity(tree)
if not tree then return nil end
local parts = tree.container_parts
if #parts <= 1 then
-- Single container
if parts[1] and parts[1].continuation then
return check_complexity(parts[1].continuation)
end
return nil
end
-- Or-join containers must precede any supplemental (calque-like / influence) containers.
local seen_supplement = false
for _, part in ipairs(parts) do
local kind = container_join_kind(part)
if kind == "supplement" then
seen_supplement = true
elseif kind == "or_join" and seen_supplement then
error(
"Cannot generate etymology text: a main derivation step cannot follow a calque, semantic loan, or influence clause in the same list.")
end
end
for _, part in ipairs(parts) do
if part.continuation then
check_complexity(part.continuation)
end
end
return nil
end
-- Analyze tree and assign punctuation
local function analyze_punctuation(tree, is_toplevel)
if not tree then return end
local parts = tree.container_parts
local num_parts = #parts
for i, part in ipairs(parts) do
local is_first = (i == 1)
local is_last = (i == num_parts)
local next_part = parts[i + 1]
-- Analyze term punctuation within container
if part.term_parts then
-- Terms use Oxford comma style: "A, B, yan jî C"
-- Custom conjunction can be specified via conj modifier (e.g., "and/or", "and")
local num_terms = #part.term_parts
local term_conj = part.conj or "yan jî" -- Kurdish default
for j, term_part in ipairs(part.term_parts) do
local is_last_term = (j == num_terms)
if part.is_group then
-- Group: terms joined with " + "
term_part.joiner = is_last_term and "" or " + "
elseif num_terms > 1 then
-- Multiple terms not in a group: Oxford comma style
if is_last_term then
term_part.joiner = ""
elseif j == num_terms - 1 then
-- Second to last term
if num_terms == 2 then
term_part.joiner = " " .. term_conj .. " "
else
term_part.joiner = ", " .. term_conj .. " "
end
else
term_part.joiner = ", "
end
else
-- Single term
term_part.joiner = ""
end
end
end
-- Determine container punctuation based on what comes next
if part.continuation then
-- Has continuation
part.punctuation = ","
-- Recursively analyze continuation
analyze_punctuation(part.continuation, false)
elseif is_last then
-- Last container at this level (may still continue in part.continuation)
part.punctuation = "."
elseif next_part and next_part.new_sentence then
-- Next container starts a new sentence
part.punctuation = "."
elseif next_part and next_part.separate_clause then
-- Next container is a separate clause
part.punctuation = ","
else
-- Not last, next is joined with the conjunction
-- Containers use repeated conjunction style: "A, yan jî B, yan jî C"
part.punctuation = ","
end
-- Determine joiner to next part
-- Containers use the repeated conjunction between each
-- Custom conjunction can be specified via conj modifier
local container_conj = part.conj or "yan jî" -- Kurdish default
if not is_last then
if next_part and next_part.new_sentence then
-- New sentence
part.joiner = " "
elseif next_part and next_part.separate_clause then
-- Separate clause
part.joiner = " "
else
-- Same sentence: use the custom conjunction, else the default
part.joiner = " " .. container_conj .. " "
end
else
part.joiner = ""
end
-- Determine intro formatting
-- Capitalize if first at top level, OR if this container starts a new sentence
if (is_first and is_toplevel) or part.new_sentence then
part.intro_capitalized = true
part.use_full_intro = true
else
part.intro_capitalized = false
part.use_full_intro = false
end
end
end
-- Assemble text from analyzed tree
local function assemble_text(tree)
if not tree then return "" end
local result = ""
for i, part in ipairs(tree.container_parts) do
if part.type == "etydate" then
result = result .. part.etydate_text
if part.punctuation and part.punctuation ~= "" then
result = result .. part.punctuation
end
if part.etydate_refs and next(part.etydate_refs) then
result = result .. M.references.format_references(part.etydate_refs)
end
if part.joiner and part.joiner ~= "" then
result = result .. part.joiner
end
else
-- Build intro
local intro_text = part.intro_text
local phrase = part.phrase
if part.senseid then
intro_text, phrase = format_sl_senseid_intro(
part.senseid,
part.sl_keyword_text,
part.phrase,
part.intro_capitalized,
part.is_uncertain
)
end
local intro
if part.use_full_intro then
if part.is_uncertain and not part.senseid then
intro = "Mihtemelen " .. phrase
else
intro = intro_text
end
else
if part.is_uncertain and not part.senseid then
intro = "mihtemelen " .. phrase
else
intro = phrase
end
end
result = result .. intro
-- Build terms
if #part.term_parts > 0 then
result = result .. " "
for j, term_part in ipairs(part.term_parts) do
-- Add "possibly" prefix for uncertain terms when there's mixed uncertainty
if part.has_mixed_uncertainty and term_part.is_uncertain then
result = result .. "mihtemelen "
end
result = result .. term_part.text
-- Add joiner between terms
if term_part.joiner ~= "" then
-- Check if joiner contains comma (punctuation)
local comma_pos = term_part.joiner:find(",")
if comma_pos then
-- Add up to and including comma
result = result .. term_part.joiner:sub(1, comma_pos)
-- Add refs after comma
if term_part.refs ~= "" then
result = result .. term_part.refs
end
-- Add rest of joiner
result = result .. term_part.joiner:sub(comma_pos + 1)
else
-- No comma, add refs before joiner
if term_part.refs ~= "" then
result = result .. term_part.refs
end
result = result .. term_part.joiner
end
end
end
-- For the last term, add punctuation then refs
local last_term = part.term_parts[#part.term_parts]
if last_term and last_term.joiner == "" then
if part.punctuation ~= "" then
-- If we have literal text, punctuation goes AFTER it
if part.lit then
-- Add refs first (attached to term)
if last_term.refs ~= "" then
result = result .. last_term.refs
end
-- Add keyword refs
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
-- Add literal text
result = result .. ", literally “" .. part.lit .. "”"
-- Add punctuation
result = result .. part.punctuation
else
-- Normal behavior: punctuation then refs
result = result .. part.punctuation
if last_term.refs ~= "" then
result = result .. last_term.refs
end
-- Add keyword refs after term refs
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
end
else
-- No punctuation
if last_term.refs ~= "" then
result = result .. last_term.refs
end
-- Add keyword refs
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
-- Add literal text if present (even without punctuation)
if part.lit then
result = result .. ", literally “" .. part.lit .. "”"
end
end
end
else
-- No terms, just add punctuation and keyword refs
if part.punctuation ~= "" then
result = result .. part.punctuation
end
-- Add keyword refs even when there are no terms
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
end
-- Add continuation
if part.continuation then
result = result .. " " .. assemble_text(part.continuation)
end
-- Add joiner to next container
if part.joiner ~= "" then
result = result .. part.joiner
end
end
end
return result
end
local text_tree = build_text_tree(data_tree, 1, true, false)
-- Supplements (doublets, etydate, …) are rendered outside the main derivation text tree.
local function assemble_supplements()
if not data_tree.supplements then
return ""
end
local chunks = {}
local pending_trees = {}
local function flush_pending_trees()
local num = #pending_trees
for i, supplement_tree in ipairs(pending_trees) do
analyze_punctuation(supplement_tree, true)
apply_closing_punctuation_override(supplement_tree, i == num)
local chunk = assemble_text(supplement_tree)
if chunk ~= "" then
table.insert(chunks, chunk)
end
end
pending_trees = {}
end
for _, supplement in ipairs(data_tree.supplements) do
local supplement_tree
if supplement.type == "doublet" and supplement.config
and supplement.terms and #supplement.terms > 0 then
local config = supplement.config
local term_parts = {}
for _, term in ipairs(supplement.terms) do
local term_part = build_term_part(term, entry_lang, 1)
if term_part.text ~= "" then
table.insert(term_parts, term_part)
end
end
if #term_parts == 0 then
supplement_tree = nil
else
supplement_tree = {
type = "tree",
container_parts = {
{
type = "doublet",
intro_text = config.text,
phrase = config.phrase,
term_parts = term_parts,
conj = config.default_conj or "û",
new_sentence = true,
},
},
depth = 1,
}
end
elseif supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then
supplement_tree = {
type = "tree",
container_parts = {
{
type = "etydate",
etydate_text = supplement.etydate_text,
etydate_refs = supplement.etydate_refs,
new_sentence = true,
},
},
depth = 1,
}
end
if supplement_tree then
table.insert(pending_trees, supplement_tree)
end
end
flush_pending_trees()
return table.concat(chunks, " ")
end
if not text_tree then
local supplement_text = assemble_supplements()
if supplement_text == "" then
if stop_at_lang then
return "", { stop_lang_reached = false }
end
return ""
end
if stop_at_lang then
return supplement_text, { stop_lang_reached = false }
end
return supplement_text
end
local rendered = ""
if text_tree then
check_complexity(text_tree)
analyze_punctuation(text_tree, true)
apply_closing_punctuation_override(text_tree, not has_supplements())
rendered = assemble_text(text_tree)
end
local supplement_text = assemble_supplements()
if supplement_text ~= "" then
if rendered ~= "" then
rendered = rendered .. " " .. supplement_text
else
rendered = supplement_text
end
end
if stop_at_lang then
return rendered, { stop_lang_reached = stop_lang_reached }
end
return rendered
end
return export
j4rx3kii3ltjel9dccwf17ohjvji18n
6532031
6532030
2026-09-18T16:01:25Z
Wikihez
7344
sync test copy
6532031
Scribunto
text/plain
local export = {}
local loader = require("Module:module loader")
local M = loader.init({
require = {
en_utilities = "Module:en-utilities",
references = "Module:references",
senseno = "Module:senseno",
},
loadData = {
data = "Module:etymon/data/ceribandin",
},
})
function export.render(opts)
opts = opts or {}
local data_tree = opts.data_tree
local format_term_func = opts.format_term_func
local max_depth = opts.max_depth
local stop_at_blue_link = opts.stop_at_blue_link
local curr_page = opts.curr_page
local nodot = opts.nodot and opts.nodot ~= "" and opts.nodot ~= "0"
local function explicit_dot_override()
if opts.dot == nil or opts.dot == false then
return nil
end
local d = mw.text.trim(tostring(opts.dot))
if d == "" or d == "." then
return nil
end
return d
end
local dot_override = explicit_dot_override()
local function find_deepest_last_part(tree)
if not tree or not tree.container_parts or #tree.container_parts == 0 then
return nil
end
local last_part = tree.container_parts[#tree.container_parts]
if last_part.continuation then
return find_deepest_last_part(last_part.continuation)
end
return last_part
end
local function apply_final_punctuation_override(tree, punct)
if not tree or punct == nil then
return
end
local last_part = find_deepest_last_part(tree)
if last_part then
last_part.punctuation = punct
end
end
local function apply_closing_punctuation_override(tree, is_last_segment)
if not is_last_segment then
return
end
local punct
if nodot then
punct = ""
elseif dot_override ~= nil then
punct = dot_override
else
return
end
apply_final_punctuation_override(tree, punct)
end
local function has_supplements()
return data_tree.supplements and #data_tree.supplements > 0
end
local stop_at_lang = opts.stop_at_lang
local stop_at_lang_or_bluelink = opts.stop_at_lang_or_bluelink
local lang_matches_stop_code = opts.lang_matches_stop_code
local stop_lang_reached = false
local function term_matches_stop_code(term_lang, stop_code)
if lang_matches_stop_code then
return lang_matches_stop_code(term_lang, stop_code)
end
return term_lang and term_lang:getCode() == stop_code
end
local children = data_tree.children
local function has_text_supplements()
if not data_tree.supplements then
return false
end
for _, supplement in ipairs(data_tree.supplements) do
if supplement.type == "doublet" and supplement.terms and #supplement.terms > 0 then
return true
end
if supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then
return true
end
end
return false
end
if (not children or #children == 0) and not has_text_supplements() then
if stop_at_lang then
return "", { stop_lang_reached = false }
end
return ""
end
local top_l2 = data_tree.lang:getFullCode() .. ":" .. curr_page
local entry_lang = data_tree.lang
local function lowercase_glossary_link_display(wikitext)
return wikitext:gsub("(%[%[Appendix:Glossary#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest)
return prefix .. mw.ustring.lower(first) .. rest .. "]]"
end)
end
local function format_sl_senseid_intro(senseid, keyword_text, keyword_phrase, capitalize_senseno, is_uncertain)
local senseids = mw.text.split(senseid, "!!", true)
local senseno_parts = {}
for i, id in ipairs(senseids) do
id = mw.text.trim(id)
if id ~= "" then
table.insert(senseno_parts, M.senseno.link_text(entry_lang:getCode(), { id }, {
title = curr_page,
uc = (i == 1 and capitalize_senseno) or nil,
}))
end
end
if #senseno_parts == 0 then
return keyword_text, keyword_phrase
end
local senseno_text = mw.text.listToText(senseno_parts)
local glossary_link = (keyword_text or ""):gsub(" from$", "")
local glossary_lower = lowercase_glossary_link_display(glossary_link)
if #senseno_parts > 1 then
local plural_link = glossary_lower:gsub("|semantic loan%]%]", "|semantic loans]]")
if is_uncertain then
return senseno_text .. " are possibly " .. plural_link .. " from",
senseno_text .. " are possibly semantic loans from"
end
return senseno_text .. " are " .. plural_link .. " from",
senseno_text .. " are semantic loans from"
end
if is_uncertain then
return senseno_text .. " is possibly a " .. glossary_lower .. " from",
senseno_text .. " is possibly a semantic loan from"
end
return senseno_text .. " is a " .. glossary_lower .. " from",
senseno_text .. " is a semantic loan from"
end
-- Get refs for a term
local function get_term_refs(term, term_lang, depth)
local term_l2 = term_lang:getFullCode() .. ":" .. curr_page
if term.parsed_ref and (depth == 1 or term_l2 == top_l2) then
return M.references.format_references(term.parsed_ref)
end
return ""
end
-- A language name in running text: its canonical name, linked to the language's category.
-- A family keeps makeCategoryLink's own wording ("zimanên îranî").
local function lang_link(lang)
if (lang.hasType and lang:hasType("family")) or not lang.getCategoryName then
return lang:makeCategoryLink()
end
local ok, cat = pcall(lang.getCategoryName, lang)
if not ok or not cat or cat == "" then
return lang:makeWikipediaLink()
end
return "[[:Kategorî:" .. cat .. "|" .. lang:getCanonicalName() .. "]]"
end
-- Build a text part for a single term
local function build_term_part(term, current_lang, depth)
local text = ""
local new_lang = current_lang
local lang_changed = term.lang:getCanonicalName() ~= current_lang:getCanonicalName()
-- Use centralized format_term (handles suppress_term, unknown_term, and regular terms)
local term_text = format_term_func(term)
if lang_changed then
new_lang = term.lang
if term_text then
text = lang_link(term.lang) .. " " .. term_text
elseif term.is_family then
text = lang_link(term.lang) -- a family: "zimanên îranî"
else
-- suppress_term with language change: show only language
text = lang_link(term.lang)
end
else
text = term_text or ""
end
return {
type = "term",
text = text,
refs = get_term_refs(term, new_lang, depth),
lang = new_lang,
is_uncertain = term.is_uncertain or false,
}
end
-- Build text parts for a container
local function build_container_part(container, node, depth, allow_continuation, fallback_to_bluelink)
local keyword_info = container.keyword_info
local keyword_modifiers = container.keyword_modifiers or {}
local terms = container.terms or {}
if not keyword_info or #terms == 0 then
return nil
end
-- Skip building text part when invisible in text ("all", "text", or true)
local inv = keyword_info.invisible
if inv == "all" or inv == true or inv == "text" then
return nil
end
local is_group = keyword_info.is_group
local keyword_uncertain = keyword_modifiers.unc or false
-- Determine text and phrase (allowing for overrides)
local intro_text = keyword_info.text
local phrase = keyword_info.phrase
local new_sentence = keyword_info.new_sentence or false
if keyword_modifiers.text then
-- User-provided override: assumed to be lowercase
phrase = keyword_modifiers.text
-- Auto-capitalize for intro text (e.g., "derived from" -> "Derived from")
intro_text = mw.ustring.upper(phrase:sub(1, 1)) .. phrase:sub(2)
end
-- Get keyword references
local keyword_refs = ""
if keyword_modifiers.ref then
local parsed_keyword_refs = M.references.parse_references(keyword_modifiers.ref)
if parsed_keyword_refs and parsed_keyword_refs ~= "" then
keyword_refs = M.references.format_references(parsed_keyword_refs)
end
end
-- Build term parts
local term_parts = {}
local current_lang = node.lang
for _, term in ipairs(terms) do
local term_part = build_term_part(term, current_lang, depth)
if term_part.text ~= "" then
table.insert(term_parts, term_part)
current_lang = term_part.lang
end
end
-- Check uncertainty distribution
local uncertain_count = 0
for _, term_part in ipairs(term_parts) do
if term_part.is_uncertain then
uncertain_count = uncertain_count + 1
end
end
-- If keyword itself is uncertain, treat all terms as uncertain
local all_uncertain = keyword_uncertain or (uncertain_count == #term_parts and #term_parts > 0)
if is_group and uncertain_count > 0 then
all_uncertain = true
end
local has_mixed_uncertainty = not all_uncertain and uncertain_count > 0
-- Check if there are more steps (only if continuation is allowed)
local has_more_steps = false
local next_node = nil
local first_term = terms[1]
-- Check if we should stop at this language
local reached_stop_lang = false
if stop_at_lang then
for _, term in ipairs(terms) do
if term.lang and term_matches_stop_code(term.lang, stop_at_lang) then
reached_stop_lang = true
stop_lang_reached = true
break
end
end
elseif stop_at_lang_or_bluelink then
-- Check if we should stop at this language, or at the first bluelink if it's a redlink
for _, term in ipairs(terms) do
if term.lang and term_matches_stop_code(term.lang, stop_at_lang_or_bluelink) then
if first_term.status == M.data.STATUS.OK then
reached_stop_lang = true
else
fallback_to_bluelink = true
end
break
end
end
if fallback_to_bluelink and first_term.status == M.data.STATUS.OK then
reached_stop_lang = true
end
end
if allow_continuation and not is_group and #terms == 1 and not reached_stop_lang then
local first_term_children = first_term.children
if first_term_children and #first_term_children > 0 and (not max_depth or depth < max_depth) then
local next_container = first_term_children[1]
local next_keyword_info = next_container and next_container.keyword_info
if not (next_keyword_info and next_keyword_info.invisible) then
if stop_at_blue_link then
if first_term.status ~= M.data.STATUS.OK then
has_more_steps = true
next_node = first_term
end
else
has_more_steps = true
next_node = first_term
end
end
end
end
return {
type = "container",
intro_text = intro_text,
phrase = phrase,
senseid = keyword_modifiers.senseid,
sl_keyword_text = keyword_modifiers.senseid and keyword_info.text or nil,
is_uncertain = all_uncertain,
has_mixed_uncertainty = has_mixed_uncertainty,
term_parts = term_parts,
is_group = is_group,
has_more_steps = has_more_steps,
next_node = next_node,
new_sentence = new_sentence,
separate_clause = keyword_info.separate_clause or false,
conj = keyword_modifiers.conj or keyword_info.default_conj, -- custom conjunction: "and", "or", "and/or", etc.
lit = keyword_modifiers.lit,
keyword_refs = keyword_refs,
fallback_to_bluelink = fallback_to_bluelink,
}
end
-- Build the full tree of text parts
local function build_text_tree(node, depth, allow_continuation, fallback_to_bluelink)
local containers = node.children
if not containers or #containers == 0 then
return nil
end
local container_parts = {}
-- Count containers that get a text part (invisible in text = "all", "text", or true)
local visible_container_count = 0
for _, container in ipairs(containers) do
local keyword_info = container.keyword_info
local inv = keyword_info and keyword_info.invisible
if not (inv == "all" or inv == true or inv == "text") then
visible_container_count = visible_container_count + 1
end
end
-- If there are multiple visible containers at this level, don't allow continuation for any
local has_multiple_containers = visible_container_count > 1
local should_allow_continuation = allow_continuation and not has_multiple_containers
for _, container in ipairs(containers) do
local part = build_container_part(container, node, depth, should_allow_continuation, fallback_to_bluelink)
if part then
-- Recursively build children if there are more steps
if part.has_more_steps and part.next_node then
part.continuation = build_text_tree(part.next_node, depth + 1, true, part.fallback_to_bluelink)
end
table.insert(container_parts, part)
end
end
if #container_parts == 0 then
return nil
end
return {
type = "tree",
container_parts = container_parts,
depth = depth,
}
end
-- Check if tree has mixed joining types
local function container_join_kind(part)
if part.type == "etydate" then
return nil
end
if part.new_sentence or part.separate_clause then
return "supplement"
end
return "or_join"
end
local function check_complexity(tree)
if not tree then return nil end
local parts = tree.container_parts
if #parts <= 1 then
-- Single container
if parts[1] and parts[1].continuation then
return check_complexity(parts[1].continuation)
end
return nil
end
-- Or-join containers must precede any supplemental (calque-like / influence) containers.
local seen_supplement = false
for _, part in ipairs(parts) do
local kind = container_join_kind(part)
if kind == "supplement" then
seen_supplement = true
elseif kind == "or_join" and seen_supplement then
error(
"Cannot generate etymology text: a main derivation step cannot follow a calque, semantic loan, or influence clause in the same list.")
end
end
for _, part in ipairs(parts) do
if part.continuation then
check_complexity(part.continuation)
end
end
return nil
end
-- Analyze tree and assign punctuation
local function analyze_punctuation(tree, is_toplevel)
if not tree then return end
local parts = tree.container_parts
local num_parts = #parts
for i, part in ipairs(parts) do
local is_first = (i == 1)
local is_last = (i == num_parts)
local next_part = parts[i + 1]
-- Analyze term punctuation within container
if part.term_parts then
-- Terms use Oxford comma style: "A, B, yan jî C"
-- Custom conjunction can be specified via conj modifier (e.g., "and/or", "and")
local num_terms = #part.term_parts
local term_conj = part.conj or "yan jî" -- Kurdish default
for j, term_part in ipairs(part.term_parts) do
local is_last_term = (j == num_terms)
if part.is_group then
-- Group: terms joined with " + "
term_part.joiner = is_last_term and "" or " + "
elseif num_terms > 1 then
-- Multiple terms not in a group: Oxford comma style
if is_last_term then
term_part.joiner = ""
elseif j == num_terms - 1 then
-- Second to last term
if num_terms == 2 then
term_part.joiner = " " .. term_conj .. " "
else
term_part.joiner = ", " .. term_conj .. " "
end
else
term_part.joiner = ", "
end
else
-- Single term
term_part.joiner = ""
end
end
end
-- Determine container punctuation based on what comes next
if part.continuation then
-- Has continuation
part.punctuation = ","
-- Recursively analyze continuation
analyze_punctuation(part.continuation, false)
elseif is_last then
-- Last container at this level (may still continue in part.continuation)
part.punctuation = "."
elseif next_part and next_part.new_sentence then
-- Next container starts a new sentence
part.punctuation = "."
elseif next_part and next_part.separate_clause then
-- Next container is a separate clause
part.punctuation = ","
else
-- Not last, next is joined with the conjunction
-- Containers use repeated conjunction style: "A, yan jî B, yan jî C"
part.punctuation = ","
end
-- Determine joiner to next part
-- Containers use the repeated conjunction between each
-- Custom conjunction can be specified via conj modifier
local container_conj = part.conj or "yan jî" -- Kurdish default
if not is_last then
if next_part and next_part.new_sentence then
-- New sentence
part.joiner = " "
elseif next_part and next_part.separate_clause then
-- Separate clause
part.joiner = " "
else
-- Same sentence: use the custom conjunction, else the default
part.joiner = " " .. container_conj .. " "
end
else
part.joiner = ""
end
-- Determine intro formatting
-- Capitalize if first at top level, OR if this container starts a new sentence
if (is_first and is_toplevel) or part.new_sentence then
part.intro_capitalized = true
part.use_full_intro = true
else
part.intro_capitalized = false
part.use_full_intro = false
end
end
end
-- Assemble text from analyzed tree
local function assemble_text(tree)
if not tree then return "" end
local result = ""
for i, part in ipairs(tree.container_parts) do
if part.type == "etydate" then
result = result .. part.etydate_text
if part.punctuation and part.punctuation ~= "" then
result = result .. part.punctuation
end
if part.etydate_refs and next(part.etydate_refs) then
result = result .. M.references.format_references(part.etydate_refs)
end
if part.joiner and part.joiner ~= "" then
result = result .. part.joiner
end
else
-- Build intro
local intro_text = part.intro_text
local phrase = part.phrase
if part.senseid then
intro_text, phrase = format_sl_senseid_intro(
part.senseid,
part.sl_keyword_text,
part.phrase,
part.intro_capitalized,
part.is_uncertain
)
end
local intro
if part.use_full_intro then
if part.is_uncertain and not part.senseid then
intro = "Mihtemelen " .. phrase
else
intro = intro_text
end
else
if part.is_uncertain and not part.senseid then
intro = "mihtemelen " .. phrase
else
intro = phrase
end
end
result = result .. intro
-- Build terms
if #part.term_parts > 0 then
result = result .. " "
for j, term_part in ipairs(part.term_parts) do
-- Add "possibly" prefix for uncertain terms when there's mixed uncertainty
if part.has_mixed_uncertainty and term_part.is_uncertain then
result = result .. "mihtemelen "
end
result = result .. term_part.text
-- Add joiner between terms
if term_part.joiner ~= "" then
-- Check if joiner contains comma (punctuation)
local comma_pos = term_part.joiner:find(",")
if comma_pos then
-- Add up to and including comma
result = result .. term_part.joiner:sub(1, comma_pos)
-- Add refs after comma
if term_part.refs ~= "" then
result = result .. term_part.refs
end
-- Add rest of joiner
result = result .. term_part.joiner:sub(comma_pos + 1)
else
-- No comma, add refs before joiner
if term_part.refs ~= "" then
result = result .. term_part.refs
end
result = result .. term_part.joiner
end
end
end
-- For the last term, add punctuation then refs
local last_term = part.term_parts[#part.term_parts]
if last_term and last_term.joiner == "" then
if part.punctuation ~= "" then
-- If we have literal text, punctuation goes AFTER it
if part.lit then
-- Add refs first (attached to term)
if last_term.refs ~= "" then
result = result .. last_term.refs
end
-- Add keyword refs
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
-- Add literal text
result = result .. ", literally “" .. part.lit .. "”"
-- Add punctuation
result = result .. part.punctuation
else
-- Normal behavior: punctuation then refs
result = result .. part.punctuation
if last_term.refs ~= "" then
result = result .. last_term.refs
end
-- Add keyword refs after term refs
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
end
else
-- No punctuation
if last_term.refs ~= "" then
result = result .. last_term.refs
end
-- Add keyword refs
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
-- Add literal text if present (even without punctuation)
if part.lit then
result = result .. ", literally “" .. part.lit .. "”"
end
end
end
else
-- No terms, just add punctuation and keyword refs
if part.punctuation ~= "" then
result = result .. part.punctuation
end
-- Add keyword refs even when there are no terms
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
end
-- Add continuation
if part.continuation then
result = result .. " " .. assemble_text(part.continuation)
end
-- Add joiner to next container
if part.joiner ~= "" then
result = result .. part.joiner
end
end
end
return result
end
local text_tree = build_text_tree(data_tree, 1, true, false)
-- Supplements (doublets, etydate, …) are rendered outside the main derivation text tree.
local function assemble_supplements()
if not data_tree.supplements then
return ""
end
local chunks = {}
local pending_trees = {}
local function flush_pending_trees()
local num = #pending_trees
for i, supplement_tree in ipairs(pending_trees) do
analyze_punctuation(supplement_tree, true)
apply_closing_punctuation_override(supplement_tree, i == num)
local chunk = assemble_text(supplement_tree)
if chunk ~= "" then
table.insert(chunks, chunk)
end
end
pending_trees = {}
end
for _, supplement in ipairs(data_tree.supplements) do
local supplement_tree
if supplement.type == "doublet" and supplement.config
and supplement.terms and #supplement.terms > 0 then
local config = supplement.config
local term_parts = {}
for _, term in ipairs(supplement.terms) do
local term_part = build_term_part(term, entry_lang, 1)
if term_part.text ~= "" then
table.insert(term_parts, term_part)
end
end
if #term_parts == 0 then
supplement_tree = nil
else
supplement_tree = {
type = "tree",
container_parts = {
{
type = "doublet",
intro_text = config.text,
phrase = config.phrase,
term_parts = term_parts,
conj = config.default_conj or "û",
new_sentence = true,
},
},
depth = 1,
}
end
elseif supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then
supplement_tree = {
type = "tree",
container_parts = {
{
type = "etydate",
etydate_text = supplement.etydate_text,
etydate_refs = supplement.etydate_refs,
new_sentence = true,
},
},
depth = 1,
}
end
if supplement_tree then
table.insert(pending_trees, supplement_tree)
end
end
flush_pending_trees()
return table.concat(chunks, " ")
end
if not text_tree then
local supplement_text = assemble_supplements()
if supplement_text == "" then
if stop_at_lang then
return "", { stop_lang_reached = false }
end
return ""
end
if stop_at_lang then
return supplement_text, { stop_lang_reached = false }
end
return supplement_text
end
local rendered = ""
if text_tree then
check_complexity(text_tree)
analyze_punctuation(text_tree, true)
apply_closing_punctuation_override(text_tree, not has_supplements())
rendered = assemble_text(text_tree)
end
local supplement_text = assemble_supplements()
if supplement_text ~= "" then
if rendered ~= "" then
rendered = rendered .. " " .. supplement_text
else
rendered = supplement_text
end
end
if stop_at_lang then
return rendered, { stop_lang_reached = stop_lang_reached }
end
return rendered
end
return export
oawj2h2aqok5q8g7kvkt5gug2zj25fx
6532032
6532031
2026-09-18T16:05:32Z
Wikihez
7344
sync test copy
6532032
Scribunto
text/plain
local export = {}
local loader = require("Module:module loader")
local M = loader.init({
require = {
en_utilities = "Module:en-utilities",
references = "Module:references",
senseno = "Module:senseno",
},
loadData = {
data = "Module:etymon/data/ceribandin",
},
})
function export.render(opts)
opts = opts or {}
local data_tree = opts.data_tree
local format_term_func = opts.format_term_func
local max_depth = opts.max_depth
local stop_at_blue_link = opts.stop_at_blue_link
local curr_page = opts.curr_page
local nodot = opts.nodot and opts.nodot ~= "" and opts.nodot ~= "0"
local function explicit_dot_override()
if opts.dot == nil or opts.dot == false then
return nil
end
local d = mw.text.trim(tostring(opts.dot))
if d == "" or d == "." then
return nil
end
return d
end
local dot_override = explicit_dot_override()
local function find_deepest_last_part(tree)
if not tree or not tree.container_parts or #tree.container_parts == 0 then
return nil
end
local last_part = tree.container_parts[#tree.container_parts]
if last_part.continuation then
return find_deepest_last_part(last_part.continuation)
end
return last_part
end
local function apply_final_punctuation_override(tree, punct)
if not tree or punct == nil then
return
end
local last_part = find_deepest_last_part(tree)
if last_part then
last_part.punctuation = punct
end
end
local function apply_closing_punctuation_override(tree, is_last_segment)
if not is_last_segment then
return
end
local punct
if nodot then
punct = ""
elseif dot_override ~= nil then
punct = dot_override
else
return
end
apply_final_punctuation_override(tree, punct)
end
local function has_supplements()
return data_tree.supplements and #data_tree.supplements > 0
end
local stop_at_lang = opts.stop_at_lang
local stop_at_lang_or_bluelink = opts.stop_at_lang_or_bluelink
local lang_matches_stop_code = opts.lang_matches_stop_code
local stop_lang_reached = false
local function term_matches_stop_code(term_lang, stop_code)
if lang_matches_stop_code then
return lang_matches_stop_code(term_lang, stop_code)
end
return term_lang and term_lang:getCode() == stop_code
end
local children = data_tree.children
local function has_text_supplements()
if not data_tree.supplements then
return false
end
for _, supplement in ipairs(data_tree.supplements) do
if supplement.type == "doublet" and supplement.terms and #supplement.terms > 0 then
return true
end
if supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then
return true
end
end
return false
end
if (not children or #children == 0) and not has_text_supplements() then
if stop_at_lang then
return "", { stop_lang_reached = false }
end
return ""
end
local top_l2 = data_tree.lang:getFullCode() .. ":" .. curr_page
local entry_lang = data_tree.lang
local function lowercase_glossary_link_display(wikitext)
return wikitext:gsub("(%[%[Appendix:Glossary#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest)
return prefix .. mw.ustring.lower(first) .. rest .. "]]"
end)
end
local function format_sl_senseid_intro(senseid, keyword_text, keyword_phrase, capitalize_senseno, is_uncertain)
local senseids = mw.text.split(senseid, "!!", true)
local senseno_parts = {}
for i, id in ipairs(senseids) do
id = mw.text.trim(id)
if id ~= "" then
table.insert(senseno_parts, M.senseno.link_text(entry_lang:getCode(), { id }, {
title = curr_page,
uc = (i == 1 and capitalize_senseno) or nil,
}))
end
end
if #senseno_parts == 0 then
return keyword_text, keyword_phrase
end
local senseno_text = mw.text.listToText(senseno_parts)
local glossary_link = (keyword_text or ""):gsub(" from$", "")
local glossary_lower = lowercase_glossary_link_display(glossary_link)
if #senseno_parts > 1 then
local plural_link = glossary_lower:gsub("|semantic loan%]%]", "|semantic loans]]")
if is_uncertain then
return senseno_text .. " are possibly " .. plural_link .. " from",
senseno_text .. " are possibly semantic loans from"
end
return senseno_text .. " are " .. plural_link .. " from",
senseno_text .. " are semantic loans from"
end
if is_uncertain then
return senseno_text .. " is possibly a " .. glossary_lower .. " from",
senseno_text .. " is possibly a semantic loan from"
end
return senseno_text .. " is a " .. glossary_lower .. " from",
senseno_text .. " is a semantic loan from"
end
-- Get refs for a term
local function get_term_refs(term, term_lang, depth)
local term_l2 = term_lang:getFullCode() .. ":" .. curr_page
if term.parsed_ref and (depth == 1 or term_l2 == top_l2) then
return M.references.format_references(term.parsed_ref)
end
return ""
end
-- Build a text part for a single term
local function build_term_part(term, current_lang, depth)
local text = ""
local new_lang = current_lang
local lang_changed = term.lang:getCanonicalName() ~= current_lang:getCanonicalName()
-- Use centralized format_term (handles suppress_term, unknown_term, and regular terms)
local term_text = format_term_func(term)
if lang_changed then
new_lang = term.lang
if term_text then
text = term.lang:makeCategoryLink(true) .. " " .. term_text
elseif term.is_family then
text = term.lang:makeCategoryLink(true) -- a family: "zimanên îranî"
else
-- suppress_term with language change: show only language
text = term.lang:makeCategoryLink(true)
end
else
text = term_text or ""
end
return {
type = "term",
text = text,
refs = get_term_refs(term, new_lang, depth),
lang = new_lang,
is_uncertain = term.is_uncertain or false,
}
end
-- Build text parts for a container
local function build_container_part(container, node, depth, allow_continuation, fallback_to_bluelink)
local keyword_info = container.keyword_info
local keyword_modifiers = container.keyword_modifiers or {}
local terms = container.terms or {}
if not keyword_info or #terms == 0 then
return nil
end
-- Skip building text part when invisible in text ("all", "text", or true)
local inv = keyword_info.invisible
if inv == "all" or inv == true or inv == "text" then
return nil
end
local is_group = keyword_info.is_group
local keyword_uncertain = keyword_modifiers.unc or false
-- Determine text and phrase (allowing for overrides)
local intro_text = keyword_info.text
local phrase = keyword_info.phrase
local new_sentence = keyword_info.new_sentence or false
if keyword_modifiers.text then
-- User-provided override: assumed to be lowercase
phrase = keyword_modifiers.text
-- Auto-capitalize for intro text (e.g., "derived from" -> "Derived from")
intro_text = mw.ustring.upper(phrase:sub(1, 1)) .. phrase:sub(2)
end
-- Get keyword references
local keyword_refs = ""
if keyword_modifiers.ref then
local parsed_keyword_refs = M.references.parse_references(keyword_modifiers.ref)
if parsed_keyword_refs and parsed_keyword_refs ~= "" then
keyword_refs = M.references.format_references(parsed_keyword_refs)
end
end
-- Build term parts
local term_parts = {}
local current_lang = node.lang
for _, term in ipairs(terms) do
local term_part = build_term_part(term, current_lang, depth)
if term_part.text ~= "" then
table.insert(term_parts, term_part)
current_lang = term_part.lang
end
end
-- Check uncertainty distribution
local uncertain_count = 0
for _, term_part in ipairs(term_parts) do
if term_part.is_uncertain then
uncertain_count = uncertain_count + 1
end
end
-- If keyword itself is uncertain, treat all terms as uncertain
local all_uncertain = keyword_uncertain or (uncertain_count == #term_parts and #term_parts > 0)
if is_group and uncertain_count > 0 then
all_uncertain = true
end
local has_mixed_uncertainty = not all_uncertain and uncertain_count > 0
-- Check if there are more steps (only if continuation is allowed)
local has_more_steps = false
local next_node = nil
local first_term = terms[1]
-- Check if we should stop at this language
local reached_stop_lang = false
if stop_at_lang then
for _, term in ipairs(terms) do
if term.lang and term_matches_stop_code(term.lang, stop_at_lang) then
reached_stop_lang = true
stop_lang_reached = true
break
end
end
elseif stop_at_lang_or_bluelink then
-- Check if we should stop at this language, or at the first bluelink if it's a redlink
for _, term in ipairs(terms) do
if term.lang and term_matches_stop_code(term.lang, stop_at_lang_or_bluelink) then
if first_term.status == M.data.STATUS.OK then
reached_stop_lang = true
else
fallback_to_bluelink = true
end
break
end
end
if fallback_to_bluelink and first_term.status == M.data.STATUS.OK then
reached_stop_lang = true
end
end
if allow_continuation and not is_group and #terms == 1 and not reached_stop_lang then
local first_term_children = first_term.children
if first_term_children and #first_term_children > 0 and (not max_depth or depth < max_depth) then
local next_container = first_term_children[1]
local next_keyword_info = next_container and next_container.keyword_info
if not (next_keyword_info and next_keyword_info.invisible) then
if stop_at_blue_link then
if first_term.status ~= M.data.STATUS.OK then
has_more_steps = true
next_node = first_term
end
else
has_more_steps = true
next_node = first_term
end
end
end
end
return {
type = "container",
intro_text = intro_text,
phrase = phrase,
senseid = keyword_modifiers.senseid,
sl_keyword_text = keyword_modifiers.senseid and keyword_info.text or nil,
is_uncertain = all_uncertain,
has_mixed_uncertainty = has_mixed_uncertainty,
term_parts = term_parts,
is_group = is_group,
has_more_steps = has_more_steps,
next_node = next_node,
new_sentence = new_sentence,
separate_clause = keyword_info.separate_clause or false,
conj = keyword_modifiers.conj or keyword_info.default_conj, -- custom conjunction: "and", "or", "and/or", etc.
lit = keyword_modifiers.lit,
keyword_refs = keyword_refs,
fallback_to_bluelink = fallback_to_bluelink,
}
end
-- Build the full tree of text parts
local function build_text_tree(node, depth, allow_continuation, fallback_to_bluelink)
local containers = node.children
if not containers or #containers == 0 then
return nil
end
local container_parts = {}
-- Count containers that get a text part (invisible in text = "all", "text", or true)
local visible_container_count = 0
for _, container in ipairs(containers) do
local keyword_info = container.keyword_info
local inv = keyword_info and keyword_info.invisible
if not (inv == "all" or inv == true or inv == "text") then
visible_container_count = visible_container_count + 1
end
end
-- If there are multiple visible containers at this level, don't allow continuation for any
local has_multiple_containers = visible_container_count > 1
local should_allow_continuation = allow_continuation and not has_multiple_containers
for _, container in ipairs(containers) do
local part = build_container_part(container, node, depth, should_allow_continuation, fallback_to_bluelink)
if part then
-- Recursively build children if there are more steps
if part.has_more_steps and part.next_node then
part.continuation = build_text_tree(part.next_node, depth + 1, true, part.fallback_to_bluelink)
end
table.insert(container_parts, part)
end
end
if #container_parts == 0 then
return nil
end
return {
type = "tree",
container_parts = container_parts,
depth = depth,
}
end
-- Check if tree has mixed joining types
local function container_join_kind(part)
if part.type == "etydate" then
return nil
end
if part.new_sentence or part.separate_clause then
return "supplement"
end
return "or_join"
end
local function check_complexity(tree)
if not tree then return nil end
local parts = tree.container_parts
if #parts <= 1 then
-- Single container
if parts[1] and parts[1].continuation then
return check_complexity(parts[1].continuation)
end
return nil
end
-- Or-join containers must precede any supplemental (calque-like / influence) containers.
local seen_supplement = false
for _, part in ipairs(parts) do
local kind = container_join_kind(part)
if kind == "supplement" then
seen_supplement = true
elseif kind == "or_join" and seen_supplement then
error(
"Cannot generate etymology text: a main derivation step cannot follow a calque, semantic loan, or influence clause in the same list.")
end
end
for _, part in ipairs(parts) do
if part.continuation then
check_complexity(part.continuation)
end
end
return nil
end
-- Analyze tree and assign punctuation
local function analyze_punctuation(tree, is_toplevel)
if not tree then return end
local parts = tree.container_parts
local num_parts = #parts
for i, part in ipairs(parts) do
local is_first = (i == 1)
local is_last = (i == num_parts)
local next_part = parts[i + 1]
-- Analyze term punctuation within container
if part.term_parts then
-- Terms use Oxford comma style: "A, B, yan jî C"
-- Custom conjunction can be specified via conj modifier (e.g., "and/or", "and")
local num_terms = #part.term_parts
local term_conj = part.conj or "yan jî" -- Kurdish default
for j, term_part in ipairs(part.term_parts) do
local is_last_term = (j == num_terms)
if part.is_group then
-- Group: terms joined with " + "
term_part.joiner = is_last_term and "" or " + "
elseif num_terms > 1 then
-- Multiple terms not in a group: Oxford comma style
if is_last_term then
term_part.joiner = ""
elseif j == num_terms - 1 then
-- Second to last term
if num_terms == 2 then
term_part.joiner = " " .. term_conj .. " "
else
term_part.joiner = ", " .. term_conj .. " "
end
else
term_part.joiner = ", "
end
else
-- Single term
term_part.joiner = ""
end
end
end
-- Determine container punctuation based on what comes next
if part.continuation then
-- Has continuation
part.punctuation = ","
-- Recursively analyze continuation
analyze_punctuation(part.continuation, false)
elseif is_last then
-- Last container at this level (may still continue in part.continuation)
part.punctuation = "."
elseif next_part and next_part.new_sentence then
-- Next container starts a new sentence
part.punctuation = "."
elseif next_part and next_part.separate_clause then
-- Next container is a separate clause
part.punctuation = ","
else
-- Not last, next is joined with the conjunction
-- Containers use repeated conjunction style: "A, yan jî B, yan jî C"
part.punctuation = ","
end
-- Determine joiner to next part
-- Containers use the repeated conjunction between each
-- Custom conjunction can be specified via conj modifier
local container_conj = part.conj or "yan jî" -- Kurdish default
if not is_last then
if next_part and next_part.new_sentence then
-- New sentence
part.joiner = " "
elseif next_part and next_part.separate_clause then
-- Separate clause
part.joiner = " "
else
-- Same sentence: use the custom conjunction, else the default
part.joiner = " " .. container_conj .. " "
end
else
part.joiner = ""
end
-- Determine intro formatting
-- Capitalize if first at top level, OR if this container starts a new sentence
if (is_first and is_toplevel) or part.new_sentence then
part.intro_capitalized = true
part.use_full_intro = true
else
part.intro_capitalized = false
part.use_full_intro = false
end
end
end
-- Assemble text from analyzed tree
local function assemble_text(tree)
if not tree then return "" end
local result = ""
for i, part in ipairs(tree.container_parts) do
if part.type == "etydate" then
result = result .. part.etydate_text
if part.punctuation and part.punctuation ~= "" then
result = result .. part.punctuation
end
if part.etydate_refs and next(part.etydate_refs) then
result = result .. M.references.format_references(part.etydate_refs)
end
if part.joiner and part.joiner ~= "" then
result = result .. part.joiner
end
else
-- Build intro
local intro_text = part.intro_text
local phrase = part.phrase
if part.senseid then
intro_text, phrase = format_sl_senseid_intro(
part.senseid,
part.sl_keyword_text,
part.phrase,
part.intro_capitalized,
part.is_uncertain
)
end
local intro
if part.use_full_intro then
if part.is_uncertain and not part.senseid then
intro = "Mihtemelen " .. phrase
else
intro = intro_text
end
else
if part.is_uncertain and not part.senseid then
intro = "mihtemelen " .. phrase
else
intro = phrase
end
end
result = result .. intro
-- Build terms
if #part.term_parts > 0 then
result = result .. " "
for j, term_part in ipairs(part.term_parts) do
-- Add "possibly" prefix for uncertain terms when there's mixed uncertainty
if part.has_mixed_uncertainty and term_part.is_uncertain then
result = result .. "mihtemelen "
end
result = result .. term_part.text
-- Add joiner between terms
if term_part.joiner ~= "" then
-- Check if joiner contains comma (punctuation)
local comma_pos = term_part.joiner:find(",")
if comma_pos then
-- Add up to and including comma
result = result .. term_part.joiner:sub(1, comma_pos)
-- Add refs after comma
if term_part.refs ~= "" then
result = result .. term_part.refs
end
-- Add rest of joiner
result = result .. term_part.joiner:sub(comma_pos + 1)
else
-- No comma, add refs before joiner
if term_part.refs ~= "" then
result = result .. term_part.refs
end
result = result .. term_part.joiner
end
end
end
-- For the last term, add punctuation then refs
local last_term = part.term_parts[#part.term_parts]
if last_term and last_term.joiner == "" then
if part.punctuation ~= "" then
-- If we have literal text, punctuation goes AFTER it
if part.lit then
-- Add refs first (attached to term)
if last_term.refs ~= "" then
result = result .. last_term.refs
end
-- Add keyword refs
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
-- Add literal text
result = result .. ", literally “" .. part.lit .. "”"
-- Add punctuation
result = result .. part.punctuation
else
-- Normal behavior: punctuation then refs
result = result .. part.punctuation
if last_term.refs ~= "" then
result = result .. last_term.refs
end
-- Add keyword refs after term refs
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
end
else
-- No punctuation
if last_term.refs ~= "" then
result = result .. last_term.refs
end
-- Add keyword refs
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
-- Add literal text if present (even without punctuation)
if part.lit then
result = result .. ", literally “" .. part.lit .. "”"
end
end
end
else
-- No terms, just add punctuation and keyword refs
if part.punctuation ~= "" then
result = result .. part.punctuation
end
-- Add keyword refs even when there are no terms
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
end
-- Add continuation
if part.continuation then
result = result .. " " .. assemble_text(part.continuation)
end
-- Add joiner to next container
if part.joiner ~= "" then
result = result .. part.joiner
end
end
end
return result
end
local text_tree = build_text_tree(data_tree, 1, true, false)
-- Supplements (doublets, etydate, …) are rendered outside the main derivation text tree.
local function assemble_supplements()
if not data_tree.supplements then
return ""
end
local chunks = {}
local pending_trees = {}
local function flush_pending_trees()
local num = #pending_trees
for i, supplement_tree in ipairs(pending_trees) do
analyze_punctuation(supplement_tree, true)
apply_closing_punctuation_override(supplement_tree, i == num)
local chunk = assemble_text(supplement_tree)
if chunk ~= "" then
table.insert(chunks, chunk)
end
end
pending_trees = {}
end
for _, supplement in ipairs(data_tree.supplements) do
local supplement_tree
if supplement.type == "doublet" and supplement.config
and supplement.terms and #supplement.terms > 0 then
local config = supplement.config
local term_parts = {}
for _, term in ipairs(supplement.terms) do
local term_part = build_term_part(term, entry_lang, 1)
if term_part.text ~= "" then
table.insert(term_parts, term_part)
end
end
if #term_parts == 0 then
supplement_tree = nil
else
supplement_tree = {
type = "tree",
container_parts = {
{
type = "doublet",
intro_text = config.text,
phrase = config.phrase,
term_parts = term_parts,
conj = config.default_conj or "û",
new_sentence = true,
},
},
depth = 1,
}
end
elseif supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then
supplement_tree = {
type = "tree",
container_parts = {
{
type = "etydate",
etydate_text = supplement.etydate_text,
etydate_refs = supplement.etydate_refs,
new_sentence = true,
},
},
depth = 1,
}
end
if supplement_tree then
table.insert(pending_trees, supplement_tree)
end
end
flush_pending_trees()
return table.concat(chunks, " ")
end
if not text_tree then
local supplement_text = assemble_supplements()
if supplement_text == "" then
if stop_at_lang then
return "", { stop_lang_reached = false }
end
return ""
end
if stop_at_lang then
return supplement_text, { stop_lang_reached = false }
end
return supplement_text
end
local rendered = ""
if text_tree then
check_complexity(text_tree)
analyze_punctuation(text_tree, true)
apply_closing_punctuation_override(text_tree, not has_supplements())
rendered = assemble_text(text_tree)
end
local supplement_text = assemble_supplements()
if supplement_text ~= "" then
if rendered ~= "" then
rendered = rendered .. " " .. supplement_text
else
rendered = supplement_text
end
end
if stop_at_lang then
return rendered, { stop_lang_reached = stop_lang_reached }
end
return rendered
end
return export
rph63f7am34zj2t95xkk45z839n8f56
6532035
6532032
2026-09-18T16:07:42Z
Wikihez
7344
sync test copy
6532035
Scribunto
text/plain
local export = {}
local loader = require("Module:module loader")
local M = loader.init({
require = {
en_utilities = "Module:en-utilities",
references = "Module:references",
senseno = "Module:senseno",
},
loadData = {
data = "Module:etymon/data/ceribandin",
},
})
function export.render(opts)
opts = opts or {}
local data_tree = opts.data_tree
local format_term_func = opts.format_term_func
local max_depth = opts.max_depth
local stop_at_blue_link = opts.stop_at_blue_link
local curr_page = opts.curr_page
local nodot = opts.nodot and opts.nodot ~= "" and opts.nodot ~= "0"
local function explicit_dot_override()
if opts.dot == nil or opts.dot == false then
return nil
end
local d = mw.text.trim(tostring(opts.dot))
if d == "" or d == "." then
return nil
end
return d
end
local dot_override = explicit_dot_override()
local function find_deepest_last_part(tree)
if not tree or not tree.container_parts or #tree.container_parts == 0 then
return nil
end
local last_part = tree.container_parts[#tree.container_parts]
if last_part.continuation then
return find_deepest_last_part(last_part.continuation)
end
return last_part
end
local function apply_final_punctuation_override(tree, punct)
if not tree or punct == nil then
return
end
local last_part = find_deepest_last_part(tree)
if last_part then
last_part.punctuation = punct
end
end
local function apply_closing_punctuation_override(tree, is_last_segment)
if not is_last_segment then
return
end
local punct
if nodot then
punct = ""
elseif dot_override ~= nil then
punct = dot_override
else
return
end
apply_final_punctuation_override(tree, punct)
end
local function has_supplements()
return data_tree.supplements and #data_tree.supplements > 0
end
local stop_at_lang = opts.stop_at_lang
local stop_at_lang_or_bluelink = opts.stop_at_lang_or_bluelink
local lang_matches_stop_code = opts.lang_matches_stop_code
local stop_lang_reached = false
local function term_matches_stop_code(term_lang, stop_code)
if lang_matches_stop_code then
return lang_matches_stop_code(term_lang, stop_code)
end
return term_lang and term_lang:getCode() == stop_code
end
local children = data_tree.children
local function has_text_supplements()
if not data_tree.supplements then
return false
end
for _, supplement in ipairs(data_tree.supplements) do
if supplement.type == "doublet" and supplement.terms and #supplement.terms > 0 then
return true
end
if supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then
return true
end
end
return false
end
if (not children or #children == 0) and not has_text_supplements() then
if stop_at_lang then
return "", { stop_lang_reached = false }
end
return ""
end
local top_l2 = data_tree.lang:getFullCode() .. ":" .. curr_page
local entry_lang = data_tree.lang
local function lowercase_glossary_link_display(wikitext)
return wikitext:gsub("(%[%[Nimînok:Ferhengok#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest)
return prefix .. mw.ustring.lower(first) .. rest .. "]]"
end)
end
local function format_sl_senseid_intro(senseid, keyword_text, keyword_phrase, capitalize_senseno, is_uncertain)
local senseids = mw.text.split(senseid, "!!", true)
local senseno_parts = {}
for i, id in ipairs(senseids) do
id = mw.text.trim(id)
if id ~= "" then
table.insert(senseno_parts, M.senseno.link_text(entry_lang:getCode(), { id }, {
title = curr_page,
uc = (i == 1 and capitalize_senseno) or nil,
}))
end
end
if #senseno_parts == 0 then
return keyword_text, keyword_phrase
end
local senseno_text = mw.text.listToText(senseno_parts)
local glossary_link = (keyword_text or ""):gsub(" from$", "")
local glossary_lower = lowercase_glossary_link_display(glossary_link)
if #senseno_parts > 1 then
local plural_link = glossary_lower:gsub("|semantic loan%]%]", "|semantic loans]]")
if is_uncertain then
return senseno_text .. " are possibly " .. plural_link .. " from",
senseno_text .. " are possibly semantic loans from"
end
return senseno_text .. " are " .. plural_link .. " from",
senseno_text .. " are semantic loans from"
end
if is_uncertain then
return senseno_text .. " is possibly a " .. glossary_lower .. " from",
senseno_text .. " is possibly a semantic loan from"
end
return senseno_text .. " is a " .. glossary_lower .. " from",
senseno_text .. " is a semantic loan from"
end
-- Get refs for a term
local function get_term_refs(term, term_lang, depth)
local term_l2 = term_lang:getFullCode() .. ":" .. curr_page
if term.parsed_ref and (depth == 1 or term_l2 == top_l2) then
return M.references.format_references(term.parsed_ref)
end
return ""
end
-- Build a text part for a single term
local function build_term_part(term, current_lang, depth)
local text = ""
local new_lang = current_lang
local lang_changed = term.lang:getCanonicalName() ~= current_lang:getCanonicalName()
-- Use centralized format_term (handles suppress_term, unknown_term, and regular terms)
local term_text = format_term_func(term)
if lang_changed then
new_lang = term.lang
if term_text then
text = term.lang:makeCategoryLink(true) .. " " .. term_text
elseif term.is_family then
text = term.lang:makeCategoryLink(true) -- a family: "zimanên îranî"
else
-- suppress_term with language change: show only language
text = term.lang:makeCategoryLink(true)
end
else
text = term_text or ""
end
return {
type = "term",
text = text,
refs = get_term_refs(term, new_lang, depth),
lang = new_lang,
is_uncertain = term.is_uncertain or false,
}
end
-- Build text parts for a container
local function build_container_part(container, node, depth, allow_continuation, fallback_to_bluelink)
local keyword_info = container.keyword_info
local keyword_modifiers = container.keyword_modifiers or {}
local terms = container.terms or {}
if not keyword_info or #terms == 0 then
return nil
end
-- Skip building text part when invisible in text ("all", "text", or true)
local inv = keyword_info.invisible
if inv == "all" or inv == true or inv == "text" then
return nil
end
local is_group = keyword_info.is_group
local keyword_uncertain = keyword_modifiers.unc or false
-- Determine text and phrase (allowing for overrides)
local intro_text = keyword_info.text
local phrase = keyword_info.phrase
local new_sentence = keyword_info.new_sentence or false
if keyword_modifiers.text then
-- User-provided override: assumed to be lowercase
phrase = keyword_modifiers.text
-- Auto-capitalize for intro text (e.g., "derived from" -> "Derived from")
intro_text = mw.ustring.upper(phrase:sub(1, 1)) .. phrase:sub(2)
end
-- Get keyword references
local keyword_refs = ""
if keyword_modifiers.ref then
local parsed_keyword_refs = M.references.parse_references(keyword_modifiers.ref)
if parsed_keyword_refs and parsed_keyword_refs ~= "" then
keyword_refs = M.references.format_references(parsed_keyword_refs)
end
end
-- Build term parts
local term_parts = {}
local current_lang = node.lang
for _, term in ipairs(terms) do
local term_part = build_term_part(term, current_lang, depth)
if term_part.text ~= "" then
table.insert(term_parts, term_part)
current_lang = term_part.lang
end
end
-- Check uncertainty distribution
local uncertain_count = 0
for _, term_part in ipairs(term_parts) do
if term_part.is_uncertain then
uncertain_count = uncertain_count + 1
end
end
-- If keyword itself is uncertain, treat all terms as uncertain
local all_uncertain = keyword_uncertain or (uncertain_count == #term_parts and #term_parts > 0)
if is_group and uncertain_count > 0 then
all_uncertain = true
end
local has_mixed_uncertainty = not all_uncertain and uncertain_count > 0
-- Check if there are more steps (only if continuation is allowed)
local has_more_steps = false
local next_node = nil
local first_term = terms[1]
-- Check if we should stop at this language
local reached_stop_lang = false
if stop_at_lang then
for _, term in ipairs(terms) do
if term.lang and term_matches_stop_code(term.lang, stop_at_lang) then
reached_stop_lang = true
stop_lang_reached = true
break
end
end
elseif stop_at_lang_or_bluelink then
-- Check if we should stop at this language, or at the first bluelink if it's a redlink
for _, term in ipairs(terms) do
if term.lang and term_matches_stop_code(term.lang, stop_at_lang_or_bluelink) then
if first_term.status == M.data.STATUS.OK then
reached_stop_lang = true
else
fallback_to_bluelink = true
end
break
end
end
if fallback_to_bluelink and first_term.status == M.data.STATUS.OK then
reached_stop_lang = true
end
end
if allow_continuation and not is_group and #terms == 1 and not reached_stop_lang then
local first_term_children = first_term.children
if first_term_children and #first_term_children > 0 and (not max_depth or depth < max_depth) then
local next_container = first_term_children[1]
local next_keyword_info = next_container and next_container.keyword_info
if not (next_keyword_info and next_keyword_info.invisible) then
if stop_at_blue_link then
if first_term.status ~= M.data.STATUS.OK then
has_more_steps = true
next_node = first_term
end
else
has_more_steps = true
next_node = first_term
end
end
end
end
return {
type = "container",
intro_text = intro_text,
phrase = phrase,
senseid = keyword_modifiers.senseid,
sl_keyword_text = keyword_modifiers.senseid and keyword_info.text or nil,
is_uncertain = all_uncertain,
has_mixed_uncertainty = has_mixed_uncertainty,
term_parts = term_parts,
is_group = is_group,
has_more_steps = has_more_steps,
next_node = next_node,
new_sentence = new_sentence,
separate_clause = keyword_info.separate_clause or false,
conj = keyword_modifiers.conj or keyword_info.default_conj, -- custom conjunction: "and", "or", "and/or", etc.
lit = keyword_modifiers.lit,
keyword_refs = keyword_refs,
fallback_to_bluelink = fallback_to_bluelink,
}
end
-- Build the full tree of text parts
local function build_text_tree(node, depth, allow_continuation, fallback_to_bluelink)
local containers = node.children
if not containers or #containers == 0 then
return nil
end
local container_parts = {}
-- Count containers that get a text part (invisible in text = "all", "text", or true)
local visible_container_count = 0
for _, container in ipairs(containers) do
local keyword_info = container.keyword_info
local inv = keyword_info and keyword_info.invisible
if not (inv == "all" or inv == true or inv == "text") then
visible_container_count = visible_container_count + 1
end
end
-- If there are multiple visible containers at this level, don't allow continuation for any
local has_multiple_containers = visible_container_count > 1
local should_allow_continuation = allow_continuation and not has_multiple_containers
for _, container in ipairs(containers) do
local part = build_container_part(container, node, depth, should_allow_continuation, fallback_to_bluelink)
if part then
-- Recursively build children if there are more steps
if part.has_more_steps and part.next_node then
part.continuation = build_text_tree(part.next_node, depth + 1, true, part.fallback_to_bluelink)
end
table.insert(container_parts, part)
end
end
if #container_parts == 0 then
return nil
end
return {
type = "tree",
container_parts = container_parts,
depth = depth,
}
end
-- Check if tree has mixed joining types
local function container_join_kind(part)
if part.type == "etydate" then
return nil
end
if part.new_sentence or part.separate_clause then
return "supplement"
end
return "or_join"
end
local function check_complexity(tree)
if not tree then return nil end
local parts = tree.container_parts
if #parts <= 1 then
-- Single container
if parts[1] and parts[1].continuation then
return check_complexity(parts[1].continuation)
end
return nil
end
-- Or-join containers must precede any supplemental (calque-like / influence) containers.
local seen_supplement = false
for _, part in ipairs(parts) do
local kind = container_join_kind(part)
if kind == "supplement" then
seen_supplement = true
elseif kind == "or_join" and seen_supplement then
error(
"Cannot generate etymology text: a main derivation step cannot follow a calque, semantic loan, or influence clause in the same list.")
end
end
for _, part in ipairs(parts) do
if part.continuation then
check_complexity(part.continuation)
end
end
return nil
end
-- Analyze tree and assign punctuation
local function analyze_punctuation(tree, is_toplevel)
if not tree then return end
local parts = tree.container_parts
local num_parts = #parts
for i, part in ipairs(parts) do
local is_first = (i == 1)
local is_last = (i == num_parts)
local next_part = parts[i + 1]
-- Analyze term punctuation within container
if part.term_parts then
-- Terms use Oxford comma style: "A, B, yan jî C"
-- Custom conjunction can be specified via conj modifier (e.g., "and/or", "and")
local num_terms = #part.term_parts
local term_conj = part.conj or "yan jî" -- Kurdish default
for j, term_part in ipairs(part.term_parts) do
local is_last_term = (j == num_terms)
if part.is_group then
-- Group: terms joined with " + "
term_part.joiner = is_last_term and "" or " + "
elseif num_terms > 1 then
-- Multiple terms not in a group: Oxford comma style
if is_last_term then
term_part.joiner = ""
elseif j == num_terms - 1 then
-- Second to last term
if num_terms == 2 then
term_part.joiner = " " .. term_conj .. " "
else
term_part.joiner = ", " .. term_conj .. " "
end
else
term_part.joiner = ", "
end
else
-- Single term
term_part.joiner = ""
end
end
end
-- Determine container punctuation based on what comes next
if part.continuation then
-- Has continuation
part.punctuation = ","
-- Recursively analyze continuation
analyze_punctuation(part.continuation, false)
elseif is_last then
-- Last container at this level (may still continue in part.continuation)
part.punctuation = "."
elseif next_part and next_part.new_sentence then
-- Next container starts a new sentence
part.punctuation = "."
elseif next_part and next_part.separate_clause then
-- Next container is a separate clause
part.punctuation = ","
else
-- Not last, next is joined with the conjunction
-- Containers use repeated conjunction style: "A, yan jî B, yan jî C"
part.punctuation = ","
end
-- Determine joiner to next part
-- Containers use the repeated conjunction between each
-- Custom conjunction can be specified via conj modifier
local container_conj = part.conj or "yan jî" -- Kurdish default
if not is_last then
if next_part and next_part.new_sentence then
-- New sentence
part.joiner = " "
elseif next_part and next_part.separate_clause then
-- Separate clause
part.joiner = " "
else
-- Same sentence: use the custom conjunction, else the default
part.joiner = " " .. container_conj .. " "
end
else
part.joiner = ""
end
-- Determine intro formatting
-- Capitalize if first at top level, OR if this container starts a new sentence
if (is_first and is_toplevel) or part.new_sentence then
part.intro_capitalized = true
part.use_full_intro = true
else
part.intro_capitalized = false
part.use_full_intro = false
end
end
end
-- Assemble text from analyzed tree
local function assemble_text(tree)
if not tree then return "" end
local result = ""
for i, part in ipairs(tree.container_parts) do
if part.type == "etydate" then
result = result .. part.etydate_text
if part.punctuation and part.punctuation ~= "" then
result = result .. part.punctuation
end
if part.etydate_refs and next(part.etydate_refs) then
result = result .. M.references.format_references(part.etydate_refs)
end
if part.joiner and part.joiner ~= "" then
result = result .. part.joiner
end
else
-- Build intro
local intro_text = part.intro_text
local phrase = part.phrase
if part.senseid then
intro_text, phrase = format_sl_senseid_intro(
part.senseid,
part.sl_keyword_text,
part.phrase,
part.intro_capitalized,
part.is_uncertain
)
end
local intro
if part.use_full_intro then
if part.is_uncertain and not part.senseid then
intro = "Mihtemelen " .. phrase
else
intro = intro_text
end
else
if part.is_uncertain and not part.senseid then
intro = "mihtemelen " .. phrase
else
intro = phrase
end
end
result = result .. intro
-- Build terms
if #part.term_parts > 0 then
result = result .. " "
for j, term_part in ipairs(part.term_parts) do
-- Add "possibly" prefix for uncertain terms when there's mixed uncertainty
if part.has_mixed_uncertainty and term_part.is_uncertain then
result = result .. "mihtemelen "
end
result = result .. term_part.text
-- Add joiner between terms
if term_part.joiner ~= "" then
-- Check if joiner contains comma (punctuation)
local comma_pos = term_part.joiner:find(",")
if comma_pos then
-- Add up to and including comma
result = result .. term_part.joiner:sub(1, comma_pos)
-- Add refs after comma
if term_part.refs ~= "" then
result = result .. term_part.refs
end
-- Add rest of joiner
result = result .. term_part.joiner:sub(comma_pos + 1)
else
-- No comma, add refs before joiner
if term_part.refs ~= "" then
result = result .. term_part.refs
end
result = result .. term_part.joiner
end
end
end
-- For the last term, add punctuation then refs
local last_term = part.term_parts[#part.term_parts]
if last_term and last_term.joiner == "" then
if part.punctuation ~= "" then
-- If we have literal text, punctuation goes AFTER it
if part.lit then
-- Add refs first (attached to term)
if last_term.refs ~= "" then
result = result .. last_term.refs
end
-- Add keyword refs
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
-- Add literal text
result = result .. ", literally “" .. part.lit .. "”"
-- Add punctuation
result = result .. part.punctuation
else
-- Normal behavior: punctuation then refs
result = result .. part.punctuation
if last_term.refs ~= "" then
result = result .. last_term.refs
end
-- Add keyword refs after term refs
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
end
else
-- No punctuation
if last_term.refs ~= "" then
result = result .. last_term.refs
end
-- Add keyword refs
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
-- Add literal text if present (even without punctuation)
if part.lit then
result = result .. ", literally “" .. part.lit .. "”"
end
end
end
else
-- No terms, just add punctuation and keyword refs
if part.punctuation ~= "" then
result = result .. part.punctuation
end
-- Add keyword refs even when there are no terms
if part.keyword_refs and part.keyword_refs ~= "" then
result = result .. part.keyword_refs
end
end
-- Add continuation
if part.continuation then
result = result .. " " .. assemble_text(part.continuation)
end
-- Add joiner to next container
if part.joiner ~= "" then
result = result .. part.joiner
end
end
end
return result
end
local text_tree = build_text_tree(data_tree, 1, true, false)
-- Supplements (doublets, etydate, …) are rendered outside the main derivation text tree.
local function assemble_supplements()
if not data_tree.supplements then
return ""
end
local chunks = {}
local pending_trees = {}
local function flush_pending_trees()
local num = #pending_trees
for i, supplement_tree in ipairs(pending_trees) do
analyze_punctuation(supplement_tree, true)
apply_closing_punctuation_override(supplement_tree, i == num)
local chunk = assemble_text(supplement_tree)
if chunk ~= "" then
table.insert(chunks, chunk)
end
end
pending_trees = {}
end
for _, supplement in ipairs(data_tree.supplements) do
local supplement_tree
if supplement.type == "doublet" and supplement.config
and supplement.terms and #supplement.terms > 0 then
local config = supplement.config
local term_parts = {}
for _, term in ipairs(supplement.terms) do
local term_part = build_term_part(term, entry_lang, 1)
if term_part.text ~= "" then
table.insert(term_parts, term_part)
end
end
if #term_parts == 0 then
supplement_tree = nil
else
supplement_tree = {
type = "tree",
container_parts = {
{
type = "doublet",
intro_text = config.text,
phrase = config.phrase,
term_parts = term_parts,
conj = config.default_conj or "û",
new_sentence = true,
},
},
depth = 1,
}
end
elseif supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then
supplement_tree = {
type = "tree",
container_parts = {
{
type = "etydate",
etydate_text = supplement.etydate_text,
etydate_refs = supplement.etydate_refs,
new_sentence = true,
},
},
depth = 1,
}
end
if supplement_tree then
table.insert(pending_trees, supplement_tree)
end
end
flush_pending_trees()
return table.concat(chunks, " ")
end
if not text_tree then
local supplement_text = assemble_supplements()
if supplement_text == "" then
if stop_at_lang then
return "", { stop_lang_reached = false }
end
return ""
end
if stop_at_lang then
return supplement_text, { stop_lang_reached = false }
end
return supplement_text
end
local rendered = ""
if text_tree then
check_complexity(text_tree)
analyze_punctuation(text_tree, true)
apply_closing_punctuation_override(text_tree, not has_supplements())
rendered = assemble_text(text_tree)
end
local supplement_text = assemble_supplements()
if supplement_text ~= "" then
if rendered ~= "" then
rendered = rendered .. " " .. supplement_text
else
rendered = supplement_text
end
end
if stop_at_lang then
return rendered, { stop_lang_reached = stop_lang_reached }
end
return rendered
end
return export
a0p4o3zxiq72k8j0pbxt1kv2umqzfl4
Modul:etymon/data/ceribandin
828
1359187
6532037
6531856
2026-09-18T16:34:45Z
Wikihez
7344
sync test copy
6532037
Scribunto
text/plain
local export = {}
export.STATUS = {
OK = "ok",
INLINE = "inline",
MISSING = "missing",
REDLINK = "redlink",
AMBIGUOUS = "ambiguous",
}
export.TRANSITIVE = {
ALWAYS = "always", -- always recurse into children
NEVER = "never", -- never recurse into children
CROSS_LANG = "cross_lang", -- only recurse when source lang differs from target lang (but pos chain continues)
CROSS_LANG_NO_INTERNAL_SOURCE = "cross_lang_no_internal_source", -- like CROSS_LANG, but source breaks for internal derivations in the same language context
}
-- Deep merge tables (nested tables are merged recursively, later values override earlier)
local function deep_merge(...)
local result = {}
for _, t in ipairs({ ... }) do
for k, v in pairs(t) do
if type(v) == "table" and type(result[k]) == "table" then
result[k] = deep_merge(result[k], v)
else
result[k] = v
end
end
end
return result
end
local glossary_page = "Nimînok:Ferhengok"
-- `term` is either a bare anchor on the glossary page or a full "Rûpel#lenger".
local function make_glossary_link(term, display_text)
if not term then return display_text end
local page, anchor = term:match("^(.-)#(.+)$")
if not page then
page, anchor = glossary_page, term
end
return "[[" .. page .. "#" .. anchor:gsub(" ", "_") .. "|" .. display_text .. "]]"
end
-- Extract base word and connector from text like "Borrowed from" or "calque of"
local function split_glossary_text(text)
for _, pattern in ipairs({ "^(.-)(%s+[Jj][Ii])$", "^(.-)(%s+[Oo][Ff])$", "^(.-)(%s+[Ff][Rr][Oo][Mm])$" }) do
local base, rest = text:match(pattern)
if base then return base, rest end
end
return text, ""
end
local TRANSITIVE = export.TRANSITIVE
local function create_keyword(opts)
local entry = {
is_group = opts.is_group or false,
abbrev = opts.abbrev,
glossary = opts.glossary,
transitive = opts.transitive or TRANSITIVE.ALWAYS, -- default "always"
inherited_chain = opts.inherited_chain or false,
affix_categories = opts.affix_categories or false,
borrowing_type = opts.borrowing_type,
specialized_borrowing = opts.specialized_borrowing,
toplevel_category = opts.toplevel_category,
no_child_categories = opts.no_child_categories or false,
source_category_type = opts.source_category_type,
invisible = (opts.invisible == true and "all") or opts.invisible or false,
pos_override = opts.pos_override,
new_sentence = opts.new_sentence or false,
separate_clause = opts.separate_clause or false,
default_conj = opts.default_conj,
min_etymons = opts.min_etymons,
max_etymons = opts.max_etymons,
term_rules = opts.term_rules,
aliases = opts.aliases,
}
-- Only set text/phrase when visible in text (invisible ~= "all" and ~= "text")
local inv = entry.invisible
if inv ~= "all" and inv ~= "text" then
entry.phrase = opts.phrase
if opts.text then
if opts.glossary then
local base_word, rest = split_glossary_text(opts.text)
entry.text = make_glossary_link(opts.glossary, base_word) .. rest
else
entry.text = opts.text
end
end
end
return entry
end
-- Shared defaults for keyword groups
local DEFAULTS = {
-- Keywords that pass through inheritance chain
inheritance = {
transitive = TRANSITIVE.ALWAYS,
inherited_chain = true,
},
-- Standard transitive derivation
transitive = {
transitive = TRANSITIVE.ALWAYS,
},
-- Standard for internal derivations: transitive across languages, but not within them
internal_derivation = {
transitive = TRANSITIVE.CROSS_LANG,
},
-- Borrowing keywords
borrowing = {
transitive = TRANSITIVE.ALWAYS,
},
-- Affix group keywords (compound words, blends, etc.)
affix_group = {
is_group = true,
min_etymons = 2,
transitive = TRANSITIVE.CROSS_LANG,
affix_categories = true,
},
-- Calque-like keywords (calque, partial calque, semantic loan)
calque_like = {
transitive = TRANSITIVE.NEVER,
no_child_categories = true,
new_sentence = true,
},
-- Non-transitive influence
influence_like = {
transitive = TRANSITIVE.NEVER,
no_child_categories = true,
},
}
export.keywords = {
--
-- Inheritance keywords
--
["from"] = create_keyword(deep_merge(DEFAULTS.inheritance, {
text = "Ji", phrase = "ji",
aliases = { "ji" },
term_rules = { entry_lang = true },
})),
["inherited"] = create_keyword(deep_merge(DEFAULTS.inheritance, {
text = "Mîrasmayî ji",
phrase = "mîrasmayî ji",
glossary = "Wîkîferheng:Etîmolojî#Peyvên mîrasmayî",
aliases = { "inh", "mîrasmayî", "mîr" },
term_rules = {
family = "disallowed",
family_suffix = "; use a specific language.",
ancestor_check = true,
},
})),
--
-- Basic derivation keywords
--
["uder"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Ji",
phrase = "ji",
aliases = { "drşnd" },
toplevel_category = "Dariştinên nediyar",
})),
["derived"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Ji",
phrase = "ji",
abbrev = "drş.",
glossary = "Nimînok:Ferhengok#dariştî",
aliases = { "der", "dariştî", "drş" },
})),
--
-- Affix/compound group keywords
--
["affix"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "Ji",
phrase = "ji",
min_etymons = 1,
aliases = { "af", "qertaf", "qf" },
})),
["blend"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "Têkilkirin ji",
phrase = "têkilkirin ji",
aliases = { "têkilkirin" },
abbrev = "blend",
glossary = "Nimînok:Ferhengok#têkilkirin",
toplevel_category = "Têkilkirin",
})),
["univerbation"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "Ûnîverbasyona",
phrase = "ûnîverbasyona",
abbrev = "univ.",
glossary = "ûnîverbasyon",
toplevel_category = "univerbations",
min_etymons = 1,
aliases = { "univ" },
})),
["vrd-af"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "Vṛddhi derivative of",
phrase = "a vṛddhi derivative of",
abbrev = "vṛd.",
glossary = "vṛddhi derivative",
toplevel_category = "vrddhi derivatives",
})),
["sa-af"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "[[Sanskritic]] formation from",
phrase = "a [[Sanskritic]] formation of",
toplevel_category = "Sanskritic formations",
})),
--
-- Borrowing keywords
--
["bor"] = create_keyword(deep_merge(DEFAULTS.borrowing, {
text = "Deyn ji",
phrase = "deynkirî ji",
abbrev = "deyn.",
glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî",
borrowing_type = "borrowed",
aliases = { "borrowed", "deyn" },
})),
["lbor"] = create_keyword(deep_merge(DEFAULTS.borrowing, {
text = "Deynkirina hînbûyî ji",
phrase = "deynkirina hînbûyî ji",
aliases = { "deynh" },
abbrev = "deynh.",
glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî",
specialized_borrowing = "learned",
})),
["obor"] = create_keyword(deep_merge(DEFAULTS.borrowing, {
text = "Deynkirina ortografîk ji",
phrase = "deynkirina ortografîk ji",
abbrev = "obor.",
glossary = "deynkirina ortografîk",
specialized_borrowing = "orthographic",
})),
["slbor"] = create_keyword(deep_merge(DEFAULTS.borrowing, {
text = "Deynkirina hînbûyî ya qismî ji",
phrase = "deynkirina hînbûyî ya qismî ji",
aliases = { "deynhq" },
abbrev = "deynhq.",
glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî",
specialized_borrowing = "semi-learned",
})),
["ubor"] = create_keyword(deep_merge(DEFAULTS.borrowing, {
text = "Deynkirina neadaptekirî ji",
phrase = "deynkirina neadaptekirî ji",
abbrev = "ubor.",
glossary = "deynkirina neadaptekirî",
specialized_borrowing = "unadapted",
})),
--
-- Calque-like keywords (non-transitive, start new sentence)
--
["calque"] = create_keyword(deep_merge(DEFAULTS.calque_like, {
text = "Wergerandina yekser ji",
phrase = "wergerandina yekser ji",
abbrev = "yekser",
glossary = "Nimînok:Ferhengok#yekser",
specialized_borrowing = "calque",
aliases = { "cal", "clq", "yekser" },
})),
["partial calque"] = create_keyword(deep_merge(DEFAULTS.calque_like, {
text = "Wergerandina yekser a qismî ji",
phrase = "wergerandina yekser a qismî ji",
abbrev = "yekserq.",
glossary = "Nimînok:Ferhengok#yekser",
specialized_borrowing = "partial-calque",
aliases = { "pcal", "yekserqismî", "yekserq" },
})),
["semantic loan"] = create_keyword(deep_merge(DEFAULTS.calque_like, {
text = "Wergirtina maneyê ji",
phrase = "wergirtina maneyê ji",
abbrev = "wer. mane",
glossary = "Wîkîferheng:Etîmolojî#Wergirtina maneyê",
specialized_borrowing = "semantic-loan",
aliases = { "sl", "wergirtin" },
})),
["psm"] = create_keyword(deep_merge(DEFAULTS.calque_like, {
text = "Lihevanîna dengî-maneyî ji",
phrase = "lihevanîna dengî-maneyî ji",
abbrev = "lihevanîn",
glossary = "Wîkîferheng:Etîmolojî#Lihevanîna dengî-maneyî",
specialized_borrowing = "phono-semantic-matching",
aliases = { "phono-semantic matching", "lihevanîn" },
})),
--
-- Influence keywords (non-transitive, separate clause)
--
["influence"] = create_keyword(deep_merge(DEFAULTS.influence_like, {
text = "Di bin tesîra",
phrase = "bin tesîra",
aliases = { "tesîr" },
abbrev = "tesîr.",
glossary = "belavbûn ji zimanekî din",
separate_clause = true,
})),
--
-- Morphological derivation keywords
--
["clipping"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Qusandin ji",
phrase = "qusandin ji",
abbrev = "qusandin",
glossary = "Nimînok:Ferhengok#qusandin",
toplevel_category = "Qusandin",
aliases = { "clip", "qusandin" },
})),
["ellipsis"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Elîpsîza",
phrase = "elîpsîza",
abbrev = "ellip.",
glossary = "elîpsîz",
toplevel_category = "ellipses",
aliases = { "ellip" },
})),
["back-formation"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Paşvesazî ji",
phrase = "paşvesazî ji",
abbrev = "paşvesazî",
glossary = "Nimînok:Ferhengok#paşvesazî",
toplevel_category = "Paşvesazî",
aliases = { "bf", "paşvesazî" },
})),
["nominalization"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Nomînalîzasyona",
phrase = "nomînalîzasyona",
abbrev = "nom.",
glossary = "nomînalîzasyon",
toplevel_category = "nominalizations",
aliases = { "nom" },
})),
["transliteration"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Translîterasyona",
phrase = "translîterasyona",
abbrev = "translit.",
glossary = "translîterasyon",
aliases = { "translit" },
})),
["vrd"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Vṛddhi derivative of",
phrase = "a vṛddhi derivative of",
abbrev = "vṛd.",
glossary = "vṛddhi derivative",
toplevel_category = "vrddhi derivatives",
})),
["apheretic"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Apheretic form of",
phrase = "an apheretic form of",
abbrev = "aph.",
glossary = "apheresis",
aliases = { "apheresis", "aphetic" },
})),
["denominal"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Denominal verb from",
phrase = "denominal verb from",
abbrev = "denom.",
glossary = "denominal",
toplevel_category = "denominal verbs",
aliases = { "denom" },
})),
["deverbal"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Deverbal from",
phrase = "deverbal from",
abbrev = "deverb.",
glossary = "deverbal",
toplevel_category = "deverbals",
})),
["reduplication"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Redûblîcasyona",
phrase = "redûblîcasyona",
abbrev = "redup.",
glossary = "redûblîcasyon",
toplevel_category = "reduplications",
aliases = { "redup" },
})),
["abbreviation"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Kurtkirina",
phrase = "kurtkirina",
abbrev = "kurt.",
aliases = { "abbr", "abbrev", "kurtkirin" },
})),
["syllabic abbreviation"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Syllabic abbreviation of",
phrase = "syllabic abbreviation of",
abbrev = "syl. abbr.",
glossary = "syllabic abbreviation",
aliases = { "sylabbr", "sylabbrev" },
})),
["acronym"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Akronîma",
phrase = "akronîma",
abbrev = "acronym",
glossary = "akronîm",
aliases = { "acro" },
})),
["initialism"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Înîtîalîzma",
phrase = "înîtîalîzma",
abbrev = "init.",
glossary = "înîtîalîzm",
aliases = { "init" },
})),
["metathesis"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Metateza",
phrase = "metateza",
abbrev = "meta.",
glossary = "metatez",
toplevel_category = "peyvên dariştî bi riya metatezê",
aliases = { "meta" },
})),
--
-- Invisible keywords (no text output)
--
["root"] = create_keyword {
transitive = TRANSITIVE.ALWAYS,
invisible = "all",
pos_override = "root",
aliases = { "reh" },
},
["afeq"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "Ji",
phrase = "ji",
transitive = TRANSITIVE.NEVER,
min_etymons = 1,
invisible = "all",
})),
}
-- Template-parameter supplements.
export.supplements = {
doublet = {
text = "Cotreha",
phrase = "cotreha",
glossary = "Nimînok:Ferhengok#cotreh",
toplevel_category = "Cotreh",
default_conj = "û",
term_rules = {
entry_lang = true,
require_term = true,
disallow = { "suppress", "unknown", "family" },
},
},
}
local aliases_to_register = {}
local canonical_aliases = {}
-- Map every keyword (canonical or alias) to its canonical form for consistent checks and tracking.
export.keyword_canonical = {}
for name, keyword_data in pairs(export.keywords) do
export.keyword_canonical[name] = name
if keyword_data.aliases then
canonical_aliases[name] = keyword_data.aliases
for _, alias in ipairs(keyword_data.aliases) do
if export.keywords[alias] then
error("Alias '" ..
alias .. "' defined in keyword '" .. name .. "' collides with existing keyword '" .. alias .. "'.")
end
if aliases_to_register[alias] then
error("Alias '" ..
alias .. "' defined in keyword '" .. name .. "' is already claimed by another keyword.")
end
aliases_to_register[alias] = keyword_data
export.keyword_canonical[alias] = name
end
keyword_data.aliases = nil
end
end
for alias, data in pairs(aliases_to_register) do
export.keywords[alias] = data
end
--
-- Language exception presets
--
local EXCEPTION_PRESETS = {
-- Fully disallowed: no tree, no text, no categories
disallowed = {
disallow = { tree = true, text = true },
suppress_categories = true,
},
-- Suppress transliteration only
no_translit = {
suppress_tr = true,
},
-- Suppress all categories only
no_categories = {
suppress_categories = true,
},
}
--[=[
Available exception options:
disallow = { Related options for disallowing output:
tree Disallow etymology trees for this language
text Disallow etymology text generation for this language
ref Reference link shown when tree/text is disallowed
}
suppress_tr Suppress transliteration in links
suppress_categories Suppress all category generation
normalize_to Normalize language code to a different code
normalize_from_families Apply normalization to languages in these families
normalize_exclude_families Exclude these families from normalization
keyword_overrides Per-keyword categorisation overrides (e.g. { ["af"] = { transitive = TRANSITIVE.NEVER } })
]=]
local function create_exception(preset, overrides)
local base = preset and EXCEPTION_PRESETS[preset] or {}
return deep_merge(base, overrides or {})
end
export.config = {
lang_exceptions = {
["zh"] = create_exception("disallowed", {
disallow = { ref = "[[Wiktionary:Beer parlour/2025/May#Template:etymon for Chinese]]" },
suppress_tr = true,
normalize_to = "zh",
normalize_from_families = { "zhx" },
normalize_exclude_families = { "qfa-cnt" },
}),
},
}
-- Supported codes for the nominalization <g:code> modifier (subset of common gender/number-style codes)
-- Codes accepted by the <g:code> modifier on a nominalization. These are the codes of
-- [[Modul:gender and number/data]], with that module's own Kurdish wording -- the same value is
-- passed through to it for the gender tag, so anything valid here is valid there. A two-letter
-- gender+number code that is not listed ("np", "mp") is decomposed automatically below.
export.nominalization_g_codes = {
-- Cins
["n"] = "nêr",
["m"] = "mê",
["f"] = "mê",
["nt"] = "nêtar",
["c"] = "giştî",
["g"] = "giştî",
["cnt"] = "cinsê-notr",
-- Hejmar
["y"] = "yekjimar",
["s"] = "yekjimar",
["p"] = "pirjimar",
["d"] = "dual",
-- Kodên hevedudanî yên [[Modul:gender and number/data]]
["mf"] = "nêr an mê",
["mn"] = "mê an nêr",
["mnt"] = "mê an nêtar",
}
--
-- Propagate keyword overrides to aliases
--
if export.config.lang_exceptions then
for lang_code, exception in pairs(export.config.lang_exceptions) do
if exception.keyword_overrides then
for canonical, aliases in pairs(canonical_aliases) do
if exception.keyword_overrides[canonical] then
local override_data = exception.keyword_overrides[canonical]
for _, alias in ipairs(aliases) do
if not exception.keyword_overrides[alias] then
exception.keyword_overrides[alias] = override_data
end
end
end
end
end
end
end
return export
4jqasrug1e75idczdq2t4w9qgohmy29
6532038
6532037
2026-09-18T16:39:06Z
Wikihez
7344
sync test copy
6532038
Scribunto
text/plain
local export = {}
export.STATUS = {
OK = "ok",
INLINE = "inline",
MISSING = "missing",
REDLINK = "redlink",
AMBIGUOUS = "ambiguous",
}
export.TRANSITIVE = {
ALWAYS = "always", -- always recurse into children
NEVER = "never", -- never recurse into children
CROSS_LANG = "cross_lang", -- only recurse when source lang differs from target lang (but pos chain continues)
CROSS_LANG_NO_INTERNAL_SOURCE = "cross_lang_no_internal_source", -- like CROSS_LANG, but source breaks for internal derivations in the same language context
}
-- Deep merge tables (nested tables are merged recursively, later values override earlier)
local function deep_merge(...)
local result = {}
for _, t in ipairs({ ... }) do
for k, v in pairs(t) do
if type(v) == "table" and type(result[k]) == "table" then
result[k] = deep_merge(result[k], v)
else
result[k] = v
end
end
end
return result
end
local glossary_page = "Nimînok:Ferhengok"
-- `term` is either a bare anchor on the glossary page or a full "Rûpel#lenger".
local function make_glossary_link(term, display_text)
if not term then return display_text end
local page, anchor = term:match("^(.-)#(.+)$")
if not page then
page, anchor = glossary_page, term
end
return "[[" .. page .. "#" .. anchor:gsub(" ", "_") .. "|" .. display_text .. "]]"
end
-- Extract base word and connector from text like "Borrowed from" or "calque of"
local function split_glossary_text(text)
for _, pattern in ipairs({ "^(.-)(%s+[Jj][Ii])$", "^(.-)(%s+[Oo][Ff])$", "^(.-)(%s+[Ff][Rr][Oo][Mm])$" }) do
local base, rest = text:match(pattern)
if base then return base, rest end
end
return text, ""
end
local TRANSITIVE = export.TRANSITIVE
local function create_keyword(opts)
local entry = {
is_group = opts.is_group or false,
abbrev = opts.abbrev,
glossary = opts.glossary,
transitive = opts.transitive or TRANSITIVE.ALWAYS, -- default "always"
inherited_chain = opts.inherited_chain or false,
affix_categories = opts.affix_categories or false,
borrowing_type = opts.borrowing_type,
specialized_borrowing = opts.specialized_borrowing,
toplevel_category = opts.toplevel_category,
no_child_categories = opts.no_child_categories or false,
source_category_type = opts.source_category_type,
invisible = (opts.invisible == true and "all") or opts.invisible or false,
pos_override = opts.pos_override,
new_sentence = opts.new_sentence or false,
separate_clause = opts.separate_clause or false,
default_conj = opts.default_conj,
min_etymons = opts.min_etymons,
max_etymons = opts.max_etymons,
term_rules = opts.term_rules,
aliases = opts.aliases,
}
-- Only set text/phrase when visible in text (invisible ~= "all" and ~= "text")
local inv = entry.invisible
if inv ~= "all" and inv ~= "text" then
entry.phrase = opts.phrase
if opts.text then
if opts.glossary then
local base_word, rest = split_glossary_text(opts.text)
entry.text = make_glossary_link(opts.glossary, base_word) .. rest
else
entry.text = opts.text
end
end
end
return entry
end
-- Shared defaults for keyword groups
local DEFAULTS = {
-- Keywords that pass through inheritance chain
inheritance = {
transitive = TRANSITIVE.ALWAYS,
inherited_chain = true,
},
-- Standard transitive derivation
transitive = {
transitive = TRANSITIVE.ALWAYS,
},
-- Standard for internal derivations: transitive across languages, but not within them
internal_derivation = {
transitive = TRANSITIVE.CROSS_LANG,
},
-- Borrowing keywords
borrowing = {
transitive = TRANSITIVE.ALWAYS,
},
-- Affix group keywords (compound words, blends, etc.)
affix_group = {
is_group = true,
min_etymons = 2,
transitive = TRANSITIVE.CROSS_LANG,
affix_categories = true,
},
-- Calque-like keywords (calque, partial calque, semantic loan)
calque_like = {
transitive = TRANSITIVE.NEVER,
no_child_categories = true,
new_sentence = true,
},
-- Non-transitive influence
influence_like = {
transitive = TRANSITIVE.NEVER,
no_child_categories = true,
},
}
export.keywords = {
--
-- Inheritance keywords
--
["from"] = create_keyword(deep_merge(DEFAULTS.inheritance, {
text = "Ji", phrase = "ji",
aliases = { "ji" },
term_rules = { entry_lang = true },
})),
["inherited"] = create_keyword(deep_merge(DEFAULTS.inheritance, {
text = "Mîrasmayî ji",
phrase = "mîrasmayî ji",
glossary = "Wîkîferheng:Etîmolojî#Peyvên mîrasmayî",
aliases = { "inh", "mîrasmayî", "mîr" },
term_rules = {
family = "disallowed",
family_suffix = "; use a specific language.",
ancestor_check = true,
},
})),
--
-- Basic derivation keywords
--
["uder"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Ji",
phrase = "ji",
aliases = { "drşnd" },
toplevel_category = "Dariştinên nediyar",
})),
["derived"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Ji",
phrase = "ji",
abbrev = "drş.",
glossary = "Nimînok:Ferhengok#dariştî",
aliases = { "der", "dariştî", "drş" },
})),
--
-- Affix/compound group keywords
--
["affix"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "Ji",
phrase = "ji",
min_etymons = 1,
aliases = { "af", "qertaf", "qf" },
})),
["blend"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "Têkilkirin ji",
phrase = "têkilkirin ji",
aliases = { "têkilkirin" },
abbrev = "blend",
glossary = "Nimînok:Ferhengok#têkilkirin",
toplevel_category = "Têkilkirin",
})),
["univerbation"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "Ûnîverbasyona",
phrase = "ûnîverbasyona",
abbrev = "ûnîv.",
glossary = "ûnîverbasyon",
toplevel_category = "univerbations",
min_etymons = 1,
aliases = { "univ", "ûnîverbasyon", "ûnîv" },
})),
["vrd-af"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "Vṛddhi derivative of",
phrase = "a vṛddhi derivative of",
abbrev = "vṛd.",
glossary = "vṛddhi derivative",
toplevel_category = "vrddhi derivatives",
})),
["sa-af"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "[[Sanskritic]] formation from",
phrase = "a [[Sanskritic]] formation of",
toplevel_category = "Sanskritic formations",
})),
--
-- Borrowing keywords
--
["bor"] = create_keyword(deep_merge(DEFAULTS.borrowing, {
text = "Deyn ji",
phrase = "deynkirî ji",
abbrev = "deyn.",
glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî",
borrowing_type = "borrowed",
aliases = { "borrowed", "deyn" },
})),
["lbor"] = create_keyword(deep_merge(DEFAULTS.borrowing, {
text = "Deynkirina hînbûyî ji",
phrase = "deynkirina hînbûyî ji",
aliases = { "deynh" },
abbrev = "deynh.",
glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî",
specialized_borrowing = "learned",
})),
["obor"] = create_keyword(deep_merge(DEFAULTS.borrowing, {
text = "Deynkirina ortografîk ji",
phrase = "deynkirina ortografîk ji",
abbrev = "deynort.",
glossary = "deynkirina ortografîk",
specialized_borrowing = "orthographic",
aliases = { "deynort" },
})),
["slbor"] = create_keyword(deep_merge(DEFAULTS.borrowing, {
text = "Deynkirina hînbûyî ya qismî ji",
phrase = "deynkirina hînbûyî ya qismî ji",
aliases = { "deynhq" },
abbrev = "deynhq.",
glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî",
specialized_borrowing = "semi-learned",
})),
["ubor"] = create_keyword(deep_merge(DEFAULTS.borrowing, {
text = "Deynkirina neadaptekirî ji",
phrase = "deynkirina neadaptekirî ji",
abbrev = "deynne.",
glossary = "deynkirina neadaptekirî",
specialized_borrowing = "unadapted",
aliases = { "deynne" },
})),
--
-- Calque-like keywords (non-transitive, start new sentence)
--
["calque"] = create_keyword(deep_merge(DEFAULTS.calque_like, {
text = "Wergerandina yekser ji",
phrase = "wergerandina yekser ji",
abbrev = "yekser",
glossary = "Nimînok:Ferhengok#yekser",
specialized_borrowing = "calque",
aliases = { "cal", "clq", "yekser" },
})),
["partial calque"] = create_keyword(deep_merge(DEFAULTS.calque_like, {
text = "Wergerandina yekser a qismî ji",
phrase = "wergerandina yekser a qismî ji",
abbrev = "yekserq.",
glossary = "Nimînok:Ferhengok#yekser",
specialized_borrowing = "partial-calque",
aliases = { "pcal", "yekserqismî", "yekserq" },
})),
["semantic loan"] = create_keyword(deep_merge(DEFAULTS.calque_like, {
text = "Wergirtina maneyê ji",
phrase = "wergirtina maneyê ji",
abbrev = "wer. mane",
glossary = "Wîkîferheng:Etîmolojî#Wergirtina maneyê",
specialized_borrowing = "semantic-loan",
aliases = { "sl", "wergirtin" },
})),
["psm"] = create_keyword(deep_merge(DEFAULTS.calque_like, {
text = "Lihevanîna dengî-maneyî ji",
phrase = "lihevanîna dengî-maneyî ji",
abbrev = "lihevanîn",
glossary = "Wîkîferheng:Etîmolojî#Lihevanîna dengî-maneyî",
specialized_borrowing = "phono-semantic-matching",
aliases = { "phono-semantic matching", "lihevanîn" },
})),
--
-- Influence keywords (non-transitive, separate clause)
--
["influence"] = create_keyword(deep_merge(DEFAULTS.influence_like, {
text = "Di bin tesîra",
phrase = "bin tesîra",
aliases = { "tesîr" },
abbrev = "tesîr.",
glossary = "belavbûn ji zimanekî din",
separate_clause = true,
})),
--
-- Morphological derivation keywords
--
["clipping"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Qusandin ji",
phrase = "qusandin ji",
abbrev = "qusandin",
glossary = "Nimînok:Ferhengok#qusandin",
toplevel_category = "Qusandin",
aliases = { "clip", "qusandin" },
})),
["ellipsis"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Elîpsîza",
phrase = "elîpsîza",
abbrev = "elîp.",
glossary = "elîpsîz",
toplevel_category = "ellipses",
aliases = { "ellip", "elîpsîz", "elîp" },
})),
["back-formation"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Paşvesazî ji",
phrase = "paşvesazî ji",
abbrev = "paşvesazî",
glossary = "Nimînok:Ferhengok#paşvesazî",
toplevel_category = "Paşvesazî",
aliases = { "bf", "paşvesazî" },
})),
["nominalization"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Nomînalîzasyona",
phrase = "nomînalîzasyona",
abbrev = "nomîn.",
glossary = "nomînalîzasyon",
toplevel_category = "nominalizations",
aliases = { "nom", "nomînalîzasyon", "nomîn" },
})),
["transliteration"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Translîterasyona",
phrase = "translîterasyona",
abbrev = "translît.",
glossary = "translîterasyon",
aliases = { "translit", "translîterasyon", "translît" },
})),
["vrd"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Vṛddhi derivative of",
phrase = "a vṛddhi derivative of",
abbrev = "vṛd.",
glossary = "vṛddhi derivative",
toplevel_category = "vrddhi derivatives",
})),
["apheretic"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Apheretic form of",
phrase = "an apheretic form of",
abbrev = "aph.",
glossary = "apheresis",
aliases = { "apheresis", "aphetic" },
})),
["denominal"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Denominal verb from",
phrase = "denominal verb from",
abbrev = "denom.",
glossary = "denominal",
toplevel_category = "denominal verbs",
aliases = { "denom" },
})),
["deverbal"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Deverbal from",
phrase = "deverbal from",
abbrev = "deverb.",
glossary = "deverbal",
toplevel_category = "deverbals",
})),
["reduplication"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Redûblîcasyona",
phrase = "redûblîcasyona",
abbrev = "redûb.",
glossary = "redûblîcasyon",
toplevel_category = "reduplications",
aliases = { "redup", "redûblîcasyon", "redûb" },
})),
["abbreviation"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Kurtkirina",
phrase = "kurtkirina",
abbrev = "kurt.",
aliases = { "abbr", "abbrev", "kurtkirin" },
})),
["syllabic abbreviation"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Syllabic abbreviation of",
phrase = "syllabic abbreviation of",
abbrev = "syl. abbr.",
glossary = "syllabic abbreviation",
aliases = { "sylabbr", "sylabbrev" },
})),
["acronym"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Akronîma",
phrase = "akronîma",
abbrev = "akronîm",
glossary = "akronîm",
aliases = { "acro", "akronîm" },
})),
["initialism"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Înîtîalîzma",
phrase = "înîtîalîzma",
abbrev = "înît.",
glossary = "înîtîalîzm",
aliases = { "init", "înîtîalîzm", "înît" },
})),
["metathesis"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Metateza",
phrase = "metateza",
abbrev = "meta.",
glossary = "metatez",
toplevel_category = "peyvên dariştî bi riya metatezê",
aliases = { "meta", "metatez" },
})),
--
-- Invisible keywords (no text output)
--
["root"] = create_keyword {
transitive = TRANSITIVE.ALWAYS,
invisible = "all",
pos_override = "root",
aliases = { "reh" },
},
["afeq"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "Ji",
phrase = "ji",
transitive = TRANSITIVE.NEVER,
min_etymons = 1,
invisible = "all",
})),
}
-- Template-parameter supplements.
export.supplements = {
doublet = {
text = "Cotreha",
phrase = "cotreha",
glossary = "Nimînok:Ferhengok#cotreh",
toplevel_category = "Cotreh",
default_conj = "û",
term_rules = {
entry_lang = true,
require_term = true,
disallow = { "suppress", "unknown", "family" },
},
},
}
local aliases_to_register = {}
local canonical_aliases = {}
-- Map every keyword (canonical or alias) to its canonical form for consistent checks and tracking.
export.keyword_canonical = {}
for name, keyword_data in pairs(export.keywords) do
export.keyword_canonical[name] = name
if keyword_data.aliases then
canonical_aliases[name] = keyword_data.aliases
for _, alias in ipairs(keyword_data.aliases) do
if export.keywords[alias] then
error("Alias '" ..
alias .. "' defined in keyword '" .. name .. "' collides with existing keyword '" .. alias .. "'.")
end
if aliases_to_register[alias] then
error("Alias '" ..
alias .. "' defined in keyword '" .. name .. "' is already claimed by another keyword.")
end
aliases_to_register[alias] = keyword_data
export.keyword_canonical[alias] = name
end
keyword_data.aliases = nil
end
end
for alias, data in pairs(aliases_to_register) do
export.keywords[alias] = data
end
--
-- Language exception presets
--
local EXCEPTION_PRESETS = {
-- Fully disallowed: no tree, no text, no categories
disallowed = {
disallow = { tree = true, text = true },
suppress_categories = true,
},
-- Suppress transliteration only
no_translit = {
suppress_tr = true,
},
-- Suppress all categories only
no_categories = {
suppress_categories = true,
},
}
--[=[
Available exception options:
disallow = { Related options for disallowing output:
tree Disallow etymology trees for this language
text Disallow etymology text generation for this language
ref Reference link shown when tree/text is disallowed
}
suppress_tr Suppress transliteration in links
suppress_categories Suppress all category generation
normalize_to Normalize language code to a different code
normalize_from_families Apply normalization to languages in these families
normalize_exclude_families Exclude these families from normalization
keyword_overrides Per-keyword categorisation overrides (e.g. { ["af"] = { transitive = TRANSITIVE.NEVER } })
]=]
local function create_exception(preset, overrides)
local base = preset and EXCEPTION_PRESETS[preset] or {}
return deep_merge(base, overrides or {})
end
export.config = {
lang_exceptions = {
["zh"] = create_exception("disallowed", {
disallow = { ref = "[[Wiktionary:Beer parlour/2025/May#Template:etymon for Chinese]]" },
suppress_tr = true,
normalize_to = "zh",
normalize_from_families = { "zhx" },
normalize_exclude_families = { "qfa-cnt" },
}),
},
}
-- Supported codes for the nominalization <g:code> modifier (subset of common gender/number-style codes)
-- Codes accepted by the <g:code> modifier on a nominalization. These are the codes of
-- [[Modul:gender and number/data]], with that module's own Kurdish wording -- the same value is
-- passed through to it for the gender tag, so anything valid here is valid there. A two-letter
-- gender+number code that is not listed ("np", "mp") is decomposed automatically below.
export.nominalization_g_codes = {
-- Cins
["n"] = "nêr",
["m"] = "mê",
["f"] = "mê",
["nt"] = "nêtar",
["c"] = "giştî",
["g"] = "giştî",
["cnt"] = "cinsê-notr",
-- Hejmar
["y"] = "yekjimar",
["s"] = "yekjimar",
["p"] = "pirjimar",
["d"] = "dual",
-- Kodên hevedudanî yên [[Modul:gender and number/data]]
["mf"] = "nêr an mê",
["mn"] = "mê an nêr",
["mnt"] = "mê an nêtar",
}
--
-- Propagate keyword overrides to aliases
--
if export.config.lang_exceptions then
for lang_code, exception in pairs(export.config.lang_exceptions) do
if exception.keyword_overrides then
for canonical, aliases in pairs(canonical_aliases) do
if exception.keyword_overrides[canonical] then
local override_data = exception.keyword_overrides[canonical]
for _, alias in ipairs(aliases) do
if not exception.keyword_overrides[alias] then
exception.keyword_overrides[alias] = override_data
end
end
end
end
end
end
end
return export
gq7pkwytx2usrb5n6ojbcvtd7c42m7p
6532041
6532038
2026-09-18T16:46:35Z
Wikihez
7344
sync test copy
6532041
Scribunto
text/plain
local export = {}
export.STATUS = {
OK = "ok",
INLINE = "inline",
MISSING = "missing",
REDLINK = "redlink",
AMBIGUOUS = "ambiguous",
}
export.TRANSITIVE = {
ALWAYS = "always", -- always recurse into children
NEVER = "never", -- never recurse into children
CROSS_LANG = "cross_lang", -- only recurse when source lang differs from target lang (but pos chain continues)
CROSS_LANG_NO_INTERNAL_SOURCE = "cross_lang_no_internal_source", -- like CROSS_LANG, but source breaks for internal derivations in the same language context
}
-- Deep merge tables (nested tables are merged recursively, later values override earlier)
local function deep_merge(...)
local result = {}
for _, t in ipairs({ ... }) do
for k, v in pairs(t) do
if type(v) == "table" and type(result[k]) == "table" then
result[k] = deep_merge(result[k], v)
else
result[k] = v
end
end
end
return result
end
local glossary_page = "Nimînok:Ferhengok"
-- `term` is either a bare anchor on the glossary page or a full "Rûpel#lenger".
local function make_glossary_link(term, display_text)
if not term then return display_text end
local page, anchor = term:match("^(.-)#(.+)$")
if not page then
page, anchor = glossary_page, term
end
return "[[" .. page .. "#" .. anchor:gsub(" ", "_") .. "|" .. display_text .. "]]"
end
-- Extract base word and connector from text like "Borrowed from" or "calque of"
local function split_glossary_text(text)
for _, pattern in ipairs({ "^(.-)(%s+[Jj][Ii])$", "^(.-)(%s+[Oo][Ff])$", "^(.-)(%s+[Ff][Rr][Oo][Mm])$" }) do
local base, rest = text:match(pattern)
if base then return base, rest end
end
return text, ""
end
local TRANSITIVE = export.TRANSITIVE
local function create_keyword(opts)
local entry = {
is_group = opts.is_group or false,
abbrev = opts.abbrev,
glossary = opts.glossary,
transitive = opts.transitive or TRANSITIVE.ALWAYS, -- default "always"
inherited_chain = opts.inherited_chain or false,
affix_categories = opts.affix_categories or false,
borrowing_type = opts.borrowing_type,
specialized_borrowing = opts.specialized_borrowing,
toplevel_category = opts.toplevel_category,
no_child_categories = opts.no_child_categories or false,
source_category_type = opts.source_category_type,
invisible = (opts.invisible == true and "all") or opts.invisible or false,
pos_override = opts.pos_override,
new_sentence = opts.new_sentence or false,
separate_clause = opts.separate_clause or false,
default_conj = opts.default_conj,
min_etymons = opts.min_etymons,
max_etymons = opts.max_etymons,
term_rules = opts.term_rules,
aliases = opts.aliases,
}
-- Only set text/phrase when visible in text (invisible ~= "all" and ~= "text")
local inv = entry.invisible
if inv ~= "all" and inv ~= "text" then
entry.phrase = opts.phrase
if opts.text then
if opts.glossary then
local base_word, rest = split_glossary_text(opts.text)
entry.text = make_glossary_link(opts.glossary, base_word) .. rest
else
entry.text = opts.text
end
end
end
return entry
end
-- Shared defaults for keyword groups
local DEFAULTS = {
-- Keywords that pass through inheritance chain
inheritance = {
transitive = TRANSITIVE.ALWAYS,
inherited_chain = true,
},
-- Standard transitive derivation
transitive = {
transitive = TRANSITIVE.ALWAYS,
},
-- Standard for internal derivations: transitive across languages, but not within them
internal_derivation = {
transitive = TRANSITIVE.CROSS_LANG,
},
-- Borrowing keywords
borrowing = {
transitive = TRANSITIVE.ALWAYS,
},
-- Affix group keywords (compound words, blends, etc.)
affix_group = {
is_group = true,
min_etymons = 2,
transitive = TRANSITIVE.CROSS_LANG,
affix_categories = true,
},
-- Calque-like keywords (calque, partial calque, semantic loan)
calque_like = {
transitive = TRANSITIVE.NEVER,
no_child_categories = true,
new_sentence = true,
},
-- Non-transitive influence
influence_like = {
transitive = TRANSITIVE.NEVER,
no_child_categories = true,
},
}
export.keywords = {
--
-- Inheritance keywords
--
["from"] = create_keyword(deep_merge(DEFAULTS.inheritance, {
text = "Ji", phrase = "ji",
aliases = { "ji" },
term_rules = { entry_lang = true },
})),
["inherited"] = create_keyword(deep_merge(DEFAULTS.inheritance, {
text = "Mîrasmayî ji",
phrase = "mîrasmayî ji",
glossary = "Wîkîferheng:Etîmolojî#Peyvên mîrasmayî",
aliases = { "inh", "mîrasmayî", "mîr" },
term_rules = {
family = "disallowed",
family_suffix = "; use a specific language.",
ancestor_check = true,
},
})),
--
-- Basic derivation keywords
--
["uder"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Ji",
phrase = "ji",
aliases = { "drşnd" },
toplevel_category = "Dariştinên nediyar",
})),
["derived"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Ji",
phrase = "ji",
abbrev = "drş.",
glossary = "Nimînok:Ferhengok#dariştî",
aliases = { "der", "dariştî", "drş" },
})),
--
-- Affix/compound group keywords
--
["affix"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "Ji",
phrase = "ji",
min_etymons = 1,
aliases = { "af", "qertaf", "qf" },
})),
["blend"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "Têkilkirin ji",
phrase = "têkilkirin ji",
aliases = { "têkilkirin" },
abbrev = "blend",
glossary = "Nimînok:Ferhengok#têkilkirin",
toplevel_category = "Têkilkirin",
})),
["univerbation"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "Ûnîverbasyona",
phrase = "ûnîverbasyona",
abbrev = "ûnîv.",
glossary = "ûnîverbasyon",
toplevel_category = "univerbations",
min_etymons = 1,
aliases = { "univ", "ûnîverbasyon", "ûnîv" },
})),
["vrd-af"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "Vṛddhi derivative of",
phrase = "a vṛddhi derivative of",
abbrev = "vṛd.",
glossary = "vṛddhi derivative",
toplevel_category = "vrddhi derivatives",
})),
["sa-af"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "[[Sanskritic]] formation from",
phrase = "a [[Sanskritic]] formation of",
toplevel_category = "Sanskritic formations",
})),
--
-- Borrowing keywords
--
["bor"] = create_keyword(deep_merge(DEFAULTS.borrowing, {
text = "Deyn ji",
phrase = "deynkirî ji",
abbrev = "deyn.",
glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî",
borrowing_type = "borrowed",
aliases = { "borrowed", "deyn" },
})),
["lbor"] = create_keyword(deep_merge(DEFAULTS.borrowing, {
text = "Deynkirina hînbûyî ji",
phrase = "deynkirina hînbûyî ji",
aliases = { "deynh" },
abbrev = "deynh.",
glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî",
specialized_borrowing = "learned",
})),
["obor"] = create_keyword(deep_merge(DEFAULTS.borrowing, {
text = "Deynkirina ortografîk ji",
phrase = "deynkirina ortografîk ji",
abbrev = "deynort.",
glossary = "deynkirina ortografîk",
specialized_borrowing = "orthographic",
aliases = { "deynort" },
})),
["slbor"] = create_keyword(deep_merge(DEFAULTS.borrowing, {
text = "Deynkirina hînbûyî ya qismî ji",
phrase = "deynkirina hînbûyî ya qismî ji",
aliases = { "deynhq" },
abbrev = "deynhq.",
glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî",
specialized_borrowing = "semi-learned",
})),
["ubor"] = create_keyword(deep_merge(DEFAULTS.borrowing, {
text = "Deynkirina neadaptekirî ji",
phrase = "deynkirina neadaptekirî ji",
abbrev = "deynne.",
glossary = "deynkirina neadaptekirî",
specialized_borrowing = "unadapted",
aliases = { "deynne" },
})),
--
-- Calque-like keywords (non-transitive, start new sentence)
--
["calque"] = create_keyword(deep_merge(DEFAULTS.calque_like, {
text = "Wergerandina yekser ji",
phrase = "wergerandina yekser ji",
abbrev = "yekser",
glossary = "Nimînok:Ferhengok#yekser",
specialized_borrowing = "calque",
aliases = { "cal", "clq", "yekser" },
})),
["partial calque"] = create_keyword(deep_merge(DEFAULTS.calque_like, {
text = "Wergerandina yekser a qismî ji",
phrase = "wergerandina yekser a qismî ji",
abbrev = "yekserq.",
glossary = "Nimînok:Ferhengok#yekser",
specialized_borrowing = "partial-calque",
aliases = { "pcal", "yekserqismî", "yekserq" },
})),
["semantic loan"] = create_keyword(deep_merge(DEFAULTS.calque_like, {
text = "Wergirtina maneyê ji",
phrase = "wergirtina maneyê ji",
abbrev = "wer. mane",
glossary = "Wîkîferheng:Etîmolojî#Wergirtina maneyê",
specialized_borrowing = "semantic-loan",
aliases = { "sl", "wergirtin" },
})),
["psm"] = create_keyword(deep_merge(DEFAULTS.calque_like, {
text = "Lihevanîna dengî-maneyî ji",
phrase = "lihevanîna dengî-maneyî ji",
abbrev = "lihevanîn",
glossary = "Wîkîferheng:Etîmolojî#Lihevanîna dengî-maneyî",
specialized_borrowing = "phono-semantic-matching",
aliases = { "phono-semantic matching", "lihevanîn" },
})),
--
-- Influence keywords (non-transitive, separate clause)
--
["influence"] = create_keyword(deep_merge(DEFAULTS.influence_like, {
text = "Di bin tesîra",
phrase = "bin tesîra",
aliases = { "tesîr" },
abbrev = "tesîr.",
glossary = "belavbûn ji zimanekî din",
separate_clause = true,
})),
--
-- Morphological derivation keywords
--
["clipping"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Qusandin ji",
phrase = "qusandin ji",
abbrev = "qusandin",
glossary = "Nimînok:Ferhengok#qusandin",
toplevel_category = "Qusandin",
aliases = { "clip", "qusandin" },
})),
["ellipsis"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Elîpsîza",
phrase = "elîpsîza",
abbrev = "elîp.",
glossary = "elîpsîz",
toplevel_category = "ellipses",
aliases = { "ellip", "elîpsîz", "elîp" },
})),
["back-formation"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Paşvesazî ji",
phrase = "paşvesazî ji",
abbrev = "paşvesazî",
glossary = "Nimînok:Ferhengok#paşvesazî",
toplevel_category = "Paşvesazî",
aliases = { "bf", "paşvesazî" },
})),
["nominalization"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Nomînalîzasyona",
phrase = "nomînalîzasyona",
abbrev = "nomîn.",
glossary = "nomînalîzasyon",
toplevel_category = "nominalizations",
aliases = { "nom", "nomînalîzasyon", "nomîn" },
})),
["transliteration"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Translîterasyona",
phrase = "translîterasyona",
abbrev = "translît.",
glossary = "translîterasyon",
aliases = { "translit", "translîterasyon", "translît" },
})),
["vrd"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Vṛddhi derivative of",
phrase = "a vṛddhi derivative of",
abbrev = "vṛd.",
glossary = "vṛddhi derivative",
toplevel_category = "vrddhi derivatives",
})),
["apheretic"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Apheretic form of",
phrase = "an apheretic form of",
abbrev = "aph.",
glossary = "apheresis",
aliases = { "apheresis", "aphetic" },
})),
["denominal"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Denominal verb from",
phrase = "denominal verb from",
abbrev = "denom.",
glossary = "denominal",
toplevel_category = "denominal verbs",
aliases = { "denom" },
})),
["deverbal"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Deverbal from",
phrase = "deverbal from",
abbrev = "deverb.",
glossary = "deverbal",
toplevel_category = "deverbals",
})),
["reduplication"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Redûblîkasyona",
phrase = "redûblîkasyona",
abbrev = "redûb.",
glossary = "redûblîkasyon",
toplevel_category = "reduplications",
aliases = { "redup", "redûblîkasyon", "redûb" },
})),
["abbreviation"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Kurtkirina",
phrase = "kurtkirina",
abbrev = "kurt.",
aliases = { "abbr", "abbrev", "kurtkirin" },
})),
["syllabic abbreviation"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Syllabic abbreviation of",
phrase = "syllabic abbreviation of",
abbrev = "syl. abbr.",
glossary = "syllabic abbreviation",
aliases = { "sylabbr", "sylabbrev" },
})),
["acronym"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Akronîma",
phrase = "akronîma",
abbrev = "akronîm",
glossary = "akronîm",
aliases = { "acro", "akronîm" },
})),
["initialism"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Înîtîalîzma",
phrase = "înîtîalîzma",
abbrev = "înît.",
glossary = "înîtîalîzm",
aliases = { "init", "înîtîalîzm", "înît" },
})),
["metathesis"] = create_keyword(deep_merge(DEFAULTS.transitive, {
text = "Metateza",
phrase = "metateza",
abbrev = "meta.",
glossary = "metatez",
toplevel_category = "peyvên dariştî bi riya metatezê",
aliases = { "meta", "metatez" },
})),
--
-- Invisible keywords (no text output)
--
["root"] = create_keyword {
transitive = TRANSITIVE.ALWAYS,
invisible = "all",
pos_override = "root",
aliases = { "reh" },
},
["afeq"] = create_keyword(deep_merge(DEFAULTS.affix_group, {
text = "Ji",
phrase = "ji",
transitive = TRANSITIVE.NEVER,
min_etymons = 1,
invisible = "all",
})),
}
-- Template-parameter supplements.
export.supplements = {
doublet = {
text = "Cotreha",
phrase = "cotreha",
glossary = "Nimînok:Ferhengok#cotreh",
toplevel_category = "Cotreh",
default_conj = "û",
term_rules = {
entry_lang = true,
require_term = true,
disallow = { "suppress", "unknown", "family" },
},
},
}
local aliases_to_register = {}
local canonical_aliases = {}
-- Map every keyword (canonical or alias) to its canonical form for consistent checks and tracking.
export.keyword_canonical = {}
for name, keyword_data in pairs(export.keywords) do
export.keyword_canonical[name] = name
if keyword_data.aliases then
canonical_aliases[name] = keyword_data.aliases
for _, alias in ipairs(keyword_data.aliases) do
if export.keywords[alias] then
error("Alias '" ..
alias .. "' defined in keyword '" .. name .. "' collides with existing keyword '" .. alias .. "'.")
end
if aliases_to_register[alias] then
error("Alias '" ..
alias .. "' defined in keyword '" .. name .. "' is already claimed by another keyword.")
end
aliases_to_register[alias] = keyword_data
export.keyword_canonical[alias] = name
end
keyword_data.aliases = nil
end
end
for alias, data in pairs(aliases_to_register) do
export.keywords[alias] = data
end
--
-- Language exception presets
--
local EXCEPTION_PRESETS = {
-- Fully disallowed: no tree, no text, no categories
disallowed = {
disallow = { tree = true, text = true },
suppress_categories = true,
},
-- Suppress transliteration only
no_translit = {
suppress_tr = true,
},
-- Suppress all categories only
no_categories = {
suppress_categories = true,
},
}
--[=[
Available exception options:
disallow = { Related options for disallowing output:
tree Disallow etymology trees for this language
text Disallow etymology text generation for this language
ref Reference link shown when tree/text is disallowed
}
suppress_tr Suppress transliteration in links
suppress_categories Suppress all category generation
normalize_to Normalize language code to a different code
normalize_from_families Apply normalization to languages in these families
normalize_exclude_families Exclude these families from normalization
keyword_overrides Per-keyword categorisation overrides (e.g. { ["af"] = { transitive = TRANSITIVE.NEVER } })
]=]
local function create_exception(preset, overrides)
local base = preset and EXCEPTION_PRESETS[preset] or {}
return deep_merge(base, overrides or {})
end
export.config = {
lang_exceptions = {
["zh"] = create_exception("disallowed", {
disallow = { ref = "[[Wiktionary:Beer parlour/2025/May#Template:etymon for Chinese]]" },
suppress_tr = true,
normalize_to = "zh",
normalize_from_families = { "zhx" },
normalize_exclude_families = { "qfa-cnt" },
}),
},
}
-- Supported codes for the nominalization <g:code> modifier (subset of common gender/number-style codes)
-- Codes accepted by the <g:code> modifier on a nominalization. These are the codes of
-- [[Modul:gender and number/data]], with that module's own Kurdish wording -- the same value is
-- passed through to it for the gender tag, so anything valid here is valid there. A two-letter
-- gender+number code that is not listed ("np", "mp") is decomposed automatically below.
export.nominalization_g_codes = {
-- Cins
["n"] = "nêr",
["m"] = "mê",
["f"] = "mê",
["nt"] = "nêtar",
["c"] = "giştî",
["g"] = "giştî",
["cnt"] = "cinsê-notr",
-- Hejmar
["y"] = "yekjimar",
["s"] = "yekjimar",
["p"] = "pirjimar",
["d"] = "dual",
-- Kodên hevedudanî yên [[Modul:gender and number/data]]
["mf"] = "nêr an mê",
["mn"] = "mê an nêr",
["mnt"] = "mê an nêtar",
}
--
-- Propagate keyword overrides to aliases
--
if export.config.lang_exceptions then
for lang_code, exception in pairs(export.config.lang_exceptions) do
if exception.keyword_overrides then
for canonical, aliases in pairs(canonical_aliases) do
if exception.keyword_overrides[canonical] then
local override_data = exception.keyword_overrides[canonical]
for _, alias in ipairs(aliases) do
if not exception.keyword_overrides[alias] then
exception.keyword_overrides[alias] = override_data
end
end
end
end
end
end
end
return export
ccvtb8l8zkezxqph95plteme7ki8zxy
Modul:etymon/ceribandin/styles.css
828
1359190
6532096
6434869
2026-09-18T20:05:45Z
Wikihez
7344
sync test copy
6532096
sanitized-css
text/css
/* Main container. Follows the frame that {{tewandin-ser}} gives inflection tables
(Şablon:tewandin-ser/style.css): pale-blue frame, rounded, soft shadow, white body. */
.etytree {
width: max-content;
max-width: 100%;
overflow: hidden;
box-sizing: border-box;
padding: 3px;
margin: 0.5em 0;
background: var(--wikt-palette-paleblue);
border: 1px solid var(--wikt-palette-grey);
border-radius: 6px;
box-shadow: 0 4px 15px var(--wikt-palette-grey-3);
}
/* Title bar, styled like the inflection-table caption. */
.etytree .NavHead {
background: var(--wikt-palette-paleblue);
text-align: left;
font-size: 95%;
font-weight: bold;
padding: 0.1em 0.5em;
box-sizing: border-box;
}
/* Was a fixed 25em, which stretched even a two-node tree to that width. */
.etytree .NavHead > div {
min-width: 14em;
}
/* A fixed height; a taller tree scrolls (or drags, with the EtytreeZoom gadget) inside the box.
The gadget's "Biçûk bike" lifts the limit and scales the whole tree into view. */
.etytree .NavContent {
overflow: auto;
max-height: 28em;
background: var(--wikt-palette-white);
border: 1px solid var(--wikt-palette-grey-6);
border-radius: 4px;
}
.etytree-body {
display: flex;
flex-direction: column;
align-items: center;
padding: 0.75em 0.5em;
margin: auto;
width: fit-content;
}
.etytree-branch-group {
display: flex;
column-gap: 0.5em;
align-items: end;
position: relative;
}
.etytree-branch {
display: flex;
flex-direction: column;
align-items: center;
}
/* Term blocks */
.etytree-block {
position: relative;
padding: 0.3em 0.7em;
border: 1px solid var(--wikt-palette-lightgrey);
border-radius: 4px;
background: var(--wikt-palette-beige);
text-align: center;
line-height: 1.35;
box-shadow: 0 1px 2px var(--wikt-palette-grey-3);
}
/* The language sits above the term, so give it the quieter weight of the two: smaller, grey and
out of link blue, so only the term itself reads as a link. */
.etytree-block .etyl {
font-size: 85%;
letter-spacing: 0.02em;
}
.etytree-block .etyl a {
color: var(--wikt-palette-grey-9);
text-decoration: none;
}
.etytree-block .etyl a:hover,
.etytree-block .etyl a:focus {
color: var(--wikt-palette-blue);
text-decoration: underline;
}
/* Reconstructed languages: a cooler tint than the beige of attested terms. */
.etytree-block.etytree-reconstructed {
background: var(--wikt-palette-grey-blue-1);
/* the sanitiser rejects border-color with a var(), so set the shorthand */
border: 1px solid var(--wikt-palette-grey-blue-3);
}
/* Termless keyword blocks (invisible wrapper for positioning) */
.etytree-termless-block {
height: 0 !important;
padding: 0 !important;
border: none !important;
background: transparent !important;
margin: 0 !important;
overflow: visible;
}
.etytree-block.etytree-duplicate {
border: 1px dashed var(--wikt-palette-grey);
}
.etytree-term {
display: inline-block;
}
/* The meaning, on its own line under the term. */
.etytree-gloss {
display: inline-block;
max-width: 16em;
font-size: 85%;
font-style: italic;
line-height: 1.25;
color: var(--wikt-palette-grey-9);
}
/* Vertical connectors */
.etytree-connector-vertical,
.etytree-connector-vertical-short {
border-right: 2px solid var(--wikt-palette-grey);
position: relative;
transform: translateX(1px);
}
.etytree-connector-vertical { height: 20px; }
.etytree-connector-vertical-short { height: 10px; }
.etytree-connector-dotted {
border-left: 2px dotted var(--wikt-palette-grey);
height: 20px;
display: block;
margin-left: 50%;
}
/* Branch connectors */
.etytree-branch-left,
.etytree-branch-right {
height: 10px;
width: calc(50% + 0.25em);
border-bottom: 2px solid var(--wikt-palette-grey);
}
.etytree-branch-left {
border-left: 2px solid var(--wikt-palette-grey);
border-bottom-left-radius: 4px;
transform: translateX(50%);
}
.etytree-branch-right {
border-right: 2px solid var(--wikt-palette-grey);
border-bottom-right-radius: 4px;
transform: translateX(-50%);
}
.etytree-branch-mid {
border-bottom: 2px solid var(--wikt-palette-grey);
width: calc(100% + 0.5em);
}
/* Duplicate connector (L-shaped with arrow) */
.etytree-duplicate-connector {
display: flex;
justify-content: center;
height: 20px;
}
.etytree-duplicate-connector > div {
position: relative;
width: 60px;
height: 100%;
}
.etytree-duplicate-connector .etytree-dup-right {
position: absolute;
right: 0;
top: 50%;
bottom: 0;
border-left: 2px dotted var(--wikt-palette-grey);
}
.etytree-duplicate-connector .etytree-dup-horiz {
position: absolute;
left: 0;
right: 0;
top: 50%;
border-top: 2px dotted var(--wikt-palette-grey);
}
.etytree-duplicate-connector .etytree-dup-left {
position: absolute;
left: 0;
top: 0;
bottom: 50%;
border-left: 2px dotted var(--wikt-palette-grey);
}
.etytree-duplicate-connector .etytree-dup-arrow {
position: absolute;
left: -5px;
top: -5px;
font-size: 10px;
color: var(--wikt-palette-grey);
}
/* Label containers */
.etytree-label-container {
z-index: 1;
position: absolute;
transform: translate(-50%);
top: calc(100% + 5px);
left: 50%;
line-height: 10px;
overflow: visible;
}
.etytree-group-label {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
z-index: 2;
height: 10px;
line-height: 10px;
}
/* Labels */
.etytree-label abbr {
font-size: 12px;
font-style: italic;
color: var(--wikt-palette-black);
background: var(--wikt-palette-cyan);
border-radius: 2px;
text-decoration: none;
}
/* Uncertainty marker */
.etytree-unc {
font-size: 10px;
font-weight: bold;
padding: 1px 2px;
background: var(--wikt-palette-pink);
border-radius: 2px;
text-decoration: none;
}
.etytree-label + .etytree-unc {
position: absolute;
left: calc(100% + 3px);
}
/* Final marker (for termless keywords) */
.etytree-final {
font-size: 10px;
font-weight: bold;
padding: 1px 2px;
background: var(--wikt-palette-grey) !important;
color: var(--wikt-palette-white) !important;
border-radius: 2px;
text-decoration: none;
display: inline-block;
line-height: 1;
}
.etytree-label-container .etytree-final {
position: absolute;
left: 50%;
top: -12px;
transform: translateX(-50%);
z-index: 3;
margin-left: 0;
}
hzewiqkdp3qhxjfy2jwct7y1xht5l8k
6532097
6532096
2026-09-18T20:06:58Z
Wikihez
7344
sync test copy
6532097
sanitized-css
text/css
/* Main container. Follows the frame that {{tewandin-ser}} gives inflection tables
(Şablon:tewandin-ser/style.css): pale-blue frame, rounded, soft shadow, white body. */
.etytree {
width: max-content;
max-width: 100%;
overflow: hidden;
box-sizing: border-box;
padding: 3px;
margin: 0.5em 0;
background: var(--wikt-palette-paleblue);
border: 1px solid var(--wikt-palette-grey);
border-radius: 6px;
box-shadow: 0 4px 15px var(--wikt-palette-grey-3);
}
/* Title bar, styled like the inflection-table caption. */
.etytree .NavHead {
background: var(--wikt-palette-paleblue);
text-align: left;
font-size: 95%;
font-weight: bold;
padding: 0.1em 0.5em;
box-sizing: border-box;
}
/* Was a fixed 25em, which stretched even a two-node tree to that width. */
.etytree .NavHead > div {
min-width: 14em;
}
/* A fixed height; a taller tree scrolls (or drags, with the EtytreeZoom gadget) inside the box.
The gadget's "Biçûk bike" lifts the limit and scales the whole tree into view. */
.etytree .NavContent {
overflow: auto;
max-height: 28em;
background: var(--wikt-palette-white);
border: 1px solid var(--wikt-palette-grey-6);
border-radius: 4px;
}
.etytree-body {
display: flex;
flex-direction: column;
align-items: center;
padding: 0.75em 0.5em;
margin: auto;
width: fit-content;
}
.etytree-branch-group {
display: flex;
column-gap: 0.5em;
align-items: end;
position: relative;
}
.etytree-branch {
display: flex;
flex-direction: column;
align-items: center;
}
/* Term blocks */
.etytree-block {
position: relative;
padding: 0.3em 0.7em;
border: 1px solid var(--wikt-palette-lightgrey);
border-radius: 4px;
background: var(--wikt-palette-beige);
text-align: center;
line-height: 1.35;
box-shadow: 0 1px 2px var(--wikt-palette-grey-3);
}
/* The language sits above the term, so give it the quieter weight of the two: smaller, grey and
out of link blue, so only the term itself reads as a link. */
.etytree-block .etyl {
font-size: 85%;
letter-spacing: 0.02em;
}
.etytree-block .etyl a {
color: var(--wikt-palette-darkgrey);
text-decoration: none;
}
.etytree-block .etyl a:hover,
.etytree-block .etyl a:focus {
color: var(--wikt-palette-blue);
text-decoration: underline;
}
/* Reconstructed languages: a cooler tint than the beige of attested terms. */
.etytree-block.etytree-reconstructed {
background: var(--wikt-palette-grey-blue-1);
/* the sanitiser rejects border-color with a var(), so set the shorthand */
border: 1px solid var(--wikt-palette-grey-blue-3);
}
/* Termless keyword blocks (invisible wrapper for positioning) */
.etytree-termless-block {
height: 0 !important;
padding: 0 !important;
border: none !important;
background: transparent !important;
margin: 0 !important;
overflow: visible;
}
.etytree-block.etytree-duplicate {
border: 1px dashed var(--wikt-palette-grey);
}
.etytree-term {
display: inline-block;
}
/* The meaning, on its own line under the term. */
.etytree-gloss {
display: inline-block;
max-width: 16em;
font-size: 85%;
font-style: italic;
line-height: 1.25;
color: var(--wikt-palette-grey-9);
}
/* Vertical connectors */
.etytree-connector-vertical,
.etytree-connector-vertical-short {
border-right: 2px solid var(--wikt-palette-grey);
position: relative;
transform: translateX(1px);
}
.etytree-connector-vertical { height: 20px; }
.etytree-connector-vertical-short { height: 10px; }
.etytree-connector-dotted {
border-left: 2px dotted var(--wikt-palette-grey);
height: 20px;
display: block;
margin-left: 50%;
}
/* Branch connectors */
.etytree-branch-left,
.etytree-branch-right {
height: 10px;
width: calc(50% + 0.25em);
border-bottom: 2px solid var(--wikt-palette-grey);
}
.etytree-branch-left {
border-left: 2px solid var(--wikt-palette-grey);
border-bottom-left-radius: 4px;
transform: translateX(50%);
}
.etytree-branch-right {
border-right: 2px solid var(--wikt-palette-grey);
border-bottom-right-radius: 4px;
transform: translateX(-50%);
}
.etytree-branch-mid {
border-bottom: 2px solid var(--wikt-palette-grey);
width: calc(100% + 0.5em);
}
/* Duplicate connector (L-shaped with arrow) */
.etytree-duplicate-connector {
display: flex;
justify-content: center;
height: 20px;
}
.etytree-duplicate-connector > div {
position: relative;
width: 60px;
height: 100%;
}
.etytree-duplicate-connector .etytree-dup-right {
position: absolute;
right: 0;
top: 50%;
bottom: 0;
border-left: 2px dotted var(--wikt-palette-grey);
}
.etytree-duplicate-connector .etytree-dup-horiz {
position: absolute;
left: 0;
right: 0;
top: 50%;
border-top: 2px dotted var(--wikt-palette-grey);
}
.etytree-duplicate-connector .etytree-dup-left {
position: absolute;
left: 0;
top: 0;
bottom: 50%;
border-left: 2px dotted var(--wikt-palette-grey);
}
.etytree-duplicate-connector .etytree-dup-arrow {
position: absolute;
left: -5px;
top: -5px;
font-size: 10px;
color: var(--wikt-palette-grey);
}
/* Label containers */
.etytree-label-container {
z-index: 1;
position: absolute;
transform: translate(-50%);
top: calc(100% + 5px);
left: 50%;
line-height: 10px;
overflow: visible;
}
.etytree-group-label {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
z-index: 2;
height: 10px;
line-height: 10px;
}
/* Labels */
.etytree-label abbr {
font-size: 12px;
font-style: italic;
color: var(--wikt-palette-black);
background: var(--wikt-palette-cyan);
border-radius: 2px;
text-decoration: none;
}
/* Uncertainty marker */
.etytree-unc {
font-size: 10px;
font-weight: bold;
padding: 1px 2px;
background: var(--wikt-palette-pink);
border-radius: 2px;
text-decoration: none;
}
.etytree-label + .etytree-unc {
position: absolute;
left: calc(100% + 3px);
}
/* Final marker (for termless keywords) */
.etytree-final {
font-size: 10px;
font-weight: bold;
padding: 1px 2px;
background: var(--wikt-palette-grey) !important;
color: var(--wikt-palette-white) !important;
border-radius: 2px;
text-decoration: none;
display: inline-block;
line-height: 1;
}
.etytree-label-container .etytree-final {
position: absolute;
left: 50%;
top: -12px;
transform: translateX(-50%);
z-index: 3;
margin-left: 0;
}
d7wsfcirpqt63vplh60vc7778du531i
jenk
0
1359254
6532051
2026-09-18T17:14:47Z
Avestaboy
5833
Rûpel bi "== {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Navdêr === {{navdêr|ku|z=m}} # [[vac]], [[mantiq]], [[beraqilî]], [[hişmendî]], li gor [[hiş]] û [[aqil]]î, ne [[keyfî]], [[feraset]], [[têgihiştin]], [[aqildarî]], [[aqilmendî]], [[aqil]] ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Formên alternatîv ==== * {{g|ku|locîk}} ==== Jê ==== ==== Etîmolojî ====" hat çêkirin
6532051
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku|z=m}}
# [[vac]], [[mantiq]], [[beraqilî]], [[hişmendî]], li gor [[hiş]] û [[aqil]]î, ne [[keyfî]], [[feraset]], [[têgihiştin]], [[aqildarî]], [[aqilmendî]], [[aqil]]
==== Tewandin ====
{{ku-tewîn-nav|mê}}
==== Formên alternatîv ====
* {{g|ku|locîk}}
==== Jê ====
==== Etîmolojî ====
8j41wejs4iwov7o0csz389iqfi1e480
6532052
6532051
2026-09-18T17:15:04Z
Avestaboy
5833
6532052
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku|z=m}}
# [[vac]], [[mantiq]], [[beraqilî]], [[hişmendî]], li gor [[hiş]] û [[aqil]]î, ne [[keyfî]], [[feraset]], [[têgihiştin]], [[aqildarî]], [[aqilmendî]], [[aqil]]
==== Tewandin ====
{{ku-tewîn-nav|mê}}
==== Jê ====
==== Etîmolojî ====
kkij6swgvkg3cfj4s7pub2myi2z2bpr
6532053
6532052
2026-09-18T17:17:16Z
Avestaboy
5833
6532053
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku|z=m}}
# [[vac]], [[mantiq]], [[beraqilî]], [[hişmendî]], li gor [[hiş]] û [[aqil]]î, ne [[keyfî]], [[feraset]], [[têgihiştin]], [[aqildarî]], [[aqilmendî]], [[aqil]]
==== Tewandin ====
{{ku-tewîn-nav|mê}}
==== Jê ====
==== Etîmolojî ====
{{bêetîmolojî|ku}}
hk7gz60r34lluzrs5mlo65sckjh4l03
6532056
6532053
2026-09-18T17:22:16Z
Avestaboy
5833
6532056
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku|z=m}}
# [[vac]], [[mantiq]]
==== Tewandin ====
{{ku-tewîn-nav|mê}}
==== Jê ====
==== Etîmolojî ====
{{bêetîmolojî|ku}}
fbhm47126s40vyw40c2ff4f6cc79mt7
6532057
6532056
2026-09-18T17:23:27Z
Avestaboy
5833
6532057
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku|z=m}}
# [[vac]], [[mantiq]]
==== Tewandin ====
{{ku-tewîn-nav|mê}}
==== Jê ====
[[jenkî]]
==== Etîmolojî ====
{{bêetîmolojî|ku}}
i2d7eszle4tp17xygssfqayf9tmfv2r
6532786
6532057
2026-09-19T09:29:58Z
Wikihez
7344
[[Bikarhêner:Wikihez/skrîpt/js/şablon-lêke.js|T]]: +{{bêçavkanî}}
6532786
wikitext
text/x-wiki
{{bêçavkanî}}
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku|z=m}}
# [[vac]], [[mantiq]]
==== Tewandin ====
{{ku-tewîn-nav|mê}}
==== Jê ====
[[jenkî]]
==== Etîmolojî ====
{{bêetîmolojî|ku}}
31bv5oqihn27wcl3bfkjn8rvqxee1o2
Modul:etydate/ceribandin
828
1359256
6532072
2026-09-18T18:40:04Z
Wikihez
7344
test copy: Kurdish wording for etydate
6532072
Scribunto
text/plain
local export = {}
local M = require("Module:module loader").init({
require = {
parameters = "Module:parameters",
references = "Module:references",
},
})
local insert = table.insert
local concat = table.concat
function export.etydate(frame)
local params = {
nocap = { type = "boolean" },
[1] = { list = true, required = true, template_default = "{{{1}}}", disallow_holes = true },
ref = { list = true, type = "references", allow_holes = true },
["ref\1n"] = { list = true, allow_holes = true },
}
local parent_args = frame:getParent().args
local args = M.parameters.process(parent_args, params)
return export.format_etydate(args, nil)
end
function export.collect_etydate_ref_specs(args)
local ref = args.ref or {}
local refn = args.refn
local maxindex = (refn and refn.maxindex) or 0
for k in pairs(ref) do
if type(k) == "number" and k > maxindex then
maxindex = k
end
end
if maxindex == 0 and not next(ref) then
return {}
end
local parse_refs = M.references.parse_references
local flattened_refs = {}
for i = 1, maxindex do
if refn and refn[i] then
if ref[i] then
if ref[i][2] then
local ind = i == 1 and "" or i
error(("Can't specify two or more references in |ref%s= and also |ref%sn="):format(ind, ind))
end
if type(ref[i][1]) == "string" then
ref[i][1] = { text = ref[i][1] }
end
ref[i][1].name = refn[i]
insert(flattened_refs, ref[i][1])
else
insert(flattened_refs, { name = refn[i] })
end
elseif ref[i] then
if type(ref[i]) == "string" then
for _, note in ipairs(parse_refs(ref[i])) do
insert(flattened_refs, note)
end
else
for j = 1, #ref[i] do
local item = ref[i][j]
if type(item) == "string" then
for _, note in ipairs(parse_refs(item)) do
insert(flattened_refs, note)
end
else
insert(flattened_refs, item)
end
end
end
end
end
return flattened_refs
end
function export.format_etydate(args, opts)
local parts = {}
local specs = args[1]
local function ins(txt)
insert(parts, txt)
end
-- Kurdish oblique ending on a year: "-ê" after a final 1, "-an" after a final 11 and everything else.
local function oblique(arg)
if not arg:find("^%d+$") then
return arg
elseif arg:find("11$") then
return arg .. "an"
elseif arg:find("1$") then
return arg .. "ê"
end
return arg .. "an"
end
local function process_year_or_range(poff)
local year = specs[poff]
if not year then
error(("Expected a year or 'r' in %s= but it is missing"):format(poff))
end
if year == "r" then
local r1 = specs[poff + 1]
local r2 = specs[poff + 2]
if not r1 or not r2 then
error(("Saw 'r' in %s= but %s= or %s= is missing"):format(poff, poff + 1, poff + 2))
end
ins("navbera " .. r1 .. " û " .. oblique(r2))
return poff + 3
end
ins(oblique(year:gsub("^!", "")))
return poff + 1
end
local process_common_usage
local function process_circa_or_year_range(offset)
local next_param
if specs[offset] == "c" then
ins("''[[circa|nêzîkî]]'' ")
next_param = process_year_or_range(offset + 1)
else
next_param = process_year_or_range(offset)
end
if specs[next_param] then
process_common_usage(next_param)
end
end
process_common_usage = function(offset)
ins(", lê ancax ji ")
process_circa_or_year_range(offset)
ins(" ve bi berfirehî hatiye bikaranîn")
end
if args.nocap then
ins("c")
else
ins("C")
end
ins("ara ewil ")
if specs[1] == "before" or specs[1] == "after" then
ins(specs[1] == "before" and "beriya " or "piştî ")
if not specs[2] then
error(("Saw 1=%s but 2= is missing"):format(specs[1]))
end
ins(oblique(specs[2]))
ins(" hatiye peyitandin")
if specs[3] then
process_common_usage(3)
end
else
ins("di ")
process_circa_or_year_range(1)
ins(" de hatiye peyitandin")
end
if not (opts and opts.omit_refs) then
local flattened_refs = export.collect_etydate_ref_specs(args)
if #flattened_refs > 0 then
ins(M.references.format_references(flattened_refs))
end
end
return concat(parts)
end
return export
dlthsdntef7tcc9ob7nake0hp8xag9n
6532076
6532072
2026-09-18T18:42:19Z
Wikihez
7344
test copy: Kurdish wording for etydate
6532076
Scribunto
text/plain
local export = {}
local M = require("Module:module loader").init({
require = {
parameters = "Module:parameters",
references = "Module:references",
},
})
local insert = table.insert
local concat = table.concat
function export.etydate(frame)
local params = {
nocap = { type = "boolean" },
[1] = { list = true, required = true, template_default = "{{{1}}}", disallow_holes = true },
ref = { list = true, type = "references", allow_holes = true },
["ref\1n"] = { list = true, allow_holes = true },
}
local parent_args = frame:getParent().args
local args = M.parameters.process(parent_args, params)
return export.format_etydate(args, nil)
end
function export.collect_etydate_ref_specs(args)
local ref = args.ref or {}
local refn = args.refn
local maxindex = (refn and refn.maxindex) or 0
for k in pairs(ref) do
if type(k) == "number" and k > maxindex then
maxindex = k
end
end
if maxindex == 0 and not next(ref) then
return {}
end
local parse_refs = M.references.parse_references
local flattened_refs = {}
for i = 1, maxindex do
if refn and refn[i] then
if ref[i] then
if ref[i][2] then
local ind = i == 1 and "" or i
error(("Can't specify two or more references in |ref%s= and also |ref%sn="):format(ind, ind))
end
if type(ref[i][1]) == "string" then
ref[i][1] = { text = ref[i][1] }
end
ref[i][1].name = refn[i]
insert(flattened_refs, ref[i][1])
else
insert(flattened_refs, { name = refn[i] })
end
elseif ref[i] then
if type(ref[i]) == "string" then
for _, note in ipairs(parse_refs(ref[i])) do
insert(flattened_refs, note)
end
else
for j = 1, #ref[i] do
local item = ref[i][j]
if type(item) == "string" then
for _, note in ipairs(parse_refs(item)) do
insert(flattened_refs, note)
end
else
insert(flattened_refs, item)
end
end
end
end
end
return flattened_refs
end
function export.format_etydate(args, opts)
local parts, tail = {}, {}
local specs = args[1]
local target = parts
local function ins(txt)
insert(target, txt)
end
-- Kurdish oblique ending on a year: "-ê" after a final 1, "-an" after a final 11 and everything else.
local function oblique(num)
if num:find("11$") then
return num .. "an"
elseif num:find("1$") then
return num .. "ê"
end
return num .. "an"
end
-- "1900" -> "1900an", "1500s" -> "salên 1500an", "14c" -> "sedsala 14an",
-- with "early"/"mid"/"late" in front where they are given.
local period_prefixes = { early = "destpêka ", mid = "nîvê ", late = "dawiya " }
local function period(arg)
arg = arg:gsub("^!", "")
local prefix = ""
local word, rest = arg:match("^(%a+)[ %-](.+)$")
if word and period_prefixes[word] then
prefix, arg = period_prefixes[word], rest
end
local decade = arg:match("^(%d+)s$")
if decade then
return prefix .. "salên " .. oblique(decade)
end
local century = arg:match("^(%d+)c$")
if century then
return prefix .. "sedsala " .. oblique(century)
end
if arg:find("^%d+$") then
return prefix .. oblique(arg)
end
return prefix .. arg
end
local process_common_usage
local function process_year_or_range(poff)
local year = specs[poff]
if not year then
error(("Expected a year or 'r' in %s= but it is missing"):format(poff))
end
if year == "r" then
local r1 = specs[poff + 1]
local r2 = specs[poff + 2]
if not r1 or not r2 then
error(("Saw 'r' in %s= but %s= or %s= is missing"):format(poff, poff + 1, poff + 2))
end
ins("navbera " .. r1:gsub("^!", "") .. " û " .. period(r2))
return poff + 3
end
ins(period(year))
return poff + 1
end
local function process_circa_or_year_range(offset)
local next_param
if specs[offset] == "c" then
ins("''[[circa|nêzîkî]]'' ")
next_param = process_year_or_range(offset + 1)
else
next_param = process_year_or_range(offset)
end
if specs[next_param] then
process_common_usage(next_param)
end
end
-- The second date goes after the main clause, as a sentence of its own.
process_common_usage = function(offset)
target = tail
ins(", lê ancax ji ")
process_circa_or_year_range(offset)
ins(" ve bi berfirehî hatiye bikaranîn")
target = parts
end
if args.nocap then
ins("c")
else
ins("C")
end
ins("ara ewil ")
if specs[1] == "before" or specs[1] == "after" then
ins(specs[1] == "before" and "beriya " or "piştî ")
if not specs[2] then
error(("Saw 1=%s but 2= is missing"):format(specs[1]))
end
ins(period(specs[2]))
if specs[3] then
process_common_usage(3)
end
ins(" hatiye peyitandin")
else
ins("di ")
process_circa_or_year_range(1)
ins(" de hatiye peyitandin")
end
for _, part in ipairs(tail) do
insert(parts, part)
end
if not (opts and opts.omit_refs) then
local flattened_refs = export.collect_etydate_ref_specs(args)
if #flattened_refs > 0 then
insert(parts, M.references.format_references(flattened_refs))
end
end
return concat(parts)
end
return export
0mmmpprtbtp44vcgxr7xqzpu001y439
6532080
6532076
2026-09-18T19:06:53Z
Wikihez
7344
test copy: Kurdish wording for etydate
6532080
Scribunto
text/plain
local export = {}
local M = require("Module:module loader").init({
require = {
parameters = "Module:parameters",
references = "Module:references",
},
})
local insert = table.insert
local concat = table.concat
function export.etydate(frame)
local params = {
nocap = { type = "boolean" },
[1] = { list = true, required = true, template_default = "{{{1}}}", disallow_holes = true },
ref = { list = true, type = "references", allow_holes = true },
["ref\1n"] = { list = true, allow_holes = true },
}
local parent_args = frame:getParent().args
local args = M.parameters.process(parent_args, params)
return export.format_etydate(args, nil)
end
function export.collect_etydate_ref_specs(args)
local ref = args.ref or {}
local refn = args.refn
local maxindex = (refn and refn.maxindex) or 0
for k in pairs(ref) do
if type(k) == "number" and k > maxindex then
maxindex = k
end
end
if maxindex == 0 and not next(ref) then
return {}
end
local parse_refs = M.references.parse_references
local flattened_refs = {}
for i = 1, maxindex do
if refn and refn[i] then
if ref[i] then
if ref[i][2] then
local ind = i == 1 and "" or i
error(("Can't specify two or more references in |ref%s= and also |ref%sn="):format(ind, ind))
end
if type(ref[i][1]) == "string" then
ref[i][1] = { text = ref[i][1] }
end
ref[i][1].name = refn[i]
insert(flattened_refs, ref[i][1])
else
insert(flattened_refs, { name = refn[i] })
end
elseif ref[i] then
if type(ref[i]) == "string" then
for _, note in ipairs(parse_refs(ref[i])) do
insert(flattened_refs, note)
end
else
for j = 1, #ref[i] do
local item = ref[i][j]
if type(item) == "string" then
for _, note in ipairs(parse_refs(item)) do
insert(flattened_refs, note)
end
else
insert(flattened_refs, item)
end
end
end
end
end
return flattened_refs
end
function export.format_etydate(args, opts)
local parts, tail = {}, {}
local specs = args[1]
local target = parts
local function ins(txt)
insert(target, txt)
end
-- Kurdish oblique ending on a year: "-ê" after a final 1, "-an" after a final 11 and everything else.
local function oblique(num)
if num:find("11$") then
return num .. "an"
elseif num:find("1$") then
return num .. "ê"
end
return num .. "an"
end
-- "1900" -> "1900an", "1500s" -> "salên 1500an", "14c" -> "sedsala 14an",
-- with "early"/"mid"/"late" in front where they are given.
local period_prefixes = { early = "destpêka ", mid = "nîvê ", late = "dawiya " }
local function period(arg)
arg = arg:gsub("^!", "")
local prefix = ""
local word, rest = arg:match("^(%a+)[ %-](.+)$")
if word and period_prefixes[word] then
prefix, arg = period_prefixes[word], rest
end
local decade = arg:match("^(%d+)s$")
if decade then
return prefix .. "salên " .. decade .. "î"
end
local century = arg:match("^(%d+)c$")
if century then
return prefix .. "sedsala " .. oblique(century)
end
if arg:find("^%d+$") then
return prefix .. oblique(arg)
end
return prefix .. arg
end
local process_common_usage
local function process_year_or_range(poff)
local year = specs[poff]
if not year then
error(("Expected a year or 'r' in %s= but it is missing"):format(poff))
end
if year == "r" then
local r1 = specs[poff + 1]
local r2 = specs[poff + 2]
if not r1 or not r2 then
error(("Saw 'r' in %s= but %s= or %s= is missing"):format(poff, poff + 1, poff + 2))
end
ins("navbera " .. r1:gsub("^!", "") .. " û " .. period(r2))
return poff + 3
end
ins(period(year))
return poff + 1
end
local function process_circa_or_year_range(offset)
local next_param
if specs[offset] == "c" then
ins("''[[circa|nêzîkî]]'' ")
next_param = process_year_or_range(offset + 1)
else
next_param = process_year_or_range(offset)
end
if specs[next_param] then
process_common_usage(next_param)
end
end
-- The second date goes after the main clause, as a sentence of its own.
process_common_usage = function(offset)
target = tail
ins(", lê ancax ji ")
process_circa_or_year_range(offset)
ins(" ve bi berfirehî hatiye bikaranîn")
target = parts
end
if args.nocap then
ins("c")
else
ins("C")
end
ins("ara ewil ")
if specs[1] == "before" or specs[1] == "after" then
ins(specs[1] == "before" and "beriya " or "piştî ")
if not specs[2] then
error(("Saw 1=%s but 2= is missing"):format(specs[1]))
end
ins(period(specs[2]))
if specs[3] then
process_common_usage(3)
end
ins(" hatiye peyitandin")
else
ins("di ")
process_circa_or_year_range(1)
ins(" de hatiye peyitandin")
end
for _, part in ipairs(tail) do
insert(parts, part)
end
if not (opts and opts.omit_refs) then
local flattened_refs = export.collect_etydate_ref_specs(args)
if #flattened_refs > 0 then
insert(parts, M.references.format_references(flattened_refs))
end
end
return concat(parts)
end
return export
q0rpkr9bn4b2ronjkx2u27tdfblmzeh
6532086
6532080
2026-09-18T19:11:56Z
Wikihez
7344
test copy: Kurdish wording for etydate
6532086
Scribunto
text/plain
local export = {}
local M = require("Module:module loader").init({
require = {
parameters = "Module:parameters",
references = "Module:references",
},
})
local insert = table.insert
local concat = table.concat
function export.etydate(frame)
local params = {
nocap = { type = "boolean" },
[1] = { list = true, required = true, template_default = "{{{1}}}", disallow_holes = true },
ref = { list = true, type = "references", allow_holes = true },
["ref\1n"] = { list = true, allow_holes = true },
}
local parent_args = frame:getParent().args
local args = M.parameters.process(parent_args, params)
return export.format_etydate(args, nil)
end
function export.collect_etydate_ref_specs(args)
local ref = args.ref or {}
local refn = args.refn
local maxindex = (refn and refn.maxindex) or 0
for k in pairs(ref) do
if type(k) == "number" and k > maxindex then
maxindex = k
end
end
if maxindex == 0 and not next(ref) then
return {}
end
local parse_refs = M.references.parse_references
local flattened_refs = {}
for i = 1, maxindex do
if refn and refn[i] then
if ref[i] then
if ref[i][2] then
local ind = i == 1 and "" or i
error(("Can't specify two or more references in |ref%s= and also |ref%sn="):format(ind, ind))
end
if type(ref[i][1]) == "string" then
ref[i][1] = { text = ref[i][1] }
end
ref[i][1].name = refn[i]
insert(flattened_refs, ref[i][1])
else
insert(flattened_refs, { name = refn[i] })
end
elseif ref[i] then
if type(ref[i]) == "string" then
for _, note in ipairs(parse_refs(ref[i])) do
insert(flattened_refs, note)
end
else
for j = 1, #ref[i] do
local item = ref[i][j]
if type(item) == "string" then
for _, note in ipairs(parse_refs(item)) do
insert(flattened_refs, note)
end
else
insert(flattened_refs, item)
end
end
end
end
end
return flattened_refs
end
function export.format_etydate(args, opts)
local parts, tail = {}, {}
local specs = args[1]
local target = parts
local function ins(txt)
insert(target, txt)
end
-- Kurdish oblique ending on a year: "-ê" after a final 1, "-an" after a final 11 and everything else.
local function oblique(num)
if num:find("11$") then
return num .. "an"
elseif num:find("1$") then
return num .. "ê"
end
return num .. "an"
end
-- "1900" -> "1900an", "1500s" -> "salên 1500an", "14c" -> "sedsala 14an",
-- with "early"/"mid"/"late" in front where they are given.
local period_prefixes = { early = "destpêka ", mid = "nîvê ", late = "dawiya " }
local function period(arg)
arg = arg:gsub("^!", "")
local prefix = ""
local word, rest = arg:match("^(%a+)[ %-](.+)$")
if word and period_prefixes[word] then
prefix, arg = period_prefixes[word], rest
end
-- An ending the editor typed already ("1900î", "1901ê", "1900an") is kept as it is.
if arg:find("^%d+[îê]$") or arg:find("^%d+an$") then
return prefix .. arg
end
local decade = arg:match("^(%d+)s$")
if decade then
return prefix .. "salên " .. decade .. "î"
end
local century = arg:match("^(%d+)c$")
if century then
return prefix .. "sedsala " .. oblique(century)
end
if arg:find("^%d+$") then
return prefix .. oblique(arg)
end
return prefix .. arg
end
local process_common_usage
local function process_year_or_range(poff)
local year = specs[poff]
if not year then
error(("Expected a year or 'r' in %s= but it is missing"):format(poff))
end
if year == "r" then
local r1 = specs[poff + 1]
local r2 = specs[poff + 2]
if not r1 or not r2 then
error(("Saw 'r' in %s= but %s= or %s= is missing"):format(poff, poff + 1, poff + 2))
end
ins("navbera " .. r1:gsub("^!", "") .. " û " .. period(r2))
return poff + 3
end
ins(period(year))
return poff + 1
end
local function process_circa_or_year_range(offset)
local next_param
if specs[offset] == "c" then
ins("''[[circa|nêzîkî]]'' ")
next_param = process_year_or_range(offset + 1)
else
next_param = process_year_or_range(offset)
end
if specs[next_param] then
process_common_usage(next_param)
end
end
-- The second date goes after the main clause, as a sentence of its own.
process_common_usage = function(offset)
target = tail
ins(", lê ancax ji ")
process_circa_or_year_range(offset)
ins(" ve bi berfirehî hatiye bikaranîn")
target = parts
end
if args.nocap then
ins("c")
else
ins("C")
end
ins("ara ewil ")
if specs[1] == "before" or specs[1] == "after" then
ins(specs[1] == "before" and "beriya " or "piştî ")
if not specs[2] then
error(("Saw 1=%s but 2= is missing"):format(specs[1]))
end
ins(period(specs[2]))
if specs[3] then
process_common_usage(3)
end
ins(" hatiye peyitandin")
else
ins("di ")
process_circa_or_year_range(1)
ins(" de hatiye peyitandin")
end
for _, part in ipairs(tail) do
insert(parts, part)
end
if not (opts and opts.omit_refs) then
local flattened_refs = export.collect_etydate_ref_specs(args)
if #flattened_refs > 0 then
insert(parts, M.references.format_references(flattened_refs))
end
end
return concat(parts)
end
return export
fjnsqd1ulj59xk18vmkimgqi2z9f6sn
6532088
6532086
2026-09-18T19:12:51Z
Wikihez
7344
test copy: Kurdish wording for etydate
6532088
Scribunto
text/plain
local export = {}
local M = require("Module:module loader").init({
require = {
parameters = "Module:parameters",
references = "Module:references",
},
})
local insert = table.insert
local concat = table.concat
function export.etydate(frame)
local params = {
nocap = { type = "boolean" },
[1] = { list = true, required = true, template_default = "{{{1}}}", disallow_holes = true },
ref = { list = true, type = "references", allow_holes = true },
["ref\1n"] = { list = true, allow_holes = true },
}
local parent_args = frame:getParent().args
local args = M.parameters.process(parent_args, params)
return export.format_etydate(args, nil)
end
function export.collect_etydate_ref_specs(args)
local ref = args.ref or {}
local refn = args.refn
local maxindex = (refn and refn.maxindex) or 0
for k in pairs(ref) do
if type(k) == "number" and k > maxindex then
maxindex = k
end
end
if maxindex == 0 and not next(ref) then
return {}
end
local parse_refs = M.references.parse_references
local flattened_refs = {}
for i = 1, maxindex do
if refn and refn[i] then
if ref[i] then
if ref[i][2] then
local ind = i == 1 and "" or i
error(("Can't specify two or more references in |ref%s= and also |ref%sn="):format(ind, ind))
end
if type(ref[i][1]) == "string" then
ref[i][1] = { text = ref[i][1] }
end
ref[i][1].name = refn[i]
insert(flattened_refs, ref[i][1])
else
insert(flattened_refs, { name = refn[i] })
end
elseif ref[i] then
if type(ref[i]) == "string" then
for _, note in ipairs(parse_refs(ref[i])) do
insert(flattened_refs, note)
end
else
for j = 1, #ref[i] do
local item = ref[i][j]
if type(item) == "string" then
for _, note in ipairs(parse_refs(item)) do
insert(flattened_refs, note)
end
else
insert(flattened_refs, item)
end
end
end
end
end
return flattened_refs
end
function export.format_etydate(args, opts)
local parts, tail = {}, {}
local specs = args[1]
local target = parts
local function ins(txt)
insert(target, txt)
end
-- Kurdish oblique ending on a year: "-ê" after a final 1, "-an" after a final 11 and everything else.
local function oblique(num)
if num:find("11$") then
return num .. "an"
elseif num:find("1$") then
return num .. "ê"
end
return num .. "an"
end
-- "1900" -> "1900an", "1500s" -> "salên 1500an", "14c" -> "sedsala 14an",
-- with "early"/"mid"/"late" in front where they are given.
local period_prefixes = { early = "destpêka ", mid = "nîvê ", late = "dawiya " }
local function period(arg)
if arg:find("^!") then -- "!" means: print it exactly as it was typed
return (arg:gsub("^!", ""))
end
local prefix = ""
local word, rest = arg:match("^(%a+)[ %-](.+)$")
if word and period_prefixes[word] then
prefix, arg = period_prefixes[word], rest
end
-- An ending the editor typed already ("1900î", "1901ê", "1900an") is kept as it is.
if arg:find("^%d+[îê]$") or arg:find("^%d+an$") then
return prefix .. arg
end
local decade = arg:match("^(%d+)s$")
if decade then
return prefix .. "salên " .. decade .. "î"
end
local century = arg:match("^(%d+)c$")
if century then
return prefix .. "sedsala " .. oblique(century)
end
if arg:find("^%d+$") then
return prefix .. oblique(arg)
end
return prefix .. arg
end
local process_common_usage
local function process_year_or_range(poff)
local year = specs[poff]
if not year then
error(("Expected a year or 'r' in %s= but it is missing"):format(poff))
end
if year == "r" then
local r1 = specs[poff + 1]
local r2 = specs[poff + 2]
if not r1 or not r2 then
error(("Saw 'r' in %s= but %s= or %s= is missing"):format(poff, poff + 1, poff + 2))
end
ins("navbera " .. r1:gsub("^!", "") .. " û " .. period(r2))
return poff + 3
end
ins(period(year))
return poff + 1
end
local function process_circa_or_year_range(offset)
local next_param
if specs[offset] == "c" then
ins("''[[circa|nêzîkî]]'' ")
next_param = process_year_or_range(offset + 1)
else
next_param = process_year_or_range(offset)
end
if specs[next_param] then
process_common_usage(next_param)
end
end
-- The second date goes after the main clause, as a sentence of its own.
process_common_usage = function(offset)
target = tail
ins(", lê ancax ji ")
process_circa_or_year_range(offset)
ins(" ve bi berfirehî hatiye bikaranîn")
target = parts
end
if args.nocap then
ins("c")
else
ins("C")
end
ins("ara ewil ")
if specs[1] == "before" or specs[1] == "after" then
ins(specs[1] == "before" and "beriya " or "piştî ")
if not specs[2] then
error(("Saw 1=%s but 2= is missing"):format(specs[1]))
end
ins(period(specs[2]))
if specs[3] then
process_common_usage(3)
end
ins(" hatiye peyitandin")
else
ins("di ")
process_circa_or_year_range(1)
ins(" de hatiye peyitandin")
end
for _, part in ipairs(tail) do
insert(parts, part)
end
if not (opts and opts.omit_refs) then
local flattened_refs = export.collect_etydate_ref_specs(args)
if #flattened_refs > 0 then
insert(parts, M.references.format_references(flattened_refs))
end
end
return concat(parts)
end
return export
ljm1hlpw1vnhhwzm66nabwf3vuj5oxu
Şablon:etîmon/belge
10
1359259
6532084
2026-09-18T19:08:53Z
Wikihez
7344
documentation for {{etîmon}}: parameters, keywords and term modifiers
6532084
wikitext
text/x-wiki
{{belgekirin/binrûpel}}
{{Lua bikartîne|Modul:etymon|Modul:etymon/data|Modul:etymon/text|Modul:etymon/tree|Modul:etymon/categories}}
Ev şablon etîmolojiya kelîmeyekê bi awayekî birêkûpêk qeyd dike. Di her bangkirinê de bi kêmî gaveke etîmolojiyê tê nivîsîn, yanî kelîmeya ku ev kelîme jê hatiye; bi guhernerê <code><etimon:…></code> mirov dikare çend gavan jî di eynî bangkirinê de binivîse. Gavên din li ser rûpelên wan kelîmeyan bi vê şablonê hatine qeydkirin; şablon wan rûpelan dixwîne û zincîrê bi xwe berhev dike, loma ne lazim e mirov tevahiya zincîrê li ser her rûpelê dubare bike.
Ji vê zincîrê du netîce çêdibin: '''metnê etîmolojiyê''' (bi {{para|metn}}) û '''dara etîmolojiyê''' (bi {{para|dar}}).
=== Bikaranîn ===
<pre>{{etîmon|<koda zimanê rûpelê>|:<kelîmeya mifteyî>|<koda zimên>:<kelîme>|metn=++|dar=1}}</pre>
* '''Parametreya 1''' koda zimanê rûpelê ye, wek <code>ku</code>.
* '''Parametreyên bênav ên din''' bi rêz têne xwendin: [[#Kelîmeyên mifteyî|kelîmeya mifteyî]] (bi du niqteyan dest pê dike, wek <code>:deyn</code>) û paşê kelîmeyên jêder di şiklê <code>koda zimên:kelîme</code> de.
* Eger kelîmeya jêder bi zimanê rûpelê be, koda zimên ne lazim e. Li ser rûpela ''zimandirêj'' herdu parçe kurmancî ne, loma <code>{{tlf|etîmon|ku|:qf|ziman|dirêj}}</code> bes e.
* Kelîmeya mifteyî heta ya pêş de li hemû kelîmeyên jêder tê tetbîqkirin: <code>|:deyn|a|b|:mîr|c</code> yanî a û b deyn in, c mîrasmayî ye.
==== Nimûne ====
{{şx|etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++}}
: {{etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++|katna=1}}
{{şx|etîmon|ku|:qf|ziman|dirêj|metn=++}}
: {{etîmon|ku|:qf|ziman|dirêj|metn=++|katna=1}}
{{şx|etîmon|ku|:deyn|ira:-|fa:test|metn=++}}
: {{etîmon|ku|:deyn|ira:-|fa:test|metn=++|katna=1}}
Bi darê re:
{{şx|etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman}}
: {{etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman|katna=1}}
==== Nasname (id) ====
Eger li ser rûpelekê ji etîmolojiyekê zêdetir hebe, divê her yek nasnameyeke xwe ya bi {{para|id}} hebe, û rûpelên ku wê kelîmeyê wek jêder nîşan didin divê eynî nasnameyê bi <code><id:…></code> binivîsin. Bi vî awayî şablon dizane ka kîjan etîmolojî tê xwestin.
Nasname divê kurt be û maneyekê yan eslekî bide nasîn (wek <code>kitêba referansê</code>), ne hejmarên bêmane. Eger kelîmeyê tenê etîmolojiyek hebe, nasname ne lazim e. Eger li ser rûpelekê çend bangkirinên eynî zimanî hebin û yek jê bê nasname be, şablon xeletiyekê dide. Nasname herwiha wek lenger tê bikaranîn: <code>[[qanûn#Kurmancî: rêzik]]</code>.
==== Kelîmeyên jêder ====
Şiklê temam: <code>koda zimên:kelîme<guherîner>…</code>
* Ji bo ku tenê navê zimên yan malbata zimanan bê nîşandan, li şûna kelîmeyê <code>-</code> tê nivîsîn: <code>ira:-</code>. Malbatên zimanan her tim bi vî awayî têne nivîsîn.
* Eger cihê kelîmeyê vala be, wek kelîmeyeke nenas tê nîşandan.
* Bi <code><id:!…></code> nasname her tim xuya dibe, ku şablon bi xwe biryar nede.
==== Etîmolojiya di cih de ====
Eger rûpela kelîmeya jêder tune be yan tê de ev şablon nehatibe bikaranîn, mirov dikare zincîrê bi <code><etimon:…></code> di cih de berdewam bike. '''Not:''' ev guherîner bêyî '''î''' tê nivîsîn (<code>etimon</code>, ne <code>etîmon</code>), ji ber ku navên guhernerên di nav <code><></code> de tenê bi herfên ASCII dikarin bên nivîsîn.
<pre>{{etîmon|ku|:deyn|fa:خانه<etimon::mîr<<pal:test>>>|metn=++}}</pre>
Di hundir de kelîmeya mifteyî û kelîmeyên jêder tên nivîsîn; guhernerên hundirîn bi <code><<…>></code> tên nivîsîn. Eger rûpela hedefê hebe û tê de ev şablon hebe, etîmolojiya di cih de nayê bikaranîn.
=== Parametre ===
{| class="wikitable"
! Parametre !! Mane !! Navê îngilîzî
|-
| {{para|1}} || Koda zimanê rûpelê. Lazim e.
|-
| {{para|metn}} || Metnê etîmolojiyê nîşan dide; binêre [[#Metn]]. || {{para|text}}
|-
| {{para|dar}} || Bi <code>1</code> dara etîmolojiyê nîşan dide. || {{para|tree}}
|-
| {{para|id}} || Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan.
|-
| {{para|title}} || Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be.
|-
| {{para|crz}} || Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: <code>reh</code>, <code>kelîme</code>, <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>. || {{para|pos}}
|-
| {{para|cotreh}} || Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda. || {{para|doublet}}
|-
| {{para|tarîxa-etîm}} || Tarîxa peyitandina pêşîn, wek <code>1901</code>, <code>1500s</code>, <code>14c</code>, <code>c,1900</code>, <code>before,1850</code>, <code>r,1501,1558</code>. || {{para|etydate}}
|-
| {{para|niqtena}} || Bi <code>1</code> niqteya dawiyê nayê zêdekirin. || {{para|nodot}}
|-
| {{para|niqte}} || Li şûna niqteya dawiyê nîşaneke din. || {{para|dot}}
|-
| {{para|katna}} || Bi <code>1</code> kategorî nayên zêdekirin. Herwiha {{para|nekat}}. || {{para|nocat}}
|-
| {{para|darna}} || Bi <code>1</code> ev etîmolojî di dara rûpelên din de dernakeve. || {{para|notree}}
|-
| {{para|exnihilo}} || Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin.
|-
| {{para|json}} || Bi <code>1</code> li şûna metnî daneyên xam vedigerîne; ji bo ceribandinê ye.
|}
=== Kelîmeyên mifteyî ===
Kelîmeya mifteyî bi du niqteyan dest pê dike û eleqeya di navbera her du kelîmeyan de diyar dike. Navên îngilîzî jî tên qebûlkirin.
{| class="wikitable"
! Kelîmeya mifteyî !! Mane !! Navên din
|-
| <code>:mîr</code> || Kelîmeya ku ji zimanê bav û kalan maye || <code>:mîrasmayî</code>, <code>:inh</code>
|-
| <code>:deyn</code> || Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin || <code>:bor</code>, <code>:borrowed</code>
|-
| <code>:deynh</code> || [[Nimînok:Ferhengok#deynkirina hînbûyî|Deynkirina hînbûyî]]: ne bi riya têkiliya rojane, bi qesd hatiye girtin || <code>:lbor</code>
|-
| <code>:deynhq</code> || Deynkirina hînbûyî ya ku hinekî hatiye guhertin || <code>:slbor</code>
|-
| <code>:deynort</code> || [[Nimînok:Ferhengok#deynkirina ortografîk|Deynkirina ortografîk]] || <code>:obor</code>
|-
| <code>:deynne</code> || [[Nimînok:Ferhengok#deynkirina neadaptekirî|Deynkirina neadaptekirî]] || <code>:ubor</code>
|-
| <code>:drş</code> || Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be || <code>:dariştî</code>, <code>:der</code>
|-
| <code>:ji</code> || Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e || <code>:from</code>
|-
| <code>:drşnd</code> || Dariştin heye lê cureyê wê ne diyar e || <code>:uder</code>
|-
| <code>:qf</code> || Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e || <code>:qertaf</code>, <code>:af</code>
|-
| <code>:reh</code> || Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e ("Peyvên … yên aîdî rehê …") û di metn û darê de xuya nabe || <code>:root</code>
|-
| <code>:yekser</code> || [[Nimînok:Ferhengok#yekser|Wergerandina yekser]]; zincîr li vir disekine || <code>:cal</code>, <code>:clq</code>
|-
| <code>:yekserq</code> || Wergerandina yekser a qismî; zincîr li vir disekine || <code>:yekserqismî</code>, <code>:pcal</code>
|-
| <code>:wergirtin</code> || [[Nimînok:Ferhengok#wergirtin|Wergirtina maneyê]]; mana wergirtî bi <code><maneid:…></code> tê nîşankirin || <code>:sl</code>
|-
| <code>:lihevanîn</code> || Lihevanîna dengî-maneyî || <code>:psm</code>
|-
| <code>:tesîr</code> || Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine || <code>:influence</code>
|-
| <code>:têkilkirin</code> || [[Nimînok:Ferhengok#têkilkirin|Têkilkirina]] du kelîmeyan || <code>:blend</code>
|-
| <code>:ûnîverbasyon</code> || [[Nimînok:Ferhengok#ûnîverbasyon|Ûnîverbasyon]] || <code>:ûnîv</code>, <code>:univ</code>
|-
| <code>:qusandin</code> || [[Nimînok:Ferhengok#qusandin|Qusandin]] || <code>:clip</code>
|-
| <code>:paşvesazî</code> || [[Nimînok:Ferhengok#paşvesazî|Paşvesazî]] || <code>:bf</code>
|-
| <code>:elîpsîz</code> || [[Nimînok:Ferhengok#elîpsîz|Elîpsîz]] || <code>:elîp</code>, <code>:ellip</code>
|-
| <code>:nomînalîzasyon</code> || [[Nimînok:Ferhengok#nomînalîzasyon|Nomînalîzasyon]] || <code>:nomîn</code>, <code>:nom</code>
|-
| <code>:translîterasyon</code> || [[Nimînok:Ferhengok#translîterasyon|Translîterasyon]] || <code>:translît</code>, <code>:translit</code>
|-
| <code>:redûblîkasyon</code> || [[Nimînok:Ferhengok#redûblîkasyon|Redûblîkasyon]] || <code>:redûb</code>, <code>:redup</code>
|-
| <code>:kurtkirin</code> || Kurtkirina kelîmeyekê || <code>:abbr</code>
|-
| <code>:kurtkirina bi kîteyan</code> || Kurtkirin li gorî kîteyan || <code>:sylabbr</code>
|-
| <code>:akronîm</code> || [[Nimînok:Ferhengok#akronîm|Akronîm]] || <code>:acro</code>
|-
| <code>:înîtîalîzm</code> || [[Nimînok:Ferhengok#înîtîalîzm|Înîtîalîzm]] || <code>:înît</code>, <code>:init</code>
|-
| <code>:metatez</code> || [[Nimînok:Ferhengok#metatez|Metatez]] || <code>:meta</code>
|-
| <code>:afeq</code> || Wek <code>:qf</code>, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike
|-
| <code>:aph</code> || Şiklê ku dengê destpêkê winda kiriye || <code>:apheresis</code>, <code>:aphetic</code>
|-
| <code>:denom</code> || Fiîla ji îsmekê çêbûyî || <code>:denominal</code>
|-
| <code>:deverbal</code> || Kelîmeya ji fiîlekê çêbûyî
|-
| <code>:vrd</code> || Dariştina vṛddhî (sanskrîtî); bi qertaf: <code>:vrd-af</code>
|-
| <code>:sa-af</code> || Pêkhateya sanskrîtî
|}
=== Guherîner ===
Guherîner di nav <code><></code> de tên nivîsîn û tavilê tên pey kelîmeyê yan kelîmeya mifteyî: <code>fa:خانه<tr:xâne><t:mal></code>. Navên guhernerên di nav <code><></code> de her tim bi herfên ASCII ne.
==== Guherînerên kelîmeyê ====
{| class="wikitable"
! Guherîner !! Mane !! Navên din
|-
| <code><t:…></code> || Tercimeya kelîmeyê bi kurmancî || <code><w:…></code>
|-
| <code><tr:…></code> || Translîterasyon
|-
| <code><ts:…></code> || Transkrîpsiyon
|-
| <code><cuda:…></code> || Şiklê ku tê nîşandan, eger ne wek navê rûpelê be || <code><alt:…></code>
|-
| <code><id:…></code> || Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan
|-
| <code><crz:…></code> || Cureyê rêzimanî yê kelîmeyê || <code><pos:…></code>
|-
| <code><g:…></code> || Cinsiyet: <code>n</code> (nêr), <code>m</code> (mê), <code>nt</code> (nêtar)
|-
| <code><q:…></code> || Wesf li pêşiyê kelîmeyê
|-
| <code><qq:…></code> || Wesf li pey kelîmeyê
|-
| <code><hrf:…></code> || Mana herfiyen || <code><lit:…></code>
|-
| <code><ref:…></code> || Çavkanî; binêre [[#Çavkanî]]
|-
| <code><nediyar></code> || Ev gav ne teqez e || <code><unc></code>
|-
| <code><crztip:…></code> || Kelîme ji bo kategoriyan wek <code>reh</code> yan <code>kelîme</code> tê hesibandin || <code><postype:…></code>
|-
| <code><etimon:…></code> || Etîmolojiya di cih de; binêre jor || <code><ety:…></code>
|-
| <code><aftype:…></code> || Di nav <code>:qf</code> de: cureyê qertafê; binêre [[#Cureyên qertafan]]
|-
| <code><deyn></code>, <code><deynh></code>, <code><deynhq></code> || Di nav <code>:qf</code> de: ev parçe deynkirî ye
|}
==== Guherînerên kelîmeya mifteyî ====
{| class="wikitable"
! Guherîner !! Mane !! Navên din
|-
| <code><unc></code> || Ev gav ne teqez e: "Mihtemelen…"
|-
| <code><grdk:…></code> || Girêdeka di navbera kelîmeyên jêder de, li şûna "yan jî" || <code><conj:…></code>
|-
| <code><anlz></code> || [[Nimînok:Ferhengok#analîza şiklî|Analîza şiklî]] || <code><surf></code>
|-
| <code><hrf:…></code> || Di nav <code>:qf</code> de: mana herfiyen || <code><lit:…></code>
|-
| <code><maneid:…></code> || Di nav <code>:wergirtin</code> de: nasnameya maneya wergirtî || <code><senseid:…></code>
|-
| <code><metn:…></code> || Di nav <code>:ji</code> û <code>:drş</code> de: metnekî din li şûna "Ji" || <code><text:…></code>
|-
| <code><ref:…></code> || Çavkaniya vê gavê
|}
=== Çavkanî ===
Çavkanî bi <code><ref:…></code> li kelîmeyekê yan li kelîmeya mifteyî tên zêdekirin. Ji bo çend çavkaniyan <code> !!! </code> (bi valahiyan) dikeve navbera wan. Çavkanî tenê wextê {{para|metn}} hatibe dayîn xuya dibin, û tenê li ser wê rûpelê, ne li ser rûpelên dûndeyan.
* <code>la:verbum<ref:{{ş|R:L&S}}></code> – çavkaniyek
* <code>la:verbum<ref:{{ş|R:L&S}} !!! {{ş|R:Tsabolov}}></code> – du çavkanî
* <code>la:verbum<ref:{{ş|R:L&S}}<<name:LS>>></code> – çavkaniya bi nav, ku paşê bi <code><ref:<<name:LS>>></code> tê dubarekirin
* Bi <code><<group:…>></code> kom tê diyarkirin.
=== Dar ===
Bi {{para|dar|1}} dara etîmolojiyê tê nîşandan. Dar ji eynî daneyan tê çêkirin, yanî ji zincîra ku ji rûpelan tê berhevkirin.
Kelîmeyên mifteyî yên ku zincîrê pêş de nabin (<code>:yekser</code>, <code>:yekserq</code>, <code>:wergirtin</code>, <code>:tesîr</code>) di darê de etîmolojiya jorîn nîşan nadin; li şûna wê xetek bi niqteyan xuya dibe. Kelîmeya ku di darê de dubare dibe jî etîmolojiya xwe cardin nîşan nade û bi çarçoveyeke niqteyî tê xuyakirin.
Dar bi gedgeta [[MediaWiki:Gadget-EtytreeZoom.js|EtytreeZoom]] tê biçûk û mezin kirin.
=== Metn ===
Bi {{para|metn}} metnê etîmolojiyê tê çêkirin. Li ser Wîkîferhenga kurdî ev ji bo hemû zimanan vekirî ye ([[Modul:etymon/data/text_allowed]]).
Nirxên {{para|metn}}:
* <code>++</code> – tevahiya zincîrê
* <code>+</code> – tenê gava pêşîn
* <code>*</code> – heta kelîmeya pêşîn a ku rûpela wê heye
* hejmarek – ewqas gav
* <code>:kod</code> – heta zimanê bi wê kodê
* <code>:kod*</code> – heta wî zimanî, eger rûpela wî tune be heta rûpela pêşîn a heyî
=== Cureyên qertafan ===
Di nav <code>:qf</code> de bi <code><aftype:…></code> tê diyarkirin ka parçe çi ye: <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>, <code>circumfix</code>, <code>infix</code>, <code>non-affix</code>. Kurtiyên <code>pre</code>, <code>suf</code>, <code>in</code>, <code>inter</code>, <code>circum</code>, <code>naf</code> û <code>root</code> jî tên qebûlkirin.
=== Rewşên xisûsî ===
Ji bo zimanên çînî (malbata <code>zhx</code>) dar, metn û kategorî girtî ne û translîterasyon nayê nîşandan.
'''Not:''' ev şablon li sernavê beşê dinêre û divê ew navê zimanê parametreya 1 be. Loma nimûneyên jorîn di beşên asta sisiyan de ne; di beşeke asta duduyan de (wek <code>== Bikaranîn ==</code>) şablon xeletiyekê dide.
=== Binêre ===
* {{ş|dû}} – dûndeyên kelîmeyekê
* {{ş|dara dûnde}} – dara dûndeyan
* [[Nimînok:Ferhengok]] – ferhengoka terimên etîmolojiyê
* [[Şablon:etîmon/testcases]] – ceribandin
<includeonly>
[[Kategorî:Etîmolojî (şablon)]]
</includeonly>
43qgwmyp2eh3rlyyqxoaq5c4mdfhv08
6532085
6532084
2026-09-18T19:09:31Z
Wikihez
7344
documentation for {{etîmon}}: parameters, keywords and term modifiers
6532085
wikitext
text/x-wiki
{{belgekirin/binrûpel}}
{{Lua bikartîne|Modul:etymon|Modul:etymon/data|Modul:etymon/text|Modul:etymon/tree|Modul:etymon/categories}}
Ev şablon etîmolojiya kelîmeyekê bi awayekî birêkûpêk qeyd dike. Di her bangkirinê de bi kêmî gaveke etîmolojiyê tê nivîsîn, yanî kelîmeya ku ev kelîme jê hatiye; bi guhernerê <code><etimon:…></code> mirov dikare çend gavan jî di eynî bangkirinê de binivîse. Gavên din li ser rûpelên wan kelîmeyan bi vê şablonê hatine qeydkirin; şablon wan rûpelan dixwîne û zincîrê bi xwe berhev dike, loma ne lazim e mirov tevahiya zincîrê li ser her rûpelê dubare bike.
Ji vê zincîrê du netîce çêdibin: '''metnê etîmolojiyê''' (bi {{para|metn}}) û '''dara etîmolojiyê''' (bi {{para|dar}}).
=== Bikaranîn ===
<pre>{{etîmon|<koda zimanê rûpelê>|:<kelîmeya mifteyî>|<koda zimên>:<kelîme>|metn=++|dar=1}}</pre>
* '''Parametreya 1''' koda zimanê rûpelê ye, wek <code>ku</code>.
* '''Parametreyên bênav ên din''' bi rêz têne xwendin: [[#Kelîmeyên mifteyî|kelîmeya mifteyî]] (bi du niqteyan dest pê dike, wek <code>:deyn</code>) û paşê kelîmeyên jêder di şiklê <code>koda zimên:kelîme</code> de.
* Eger kelîmeya jêder bi zimanê rûpelê be, koda zimên ne lazim e. Li ser rûpela ''zimandirêj'' herdu parçe kurmancî ne, loma <code><nowiki>{{etîmon|ku|:qf|ziman|dirêj}}</nowiki></code> bes e.
* Kelîmeya mifteyî heta ya pêş de li hemû kelîmeyên jêder tê tetbîqkirin: <code>|:deyn|a|b|:mîr|c</code> yanî a û b deyn in, c mîrasmayî ye.
==== Nimûne ====
{{şx|etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++}}
: {{etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++|katna=1}}
{{şx|etîmon|ku|:qf|ziman|dirêj|metn=++}}
: {{etîmon|ku|:qf|ziman|dirêj|metn=++|katna=1}}
{{şx|etîmon|ku|:deyn|ira:-|fa:test|metn=++}}
: {{etîmon|ku|:deyn|ira:-|fa:test|metn=++|katna=1}}
Bi darê re:
{{şx|etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman}}
: {{etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman|katna=1}}
==== Nasname (id) ====
Eger li ser rûpelekê ji etîmolojiyekê zêdetir hebe, divê her yek nasnameyeke xwe ya bi {{para|id}} hebe, û rûpelên ku wê kelîmeyê wek jêder nîşan didin divê eynî nasnameyê bi <code><id:…></code> binivîsin. Bi vî awayî şablon dizane ka kîjan etîmolojî tê xwestin.
Nasname divê kurt be û maneyekê yan eslekî bide nasîn (wek <code>kitêba referansê</code>), ne hejmarên bêmane. Eger kelîmeyê tenê etîmolojiyek hebe, nasname ne lazim e. Eger li ser rûpelekê çend bangkirinên eynî zimanî hebin û yek jê bê nasname be, şablon xeletiyekê dide. Nasname herwiha wek lenger tê bikaranîn: <code>[[qanûn#Kurmancî: rêzik]]</code>.
==== Kelîmeyên jêder ====
Şiklê temam: <code>koda zimên:kelîme<guherîner>…</code>
* Ji bo ku tenê navê zimên yan malbata zimanan bê nîşandan, li şûna kelîmeyê <code>-</code> tê nivîsîn: <code>ira:-</code>. Malbatên zimanan her tim bi vî awayî têne nivîsîn.
* Eger cihê kelîmeyê vala be, wek kelîmeyeke nenas tê nîşandan.
* Bi <code><id:!…></code> nasname her tim xuya dibe, ku şablon bi xwe biryar nede.
==== Etîmolojiya di cih de ====
Eger rûpela kelîmeya jêder tune be yan tê de ev şablon nehatibe bikaranîn, mirov dikare zincîrê bi <code><etimon:…></code> di cih de berdewam bike. '''Not:''' ev guherîner bêyî '''î''' tê nivîsîn (<code>etimon</code>, ne <code>etîmon</code>), ji ber ku navên guhernerên di nav <code><></code> de tenê bi herfên ASCII dikarin bên nivîsîn.
<pre>{{etîmon|ku|:deyn|fa:خانه<etimon::mîr<<pal:test>>>|metn=++}}</pre>
Di hundir de kelîmeya mifteyî û kelîmeyên jêder tên nivîsîn; guhernerên hundirîn bi <code><<…>></code> tên nivîsîn. Eger rûpela hedefê hebe û tê de ev şablon hebe, etîmolojiya di cih de nayê bikaranîn.
=== Parametre ===
{| class="wikitable"
! Parametre !! Mane !! Navê îngilîzî
|-
| {{para|1}} || Koda zimanê rûpelê. Lazim e.
|-
| {{para|metn}} || Metnê etîmolojiyê nîşan dide; binêre [[#Metn]]. || {{para|text}}
|-
| {{para|dar}} || Bi <code>1</code> dara etîmolojiyê nîşan dide. || {{para|tree}}
|-
| {{para|id}} || Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan.
|-
| {{para|title}} || Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be.
|-
| {{para|crz}} || Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: <code>reh</code>, <code>kelîme</code>, <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>. || {{para|pos}}
|-
| {{para|cotreh}} || Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda. || {{para|doublet}}
|-
| {{para|tarîxa-etîm}} || Tarîxa peyitandina pêşîn, wek <code>1901</code>, <code>1500s</code>, <code>14c</code>, <code>c,1900</code>, <code>before,1850</code>, <code>r,1501,1558</code>. || {{para|etydate}}
|-
| {{para|niqtena}} || Bi <code>1</code> niqteya dawiyê nayê zêdekirin. || {{para|nodot}}
|-
| {{para|niqte}} || Li şûna niqteya dawiyê nîşaneke din. || {{para|dot}}
|-
| {{para|katna}} || Bi <code>1</code> kategorî nayên zêdekirin. Herwiha {{para|nekat}}. || {{para|nocat}}
|-
| {{para|darna}} || Bi <code>1</code> ev etîmolojî di dara rûpelên din de dernakeve. || {{para|notree}}
|-
| {{para|exnihilo}} || Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin.
|-
| {{para|json}} || Bi <code>1</code> li şûna metnî daneyên xam vedigerîne; ji bo ceribandinê ye.
|}
=== Kelîmeyên mifteyî ===
Kelîmeya mifteyî bi du niqteyan dest pê dike û eleqeya di navbera her du kelîmeyan de diyar dike. Navên îngilîzî jî tên qebûlkirin.
{| class="wikitable"
! Kelîmeya mifteyî !! Mane !! Navên din
|-
| <code>:mîr</code> || Kelîmeya ku ji zimanê bav û kalan maye || <code>:mîrasmayî</code>, <code>:inh</code>
|-
| <code>:deyn</code> || Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin || <code>:bor</code>, <code>:borrowed</code>
|-
| <code>:deynh</code> || [[Nimînok:Ferhengok#deynkirina hînbûyî|Deynkirina hînbûyî]]: ne bi riya têkiliya rojane, bi qesd hatiye girtin || <code>:lbor</code>
|-
| <code>:deynhq</code> || Deynkirina hînbûyî ya ku hinekî hatiye guhertin || <code>:slbor</code>
|-
| <code>:deynort</code> || [[Nimînok:Ferhengok#deynkirina ortografîk|Deynkirina ortografîk]] || <code>:obor</code>
|-
| <code>:deynne</code> || [[Nimînok:Ferhengok#deynkirina neadaptekirî|Deynkirina neadaptekirî]] || <code>:ubor</code>
|-
| <code>:drş</code> || Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be || <code>:dariştî</code>, <code>:der</code>
|-
| <code>:ji</code> || Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e || <code>:from</code>
|-
| <code>:drşnd</code> || Dariştin heye lê cureyê wê ne diyar e || <code>:uder</code>
|-
| <code>:qf</code> || Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e || <code>:qertaf</code>, <code>:af</code>
|-
| <code>:reh</code> || Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e ("Peyvên … yên aîdî rehê …") û di metn û darê de xuya nabe || <code>:root</code>
|-
| <code>:yekser</code> || [[Nimînok:Ferhengok#yekser|Wergerandina yekser]]; zincîr li vir disekine || <code>:cal</code>, <code>:clq</code>
|-
| <code>:yekserq</code> || Wergerandina yekser a qismî; zincîr li vir disekine || <code>:yekserqismî</code>, <code>:pcal</code>
|-
| <code>:wergirtin</code> || [[Nimînok:Ferhengok#wergirtin|Wergirtina maneyê]]; mana wergirtî bi <code><maneid:…></code> tê nîşankirin || <code>:sl</code>
|-
| <code>:lihevanîn</code> || Lihevanîna dengî-maneyî || <code>:psm</code>
|-
| <code>:tesîr</code> || Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine || <code>:influence</code>
|-
| <code>:têkilkirin</code> || [[Nimînok:Ferhengok#têkilkirin|Têkilkirina]] du kelîmeyan || <code>:blend</code>
|-
| <code>:ûnîverbasyon</code> || [[Nimînok:Ferhengok#ûnîverbasyon|Ûnîverbasyon]] || <code>:ûnîv</code>, <code>:univ</code>
|-
| <code>:qusandin</code> || [[Nimînok:Ferhengok#qusandin|Qusandin]] || <code>:clip</code>
|-
| <code>:paşvesazî</code> || [[Nimînok:Ferhengok#paşvesazî|Paşvesazî]] || <code>:bf</code>
|-
| <code>:elîpsîz</code> || [[Nimînok:Ferhengok#elîpsîz|Elîpsîz]] || <code>:elîp</code>, <code>:ellip</code>
|-
| <code>:nomînalîzasyon</code> || [[Nimînok:Ferhengok#nomînalîzasyon|Nomînalîzasyon]] || <code>:nomîn</code>, <code>:nom</code>
|-
| <code>:translîterasyon</code> || [[Nimînok:Ferhengok#translîterasyon|Translîterasyon]] || <code>:translît</code>, <code>:translit</code>
|-
| <code>:redûblîkasyon</code> || [[Nimînok:Ferhengok#redûblîkasyon|Redûblîkasyon]] || <code>:redûb</code>, <code>:redup</code>
|-
| <code>:kurtkirin</code> || Kurtkirina kelîmeyekê || <code>:abbr</code>
|-
| <code>:kurtkirina bi kîteyan</code> || Kurtkirin li gorî kîteyan || <code>:sylabbr</code>
|-
| <code>:akronîm</code> || [[Nimînok:Ferhengok#akronîm|Akronîm]] || <code>:acro</code>
|-
| <code>:înîtîalîzm</code> || [[Nimînok:Ferhengok#înîtîalîzm|Înîtîalîzm]] || <code>:înît</code>, <code>:init</code>
|-
| <code>:metatez</code> || [[Nimînok:Ferhengok#metatez|Metatez]] || <code>:meta</code>
|-
| <code>:afeq</code> || Wek <code>:qf</code>, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike
|-
| <code>:aph</code> || Şiklê ku dengê destpêkê winda kiriye || <code>:apheresis</code>, <code>:aphetic</code>
|-
| <code>:denom</code> || Fiîla ji îsmekê çêbûyî || <code>:denominal</code>
|-
| <code>:deverbal</code> || Kelîmeya ji fiîlekê çêbûyî
|-
| <code>:vrd</code> || Dariştina vṛddhî (sanskrîtî); bi qertaf: <code>:vrd-af</code>
|-
| <code>:sa-af</code> || Pêkhateya sanskrîtî
|}
=== Guherîner ===
Guherîner di nav <code><></code> de tên nivîsîn û tavilê tên pey kelîmeyê yan kelîmeya mifteyî: <code>fa:خانه<tr:xâne><t:mal></code>. Navên guhernerên di nav <code><></code> de her tim bi herfên ASCII ne.
==== Guherînerên kelîmeyê ====
{| class="wikitable"
! Guherîner !! Mane !! Navên din
|-
| <code><t:…></code> || Tercimeya kelîmeyê bi kurmancî || <code><w:…></code>
|-
| <code><tr:…></code> || Translîterasyon
|-
| <code><ts:…></code> || Transkrîpsiyon
|-
| <code><cuda:…></code> || Şiklê ku tê nîşandan, eger ne wek navê rûpelê be || <code><alt:…></code>
|-
| <code><id:…></code> || Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan
|-
| <code><crz:…></code> || Cureyê rêzimanî yê kelîmeyê || <code><pos:…></code>
|-
| <code><g:…></code> || Cinsiyet: <code>n</code> (nêr), <code>m</code> (mê), <code>nt</code> (nêtar)
|-
| <code><q:…></code> || Wesf li pêşiyê kelîmeyê
|-
| <code><qq:…></code> || Wesf li pey kelîmeyê
|-
| <code><hrf:…></code> || Mana herfiyen || <code><lit:…></code>
|-
| <code><ref:…></code> || Çavkanî; binêre [[#Çavkanî]]
|-
| <code><nediyar></code> || Ev gav ne teqez e || <code><unc></code>
|-
| <code><crztip:…></code> || Kelîme ji bo kategoriyan wek <code>reh</code> yan <code>kelîme</code> tê hesibandin || <code><postype:…></code>
|-
| <code><etimon:…></code> || Etîmolojiya di cih de; binêre jor || <code><ety:…></code>
|-
| <code><aftype:…></code> || Di nav <code>:qf</code> de: cureyê qertafê; binêre [[#Cureyên qertafan]]
|-
| <code><deyn></code>, <code><deynh></code>, <code><deynhq></code> || Di nav <code>:qf</code> de: ev parçe deynkirî ye
|}
==== Guherînerên kelîmeya mifteyî ====
{| class="wikitable"
! Guherîner !! Mane !! Navên din
|-
| <code><unc></code> || Ev gav ne teqez e: "Mihtemelen…"
|-
| <code><grdk:…></code> || Girêdeka di navbera kelîmeyên jêder de, li şûna "yan jî" || <code><conj:…></code>
|-
| <code><anlz></code> || [[Nimînok:Ferhengok#analîza şiklî|Analîza şiklî]] || <code><surf></code>
|-
| <code><hrf:…></code> || Di nav <code>:qf</code> de: mana herfiyen || <code><lit:…></code>
|-
| <code><maneid:…></code> || Di nav <code>:wergirtin</code> de: nasnameya maneya wergirtî || <code><senseid:…></code>
|-
| <code><metn:…></code> || Di nav <code>:ji</code> û <code>:drş</code> de: metnekî din li şûna "Ji" || <code><text:…></code>
|-
| <code><ref:…></code> || Çavkaniya vê gavê
|}
=== Çavkanî ===
Çavkanî bi <code><ref:…></code> li kelîmeyekê yan li kelîmeya mifteyî tên zêdekirin. Ji bo çend çavkaniyan <code> !!! </code> (bi valahiyan) dikeve navbera wan. Çavkanî tenê wextê {{para|metn}} hatibe dayîn xuya dibin, û tenê li ser wê rûpelê, ne li ser rûpelên dûndeyan.
* <code>la:verbum<ref:{{ş|R:L&S}}></code> – çavkaniyek
* <code>la:verbum<ref:{{ş|R:L&S}} !!! {{ş|R:Tsabolov}}></code> – du çavkanî
* <code>la:verbum<ref:{{ş|R:L&S}}<<name:LS>>></code> – çavkaniya bi nav, ku paşê bi <code><ref:<<name:LS>>></code> tê dubarekirin
* Bi <code><<group:…>></code> kom tê diyarkirin.
=== Dar ===
Bi {{para|dar|1}} dara etîmolojiyê tê nîşandan. Dar ji eynî daneyan tê çêkirin, yanî ji zincîra ku ji rûpelan tê berhevkirin.
Kelîmeyên mifteyî yên ku zincîrê pêş de nabin (<code>:yekser</code>, <code>:yekserq</code>, <code>:wergirtin</code>, <code>:tesîr</code>) di darê de etîmolojiya jorîn nîşan nadin; li şûna wê xetek bi niqteyan xuya dibe. Kelîmeya ku di darê de dubare dibe jî etîmolojiya xwe cardin nîşan nade û bi çarçoveyeke niqteyî tê xuyakirin.
Dar bi gedgeta [[MediaWiki:Gadget-EtytreeZoom.js|EtytreeZoom]] tê biçûk û mezin kirin.
=== Metn ===
Bi {{para|metn}} metnê etîmolojiyê tê çêkirin. Li ser Wîkîferhenga kurdî ev ji bo hemû zimanan vekirî ye ([[Modul:etymon/data/text_allowed]]).
Nirxên {{para|metn}}:
* <code>++</code> – tevahiya zincîrê
* <code>+</code> – tenê gava pêşîn
* <code>*</code> – heta kelîmeya pêşîn a ku rûpela wê heye
* hejmarek – ewqas gav
* <code>:kod</code> – heta zimanê bi wê kodê
* <code>:kod*</code> – heta wî zimanî, eger rûpela wî tune be heta rûpela pêşîn a heyî
=== Cureyên qertafan ===
Di nav <code>:qf</code> de bi <code><aftype:…></code> tê diyarkirin ka parçe çi ye: <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>, <code>circumfix</code>, <code>infix</code>, <code>non-affix</code>. Kurtiyên <code>pre</code>, <code>suf</code>, <code>in</code>, <code>inter</code>, <code>circum</code>, <code>naf</code> û <code>root</code> jî tên qebûlkirin.
=== Rewşên xisûsî ===
Ji bo zimanên çînî (malbata <code>zhx</code>) dar, metn û kategorî girtî ne û translîterasyon nayê nîşandan.
'''Not:''' ev şablon li sernavê beşê dinêre û divê ew navê zimanê parametreya 1 be. Loma nimûneyên jorîn di beşên asta sisiyan de ne; di beşeke asta duduyan de (wek <code>== Bikaranîn ==</code>) şablon xeletiyekê dide.
=== Binêre ===
* {{ş|dû}} – dûndeyên kelîmeyekê
* {{ş|dara dûnde}} – dara dûndeyan
* [[Nimînok:Ferhengok]] – ferhengoka terimên etîmolojiyê
* [[Şablon:etîmon/testcases]] – ceribandin
<includeonly>
[[Kategorî:Etîmolojî (şablon)]]
</includeonly>
2bk3omeezg1h35f3oy69mh8ga6ye5m5
6532089
6532085
2026-09-18T19:14:21Z
Wikihez
7344
/* Nasname (id) */ (bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re)
6532089
wikitext
text/x-wiki
{{belgekirin/binrûpel}}
{{Lua bikartîne|Modul:etymon|Modul:etymon/data|Modul:etymon/text|Modul:etymon/tree|Modul:etymon/categories}}
Ev şablon etîmolojiya kelîmeyekê bi awayekî birêkûpêk qeyd dike. Di her bangkirinê de bi kêmî gaveke etîmolojiyê tê nivîsîn, yanî kelîmeya ku ev kelîme jê hatiye; bi guhernerê <code><etimon:…></code> mirov dikare çend gavan jî di eynî bangkirinê de binivîse. Gavên din li ser rûpelên wan kelîmeyan bi vê şablonê hatine qeydkirin; şablon wan rûpelan dixwîne û zincîrê bi xwe berhev dike, loma ne lazim e mirov tevahiya zincîrê li ser her rûpelê dubare bike.
Ji vê zincîrê du netîce çêdibin: '''metnê etîmolojiyê''' (bi {{para|metn}}) û '''dara etîmolojiyê''' (bi {{para|dar}}).
=== Bikaranîn ===
<pre>{{etîmon|<koda zimanê rûpelê>|:<kelîmeya mifteyî>|<koda zimên>:<kelîme>|metn=++|dar=1}}</pre>
* '''Parametreya 1''' koda zimanê rûpelê ye, wek <code>ku</code>.
* '''Parametreyên bênav ên din''' bi rêz têne xwendin: [[#Kelîmeyên mifteyî|kelîmeya mifteyî]] (bi du niqteyan dest pê dike, wek <code>:deyn</code>) û paşê kelîmeyên jêder di şiklê <code>koda zimên:kelîme</code> de.
* Eger kelîmeya jêder bi zimanê rûpelê be, koda zimên ne lazim e. Li ser rûpela ''zimandirêj'' herdu parçe kurmancî ne, loma <code><nowiki>{{etîmon|ku|:qf|ziman|dirêj}}</nowiki></code> bes e.
* Kelîmeya mifteyî heta ya pêş de li hemû kelîmeyên jêder tê tetbîqkirin: <code>|:deyn|a|b|:mîr|c</code> yanî a û b deyn in, c mîrasmayî ye.
==== Nimûne ====
{{şx|etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++}}
: {{etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++|katna=1}}
{{şx|etîmon|ku|:qf|ziman|dirêj|metn=++}}
: {{etîmon|ku|:qf|ziman|dirêj|metn=++|katna=1}}
{{şx|etîmon|ku|:deyn|ira:-|fa:test|metn=++}}
: {{etîmon|ku|:deyn|ira:-|fa:test|metn=++|katna=1}}
Bi darê re:
{{şx|etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman}}
: {{etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman|katna=1}}
==== Nasname (id) ====
Eger li ser rûpelekê ji yekî zêdetir beşên etîmolojiyê hebin, divê her yek nasnameyeke xwe ya bi {{para|id}} hebe, û rûpelên ku wê kelîmeyê wek jêder nîşan didin divê eynî nasnameyê bi <code><id:…></code> binivîsin. Bi vî awayî şablon dizane ka kîjan etîmolojî tê xwestin.
Nasname divê kurt be û maneyekê yan eslekî bide nasîn (wek <code>kitêba referansê</code>), ne hejmarên bêmane. Eger kelîmeyê tenê etîmolojiyek hebe, nasname ne lazim e. Eger li ser rûpelekê çend bangkirinên eynî zimanî hebin û yek jê bê nasname be, şablon xeletiyekê dide. Nasname herwiha wek lenger tê bikaranîn: <code>[[qanûn#Kurmancî:_qaîdeyên_hiqûqî]]</code>.
==== Kelîmeyên jêder ====
Şiklê temam: <code>koda zimên:kelîme<guherîner>…</code>
* Ji bo ku tenê navê zimên yan malbata zimanan bê nîşandan, li şûna kelîmeyê <code>-</code> tê nivîsîn: <code>ira:-</code>. Malbatên zimanan her tim bi vî awayî têne nivîsîn.
* Eger cihê kelîmeyê vala be, wek kelîmeyeke nenas tê nîşandan.
* Bi <code><id:!…></code> nasname her tim xuya dibe, ku şablon bi xwe biryar nede.
==== Etîmolojiya di cih de ====
Eger rûpela kelîmeya jêder tune be yan tê de ev şablon nehatibe bikaranîn, mirov dikare zincîrê bi <code><etimon:…></code> di cih de berdewam bike. '''Not:''' ev guherîner bêyî '''î''' tê nivîsîn (<code>etimon</code>, ne <code>etîmon</code>), ji ber ku navên guhernerên di nav <code><></code> de tenê bi herfên ASCII dikarin bên nivîsîn.
<pre>{{etîmon|ku|:deyn|fa:خانه<etimon::mîr<<pal:test>>>|metn=++}}</pre>
Di hundir de kelîmeya mifteyî û kelîmeyên jêder tên nivîsîn; guhernerên hundirîn bi <code><<…>></code> tên nivîsîn. Eger rûpela hedefê hebe û tê de ev şablon hebe, etîmolojiya di cih de nayê bikaranîn.
=== Parametre ===
{| class="wikitable"
! Parametre !! Mane !! Navê îngilîzî
|-
| {{para|1}} || Koda zimanê rûpelê. Lazim e.
|-
| {{para|metn}} || Metnê etîmolojiyê nîşan dide; binêre [[#Metn]]. || {{para|text}}
|-
| {{para|dar}} || Bi <code>1</code> dara etîmolojiyê nîşan dide. || {{para|tree}}
|-
| {{para|id}} || Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan.
|-
| {{para|title}} || Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be.
|-
| {{para|crz}} || Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: <code>reh</code>, <code>kelîme</code>, <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>. || {{para|pos}}
|-
| {{para|cotreh}} || Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda. || {{para|doublet}}
|-
| {{para|tarîxa-etîm}} || Tarîxa peyitandina pêşîn, wek <code>1901</code>, <code>1500s</code>, <code>14c</code>, <code>c,1900</code>, <code>before,1850</code>, <code>r,1501,1558</code>. || {{para|etydate}}
|-
| {{para|niqtena}} || Bi <code>1</code> niqteya dawiyê nayê zêdekirin. || {{para|nodot}}
|-
| {{para|niqte}} || Li şûna niqteya dawiyê nîşaneke din. || {{para|dot}}
|-
| {{para|katna}} || Bi <code>1</code> kategorî nayên zêdekirin. Herwiha {{para|nekat}}. || {{para|nocat}}
|-
| {{para|darna}} || Bi <code>1</code> ev etîmolojî di dara rûpelên din de dernakeve. || {{para|notree}}
|-
| {{para|exnihilo}} || Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin.
|-
| {{para|json}} || Bi <code>1</code> li şûna metnî daneyên xam vedigerîne; ji bo ceribandinê ye.
|}
=== Kelîmeyên mifteyî ===
Kelîmeya mifteyî bi du niqteyan dest pê dike û eleqeya di navbera her du kelîmeyan de diyar dike. Navên îngilîzî jî tên qebûlkirin.
{| class="wikitable"
! Kelîmeya mifteyî !! Mane !! Navên din
|-
| <code>:mîr</code> || Kelîmeya ku ji zimanê bav û kalan maye || <code>:mîrasmayî</code>, <code>:inh</code>
|-
| <code>:deyn</code> || Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin || <code>:bor</code>, <code>:borrowed</code>
|-
| <code>:deynh</code> || [[Nimînok:Ferhengok#deynkirina hînbûyî|Deynkirina hînbûyî]]: ne bi riya têkiliya rojane, bi qesd hatiye girtin || <code>:lbor</code>
|-
| <code>:deynhq</code> || Deynkirina hînbûyî ya ku hinekî hatiye guhertin || <code>:slbor</code>
|-
| <code>:deynort</code> || [[Nimînok:Ferhengok#deynkirina ortografîk|Deynkirina ortografîk]] || <code>:obor</code>
|-
| <code>:deynne</code> || [[Nimînok:Ferhengok#deynkirina neadaptekirî|Deynkirina neadaptekirî]] || <code>:ubor</code>
|-
| <code>:drş</code> || Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be || <code>:dariştî</code>, <code>:der</code>
|-
| <code>:ji</code> || Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e || <code>:from</code>
|-
| <code>:drşnd</code> || Dariştin heye lê cureyê wê ne diyar e || <code>:uder</code>
|-
| <code>:qf</code> || Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e || <code>:qertaf</code>, <code>:af</code>
|-
| <code>:reh</code> || Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e ("Peyvên … yên aîdî rehê …") û di metn û darê de xuya nabe || <code>:root</code>
|-
| <code>:yekser</code> || [[Nimînok:Ferhengok#yekser|Wergerandina yekser]]; zincîr li vir disekine || <code>:cal</code>, <code>:clq</code>
|-
| <code>:yekserq</code> || Wergerandina yekser a qismî; zincîr li vir disekine || <code>:yekserqismî</code>, <code>:pcal</code>
|-
| <code>:wergirtin</code> || [[Nimînok:Ferhengok#wergirtin|Wergirtina maneyê]]; mana wergirtî bi <code><maneid:…></code> tê nîşankirin || <code>:sl</code>
|-
| <code>:lihevanîn</code> || Lihevanîna dengî-maneyî || <code>:psm</code>
|-
| <code>:tesîr</code> || Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine || <code>:influence</code>
|-
| <code>:têkilkirin</code> || [[Nimînok:Ferhengok#têkilkirin|Têkilkirina]] du kelîmeyan || <code>:blend</code>
|-
| <code>:ûnîverbasyon</code> || [[Nimînok:Ferhengok#ûnîverbasyon|Ûnîverbasyon]] || <code>:ûnîv</code>, <code>:univ</code>
|-
| <code>:qusandin</code> || [[Nimînok:Ferhengok#qusandin|Qusandin]] || <code>:clip</code>
|-
| <code>:paşvesazî</code> || [[Nimînok:Ferhengok#paşvesazî|Paşvesazî]] || <code>:bf</code>
|-
| <code>:elîpsîz</code> || [[Nimînok:Ferhengok#elîpsîz|Elîpsîz]] || <code>:elîp</code>, <code>:ellip</code>
|-
| <code>:nomînalîzasyon</code> || [[Nimînok:Ferhengok#nomînalîzasyon|Nomînalîzasyon]] || <code>:nomîn</code>, <code>:nom</code>
|-
| <code>:translîterasyon</code> || [[Nimînok:Ferhengok#translîterasyon|Translîterasyon]] || <code>:translît</code>, <code>:translit</code>
|-
| <code>:redûblîkasyon</code> || [[Nimînok:Ferhengok#redûblîkasyon|Redûblîkasyon]] || <code>:redûb</code>, <code>:redup</code>
|-
| <code>:kurtkirin</code> || Kurtkirina kelîmeyekê || <code>:abbr</code>
|-
| <code>:kurtkirina bi kîteyan</code> || Kurtkirin li gorî kîteyan || <code>:sylabbr</code>
|-
| <code>:akronîm</code> || [[Nimînok:Ferhengok#akronîm|Akronîm]] || <code>:acro</code>
|-
| <code>:înîtîalîzm</code> || [[Nimînok:Ferhengok#înîtîalîzm|Înîtîalîzm]] || <code>:înît</code>, <code>:init</code>
|-
| <code>:metatez</code> || [[Nimînok:Ferhengok#metatez|Metatez]] || <code>:meta</code>
|-
| <code>:afeq</code> || Wek <code>:qf</code>, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike
|-
| <code>:aph</code> || Şiklê ku dengê destpêkê winda kiriye || <code>:apheresis</code>, <code>:aphetic</code>
|-
| <code>:denom</code> || Fiîla ji îsmekê çêbûyî || <code>:denominal</code>
|-
| <code>:deverbal</code> || Kelîmeya ji fiîlekê çêbûyî
|-
| <code>:vrd</code> || Dariştina vṛddhî (sanskrîtî); bi qertaf: <code>:vrd-af</code>
|-
| <code>:sa-af</code> || Pêkhateya sanskrîtî
|}
=== Guherîner ===
Guherîner di nav <code><></code> de tên nivîsîn û tavilê tên pey kelîmeyê yan kelîmeya mifteyî: <code>fa:خانه<tr:xâne><t:mal></code>. Navên guhernerên di nav <code><></code> de her tim bi herfên ASCII ne.
==== Guherînerên kelîmeyê ====
{| class="wikitable"
! Guherîner !! Mane !! Navên din
|-
| <code><t:…></code> || Tercimeya kelîmeyê bi kurmancî || <code><w:…></code>
|-
| <code><tr:…></code> || Translîterasyon
|-
| <code><ts:…></code> || Transkrîpsiyon
|-
| <code><cuda:…></code> || Şiklê ku tê nîşandan, eger ne wek navê rûpelê be || <code><alt:…></code>
|-
| <code><id:…></code> || Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan
|-
| <code><crz:…></code> || Cureyê rêzimanî yê kelîmeyê || <code><pos:…></code>
|-
| <code><g:…></code> || Cinsiyet: <code>n</code> (nêr), <code>m</code> (mê), <code>nt</code> (nêtar)
|-
| <code><q:…></code> || Wesf li pêşiyê kelîmeyê
|-
| <code><qq:…></code> || Wesf li pey kelîmeyê
|-
| <code><hrf:…></code> || Mana herfiyen || <code><lit:…></code>
|-
| <code><ref:…></code> || Çavkanî; binêre [[#Çavkanî]]
|-
| <code><nediyar></code> || Ev gav ne teqez e || <code><unc></code>
|-
| <code><crztip:…></code> || Kelîme ji bo kategoriyan wek <code>reh</code> yan <code>kelîme</code> tê hesibandin || <code><postype:…></code>
|-
| <code><etimon:…></code> || Etîmolojiya di cih de; binêre jor || <code><ety:…></code>
|-
| <code><aftype:…></code> || Di nav <code>:qf</code> de: cureyê qertafê; binêre [[#Cureyên qertafan]]
|-
| <code><deyn></code>, <code><deynh></code>, <code><deynhq></code> || Di nav <code>:qf</code> de: ev parçe deynkirî ye
|}
==== Guherînerên kelîmeya mifteyî ====
{| class="wikitable"
! Guherîner !! Mane !! Navên din
|-
| <code><unc></code> || Ev gav ne teqez e: "Mihtemelen…"
|-
| <code><grdk:…></code> || Girêdeka di navbera kelîmeyên jêder de, li şûna "yan jî" || <code><conj:…></code>
|-
| <code><anlz></code> || [[Nimînok:Ferhengok#analîza şiklî|Analîza şiklî]] || <code><surf></code>
|-
| <code><hrf:…></code> || Di nav <code>:qf</code> de: mana herfiyen || <code><lit:…></code>
|-
| <code><maneid:…></code> || Di nav <code>:wergirtin</code> de: nasnameya maneya wergirtî || <code><senseid:…></code>
|-
| <code><metn:…></code> || Di nav <code>:ji</code> û <code>:drş</code> de: metnekî din li şûna "Ji" || <code><text:…></code>
|-
| <code><ref:…></code> || Çavkaniya vê gavê
|}
=== Çavkanî ===
Çavkanî bi <code><ref:…></code> li kelîmeyekê yan li kelîmeya mifteyî tên zêdekirin. Ji bo çend çavkaniyan <code> !!! </code> (bi valahiyan) dikeve navbera wan. Çavkanî tenê wextê {{para|metn}} hatibe dayîn xuya dibin, û tenê li ser wê rûpelê, ne li ser rûpelên dûndeyan.
* <code>la:verbum<ref:{{ş|R:L&S}}></code> – çavkaniyek
* <code>la:verbum<ref:{{ş|R:L&S}} !!! {{ş|R:Tsabolov}}></code> – du çavkanî
* <code>la:verbum<ref:{{ş|R:L&S}}<<name:LS>>></code> – çavkaniya bi nav, ku paşê bi <code><ref:<<name:LS>>></code> tê dubarekirin
* Bi <code><<group:…>></code> kom tê diyarkirin.
=== Dar ===
Bi {{para|dar|1}} dara etîmolojiyê tê nîşandan. Dar ji eynî daneyan tê çêkirin, yanî ji zincîra ku ji rûpelan tê berhevkirin.
Kelîmeyên mifteyî yên ku zincîrê pêş de nabin (<code>:yekser</code>, <code>:yekserq</code>, <code>:wergirtin</code>, <code>:tesîr</code>) di darê de etîmolojiya jorîn nîşan nadin; li şûna wê xetek bi niqteyan xuya dibe. Kelîmeya ku di darê de dubare dibe jî etîmolojiya xwe cardin nîşan nade û bi çarçoveyeke niqteyî tê xuyakirin.
Dar bi gedgeta [[MediaWiki:Gadget-EtytreeZoom.js|EtytreeZoom]] tê biçûk û mezin kirin.
=== Metn ===
Bi {{para|metn}} metnê etîmolojiyê tê çêkirin. Li ser Wîkîferhenga kurdî ev ji bo hemû zimanan vekirî ye ([[Modul:etymon/data/text_allowed]]).
Nirxên {{para|metn}}:
* <code>++</code> – tevahiya zincîrê
* <code>+</code> – tenê gava pêşîn
* <code>*</code> – heta kelîmeya pêşîn a ku rûpela wê heye
* hejmarek – ewqas gav
* <code>:kod</code> – heta zimanê bi wê kodê
* <code>:kod*</code> – heta wî zimanî, eger rûpela wî tune be heta rûpela pêşîn a heyî
=== Cureyên qertafan ===
Di nav <code>:qf</code> de bi <code><aftype:…></code> tê diyarkirin ka parçe çi ye: <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>, <code>circumfix</code>, <code>infix</code>, <code>non-affix</code>. Kurtiyên <code>pre</code>, <code>suf</code>, <code>in</code>, <code>inter</code>, <code>circum</code>, <code>naf</code> û <code>root</code> jî tên qebûlkirin.
=== Rewşên xisûsî ===
Ji bo zimanên çînî (malbata <code>zhx</code>) dar, metn û kategorî girtî ne û translîterasyon nayê nîşandan.
'''Not:''' ev şablon li sernavê beşê dinêre û divê ew navê zimanê parametreya 1 be. Loma nimûneyên jorîn di beşên asta sisiyan de ne; di beşeke asta duduyan de (wek <code>== Bikaranîn ==</code>) şablon xeletiyekê dide.
=== Binêre ===
* {{ş|dû}} – dûndeyên kelîmeyekê
* {{ş|dara dûnde}} – dara dûndeyan
* [[Nimînok:Ferhengok]] – ferhengoka terimên etîmolojiyê
* [[Şablon:etîmon/testcases]] – ceribandin
<includeonly>
[[Kategorî:Etîmolojî (şablon)]]
</includeonly>
8hc5ev2qleykneej5v1p4mp73cl3ttk
6532090
6532089
2026-09-18T19:16:59Z
Wikihez
7344
6532090
wikitext
text/x-wiki
{{belgekirin/binrûpel}}
{{Lua bikartîne|Modul:etymon|Modul:etymon/data|Modul:etymon/text|Modul:etymon/tree|Modul:etymon/categories}}
Ev şablon etîmolojiya kelîmeyekê bi awayekî birêkûpêk qeyd dike. Di her bangkirinê de bi kêmî gaveke etîmolojiyê tê nivîsîn, yanî kelîmeya ku ev kelîme jê hatiye; bi guherînerên <code><etimon:…></code> mirov dikare çend gavan jî di eynî bangkirinê de binivîse. Gavên din li ser rûpelên wan kelîmeyan bi vê şablonê hatine qeydkirin; şablon wan rûpelan dixwîne û zincîrê bi xwe berhev dike, loma ne lazim e mirov tevahiya zincîrê li ser her rûpelê dubare bike.
Ji vê zincîrê du netîce çêdibin: '''metnê etîmolojiyê''' (bi {{para|metn}}) û '''dara etîmolojiyê''' (bi {{para|dar}}).
=== Bikaranîn ===
<pre>{{etîmon|<koda zimanê rûpelê>|:<kelîmeya mifteyî>|<koda zimên>:<kelîme>|metn=++|dar=1}}</pre>
* '''Parametreya 1''' koda zimanê rûpelê ye, wek <code>ku</code>.
* '''Parametreyên bênav ên din''' bi rêz têne xwendin: [[#Kelîmeyên mifteyî|kelîmeya mifteyî]] (bi du niqteyan dest pê dike, wek <code>:deyn</code>) û paşê kelîmeyên jêder di şiklê <code>koda zimên:kelîme</code> de.
* Eger kelîmeya jêder bi zimanê rûpelê be, koda zimên ne lazim e. Li ser rûpela ''zimandirêj'' herdu parçe kurmancî ne, loma <code><nowiki>{{etîmon|ku|:qf|ziman|dirêj}}</nowiki></code> bes e.
* Kelîmeya mifteyî heta ya pêş de li hemû kelîmeyên jêder tê tetbîqkirin: <code>|:deyn|a|b|:mîr|c</code> yanî a û b deyn in, c mîrasmayî ye.
==== Nimûne ====
{{şx|etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++}}
: {{etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++|katna=1}}
{{şx|etîmon|ku|:qf|ziman|dirêj|metn=++}}
: {{etîmon|ku|:qf|ziman|dirêj|metn=++|katna=1}}
{{şx|etîmon|ku|:deyn|ira:-|fa:test|metn=++}}
: {{etîmon|ku|:deyn|ira:-|fa:test|metn=++|katna=1}}
Bi darê re:
{{şx|etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman}}
: {{etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman|katna=1}}
==== Nasname (id) ====
Eger li ser rûpelekê ji yekî zêdetir beşên etîmolojiyê hebin, divê her yek nasnameyeke xwe ya bi {{para|id}} hebe, û rûpelên ku wê kelîmeyê wek jêder nîşan didin divê eynî nasnameyê bi <code><id:…></code> binivîsin. Bi vî awayî şablon dizane ka kîjan etîmolojî tê xwestin.
Nasname divê kurt be û maneyekê yan eslekî bide nasîn (wek <code>kitêba referansê</code>), ne hejmarên bêmane. Eger kelîmeyê tenê etîmolojiyek hebe, nasname ne lazim e. Eger li ser rûpelekê çend bangkirinên eynî zimanî hebin û yek jê bê nasname be, şablon xeletiyekê dide. Nasname herwiha wek lenger tê bikaranîn: <code>[[qanûn#Kurmancî:_qaîdeyên_hiqûqî]]</code>.
==== Kelîmeyên jêder ====
Şiklê temam: <code>koda zimên:kelîme<guherîner>…</code>
* Ji bo ku tenê navê zimên yan malbata zimanan bê nîşandan, li şûna kelîmeyê <code>-</code> tê nivîsîn: <code>ira:-</code>. Malbatên zimanan her tim bi vî awayî têne nivîsîn.
* Eger cihê kelîmeyê vala be, wek kelîmeyeke nenas tê nîşandan.
* Bi <code><id:!…></code> nasname her tim xuya dibe, ku şablon bi xwe biryar nede.
==== Etîmolojiya di cih de ====
Eger rûpela kelîmeya jêder tune be yan tê de ev şablon nehatibe bikaranîn, mirov dikare zincîrê bi <code><etimon:…></code> di cih de berdewam bike. '''Not:''' ev guherîner bêyî '''î''' tê nivîsîn (<code>etimon</code>, ne <code>etîmon</code>), ji ber ku navên guhernerên di nav <code><></code> de tenê bi herfên ASCII dikarin bên nivîsîn.
<pre>{{etîmon|ku|:deyn|fa:خانه<etimon::mîr<<pal:test>>>|metn=++}}</pre>
Di hundir de kelîmeya mifteyî û kelîmeyên jêder tên nivîsîn; guhernerên hundirîn bi <code><<…>></code> tên nivîsîn. Eger rûpela hedefê hebe û tê de ev şablon hebe, etîmolojiya di cih de nayê bikaranîn.
=== Parametre ===
{| class="wikitable"
! Parametre !! Mane !! Navê îngilîzî
|-
| {{para|1}} || Koda zimanê rûpelê. Lazim e.
|-
| {{para|metn}} || Metnê etîmolojiyê nîşan dide; binêre [[#Metn]]. || {{para|text}}
|-
| {{para|dar}} || Bi <code>1</code> dara etîmolojiyê nîşan dide. || {{para|tree}}
|-
| {{para|id}} || Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan.
|-
| {{para|title}} || Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be.
|-
| {{para|crz}} || Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: <code>reh</code>, <code>kelîme</code>, <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>. || {{para|pos}}
|-
| {{para|cotreh}} || Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda. || {{para|doublet}}
|-
| {{para|tarîxa-etîm}} || Tarîxa peyitandina pêşîn, wek <code>1901</code>, <code>1500s</code>, <code>14c</code>, <code>c,1900</code>, <code>before,1850</code>, <code>r,1501,1558</code>. || {{para|etydate}}
|-
| {{para|niqtena}} || Bi <code>1</code> niqteya dawiyê nayê zêdekirin. || {{para|nodot}}
|-
| {{para|niqte}} || Li şûna niqteya dawiyê nîşaneke din. || {{para|dot}}
|-
| {{para|katna}} || Bi <code>1</code> kategorî nayên zêdekirin. Herwiha {{para|nekat}}. || {{para|nocat}}
|-
| {{para|darna}} || Bi <code>1</code> ev etîmolojî di dara rûpelên din de dernakeve. || {{para|notree}}
|-
| {{para|exnihilo}} || Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin.
|-
| {{para|json}} || Bi <code>1</code> li şûna metnî daneyên xam vedigerîne; ji bo ceribandinê ye.
|}
=== Kelîmeyên mifteyî ===
Kelîmeya mifteyî bi du niqteyan dest pê dike û eleqeya di navbera her du kelîmeyan de diyar dike. Navên îngilîzî jî tên qebûlkirin.
{| class="wikitable"
! Kelîmeya mifteyî !! Mane !! Navên din
|-
| <code>:mîr</code> || Kelîmeya ku ji zimanê bav û kalan maye || <code>:mîrasmayî</code>, <code>:inh</code>
|-
| <code>:deyn</code> || Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin || <code>:bor</code>, <code>:borrowed</code>
|-
| <code>:deynh</code> || [[Nimînok:Ferhengok#deynkirina hînbûyî|Deynkirina hînbûyî]]: ne bi riya têkiliya rojane, bi qesd hatiye girtin || <code>:lbor</code>
|-
| <code>:deynhq</code> || Deynkirina hînbûyî ya ku hinekî hatiye guhertin || <code>:slbor</code>
|-
| <code>:deynort</code> || [[Nimînok:Ferhengok#deynkirina ortografîk|Deynkirina ortografîk]] || <code>:obor</code>
|-
| <code>:deynne</code> || [[Nimînok:Ferhengok#deynkirina neadaptekirî|Deynkirina neadaptekirî]] || <code>:ubor</code>
|-
| <code>:drş</code> || Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be || <code>:dariştî</code>, <code>:der</code>
|-
| <code>:ji</code> || Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e || <code>:from</code>
|-
| <code>:drşnd</code> || Dariştin heye lê cureyê wê ne diyar e || <code>:uder</code>
|-
| <code>:qf</code> || Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e || <code>:qertaf</code>, <code>:af</code>
|-
| <code>:reh</code> || Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e ("Peyvên … yên aîdî rehê …") û di metn û darê de xuya nabe || <code>:root</code>
|-
| <code>:yekser</code> || [[Nimînok:Ferhengok#yekser|Wergerandina yekser]]; zincîr li vir disekine || <code>:cal</code>, <code>:clq</code>
|-
| <code>:yekserq</code> || Wergerandina yekser a qismî; zincîr li vir disekine || <code>:yekserqismî</code>, <code>:pcal</code>
|-
| <code>:wergirtin</code> || [[Nimînok:Ferhengok#wergirtin|Wergirtina maneyê]]; mana wergirtî bi <code><maneid:…></code> tê nîşankirin || <code>:sl</code>
|-
| <code>:lihevanîn</code> || Lihevanîna dengî-maneyî || <code>:psm</code>
|-
| <code>:tesîr</code> || Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine || <code>:influence</code>
|-
| <code>:têkilkirin</code> || [[Nimînok:Ferhengok#têkilkirin|Têkilkirina]] du kelîmeyan || <code>:blend</code>
|-
| <code>:ûnîverbasyon</code> || [[Nimînok:Ferhengok#ûnîverbasyon|Ûnîverbasyon]] || <code>:ûnîv</code>, <code>:univ</code>
|-
| <code>:qusandin</code> || [[Nimînok:Ferhengok#qusandin|Qusandin]] || <code>:clip</code>
|-
| <code>:paşvesazî</code> || [[Nimînok:Ferhengok#paşvesazî|Paşvesazî]] || <code>:bf</code>
|-
| <code>:elîpsîz</code> || [[Nimînok:Ferhengok#elîpsîz|Elîpsîz]] || <code>:elîp</code>, <code>:ellip</code>
|-
| <code>:nomînalîzasyon</code> || [[Nimînok:Ferhengok#nomînalîzasyon|Nomînalîzasyon]] || <code>:nomîn</code>, <code>:nom</code>
|-
| <code>:translîterasyon</code> || [[Nimînok:Ferhengok#translîterasyon|Translîterasyon]] || <code>:translît</code>, <code>:translit</code>
|-
| <code>:redûblîkasyon</code> || [[Nimînok:Ferhengok#redûblîkasyon|Redûblîkasyon]] || <code>:redûb</code>, <code>:redup</code>
|-
| <code>:kurtkirin</code> || Kurtkirina kelîmeyekê || <code>:abbr</code>
|-
| <code>:kurtkirina bi kîteyan</code> || Kurtkirin li gorî kîteyan || <code>:sylabbr</code>
|-
| <code>:akronîm</code> || [[Nimînok:Ferhengok#akronîm|Akronîm]] || <code>:acro</code>
|-
| <code>:înîtîalîzm</code> || [[Nimînok:Ferhengok#înîtîalîzm|Înîtîalîzm]] || <code>:înît</code>, <code>:init</code>
|-
| <code>:metatez</code> || [[Nimînok:Ferhengok#metatez|Metatez]] || <code>:meta</code>
|-
| <code>:afeq</code> || Wek <code>:qf</code>, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike
|-
| <code>:aph</code> || Şiklê ku dengê destpêkê winda kiriye || <code>:apheresis</code>, <code>:aphetic</code>
|-
| <code>:denom</code> || Fiîla ji îsmekê çêbûyî || <code>:denominal</code>
|-
| <code>:deverbal</code> || Kelîmeya ji fiîlekê çêbûyî
|-
| <code>:vrd</code> || Dariştina vṛddhî (sanskrîtî); bi qertaf: <code>:vrd-af</code>
|-
| <code>:sa-af</code> || Pêkhateya sanskrîtî
|}
=== Guherîner ===
Guherîner di nav <code><></code> de tên nivîsîn û tavilê tên pey kelîmeyê yan kelîmeya mifteyî: <code>fa:خانه<tr:xâne><t:mal></code>. Navên guhernerên di nav <code><></code> de her tim bi herfên ASCII ne.
==== Guherînerên kelîmeyê ====
{| class="wikitable"
! Guherîner !! Mane !! Navên din
|-
| <code><t:…></code> || Tercimeya kelîmeyê bi kurmancî || <code><w:…></code>
|-
| <code><tr:…></code> || Translîterasyon
|-
| <code><ts:…></code> || Transkrîpsiyon
|-
| <code><cuda:…></code> || Şiklê ku tê nîşandan, eger ne wek navê rûpelê be || <code><alt:…></code>
|-
| <code><id:…></code> || Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan
|-
| <code><crz:…></code> || Cureyê rêzimanî yê kelîmeyê || <code><pos:…></code>
|-
| <code><g:…></code> || Cinsiyet: <code>n</code> (nêr), <code>m</code> (mê), <code>nt</code> (nêtar)
|-
| <code><q:…></code> || Wesf li pêşiyê kelîmeyê
|-
| <code><qq:…></code> || Wesf li pey kelîmeyê
|-
| <code><hrf:…></code> || Mana herfiyen || <code><lit:…></code>
|-
| <code><ref:…></code> || Çavkanî; binêre [[#Çavkanî]]
|-
| <code><nediyar></code> || Ev gav ne teqez e || <code><unc></code>
|-
| <code><crztip:…></code> || Kelîme ji bo kategoriyan wek <code>reh</code> yan <code>kelîme</code> tê hesibandin || <code><postype:…></code>
|-
| <code><etimon:…></code> || Etîmolojiya di cih de; binêre jor || <code><ety:…></code>
|-
| <code><aftype:…></code> || Di nav <code>:qf</code> de: cureyê qertafê; binêre [[#Cureyên qertafan]]
|-
| <code><deyn></code>, <code><deynh></code>, <code><deynhq></code> || Di nav <code>:qf</code> de: ev parçe deynkirî ye
|}
==== Guherînerên kelîmeya mifteyî ====
{| class="wikitable"
! Guherîner !! Mane !! Navên din
|-
| <code><unc></code> || Ev gav ne teqez e: "Mihtemelen…"
|-
| <code><grdk:…></code> || Girêdeka di navbera kelîmeyên jêder de, li şûna "yan jî" || <code><conj:…></code>
|-
| <code><anlz></code> || [[Nimînok:Ferhengok#analîza şiklî|Analîza şiklî]] || <code><surf></code>
|-
| <code><hrf:…></code> || Di nav <code>:qf</code> de: mana herfiyen || <code><lit:…></code>
|-
| <code><maneid:…></code> || Di nav <code>:wergirtin</code> de: nasnameya maneya wergirtî || <code><senseid:…></code>
|-
| <code><metn:…></code> || Di nav <code>:ji</code> û <code>:drş</code> de: metnekî din li şûna "Ji" || <code><text:…></code>
|-
| <code><ref:…></code> || Çavkaniya vê gavê
|}
=== Çavkanî ===
Çavkanî bi <code><ref:…></code> li kelîmeyekê yan li kelîmeya mifteyî tên zêdekirin. Ji bo çend çavkaniyan <code> !!! </code> (bi valahiyan) dikeve navbera wan. Çavkanî tenê wextê {{para|metn}} hatibe dayîn xuya dibin, û tenê li ser wê rûpelê, ne li ser rûpelên dûndeyan.
* <code>la:verbum<ref:{{ş|R:L&S}}></code> – çavkaniyek
* <code>la:verbum<ref:{{ş|R:L&S}} !!! {{ş|R:Tsabolov}}></code> – du çavkanî
* <code>la:verbum<ref:{{ş|R:L&S}}<<name:LS>>></code> – çavkaniya bi nav, ku paşê bi <code><ref:<<name:LS>>></code> tê dubarekirin
* Bi <code><<group:…>></code> kom tê diyarkirin.
=== Dar ===
Bi {{para|dar|1}} dara etîmolojiyê tê nîşandan. Dar ji eynî daneyan tê çêkirin, yanî ji zincîra ku ji rûpelan tê berhevkirin.
Kelîmeyên mifteyî yên ku zincîrê pêş de nabin (<code>:yekser</code>, <code>:yekserq</code>, <code>:wergirtin</code>, <code>:tesîr</code>) di darê de etîmolojiya jorîn nîşan nadin; li şûna wê xetek bi niqteyan xuya dibe. Kelîmeya ku di darê de dubare dibe jî etîmolojiya xwe cardin nîşan nade û bi çarçoveyeke niqteyî tê xuyakirin.
Dar bi gedgeta [[MediaWiki:Gadget-EtytreeZoom.js|EtytreeZoom]] tê biçûk û mezin kirin.
=== Metn ===
Bi {{para|metn}} metnê etîmolojiyê tê çêkirin. Li ser Wîkîferhenga kurdî ev ji bo hemû zimanan vekirî ye ([[Modul:etymon/data/text_allowed]]).
Nirxên {{para|metn}}:
* <code>++</code> – tevahiya zincîrê
* <code>+</code> – tenê gava pêşîn
* <code>*</code> – heta kelîmeya pêşîn a ku rûpela wê heye
* hejmarek – ewqas gav
* <code>:kod</code> – heta zimanê bi wê kodê
* <code>:kod*</code> – heta wî zimanî, eger rûpela wî tune be heta rûpela pêşîn a heyî
=== Cureyên qertafan ===
Di nav <code>:qf</code> de bi <code><aftype:…></code> tê diyarkirin ka parçe çi ye: <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>, <code>circumfix</code>, <code>infix</code>, <code>non-affix</code>. Kurtiyên <code>pre</code>, <code>suf</code>, <code>in</code>, <code>inter</code>, <code>circum</code>, <code>naf</code> û <code>root</code> jî tên qebûlkirin.
=== Rewşên xisûsî ===
Ji bo zimanên çînî (malbata <code>zhx</code>) dar, metn û kategorî girtî ne û translîterasyon nayê nîşandan.
'''Not:''' ev şablon li sernavê beşê dinêre û divê ew navê zimanê parametreya 1 be. Loma nimûneyên jorîn di beşên asta sisiyan de ne; di beşeke asta duduyan de (wek <code>== Bikaranîn ==</code>) şablon xeletiyekê dide.
=== Binêre ===
* {{ş|dû}} – dûndeyên kelîmeyekê
* {{ş|dara dûnde}} – dara dûndeyan
* [[Nimînok:Ferhengok]] – ferhengoka terimên etîmolojiyê
* [[Şablon:etîmon/testcases]] – ceribandin
<includeonly>
[[Kategorî:Etîmolojî (şablon)]]
</includeonly>
2hpazsc4mguupmyjcmbbw0bgeango1s
6532092
6532090
2026-09-18T19:18:51Z
Wikihez
7344
documentation for {{etîmon}}: parameters, keywords and term modifiers
6532092
wikitext
text/x-wiki
{{belgekirin/binrûpel}}
{{Lua bikartîne|Modul:etymon|Modul:etymon/data|Modul:etymon/text|Modul:etymon/tree|Modul:etymon/categories}}
Ev şablon etîmolojiya kelîmeyekê bi awayekî birêkûpêk qeyd dike. Di her bangkirinê de bi kêmî gaveke etîmolojiyê tê nivîsîn, yanî kelîmeya ku ev kelîme jê hatiye; bi guhernerê <code><etimon:…></code> mirov dikare çend gavan jî di eynî bangkirinê de binivîse. Gavên din li ser rûpelên wan kelîmeyan bi vê şablonê hatine qeydkirin; şablon wan rûpelan dixwîne û zincîrê bi xwe berhev dike, loma ne lazim e mirov tevahiya zincîrê li ser her rûpelê dubare bike.
Ji vê zincîrê du netîce çêdibin: '''metnê etîmolojiyê''' (bi {{para|metn}}) û '''dara etîmolojiyê''' (bi {{para|dar}}).
=== Bikaranîn ===
<pre>{{etîmon|<koda zimanê rûpelê>|:<kelîmeya mifteyî>|<koda zimên>:<kelîme>|metn=++|dar=1}}</pre>
* '''Parametreya 1''' koda zimanê rûpelê ye, wek <code>ku</code>.
* '''Parametreyên bênav ên din''' bi rêz têne xwendin: [[#Kelîmeyên mifteyî|kelîmeya mifteyî]] (bi du niqteyan dest pê dike, wek <code>:deyn</code>) û paşê kelîmeyên jêder di şiklê <code>koda zimên:kelîme</code> de.
* Eger kelîmeya jêder bi zimanê rûpelê be, koda zimên ne lazim e. Li ser rûpela ''zimandirêj'' herdu parçe kurmancî ne, loma <code><nowiki>{{etîmon|ku|:qf|ziman|dirêj}}</nowiki></code> bes e.
* Kelîmeya mifteyî heta ya pêş de li hemû kelîmeyên jêder tê tetbîqkirin: <code>|:deyn|a|b|:mîr|c</code> yanî a û b deyn in, c mîrasmayî ye.
==== Nimûne ====
{{şx|etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++}}
: {{etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++|katna=1}}
{{şx|etîmon|ku|:qf|ziman|dirêj|metn=++}}
: {{etîmon|ku|:qf|ziman|dirêj|metn=++|katna=1}}
{{şx|etîmon|ku|:deyn|ira:-|fa:test|metn=++}}
: {{etîmon|ku|:deyn|ira:-|fa:test|metn=++|katna=1}}
Bi darê re:
{{şx|etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman}}
: {{etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman|katna=1}}
==== Nasname (id) ====
Eger li ser rûpelekê ji etîmolojiyekê zêdetir hebe, divê her yek nasnameyeke xwe ya bi {{para|id}} hebe, û rûpelên ku wê kelîmeyê wek jêder nîşan didin divê eynî nasnameyê bi <code><id:…></code> binivîsin. Bi vî awayî şablon dizane ka kîjan etîmolojî tê xwestin.
Nasname divê kurt be û maneyekê yan eslekî bide nasîn (wek <code>kitêba referansê</code>), ne hejmarên bêmane. Eger kelîmeyê tenê etîmolojiyek hebe, nasname ne lazim e. Eger li ser rûpelekê çend bangkirinên eynî zimanî hebin û yek jê bê nasname be, şablon xeletiyekê dide. Nasname herwiha wek lenger tê bikaranîn: <code>[[qanûn#Kurmancî: rêzik]]</code>.
==== Kelîmeyên jêder ====
Şiklê temam: <code>koda zimên:kelîme<guherîner>…</code>
* Ji bo ku tenê navê zimên yan malbata zimanan bê nîşandan, li şûna kelîmeyê <code>-</code> tê nivîsîn: <code>ira:-</code>. Malbatên zimanan her tim bi vî awayî têne nivîsîn.
* Eger cihê kelîmeyê vala be, wek kelîmeyeke nenas tê nîşandan.
* Bi <code><id:!…></code> nasname her tim xuya dibe, ku şablon bi xwe biryar nede.
==== Etîmolojiya di cih de ====
Eger rûpela kelîmeya jêder tune be yan tê de ev şablon nehatibe bikaranîn, mirov dikare zincîrê bi <code><etimon:…></code> di cih de berdewam bike. '''Not:''' ev guherîner bêyî '''î''' tê nivîsîn (<code>etimon</code>, ne <code>etîmon</code>), ji ber ku navên guhernerên di nav <code><></code> de tenê bi herfên ASCII dikarin bên nivîsîn.
<pre>{{etîmon|ku|:deyn|fa:testxyz<etimon::mîr<pal:testabc<t:mal>>>|metn=++}}</pre>
: Deyn ji farisî ''testxyz'', mîrasmayî ji farisiya navîn ''testabc'' (“mal”).
Di hundir de pêşî kelîmeya mifteyî, paşê kelîmeyên jêder her yek di nav <code><></code> de tên nivîsîn; guhernerên wan jî di nav <code><></code> de, tavilê pey kelîmeyê. Çend gav jî dibin: <code><etimon::mîr<pal:a>:deyn<ar:b>></code>.
Eger rûpela hedefê hebe û tê de ev şablon hebe, etîmolojiya di cih de nayê bikaranîn.
=== Parametre ===
{| class="wikitable"
! Parametre !! Mane !! Navê îngilîzî
|-
| {{para|1}} || Koda zimanê rûpelê. Lazim e.
|-
| {{para|metn}} || Metnê etîmolojiyê nîşan dide; binêre [[#Metn]]. || {{para|text}}
|-
| {{para|dar}} || Bi <code>1</code> dara etîmolojiyê nîşan dide. || {{para|tree}}
|-
| {{para|id}} || Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan.
|-
| {{para|title}} || Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be.
|-
| {{para|crz}} || Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: <code>reh</code>, <code>kelîme</code>, <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>. || {{para|pos}}
|-
| {{para|cotreh}} || Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda. || {{para|doublet}}
|-
| {{para|tarîxa-etîm}} || Tarîxa peyitandina pêşîn, wek <code>1901</code>, <code>1500s</code>, <code>14c</code>, <code>c,1900</code>, <code>before,1850</code>, <code>r,1501,1558</code>. || {{para|etydate}}
|-
| {{para|niqtena}} || Bi <code>1</code> niqteya dawiyê nayê zêdekirin. || {{para|nodot}}
|-
| {{para|niqte}} || Li şûna niqteya dawiyê nîşaneke din. || {{para|dot}}
|-
| {{para|katna}} || Bi <code>1</code> kategorî nayên zêdekirin. Herwiha {{para|nekat}}. || {{para|nocat}}
|-
| {{para|darna}} || Bi <code>1</code> ev etîmolojî di dara rûpelên din de dernakeve. || {{para|notree}}
|-
| {{para|exnihilo}} || Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin.
|-
| {{para|json}} || Bi <code>1</code> li şûna metnî daneyên xam vedigerîne; ji bo ceribandinê ye.
|}
=== Kelîmeyên mifteyî ===
Kelîmeya mifteyî bi du niqteyan dest pê dike û eleqeya di navbera her du kelîmeyan de diyar dike. Navên îngilîzî jî tên qebûlkirin.
{| class="wikitable"
! Kelîmeya mifteyî !! Mane !! Navên din
|-
| <code>:mîr</code> || Kelîmeya ku ji zimanê bav û kalan maye || <code>:mîrasmayî</code>, <code>:inh</code>
|-
| <code>:deyn</code> || Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin || <code>:bor</code>, <code>:borrowed</code>
|-
| <code>:deynh</code> || [[Nimînok:Ferhengok#deynkirina hînbûyî|Deynkirina hînbûyî]]: ne bi riya têkiliya rojane, bi qesd hatiye girtin || <code>:lbor</code>
|-
| <code>:deynhq</code> || Deynkirina hînbûyî ya ku hinekî hatiye guhertin || <code>:slbor</code>
|-
| <code>:deynort</code> || [[Nimînok:Ferhengok#deynkirina ortografîk|Deynkirina ortografîk]] || <code>:obor</code>
|-
| <code>:deynne</code> || [[Nimînok:Ferhengok#deynkirina neadaptekirî|Deynkirina neadaptekirî]] || <code>:ubor</code>
|-
| <code>:drş</code> || Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be || <code>:dariştî</code>, <code>:der</code>
|-
| <code>:ji</code> || Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e || <code>:from</code>
|-
| <code>:drşnd</code> || Dariştin heye lê cureyê wê ne diyar e || <code>:uder</code>
|-
| <code>:qf</code> || Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e || <code>:qertaf</code>, <code>:af</code>
|-
| <code>:reh</code> || Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e ("Peyvên … yên aîdî rehê …") û di metn û darê de xuya nabe || <code>:root</code>
|-
| <code>:yekser</code> || [[Nimînok:Ferhengok#yekser|Wergerandina yekser]]; zincîr li vir disekine || <code>:cal</code>, <code>:clq</code>
|-
| <code>:yekserq</code> || Wergerandina yekser a qismî; zincîr li vir disekine || <code>:yekserqismî</code>, <code>:pcal</code>
|-
| <code>:wergirtin</code> || [[Nimînok:Ferhengok#wergirtin|Wergirtina maneyê]]; mana wergirtî bi <code><maneid:…></code> tê nîşankirin || <code>:sl</code>
|-
| <code>:lihevanîn</code> || Lihevanîna dengî-maneyî || <code>:psm</code>
|-
| <code>:tesîr</code> || Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine || <code>:influence</code>
|-
| <code>:têkilkirin</code> || [[Nimînok:Ferhengok#têkilkirin|Têkilkirina]] du kelîmeyan || <code>:blend</code>
|-
| <code>:ûnîverbasyon</code> || [[Nimînok:Ferhengok#ûnîverbasyon|Ûnîverbasyon]] || <code>:ûnîv</code>, <code>:univ</code>
|-
| <code>:qusandin</code> || [[Nimînok:Ferhengok#qusandin|Qusandin]] || <code>:clip</code>
|-
| <code>:paşvesazî</code> || [[Nimînok:Ferhengok#paşvesazî|Paşvesazî]] || <code>:bf</code>
|-
| <code>:elîpsîz</code> || [[Nimînok:Ferhengok#elîpsîz|Elîpsîz]] || <code>:elîp</code>, <code>:ellip</code>
|-
| <code>:nomînalîzasyon</code> || [[Nimînok:Ferhengok#nomînalîzasyon|Nomînalîzasyon]] || <code>:nomîn</code>, <code>:nom</code>
|-
| <code>:translîterasyon</code> || [[Nimînok:Ferhengok#translîterasyon|Translîterasyon]] || <code>:translît</code>, <code>:translit</code>
|-
| <code>:redûblîkasyon</code> || [[Nimînok:Ferhengok#redûblîkasyon|Redûblîkasyon]] || <code>:redûb</code>, <code>:redup</code>
|-
| <code>:kurtkirin</code> || Kurtkirina kelîmeyekê || <code>:abbr</code>
|-
| <code>:kurtkirina bi kîteyan</code> || Kurtkirin li gorî kîteyan || <code>:sylabbr</code>
|-
| <code>:akronîm</code> || [[Nimînok:Ferhengok#akronîm|Akronîm]] || <code>:acro</code>
|-
| <code>:înîtîalîzm</code> || [[Nimînok:Ferhengok#înîtîalîzm|Înîtîalîzm]] || <code>:înît</code>, <code>:init</code>
|-
| <code>:metatez</code> || [[Nimînok:Ferhengok#metatez|Metatez]] || <code>:meta</code>
|-
| <code>:afeq</code> || Wek <code>:qf</code>, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike
|-
| <code>:aph</code> || Şiklê ku dengê destpêkê winda kiriye || <code>:apheresis</code>, <code>:aphetic</code>
|-
| <code>:denom</code> || Fiîla ji îsmekê çêbûyî || <code>:denominal</code>
|-
| <code>:deverbal</code> || Kelîmeya ji fiîlekê çêbûyî
|-
| <code>:vrd</code> || Dariştina vṛddhî (sanskrîtî); bi qertaf: <code>:vrd-af</code>
|-
| <code>:sa-af</code> || Pêkhateya sanskrîtî
|}
=== Guherîner ===
Guherîner di nav <code><></code> de tên nivîsîn û tavilê tên pey kelîmeyê yan kelîmeya mifteyî: <code>fa:خانه<tr:xâne><t:mal></code>. Navên guhernerên di nav <code><></code> de her tim bi herfên ASCII ne.
==== Guherînerên kelîmeyê ====
{| class="wikitable"
! Guherîner !! Mane !! Navên din
|-
| <code><t:…></code> || Tercimeya kelîmeyê bi kurmancî || <code><w:…></code>
|-
| <code><tr:…></code> || Translîterasyon
|-
| <code><ts:…></code> || Transkrîpsiyon
|-
| <code><cuda:…></code> || Şiklê ku tê nîşandan, eger ne wek navê rûpelê be || <code><alt:…></code>
|-
| <code><id:…></code> || Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan
|-
| <code><crz:…></code> || Cureyê rêzimanî yê kelîmeyê || <code><pos:…></code>
|-
| <code><g:…></code> || Cinsiyet: <code>n</code> (nêr), <code>m</code> (mê), <code>nt</code> (nêtar)
|-
| <code><q:…></code> || Wesf li pêşiyê kelîmeyê
|-
| <code><qq:…></code> || Wesf li pey kelîmeyê
|-
| <code><hrf:…></code> || Mana herfiyen || <code><lit:…></code>
|-
| <code><ref:…></code> || Çavkanî; binêre [[#Çavkanî]]
|-
| <code><nediyar></code> || Ev gav ne teqez e || <code><unc></code>
|-
| <code><crztip:…></code> || Kelîme ji bo kategoriyan wek <code>reh</code> yan <code>kelîme</code> tê hesibandin || <code><postype:…></code>
|-
| <code><etimon:…></code> || Etîmolojiya di cih de; binêre jor || <code><ety:…></code>
|-
| <code><aftype:…></code> || Di nav <code>:qf</code> de: cureyê qertafê; binêre [[#Cureyên qertafan]]
|-
| <code><deyn></code>, <code><deynh></code>, <code><deynhq></code> || Di nav <code>:qf</code> de: ev parçe deynkirî ye
|}
==== Guherînerên kelîmeya mifteyî ====
{| class="wikitable"
! Guherîner !! Mane !! Navên din
|-
| <code><unc></code> || Ev gav ne teqez e: "Mihtemelen…"
|-
| <code><grdk:…></code> || Girêdeka di navbera kelîmeyên jêder de, li şûna "yan jî" || <code><conj:…></code>
|-
| <code><anlz></code> || [[Nimînok:Ferhengok#analîza şiklî|Analîza şiklî]] || <code><surf></code>
|-
| <code><hrf:…></code> || Di nav <code>:qf</code> de: mana herfiyen || <code><lit:…></code>
|-
| <code><maneid:…></code> || Di nav <code>:wergirtin</code> de: nasnameya maneya wergirtî || <code><senseid:…></code>
|-
| <code><metn:…></code> || Di nav <code>:ji</code> û <code>:drş</code> de: metnekî din li şûna "Ji" || <code><text:…></code>
|-
| <code><ref:…></code> || Çavkaniya vê gavê
|}
=== Çavkanî ===
Çavkanî bi <code><ref:…></code> li kelîmeyekê yan li kelîmeya mifteyî tên zêdekirin. Ji bo çend çavkaniyan <code> !!! </code> (bi valahiyan) dikeve navbera wan. Çavkanî tenê wextê {{para|metn}} hatibe dayîn xuya dibin, û tenê li ser wê rûpelê, ne li ser rûpelên dûndeyan.
* <code>la:verbum<ref:{{ş|R:L&S}}></code> – çavkaniyek
* <code>la:verbum<ref:{{ş|R:L&S}} !!! {{ş|R:Tsabolov}}></code> – du çavkanî
* <code>la:verbum<ref:{{ş|R:L&S}}<<name:LS>>></code> – çavkaniya bi nav, ku paşê bi <code><ref:<<name:LS>>></code> tê dubarekirin
* Bi <code><<group:…>></code> kom tê diyarkirin.
=== Dar ===
Bi {{para|dar|1}} dara etîmolojiyê tê nîşandan. Dar ji eynî daneyan tê çêkirin, yanî ji zincîra ku ji rûpelan tê berhevkirin.
Kelîmeyên mifteyî yên ku zincîrê pêş de nabin (<code>:yekser</code>, <code>:yekserq</code>, <code>:wergirtin</code>, <code>:tesîr</code>) di darê de etîmolojiya jorîn nîşan nadin; li şûna wê xetek bi niqteyan xuya dibe. Kelîmeya ku di darê de dubare dibe jî etîmolojiya xwe cardin nîşan nade û bi çarçoveyeke niqteyî tê xuyakirin.
Dar bi gedgeta [[MediaWiki:Gadget-EtytreeZoom.js|EtytreeZoom]] tê biçûk û mezin kirin.
=== Metn ===
Bi {{para|metn}} metnê etîmolojiyê tê çêkirin. Li ser Wîkîferhenga kurdî ev ji bo hemû zimanan vekirî ye ([[Modul:etymon/data/text_allowed]]).
Nirxên {{para|metn}}:
* <code>++</code> – tevahiya zincîrê
* <code>+</code> – tenê gava pêşîn
* <code>*</code> – heta kelîmeya pêşîn a ku rûpela wê heye
* hejmarek – ewqas gav
* <code>:kod</code> – heta zimanê bi wê kodê
* <code>:kod*</code> – heta wî zimanî, eger rûpela wî tune be heta rûpela pêşîn a heyî
=== Cureyên qertafan ===
Di nav <code>:qf</code> de bi <code><aftype:…></code> tê diyarkirin ka parçe çi ye: <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>, <code>circumfix</code>, <code>infix</code>, <code>non-affix</code>. Kurtiyên <code>pre</code>, <code>suf</code>, <code>in</code>, <code>inter</code>, <code>circum</code>, <code>naf</code> û <code>root</code> jî tên qebûlkirin.
=== Rewşên xisûsî ===
Ji bo zimanên çînî (malbata <code>zhx</code>) dar, metn û kategorî girtî ne û translîterasyon nayê nîşandan.
'''Not:''' ev şablon li sernavê beşê dinêre û divê ew navê zimanê parametreya 1 be. Loma nimûneyên jorîn di beşên asta sisiyan de ne; di beşeke asta duduyan de (wek <code>== Bikaranîn ==</code>) şablon xeletiyekê dide.
=== Binêre ===
* {{ş|dû}} – dûndeyên kelîmeyekê
* {{ş|dara dûnde}} – dara dûndeyan
* [[Nimînok:Ferhengok]] – ferhengoka terimên etîmolojiyê
* [[Şablon:etîmon/testcases]] – ceribandin
<includeonly>
[[Kategorî:Etîmolojî (şablon)]]
</includeonly>
smx7ixq46vl8pgwjlvk7mu0vn0qrejq
6532093
6532092
2026-09-18T19:19:48Z
Wikihez
7344
documentation for {{etîmon}}: parameters, keywords and term modifiers
6532093
wikitext
text/x-wiki
{{belgekirin/binrûpel}}
{{Lua bikartîne|Modul:etymon|Modul:etymon/data|Modul:etymon/text|Modul:etymon/tree|Modul:etymon/categories}}
Ev şablon etîmolojiya kelîmeyekê bi awayekî birêkûpêk qeyd dike. Di her bangkirinê de bi kêmî gaveke etîmolojiyê tê nivîsîn, yanî kelîmeya ku ev kelîme jê hatiye; bi guherînerê <code><etimon:…></code> mirov dikare çend gavan jî di eynî bangkirinê de binivîse. Gavên din li ser rûpelên wan kelîmeyan bi vê şablonê hatine qeydkirin; şablon wan rûpelan dixwîne û zincîrê bi xwe berhev dike, loma ne lazim e mirov tevahiya zincîrê li ser her rûpelê dubare bike.
Ji vê zincîrê du netîce çêdibin: '''metnê etîmolojiyê''' (bi {{para|metn}}) û '''dara etîmolojiyê''' (bi {{para|dar}}).
=== Bikaranîn ===
<pre>{{etîmon|<koda zimanê rûpelê>|:<kelîmeya mifteyî>|<koda zimên>:<kelîme>|metn=++|dar=1}}</pre>
* '''Parametreya 1''' koda zimanê rûpelê ye, wek <code>ku</code>.
* '''Parametreyên bênav ên din''' bi rêz têne xwendin: [[#Kelîmeyên mifteyî|kelîmeya mifteyî]] (bi du niqteyan dest pê dike, wek <code>:deyn</code>) û paşê kelîmeyên jêder di şiklê <code>koda zimên:kelîme</code> de.
* Eger kelîmeya jêder bi zimanê rûpelê be, koda zimên ne lazim e. Li ser rûpela ''zimandirêj'' herdu parçe kurmancî ne, loma <code><nowiki>{{etîmon|ku|:qf|ziman|dirêj}}</nowiki></code> bes e.
* Kelîmeya mifteyî heta ya pêş de li hemû kelîmeyên jêder tê tetbîqkirin: <code>|:deyn|a|b|:mîr|c</code> yanî a û b deyn in, c mîrasmayî ye.
==== Nimûne ====
{{şx|etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++}}
: {{etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++|katna=1}}
{{şx|etîmon|ku|:qf|ziman|dirêj|metn=++}}
: {{etîmon|ku|:qf|ziman|dirêj|metn=++|katna=1}}
{{şx|etîmon|ku|:deyn|ira:-|fa:test|metn=++}}
: {{etîmon|ku|:deyn|ira:-|fa:test|metn=++|katna=1}}
Bi darê re:
{{şx|etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman}}
: {{etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman|katna=1}}
==== Nasname (id) ====
Eger li ser rûpelekê ji etîmolojiyekê zêdetir hebe, divê her yek nasnameyeke xwe ya bi {{para|id}} hebe, û rûpelên ku wê kelîmeyê wek jêder nîşan didin divê eynî nasnameyê bi <code><id:…></code> binivîsin. Bi vî awayî şablon dizane ka kîjan etîmolojî tê xwestin.
Nasname divê kurt be û maneyekê yan eslekî bide nasîn (wek <code>kitêba referansê</code>), ne hejmarên bêmane. Eger kelîmeyê tenê etîmolojiyek hebe, nasname ne lazim e. Eger li ser rûpelekê çend bangkirinên eynî zimanî hebin û yek jê bê nasname be, şablon xeletiyekê dide. Nasname herwiha wek lenger tê bikaranîn: <code>[[qanûn#Kurmancî: rêzik]]</code>.
==== Kelîmeyên jêder ====
Şiklê temam: <code>koda zimên:kelîme<guherîner>…</code>
* Ji bo ku tenê navê zimên yan malbata zimanan bê nîşandan, li şûna kelîmeyê <code>-</code> tê nivîsîn: <code>ira:-</code>. Malbatên zimanan her tim bi vî awayî têne nivîsîn.
* Eger cihê kelîmeyê vala be, wek kelîmeyeke nenas tê nîşandan.
* Bi <code><id:!…></code> nasname her tim xuya dibe, ku şablon bi xwe biryar nede.
==== Etîmolojiya di cih de ====
Eger rûpela kelîmeya jêder tune be yan tê de ev şablon nehatibe bikaranîn, mirov dikare zincîrê bi <code><etimon:…></code> di cih de berdewam bike. '''Not:''' ev guherîner bêyî '''î''' tê nivîsîn (<code>etimon</code>, ne <code>etîmon</code>), ji ber ku navên guherînerên di nav <code><></code> de tenê bi herfên ASCII dikarin bên nivîsîn.
<pre>{{etîmon|ku|:deyn|fa:testxyz<etimon::mîr<pal:testabc<t:mal>>>|metn=++}}</pre>
: Deyn ji farisî ''testxyz'', mîrasmayî ji farisiya navîn ''testabc'' (“mal”).
Di hundir de pêşî kelîmeya mifteyî, paşê kelîmeyên jêder her yek di nav <code><></code> de tên nivîsîn; guherînerên wan jî di nav <code><></code> de, tavilê pey kelîmeyê. Çend gav jî dibin: <code><etimon::mîr<pal:a>:deyn<ar:b>></code>.
Eger rûpela hedefê hebe û tê de ev şablon hebe, etîmolojiya di cih de nayê bikaranîn.
=== Parametre ===
{| class="wikitable"
! Parametre !! Mane !! Navê îngilîzî
|-
| {{para|1}} || Koda zimanê rûpelê. Lazim e.
|-
| {{para|metn}} || Metnê etîmolojiyê nîşan dide; binêre [[#Metn]]. || {{para|text}}
|-
| {{para|dar}} || Bi <code>1</code> dara etîmolojiyê nîşan dide. || {{para|tree}}
|-
| {{para|id}} || Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan.
|-
| {{para|title}} || Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be.
|-
| {{para|crz}} || Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: <code>reh</code>, <code>kelîme</code>, <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>. || {{para|pos}}
|-
| {{para|cotreh}} || Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda. || {{para|doublet}}
|-
| {{para|tarîxa-etîm}} || Tarîxa peyitandina pêşîn, wek <code>1901</code>, <code>1500s</code>, <code>14c</code>, <code>c,1900</code>, <code>before,1850</code>, <code>r,1501,1558</code>. || {{para|etydate}}
|-
| {{para|niqtena}} || Bi <code>1</code> niqteya dawiyê nayê zêdekirin. || {{para|nodot}}
|-
| {{para|niqte}} || Li şûna niqteya dawiyê nîşaneke din. || {{para|dot}}
|-
| {{para|katna}} || Bi <code>1</code> kategorî nayên zêdekirin. Herwiha {{para|nekat}}. || {{para|nocat}}
|-
| {{para|darna}} || Bi <code>1</code> ev etîmolojî di dara rûpelên din de dernakeve. || {{para|notree}}
|-
| {{para|exnihilo}} || Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin.
|-
| {{para|json}} || Bi <code>1</code> li şûna metnî daneyên xam vedigerîne; ji bo ceribandinê ye.
|}
=== Kelîmeyên mifteyî ===
Kelîmeya mifteyî bi du niqteyan dest pê dike û eleqeya di navbera her du kelîmeyan de diyar dike. Navên îngilîzî jî tên qebûlkirin.
{| class="wikitable"
! Kelîmeya mifteyî !! Mane !! Navên din
|-
| <code>:mîr</code> || Kelîmeya ku ji zimanê bav û kalan maye || <code>:mîrasmayî</code>, <code>:inh</code>
|-
| <code>:deyn</code> || Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin || <code>:bor</code>, <code>:borrowed</code>
|-
| <code>:deynh</code> || [[Nimînok:Ferhengok#deynkirina hînbûyî|Deynkirina hînbûyî]]: ne bi riya têkiliya rojane, bi qesd hatiye girtin || <code>:lbor</code>
|-
| <code>:deynhq</code> || Deynkirina hînbûyî ya ku hinekî hatiye guhertin || <code>:slbor</code>
|-
| <code>:deynort</code> || [[Nimînok:Ferhengok#deynkirina ortografîk|Deynkirina ortografîk]] || <code>:obor</code>
|-
| <code>:deynne</code> || [[Nimînok:Ferhengok#deynkirina neadaptekirî|Deynkirina neadaptekirî]] || <code>:ubor</code>
|-
| <code>:drş</code> || Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be || <code>:dariştî</code>, <code>:der</code>
|-
| <code>:ji</code> || Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e || <code>:from</code>
|-
| <code>:drşnd</code> || Dariştin heye lê cureyê wê ne diyar e || <code>:uder</code>
|-
| <code>:qf</code> || Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e || <code>:qertaf</code>, <code>:af</code>
|-
| <code>:reh</code> || Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e ("Peyvên … yên aîdî rehê …") û di metn û darê de xuya nabe || <code>:root</code>
|-
| <code>:yekser</code> || [[Nimînok:Ferhengok#yekser|Wergerandina yekser]]; zincîr li vir disekine || <code>:cal</code>, <code>:clq</code>
|-
| <code>:yekserq</code> || Wergerandina yekser a qismî; zincîr li vir disekine || <code>:yekserqismî</code>, <code>:pcal</code>
|-
| <code>:wergirtin</code> || [[Nimînok:Ferhengok#wergirtin|Wergirtina maneyê]]; mana wergirtî bi <code><maneid:…></code> tê nîşankirin || <code>:sl</code>
|-
| <code>:lihevanîn</code> || Lihevanîna dengî-maneyî || <code>:psm</code>
|-
| <code>:tesîr</code> || Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine || <code>:influence</code>
|-
| <code>:têkilkirin</code> || [[Nimînok:Ferhengok#têkilkirin|Têkilkirina]] du kelîmeyan || <code>:blend</code>
|-
| <code>:ûnîverbasyon</code> || [[Nimînok:Ferhengok#ûnîverbasyon|Ûnîverbasyon]] || <code>:ûnîv</code>, <code>:univ</code>
|-
| <code>:qusandin</code> || [[Nimînok:Ferhengok#qusandin|Qusandin]] || <code>:clip</code>
|-
| <code>:paşvesazî</code> || [[Nimînok:Ferhengok#paşvesazî|Paşvesazî]] || <code>:bf</code>
|-
| <code>:elîpsîz</code> || [[Nimînok:Ferhengok#elîpsîz|Elîpsîz]] || <code>:elîp</code>, <code>:ellip</code>
|-
| <code>:nomînalîzasyon</code> || [[Nimînok:Ferhengok#nomînalîzasyon|Nomînalîzasyon]] || <code>:nomîn</code>, <code>:nom</code>
|-
| <code>:translîterasyon</code> || [[Nimînok:Ferhengok#translîterasyon|Translîterasyon]] || <code>:translît</code>, <code>:translit</code>
|-
| <code>:redûblîkasyon</code> || [[Nimînok:Ferhengok#redûblîkasyon|Redûblîkasyon]] || <code>:redûb</code>, <code>:redup</code>
|-
| <code>:kurtkirin</code> || Kurtkirina kelîmeyekê || <code>:abbr</code>
|-
| <code>:kurtkirina bi kîteyan</code> || Kurtkirin li gorî kîteyan || <code>:sylabbr</code>
|-
| <code>:akronîm</code> || [[Nimînok:Ferhengok#akronîm|Akronîm]] || <code>:acro</code>
|-
| <code>:înîtîalîzm</code> || [[Nimînok:Ferhengok#înîtîalîzm|Înîtîalîzm]] || <code>:înît</code>, <code>:init</code>
|-
| <code>:metatez</code> || [[Nimînok:Ferhengok#metatez|Metatez]] || <code>:meta</code>
|-
| <code>:afeq</code> || Wek <code>:qf</code>, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike
|-
| <code>:aph</code> || Şiklê ku dengê destpêkê winda kiriye || <code>:apheresis</code>, <code>:aphetic</code>
|-
| <code>:denom</code> || Fiîla ji îsmekê çêbûyî || <code>:denominal</code>
|-
| <code>:deverbal</code> || Kelîmeya ji fiîlekê çêbûyî
|-
| <code>:vrd</code> || Dariştina vṛddhî (sanskrîtî); bi qertaf: <code>:vrd-af</code>
|-
| <code>:sa-af</code> || Pêkhateya sanskrîtî
|}
=== Guherîner ===
Guherîner di nav <code><></code> de tên nivîsîn û tavilê tên pey kelîmeyê yan kelîmeya mifteyî: <code>fa:خانه<tr:xâne><t:mal></code>. Navên guherînerên di nav <code><></code> de her tim bi herfên ASCII ne.
==== Guherînerên kelîmeyê ====
{| class="wikitable"
! Guherîner !! Mane !! Navên din
|-
| <code><t:…></code> || Tercimeya kelîmeyê bi kurmancî || <code><w:…></code>
|-
| <code><tr:…></code> || Translîterasyon
|-
| <code><ts:…></code> || Transkrîpsiyon
|-
| <code><cuda:…></code> || Şiklê ku tê nîşandan, eger ne wek navê rûpelê be || <code><alt:…></code>
|-
| <code><id:…></code> || Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan
|-
| <code><crz:…></code> || Cureyê rêzimanî yê kelîmeyê || <code><pos:…></code>
|-
| <code><g:…></code> || Cinsiyet: <code>n</code> (nêr), <code>m</code> (mê), <code>nt</code> (nêtar)
|-
| <code><q:…></code> || Wesf li pêşiyê kelîmeyê
|-
| <code><qq:…></code> || Wesf li pey kelîmeyê
|-
| <code><hrf:…></code> || Mana herfiyen || <code><lit:…></code>
|-
| <code><ref:…></code> || Çavkanî; binêre [[#Çavkanî]]
|-
| <code><nediyar></code> || Ev gav ne teqez e || <code><unc></code>
|-
| <code><crztip:…></code> || Kelîme ji bo kategoriyan wek <code>reh</code> yan <code>kelîme</code> tê hesibandin || <code><postype:…></code>
|-
| <code><etimon:…></code> || Etîmolojiya di cih de; binêre jor || <code><ety:…></code>
|-
| <code><aftype:…></code> || Di nav <code>:qf</code> de: cureyê qertafê; binêre [[#Cureyên qertafan]]
|-
| <code><deyn></code>, <code><deynh></code>, <code><deynhq></code> || Di nav <code>:qf</code> de: ev parçe deynkirî ye
|}
==== Guherînerên kelîmeya mifteyî ====
{| class="wikitable"
! Guherîner !! Mane !! Navên din
|-
| <code><unc></code> || Ev gav ne teqez e: "Mihtemelen…"
|-
| <code><grdk:…></code> || Girêdeka di navbera kelîmeyên jêder de, li şûna "yan jî" || <code><conj:…></code>
|-
| <code><anlz></code> || [[Nimînok:Ferhengok#analîza şiklî|Analîza şiklî]] || <code><surf></code>
|-
| <code><hrf:…></code> || Di nav <code>:qf</code> de: mana herfiyen || <code><lit:…></code>
|-
| <code><maneid:…></code> || Di nav <code>:wergirtin</code> de: nasnameya maneya wergirtî || <code><senseid:…></code>
|-
| <code><metn:…></code> || Di nav <code>:ji</code> û <code>:drş</code> de: metnekî din li şûna "Ji" || <code><text:…></code>
|-
| <code><ref:…></code> || Çavkaniya vê gavê
|}
=== Çavkanî ===
Çavkanî bi <code><ref:…></code> li kelîmeyekê yan li kelîmeya mifteyî tên zêdekirin. Ji bo çend çavkaniyan <code> !!! </code> (bi valahiyan) dikeve navbera wan. Çavkanî tenê wextê {{para|metn}} hatibe dayîn xuya dibin, û tenê li ser wê rûpelê, ne li ser rûpelên dûndeyan.
* <code>la:verbum<ref:{{ş|R:L&S}}></code> – çavkaniyek
* <code>la:verbum<ref:{{ş|R:L&S}} !!! {{ş|R:Tsabolov}}></code> – du çavkanî
* <code>la:verbum<ref:{{ş|R:L&S}}<<name:LS>>></code> – çavkaniya bi nav, ku paşê bi <code><ref:<<name:LS>>></code> tê dubarekirin
* Bi <code><<group:…>></code> kom tê diyarkirin.
=== Dar ===
Bi {{para|dar|1}} dara etîmolojiyê tê nîşandan. Dar ji eynî daneyan tê çêkirin, yanî ji zincîra ku ji rûpelan tê berhevkirin.
Kelîmeyên mifteyî yên ku zincîrê pêş de nabin (<code>:yekser</code>, <code>:yekserq</code>, <code>:wergirtin</code>, <code>:tesîr</code>) di darê de etîmolojiya jorîn nîşan nadin; li şûna wê xetek bi niqteyan xuya dibe. Kelîmeya ku di darê de dubare dibe jî etîmolojiya xwe cardin nîşan nade û bi çarçoveyeke niqteyî tê xuyakirin.
Dar bi gedgeta [[MediaWiki:Gadget-EtytreeZoom.js|EtytreeZoom]] tê biçûk û mezin kirin.
=== Metn ===
Bi {{para|metn}} metnê etîmolojiyê tê çêkirin. Li ser Wîkîferhenga kurdî ev ji bo hemû zimanan vekirî ye ([[Modul:etymon/data/text_allowed]]).
Nirxên {{para|metn}}:
* <code>++</code> – tevahiya zincîrê
* <code>+</code> – tenê gava pêşîn
* <code>*</code> – heta kelîmeya pêşîn a ku rûpela wê heye
* hejmarek – ewqas gav
* <code>:kod</code> – heta zimanê bi wê kodê
* <code>:kod*</code> – heta wî zimanî, eger rûpela wî tune be heta rûpela pêşîn a heyî
=== Cureyên qertafan ===
Di nav <code>:qf</code> de bi <code><aftype:…></code> tê diyarkirin ka parçe çi ye: <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>, <code>circumfix</code>, <code>infix</code>, <code>non-affix</code>. Kurtiyên <code>pre</code>, <code>suf</code>, <code>in</code>, <code>inter</code>, <code>circum</code>, <code>naf</code> û <code>root</code> jî tên qebûlkirin.
=== Rewşên xisûsî ===
Ji bo zimanên çînî (malbata <code>zhx</code>) dar, metn û kategorî girtî ne û translîterasyon nayê nîşandan.
'''Not:''' ev şablon li sernavê beşê dinêre û divê ew navê zimanê parametreya 1 be. Loma nimûneyên jorîn di beşên asta sisiyan de ne; di beşeke asta duduyan de (wek <code>== Bikaranîn ==</code>) şablon xeletiyekê dide.
=== Binêre ===
* {{ş|dû}} – dûndeyên kelîmeyekê
* {{ş|dara dûnde}} – dara dûndeyan
* [[Nimînok:Ferhengok]] – ferhengoka terimên etîmolojiyê
* [[Şablon:etîmon/testcases]] – ceribandin
<includeonly>
[[Kategorî:Etîmolojî (şablon)]]
</includeonly>
1s46i1fboow16jx7uk5mpddka2g3qf7
6532094
6532093
2026-09-18T19:26:30Z
Wikihez
7344
documentation for {{etîmon}}: parameters, keywords and term modifiers
6532094
wikitext
text/x-wiki
{{belgekirin/binrûpel}}
{{Lua bikartîne|Modul:etymon|Modul:etymon/data|Modul:etymon/text|Modul:etymon/tree|Modul:etymon/categories}}
Ev şablon etîmolojiya kelîmeyekê bi awayekî birêkûpêk qeyd dike. Di her bangkirinê de bi kêmî gaveke etîmolojiyê tê nivîsîn, yanî kelîmeya ku ev kelîme jê hatiye; bi guherînerên <code><etimon:…></code> mirov dikare çend gavan jî di eynî bangkirinê de binivîse. Gavên din li ser rûpelên wan kelîmeyan bi vê şablonê hatine qeydkirin; şablon wan rûpelan dixwîne û zincîrê bi xwe berhev dike, loma ne lazim e mirov tevahiya zincîrê li ser her rûpelê dubare bike.
Ji vê zincîrê du netîce çêdibin: '''metnê etîmolojiyê''' (bi {{para|metn}}) û '''dara etîmolojiyê''' (bi {{para|dar}}).
=== Bikaranîn ===
<pre>{{etîmon|<koda zimanê rûpelê>|:<kelîmeya mifteyî>|<koda zimên>:<kelîme>|metn=++|dar=1}}</pre>
* '''Parametreya 1''' koda zimanê rûpelê ye, wek <code>ku</code>.
* '''Parametreyên bênav ên din''' bi rêz têne xwendin: [[#Kelîmeyên mifteyî|kelîmeya mifteyî]] (bi du niqteyan dest pê dike, wek <code>:deyn</code>) û paşê kelîmeyên jêder di şiklê <code>koda zimên:kelîme</code> de.
* Eger kelîmeya jêder bi zimanê rûpelê be, koda zimên ne lazim e. Li ser rûpela ''zimandirêj'' herdu parçe kurmancî ne, loma <code><nowiki>{{etîmon|ku|:qf|ziman|dirêj}}</nowiki></code> bes e.
* Kelîmeya mifteyî heta ya pêş de li hemû kelîmeyên jêder tê tetbîqkirin: <code>|:deyn|a|b|:mîr|c</code> yanî a û b deyn in, c mîrasmayî ye.
==== Nimûne ====
{{şx|etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++}}
: {{etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++|katna=1}}
{{şx|etîmon|ku|:qf|ziman|dirêj|metn=++}}
: {{etîmon|ku|:qf|ziman|dirêj|metn=++|katna=1}}
{{şx|etîmon|ku|:deyn|ira:-|fa:test|metn=++}}
: {{etîmon|ku|:deyn|ira:-|fa:test|metn=++|katna=1}}
Bi darê re:
{{şx|etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman}}
: {{etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman|katna=1}}
==== Nasname (id) ====
Eger li ser rûpelekê ji yekî zêdetir beşên etîmolojiyê hebin, divê her yek nasnameyeke xwe ya bi {{para|id}} hebe, û rûpelên ku wê kelîmeyê wek jêder nîşan didin divê eynî nasnameyê bi <code><id:…></code> binivîsin. Bi vî awayî şablon dizane ka kîjan etîmolojî tê xwestin.
Nasname divê kurt be û maneyekê yan eslekî bide nasîn (wek <code>kitêba referansê</code>), ne hejmarên bêmane. Eger kelîmeyê tenê etîmolojiyek hebe, nasname ne lazim e. Eger li ser rûpelekê çend bangkirinên eynî zimanî hebin û yek jê bê nasname be, şablon xeletiyekê dide. Nasname herwiha wek lenger tê bikaranîn: <code>[[qanûn#Kurmancî:_qaîdeyên_hiqûqî]]</code>.
==== Kelîmeyên jêder ====
Şiklê temam: <code>koda zimên:kelîme<guherîner>…</code>
* Ji bo ku tenê navê zimên yan malbata zimanan bê nîşandan, li şûna kelîmeyê <code>-</code> tê nivîsîn: <code>ira:-</code>. Malbatên zimanan her tim bi vî awayî têne nivîsîn.
* Eger cihê kelîmeyê vala be, wek kelîmeyeke nenas tê nîşandan.
* Bi <code><id:!…></code> nasname her tim xuya dibe, ku şablon bi xwe biryar nede.
==== Etîmolojiya di cih de ====
Eger rûpela kelîmeya jêder tune be yan tê de ev şablon nehatibe bikaranîn, mirov dikare zincîrê bi <code><etimon:…></code> di cih de berdewam bike. '''Not:''' ev guherîner bêyî '''î''' tê nivîsîn (<code>etimon</code>, ne <code>etîmon</code>), ji ber ku navên guherînerên di nav <code><></code> de tenê bi herfên ASCII dikarin bên nivîsîn.
<pre>{{etîmon|ku|:deyn|fa:testxyz<etimon::mîr<pal:testabc<t:mal>>>|metn=++}}</pre>
: Deyn ji farisî ''testxyz'', mîrasmayî ji farisiya navîn ''testabc'' (“mal”).
Di hundir de pêşî kelîmeya mifteyî, paşê kelîmeyên jêder her yek di nav <code><></code> de tên nivîsîn; guherînerên wan jî di nav <code><></code> de, tavilê pey kelîmeyê. Çend gav jî dibin: <code><etimon::mîr<pal:a>:deyn<ar:b>></code>.
Eger rûpela hedefê hebe û tê de ev şablon hebe, etîmolojiya di cih de nayê bikaranîn.
=== Parametre ===
{| class="wikitable"
! Parametre !! Mane !! Navê îngilîzî
|-
| {{para|1}} || Koda zimanê rûpelê. Lazim e.
|-
| {{para|metn}} || Metnê etîmolojiyê nîşan dide; binêre [[#Metn]]. || {{para|text}}
|-
| {{para|dar}} || Bi <code>1</code> dara etîmolojiyê nîşan dide. || {{para|tree}}
|-
| {{para|id}} || Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan.
|-
| {{para|title}} || Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be.
|-
| {{para|crz}} || Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: <code>reh</code>, <code>kelîme</code>, <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>. || {{para|pos}}
|-
| {{para|cotreh}} || Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda. || {{para|doublet}}
|-
| {{para|tarîxa-etîm}} || Tarîxa peyitandina pêşîn, wek <code>1901</code>, <code>1500s</code>, <code>14c</code>, <code>c,1900</code>, <code>before,1850</code>, <code>r,1501,1558</code>. || {{para|etydate}}
|-
| {{para|niqtena}} || Bi <code>1</code> niqteya dawiyê nayê zêdekirin. || {{para|nodot}}
|-
| {{para|niqte}} || Li şûna niqteya dawiyê nîşaneke din. || {{para|dot}}
|-
| {{para|katna}} || Bi <code>1</code> kategorî nayên zêdekirin. Herwiha {{para|nekat}}. || {{para|nocat}}
|-
| {{para|darna}} || Bi <code>1</code> ev etîmolojî di dara rûpelên din de dernakeve. || {{para|notree}}
|-
| {{para|exnihilo}} || Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin.
|-
| {{para|json}} || Bi <code>1</code> li şûna metnî daneyên xam vedigerîne; ji bo ceribandinê ye.
|}
=== Kelîmeyên mifteyî ===
Kelîmeya mifteyî bi du niqteyan dest pê dike û eleqeya di navbera her du kelîmeyan de diyar dike. Navên îngilîzî jî tên qebûlkirin.
{| class="wikitable"
! Kelîmeya mifteyî !! Mane !! Navên din
|-
| <code>:mîr</code> || Kelîmeya ku ji zimanê bav û kalan maye || <code>:mîrasmayî</code>, <code>:inh</code>
|-
| <code>:deyn</code> || Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin || <code>:bor</code>, <code>:borrowed</code>
|-
| <code>:deynh</code> || [[Nimînok:Ferhengok#deynkirina hînbûyî|Deynkirina hînbûyî]]: ne bi riya têkiliya rojane, bi qesd hatiye girtin || <code>:lbor</code>
|-
| <code>:deynhq</code> || Deynkirina hînbûyî ya ku hinekî hatiye guhertin || <code>:slbor</code>
|-
| <code>:deynort</code> || [[Nimînok:Ferhengok#deynkirina ortografîk|Deynkirina ortografîk]] || <code>:obor</code>
|-
| <code>:deynne</code> || [[Nimînok:Ferhengok#deynkirina neadaptekirî|Deynkirina neadaptekirî]] || <code>:ubor</code>
|-
| <code>:drş</code> || Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be || <code>:dariştî</code>, <code>:der</code>
|-
| <code>:ji</code> || Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e || <code>:from</code>
|-
| <code>:drşnd</code> || Dariştin heye lê cureyê wê ne diyar e || <code>:uder</code>
|-
| <code>:qf</code> || Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e || <code>:qertaf</code>, <code>:af</code>
|-
| <code>:reh</code> || Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e ("Peyvên … yên aîdî rehê …") û di metn û darê de xuya nabe || <code>:root</code>
|-
| <code>:yekser</code> || [[Nimînok:Ferhengok#yekser|Wergerandina yekser]]; zincîr li vir disekine || <code>:cal</code>, <code>:clq</code>
|-
| <code>:yekserq</code> || Wergerandina yekser a qismî; zincîr li vir disekine || <code>:yekserqismî</code>, <code>:pcal</code>
|-
| <code>:wergirtin</code> || [[Nimînok:Ferhengok#wergirtin|Wergirtina maneyê]]; mana wergirtî bi <code><maneid:…></code> tê nîşankirin || <code>:sl</code>
|-
| <code>:lihevanîn</code> || Lihevanîna dengî-maneyî || <code>:psm</code>
|-
| <code>:tesîr</code> || Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine || <code>:influence</code>
|-
| <code>:têkilkirin</code> || [[Nimînok:Ferhengok#têkilkirin|Têkilkirina]] du kelîmeyan || <code>:blend</code>
|-
| <code>:ûnîverbasyon</code> || [[Nimînok:Ferhengok#ûnîverbasyon|Ûnîverbasyon]] || <code>:ûnîv</code>, <code>:univ</code>
|-
| <code>:qusandin</code> || [[Nimînok:Ferhengok#qusandin|Qusandin]] || <code>:clip</code>
|-
| <code>:paşvesazî</code> || [[Nimînok:Ferhengok#paşvesazî|Paşvesazî]] || <code>:bf</code>
|-
| <code>:elîpsîz</code> || [[Nimînok:Ferhengok#elîpsîz|Elîpsîz]] || <code>:elîp</code>, <code>:ellip</code>
|-
| <code>:nomînalîzasyon</code> || [[Nimînok:Ferhengok#nomînalîzasyon|Nomînalîzasyon]] || <code>:nomîn</code>, <code>:nom</code>
|-
| <code>:translîterasyon</code> || [[Nimînok:Ferhengok#translîterasyon|Translîterasyon]] || <code>:translît</code>, <code>:translit</code>
|-
| <code>:redûblîkasyon</code> || [[Nimînok:Ferhengok#redûblîkasyon|Redûblîkasyon]] || <code>:redûb</code>, <code>:redup</code>
|-
| <code>:kurtkirin</code> || Kurtkirina kelîmeyekê || <code>:abbr</code>
|-
| <code>:kurtkirina bi kîteyan</code> || Kurtkirin li gorî kîteyan || <code>:sylabbr</code>
|-
| <code>:akronîm</code> || [[Nimînok:Ferhengok#akronîm|Akronîm]] || <code>:acro</code>
|-
| <code>:înîtîalîzm</code> || [[Nimînok:Ferhengok#înîtîalîzm|Înîtîalîzm]] || <code>:înît</code>, <code>:init</code>
|-
| <code>:metatez</code> || [[Nimînok:Ferhengok#metatez|Metatez]] || <code>:meta</code>
|-
| <code>:afeq</code> || Wek <code>:qf</code>, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike
|-
| <code>:aph</code> || Şiklê ku dengê destpêkê winda kiriye || <code>:apheresis</code>, <code>:aphetic</code>
|-
| <code>:denom</code> || Fiîla ji îsmekê çêbûyî || <code>:denominal</code>
|-
| <code>:deverbal</code> || Kelîmeya ji fiîlekê çêbûyî
|-
| <code>:vrd</code> || Dariştina vṛddhî (sanskrîtî); bi qertaf: <code>:vrd-af</code>
|-
| <code>:sa-af</code> || Pêkhateya sanskrîtî
|}
=== Guherîner ===
Guherîner di nav <code><></code> de tên nivîsîn û tavilê tên pey kelîmeyê yan kelîmeya mifteyî: <code>fa:خانه<tr:xâne><t:mal></code>. Navên guherînerên di nav <code><></code> de her tim bi herfên ASCII ne.
==== Guherînerên kelîmeyê ====
{| class="wikitable"
! Guherîner !! Mane !! Navên din
|-
| <code><t:…></code> || Tercimeya kelîmeyê bi kurmancî || <code><w:…></code>
|-
| <code><tr:…></code> || Translîterasyon
|-
| <code><ts:…></code> || Transkrîpsiyon
|-
| <code><cuda:…></code> || Şiklê ku tê nîşandan, eger ne wek navê rûpelê be || <code><alt:…></code>
|-
| <code><id:…></code> || Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan
|-
| <code><crz:…></code> || Cureyê rêzimanî yê kelîmeyê || <code><pos:…></code>
|-
| <code><g:…></code> || Cinsiyet: <code>n</code> (nêr), <code>m</code> (mê), <code>nt</code> (nêtar)
|-
| <code><q:…></code> || Wesf li pêşiyê kelîmeyê
|-
| <code><qq:…></code> || Wesf li pey kelîmeyê
|-
| <code><hrf:…></code> || Mana herfiyen || <code><lit:…></code>
|-
| <code><ref:…></code> || Çavkanî; binêre [[#Çavkanî]]
|-
| <code><nediyar></code> || Ev gav ne teqez e || <code><unc></code>
|-
| <code><crztip:…></code> || Kelîme ji bo kategoriyan wek <code>reh</code> yan <code>kelîme</code> tê hesibandin || <code><postype:…></code>
|-
| <code><etimon:…></code> || Etîmolojiya di cih de; binêre jor || <code><ety:…></code>
|-
| <code><aftype:…></code> || Di nav <code>:qf</code> de: cureyê qertafê; binêre [[#Cureyên qertafan]]
|-
| <code><deyn></code>, <code><deynh></code>, <code><deynhq></code> || Di nav <code>:qf</code> de: ev parçe deynkirî ye
|}
==== Guherînerên kelîmeya mifteyî ====
{| class="wikitable"
! Guherîner !! Mane !! Navên din
|-
| <code><unc></code> || Ev gav ne teqez e: "Mihtemelen…"
|-
| <code><grdk:…></code> || Girêdeka di navbera kelîmeyên jêder de, li şûna "yan jî" || <code><conj:…></code>
|-
| <code><anlz></code> || [[Nimînok:Ferhengok#analîza şiklî|Analîza şiklî]] || <code><surf></code>
|-
| <code><hrf:…></code> || Di nav <code>:qf</code> de: mana herfiyen || <code><lit:…></code>
|-
| <code><maneid:…></code> || Di nav <code>:wergirtin</code> de: nasnameya maneya wergirtî || <code><senseid:…></code>
|-
| <code><metn:…></code> || Di nav <code>:ji</code> û <code>:drş</code> de: metnekî din li şûna "Ji" || <code><text:…></code>
|-
| <code><ref:…></code> || Çavkaniya vê gavê
|}
=== Çavkanî ===
Çavkanî bi <code><ref:…></code> li kelîmeyekê yan li kelîmeya mifteyî tên zêdekirin. Ji bo çend çavkaniyan <code> !!! </code> (bi valahiyan) dikeve navbera wan. Çavkanî tenê wextê {{para|metn}} hatibe dayîn xuya dibin, û tenê li ser wê rûpelê, ne li ser rûpelên dûndeyan.
* <code>la:verbum<ref:{{ş|R:L&S}}></code> – çavkaniyek
* <code>la:verbum<ref:{{ş|R:L&S}} !!! {{ş|R:Tsabolov}}></code> – du çavkanî
* <code>la:verbum<ref:{{ş|R:L&S}}<<name:LS>>></code> – çavkaniya bi nav, ku paşê bi <code><ref:<<name:LS>>></code> tê dubarekirin
* Bi <code><<group:…>></code> kom tê diyarkirin.
=== Dar ===
Bi {{para|dar|1}} dara etîmolojiyê tê nîşandan. Dar ji eynî daneyan tê çêkirin, yanî ji zincîra ku ji rûpelan tê berhevkirin.
Kelîmeyên mifteyî yên ku zincîrê pêş de nabin (<code>:yekser</code>, <code>:yekserq</code>, <code>:wergirtin</code>, <code>:tesîr</code>) di darê de etîmolojiya jorîn nîşan nadin; li şûna wê xetek bi niqteyan xuya dibe. Kelîmeya ku di darê de dubare dibe jî etîmolojiya xwe cardin nîşan nade û bi çarçoveyeke niqteyî tê xuyakirin.
Dar bi gedgeta [[MediaWiki:Gadget-EtytreeZoom.js|EtytreeZoom]] tê biçûk û mezin kirin.
=== Metn ===
Bi {{para|metn}} metnê etîmolojiyê tê çêkirin. Li ser Wîkîferhenga kurdî ev ji bo hemû zimanan vekirî ye ([[Modul:etymon/data/text_allowed]]).
Nirxên {{para|metn}}:
* <code>++</code> – tevahiya zincîrê
* <code>+</code> – tenê gava pêşîn
* <code>*</code> – heta kelîmeya pêşîn a ku rûpela wê heye
* hejmarek – ewqas gav
* <code>:kod</code> – heta zimanê bi wê kodê
* <code>:kod*</code> – heta wî zimanî, eger rûpela wî tune be heta rûpela pêşîn a heyî
=== Cureyên qertafan ===
Di nav <code>:qf</code> de bi <code><aftype:…></code> tê diyarkirin ka parçe çi ye: <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>, <code>circumfix</code>, <code>infix</code>, <code>non-affix</code>. Kurtiyên <code>pre</code>, <code>suf</code>, <code>in</code>, <code>inter</code>, <code>circum</code>, <code>naf</code> û <code>root</code> jî tên qebûlkirin.
=== Rewşên xisûsî ===
Ji bo zimanên çînî (malbata <code>zhx</code>) dar, metn û kategorî girtî ne û translîterasyon nayê nîşandan.
'''Not:''' ev şablon li sernavê beşê dinêre û divê ew navê zimanê parametreya 1 be. Loma nimûneyên jorîn di beşên asta sisiyan de ne; di beşeke asta duduyan de (wek <code>== Bikaranîn ==</code>) şablon xeletiyekê dide.
=== Binêre ===
* {{ş|dû}} – dûndeyên kelîmeyekê
* {{ş|dara dûnde}} – dara dûndeyan
* [[Nimînok:Ferhengok]] – ferhengoka terimên etîmolojiyê
* [[Şablon:etîmon/testcases]] – ceribandin
<includeonly>
[[Kategorî:Etîmolojî (şablon)]]
</includeonly>
2ejwkmhvt2of04jkr1w1vsv2lrzom7t
6532249
6532094
2026-09-19T08:04:11Z
Wikihez
7344
documentation for {{etîmon}}: parameters, keywords and term modifiers
6532249
wikitext
text/x-wiki
{{belgekirin/binrûpel}}
{{Lua bikartîne|Modul:etymon|Modul:etymon/data|Modul:etymon/text|Modul:etymon/tree|Modul:etymon/categories}}
Ev şablon etîmolojiya kelîmeyekê bi awayekî birêkûpêk qeyd dike. Di her bangkirinê de bi kêmî gaveke etîmolojiyê tê nivîsîn, yanî kelîmeya ku ev kelîme jê hatiye; bi guherînerên <code><etimon:…></code> mirov dikare çend gavan jî di eynî bangkirinê de binivîse. Gavên din li ser rûpelên wan kelîmeyan bi vê şablonê hatine qeydkirin; şablon wan rûpelan dixwîne û zincîrê bi xwe berhev dike, loma ne lazim e mirov tevahiya zincîrê li ser her rûpelê dubare bike.
Ji vê zincîrê du netîce çêdibin: '''metnê etîmolojiyê''' (bi {{para|metn}}) û '''dara etîmolojiyê''' (bi {{para|dar}}).
=== Bikaranîn ===
<pre>{{etîmon|<koda zimanê rûpelê>|:<kelîmeya mifteyî>|<koda zimên>:<kelîme>|metn=++|dar=1}}</pre>
* '''Parametreya 1''' koda zimanê rûpelê ye, wek <code>ku</code>.
* '''Parametreyên bênav ên din''' bi rêz têne xwendin: [[#Kelîmeyên mifteyî|kelîmeya mifteyî]] (bi du niqteyan dest pê dike, wek <code>:deyn</code>) û paşê kelîmeyên jêder di şiklê <code>koda zimên:kelîme</code> de.
* Eger kelîmeya jêder bi zimanê rûpelê be, koda zimên ne lazim e. Li ser rûpela ''zimandirêj'' herdu parçe kurmancî ne, loma <code><nowiki>{{etîmon|ku|:qf|ziman|dirêj}}</nowiki></code> bes e.
* Kelîmeya mifteyî heta ya pêş de li hemû kelîmeyên jêder tê tetbîqkirin: <code>|:deyn|a|b|:mîr|c</code> yanî a û b deyn in, c mîrasmayî ye.
==== Nimûne ====
{{şx|etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++}}
: {{etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++|katna=1}}
{{şx|etîmon|ku|:qf|ziman|dirêj|metn=++}}
: {{etîmon|ku|:qf|ziman|dirêj|metn=++|katna=1}}
{{şx|etîmon|ku|:deyn|ira:-|fa:test|metn=++}}
: {{etîmon|ku|:deyn|ira:-|fa:test|metn=++|katna=1}}
Bi darê re:
{{şx|etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman}}
: {{etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman|katna=1}}
==== Nasname (id) ====
Eger li ser rûpelekê ji yekî zêdetir beşên etîmolojiyê hebin, divê her yek nasnameyeke xwe ya bi {{para|id}} hebe, û rûpelên ku wê kelîmeyê wek jêder nîşan didin divê eynî nasnameyê bi <code><id:…></code> binivîsin. Bi vî awayî şablon dizane ka kîjan etîmolojî tê xwestin.
Nasname divê kurt be û maneyekê yan eslekî bide nasîn (wek <code>kitêba referansê</code>), ne hejmarên bêmane. Eger kelîmeyê tenê etîmolojiyek hebe, nasname ne lazim e. Eger li ser rûpelekê çend bangkirinên eynî zimanî hebin û yek jê bê nasname be, şablon xeletiyekê dide. Nasname herwiha wek lenger tê bikaranîn: <code>[[qanûn#Kurmancî:_qaîdeyên_hiqûqî]]</code>.
==== Kelîmeyên jêder ====
Şiklê temam: <code>koda zimên:kelîme<guherîner>…</code>
* Ji bo ku tenê navê zimên yan malbata zimanan bê nîşandan, li şûna kelîmeyê <code>-</code> tê nivîsîn: <code>ira:-</code>. Malbatên zimanan her tim bi vî awayî têne nivîsîn.
* Eger cihê kelîmeyê vala be, wek kelîmeyeke nenas tê nîşandan.
* Bi <code><id:!…></code> nasname her tim xuya dibe, ku şablon bi xwe biryar nede.
==== Etîmolojiya di cih de ====
Eger rûpela kelîmeya jêder tune be yan tê de ev şablon nehatibe bikaranîn, mirov dikare zincîrê bi <code><etimon:…></code> di cih de berdewam bike. '''Not:''' ev guherîner bêyî '''î''' tê nivîsîn (<code>etimon</code>, ne <code>etîmon</code>), ji ber ku navên guherînerên di nav <code><></code> de tenê bi herfên ASCII dikarin bên nivîsîn.
<pre>{{etîmon|ku|:deyn|fa:testxyz<etimon::mîr<pal:testabc<t:mal>>>|metn=++}}</pre>
: Deyn ji farisî ''testxyz'', mîrasmayî ji farisiya navîn ''testabc'' (“mal”).
Di hundir de pêşî kelîmeya mifteyî, paşê kelîmeyên jêder her yek di nav <code><></code> de tên nivîsîn; guherînerên wan jî di nav <code><></code> de, tavilê pey kelîmeyê. Çend gav jî dibin: <code><etimon::mîr<pal:a>:deyn<ar:b>></code>.
Eger rûpela hedefê hebe û tê de ev şablon hebe, etîmolojiya di cih de nayê bikaranîn.
=== Parametre ===
{| class="wikitable"
! Parametre !! Mane !! Navê îngilîzî
|-
| {{para|1}} || Koda zimanê rûpelê. Lazim e.
|-
| {{para|metn}} || Metnê etîmolojiyê nîşan dide; binêre [[#Metn]]. || {{para|text}}
|-
| {{para|dar}} || Bi <code>1</code> dara etîmolojiyê nîşan dide. || {{para|tree}}
|-
| {{para|id}} || Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan.
|-
| {{para|title}} || Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be.
|-
| {{para|crz}} || Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: <code>reh</code>, <code>kelîme</code>, <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>. || {{para|pos}}
|-
| {{para|cotreh}} || Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda. || {{para|doublet}}
|-
| {{para|tarîxa-etîm}} || Tarîxa peyitandina pêşîn, wek <code>1901</code>, <code>1500s</code>, <code>14c</code>, <code>c,1900</code>, <code>before,1850</code>, <code>r,1501,1558</code>. || {{para|etydate}}
|-
| {{para|niqtena}} || Bi <code>1</code> niqteya dawiyê nayê zêdekirin. || {{para|nodot}}
|-
| {{para|niqte}} || Li şûna niqteya dawiyê nîşaneke din. || {{para|dot}}
|-
| {{para|katna}} || Bi <code>1</code> kategorî nayên zêdekirin. Herwiha {{para|nekat}}. || {{para|nocat}}
|-
| {{para|darna}} || Bi <code>1</code> ev etîmolojî di dara rûpelên din de dernakeve. || {{para|notree}}
|-
| {{para|exnihilo}} || Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin.
|-
| {{para|json}} || Bi <code>1</code> li şûna metnî daneyên xam vedigerîne; ji bo ceribandinê ye.
|}
=== Kelîmeyên mifteyî ===
Kelîmeya mifteyî bi du niqteyan dest pê dike û eleqeya di navbera her du kelîmeyan de diyar dike. Navên îngilîzî jî tên qebûlkirin.
{| class="wikitable"
! Kelîmeya mifteyî !! Mane !! Navên din
|-
| <code>:mîr</code> || Kelîmeya ku ji zimanê bav û kalan maye || <code>:mîrasmayî</code>, <code>:inh</code>
|-
| <code>:deyn</code> || Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin || <code>:bor</code>, <code>:borrowed</code>
|-
| <code>:deynh</code> || [[Nimînok:Ferhengok#deynkirina hînbûyî|Deynkirina hînbûyî]]: ne bi riya têkiliya rojane, bi qesd hatiye girtin || <code>:lbor</code>
|-
| <code>:deynhq</code> || Deynkirina hînbûyî ya ku hinekî hatiye guhertin || <code>:slbor</code>
|-
| <code>:deynort</code> || [[Nimînok:Ferhengok#deynkirina ortografîk|Deynkirina ortografîk]] || <code>:obor</code>
|-
| <code>:deynne</code> || [[Nimînok:Ferhengok#deynkirina neadaptekirî|Deynkirina neadaptekirî]] || <code>:ubor</code>
|-
| <code>:drş</code> || Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be || <code>:dariştî</code>, <code>:der</code>
|-
| <code>:ji</code> || Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e || <code>:from</code>
|-
| <code>:drşnd</code> || Dariştin heye lê cureyê wê ne diyar e || <code>:uder</code>
|-
| <code>:qf</code> || Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e || <code>:qertaf</code>, <code>:af</code>
|-
| <code>:reh</code> || Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e ("Peyvên … yên aîdî rehê …") û di metn û darê de xuya nabe || <code>:root</code>
|-
| <code>:yekser</code> || [[Nimînok:Ferhengok#yekser|Wergerandina yekser]]; zincîr li vir disekine || <code>:cal</code>, <code>:clq</code>
|-
| <code>:yekserq</code> || Wergerandina yekser a qismî; zincîr li vir disekine || <code>:yekserqismî</code>, <code>:pcal</code>
|-
| <code>:wergirtin</code> || [[Nimînok:Ferhengok#wergirtin|Wergirtina maneyê]]; mana wergirtî bi <code><maneid:…></code> tê nîşankirin || <code>:sl</code>
|-
| <code>:lihevanîn</code> || Lihevanîna dengî-maneyî || <code>:psm</code>
|-
| <code>:tesîr</code> || Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine || <code>:influence</code>
|-
| <code>:têkilkirin</code> || [[Nimînok:Ferhengok#têkilkirin|Têkilkirina]] du kelîmeyan || <code>:blend</code>
|-
| <code>:ûnîverbasyon</code> || [[Nimînok:Ferhengok#ûnîverbasyon|Ûnîverbasyon]] || <code>:ûnîv</code>, <code>:univ</code>
|-
| <code>:qusandin</code> || [[Nimînok:Ferhengok#qusandin|Qusandin]] || <code>:clip</code>
|-
| <code>:paşvesazî</code> || [[Nimînok:Ferhengok#paşvesazî|Paşvesazî]] || <code>:bf</code>
|-
| <code>:elîpsîz</code> || [[Nimînok:Ferhengok#elîpsîz|Elîpsîz]] || <code>:elîp</code>, <code>:ellip</code>
|-
| <code>:nomînalîzasyon</code> || [[Nimînok:Ferhengok#nomînalîzasyon|Nomînalîzasyon]] || <code>:nomîn</code>, <code>:nom</code>
|-
| <code>:translîterasyon</code> || [[Nimînok:Ferhengok#translîterasyon|Translîterasyon]] || <code>:translît</code>, <code>:translit</code>
|-
| <code>:redûblîkasyon</code> || [[Nimînok:Ferhengok#redûblîkasyon|Redûblîkasyon]] || <code>:redûb</code>, <code>:redup</code>
|-
| <code>:kurtkirin</code> || Kurtkirina kelîmeyekê || <code>:abbr</code>, <code>:abbrev</code>, <code>:abbreviation</code>
|-
| <code>:sylabbr</code> || Kurtkirin li gorî kîteyan || <code>:sylabbrev</code>, <code>:syllabic abbreviation</code>
|-
| <code>:akronîm</code> || [[Nimînok:Ferhengok#akronîm|Akronîm]] || <code>:acro</code>
|-
| <code>:înîtîalîzm</code> || [[Nimînok:Ferhengok#înîtîalîzm|Înîtîalîzm]] || <code>:înît</code>, <code>:init</code>
|-
| <code>:metatez</code> || [[Nimînok:Ferhengok#metatez|Metatez]] || <code>:meta</code>
|-
| <code>:afeq</code> || Wek <code>:qf</code>, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike
|-
| <code>:apheresis</code> || Şiklê ku dengê destpêkê winda kiriye || <code>:apheretic</code>, <code>:aphetic</code>
|-
| <code>:denominal</code> || Fiîla ji îsmekê çêbûyî || <code>:denom</code>
|-
| <code>:deverbal</code> || Kelîmeya ji fiîlekê çêbûyî
|-
| <code>:vrd</code> || Dariştina vṛddhî (sanskrîtî); bi qertaf: <code>:vrd-af</code>
|-
| <code>:sa-af</code> || Pêkhateya sanskrîtî
|}
=== Guherîner ===
Guherîner di nav <code><></code> de tên nivîsîn û tavilê tên pey kelîmeyê yan kelîmeya mifteyî: <code>fa:خانه<tr:xâne><t:mal></code>. Navên guherînerên di nav <code><></code> de her tim bi herfên ASCII ne.
==== Guherînerên kelîmeyê ====
{| class="wikitable"
! Guherîner !! Mane !! Navên din
|-
| <code><t:…></code> || Tercimeya kelîmeyê bi kurmancî || <code><w:…></code>
|-
| <code><tr:…></code> || Translîterasyon
|-
| <code><ts:…></code> || Transkrîpsiyon
|-
| <code><cuda:…></code> || Şiklê ku tê nîşandan, eger ne wek navê rûpelê be || <code><alt:…></code>
|-
| <code><id:…></code> || Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan
|-
| <code><crz:…></code> || Cureyê rêzimanî yê kelîmeyê || <code><pos:…></code>
|-
| <code><g:…></code> || Cinsiyet: <code>n</code> (nêr), <code>m</code> (mê), <code>nt</code> (nêtar)
|-
| <code><q:…></code> || Wesf li pêşiyê kelîmeyê
|-
| <code><qq:…></code> || Wesf li pey kelîmeyê
|-
| <code><hrf:…></code> || Mana herfiyen || <code><lit:…></code>
|-
| <code><ref:…></code> || Çavkanî; binêre [[#Çavkanî]]
|-
| <code><nediyar></code> || Ev gav ne teqez e || <code><unc></code>
|-
| <code><crztip:…></code> || Kelîme ji bo kategoriyan wek <code>reh</code> yan <code>kelîme</code> tê hesibandin || <code><postype:…></code>
|-
| <code><etimon:…></code> || Etîmolojiya di cih de; binêre jor || <code><ety:…></code>
|-
| <code><aftype:…></code> || Di nav <code>:qf</code> de: cureyê qertafê; binêre [[#Cureyên qertafan]]
|-
| <code><deyn></code>, <code><deynh></code>, <code><deynhq></code> || Di nav <code>:qf</code> de: ev parçe deynkirî ye
|}
==== Guherînerên kelîmeya mifteyî ====
{| class="wikitable"
! Guherîner !! Mane !! Navên din
|-
| <code><unc></code> || Ev gav ne teqez e: "Mihtemelen…"
|-
| <code><grdk:…></code> || Girêdeka di navbera kelîmeyên jêder de, li şûna "yan jî" || <code><conj:…></code>
|-
| <code><anlz></code> || [[Nimînok:Ferhengok#analîza şiklî|Analîza şiklî]] || <code><surf></code>
|-
| <code><hrf:…></code> || Di nav <code>:qf</code> de: mana herfiyen || <code><lit:…></code>
|-
| <code><maneid:…></code> || Di nav <code>:wergirtin</code> de: nasnameya maneya wergirtî || <code><senseid:…></code>
|-
| <code><metn:…></code> || Di nav <code>:ji</code> û <code>:drş</code> de: metnekî din li şûna "Ji" || <code><text:…></code>
|-
| <code><ref:…></code> || Çavkaniya vê gavê
|}
=== Çavkanî ===
Çavkanî bi <code><ref:…></code> li kelîmeyekê yan li kelîmeya mifteyî tên zêdekirin. Ji bo çend çavkaniyan <code> !!! </code> (bi valahiyan) dikeve navbera wan. Çavkanî tenê wextê {{para|metn}} hatibe dayîn xuya dibin, û tenê li ser wê rûpelê, ne li ser rûpelên dûndeyan.
* <code>la:verbum<ref:{{ş|R:L&S}}></code> – çavkaniyek
* <code>la:verbum<ref:{{ş|R:L&S}} !!! {{ş|R:Tsabolov}}></code> – du çavkanî
* <code>la:verbum<ref:{{ş|R:L&S}}<<name:LS>>></code> – çavkaniya bi nav, ku paşê bi <code><ref:<<name:LS>>></code> tê dubarekirin
* Bi <code><<group:…>></code> kom tê diyarkirin.
=== Dar ===
Bi {{para|dar|1}} dara etîmolojiyê tê nîşandan. Dar ji eynî daneyan tê çêkirin, yanî ji zincîra ku ji rûpelan tê berhevkirin.
Kelîmeyên mifteyî yên ku zincîrê pêş de nabin (<code>:yekser</code>, <code>:yekserq</code>, <code>:wergirtin</code>, <code>:tesîr</code>) di darê de etîmolojiya jorîn nîşan nadin; li şûna wê xetek bi niqteyan xuya dibe. Kelîmeya ku di darê de dubare dibe jî etîmolojiya xwe cardin nîşan nade û bi çarçoveyeke niqteyî tê xuyakirin.
Dar bi gedgeta [[MediaWiki:Gadget-EtytreeZoom.js|EtytreeZoom]] tê biçûk û mezin kirin.
=== Metn ===
Bi {{para|metn}} metnê etîmolojiyê tê çêkirin. Li ser Wîkîferhenga kurdî ev ji bo hemû zimanan vekirî ye ([[Modul:etymon/data/text_allowed]]).
Nirxên {{para|metn}}:
* <code>++</code> – tevahiya zincîrê
* <code>+</code> – tenê gava pêşîn
* <code>*</code> – heta kelîmeya pêşîn a ku rûpela wê heye
* hejmarek – ewqas gav
* <code>:kod</code> – heta zimanê bi wê kodê
* <code>:kod*</code> – heta wî zimanî, eger rûpela wî tune be heta rûpela pêşîn a heyî
=== Cureyên qertafan ===
Di nav <code>:qf</code> de bi <code><aftype:…></code> tê diyarkirin ka parçe çi ye: <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>, <code>circumfix</code>, <code>infix</code>, <code>non-affix</code>. Kurtiyên <code>pre</code>, <code>suf</code>, <code>in</code>, <code>inter</code>, <code>circum</code>, <code>naf</code> û <code>root</code> jî tên qebûlkirin.
=== Rewşên xisûsî ===
Ji bo zimanên çînî (malbata <code>zhx</code>) dar, metn û kategorî girtî ne û translîterasyon nayê nîşandan.
'''Not:''' ev şablon li sernavê beşê dinêre û divê ew navê zimanê parametreya 1 be. Loma nimûneyên jorîn di beşên asta sisiyan de ne; di beşeke asta duduyan de (wek <code>== Bikaranîn ==</code>) şablon xeletiyekê dide.
=== Binêre ===
* {{ş|dû}} – dûndeyên kelîmeyekê
* {{ş|dara dûnde}} – dara dûndeyan
* [[Nimînok:Ferhengok]] – ferhengoka terimên etîmolojiyê
* [[Şablon:etîmon/testcases]] – ceribandin
<includeonly>
[[Kategorî:Etîmolojî (şablon)]]
</includeonly>
o9oft6eks1rtpjy13z18eo5xkuwixgu
6533313
6532249
2026-09-19T10:54:05Z
Wikihez
7344
Cinsiyet: <c:> e, <z:> û <g:> jî tên qebûlkirin
6533313
wikitext
text/x-wiki
{{belgekirin/binrûpel}}
{{Lua bikartîne|Modul:etymon|Modul:etymon/data|Modul:etymon/text|Modul:etymon/tree|Modul:etymon/categories}}
Ev şablon etîmolojiya kelîmeyekê bi awayekî birêkûpêk qeyd dike. Di her bangkirinê de bi kêmî gaveke etîmolojiyê tê nivîsîn, yanî kelîmeya ku ev kelîme jê hatiye; bi guherînerên <code><etimon:…></code> mirov dikare çend gavan jî di eynî bangkirinê de binivîse. Gavên din li ser rûpelên wan kelîmeyan bi vê şablonê hatine qeydkirin; şablon wan rûpelan dixwîne û zincîrê bi xwe berhev dike, loma ne lazim e mirov tevahiya zincîrê li ser her rûpelê dubare bike.
Ji vê zincîrê du netîce çêdibin: '''metnê etîmolojiyê''' (bi {{para|metn}}) û '''dara etîmolojiyê''' (bi {{para|dar}}).
=== Bikaranîn ===
<pre>{{etîmon|<koda zimanê rûpelê>|:<kelîmeya mifteyî>|<koda zimên>:<kelîme>|metn=++|dar=1}}</pre>
* '''Parametreya 1''' koda zimanê rûpelê ye, wek <code>ku</code>.
* '''Parametreyên bênav ên din''' bi rêz têne xwendin: [[#Kelîmeyên mifteyî|kelîmeya mifteyî]] (bi du niqteyan dest pê dike, wek <code>:deyn</code>) û paşê kelîmeyên jêder di şiklê <code>koda zimên:kelîme</code> de.
* Eger kelîmeya jêder bi zimanê rûpelê be, koda zimên ne lazim e. Li ser rûpela ''zimandirêj'' herdu parçe kurmancî ne, loma <code><nowiki>{{etîmon|ku|:qf|ziman|dirêj}}</nowiki></code> bes e.
* Kelîmeya mifteyî heta ya pêş de li hemû kelîmeyên jêder tê tetbîqkirin: <code>|:deyn|a|b|:mîr|c</code> yanî a û b deyn in, c mîrasmayî ye.
==== Nimûne ====
{{şx|etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++}}
: {{etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++|katna=1}}
{{şx|etîmon|ku|:qf|ziman|dirêj|metn=++}}
: {{etîmon|ku|:qf|ziman|dirêj|metn=++|katna=1}}
{{şx|etîmon|ku|:deyn|ira:-|fa:test|metn=++}}
: {{etîmon|ku|:deyn|ira:-|fa:test|metn=++|katna=1}}
Bi darê re:
{{şx|etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman}}
: {{etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman|katna=1}}
==== Nasname (id) ====
Eger li ser rûpelekê ji yekî zêdetir beşên etîmolojiyê hebin, divê her yek nasnameyeke xwe ya bi {{para|id}} hebe, û rûpelên ku wê kelîmeyê wek jêder nîşan didin divê eynî nasnameyê bi <code><id:…></code> binivîsin. Bi vî awayî şablon dizane ka kîjan etîmolojî tê xwestin.
Nasname divê kurt be û maneyekê yan eslekî bide nasîn (wek <code>kitêba referansê</code>), ne hejmarên bêmane. Eger kelîmeyê tenê etîmolojiyek hebe, nasname ne lazim e. Eger li ser rûpelekê çend bangkirinên eynî zimanî hebin û yek jê bê nasname be, şablon xeletiyekê dide. Nasname herwiha wek lenger tê bikaranîn: <code>[[qanûn#Kurmancî:_qaîdeyên_hiqûqî]]</code>.
==== Kelîmeyên jêder ====
Şiklê temam: <code>koda zimên:kelîme<guherîner>…</code>
* Ji bo ku tenê navê zimên yan malbata zimanan bê nîşandan, li şûna kelîmeyê <code>-</code> tê nivîsîn: <code>ira:-</code>. Malbatên zimanan her tim bi vî awayî têne nivîsîn.
* Eger cihê kelîmeyê vala be, wek kelîmeyeke nenas tê nîşandan.
* Bi <code><id:!…></code> nasname her tim xuya dibe, ku şablon bi xwe biryar nede.
==== Etîmolojiya di cih de ====
Eger rûpela kelîmeya jêder tune be yan tê de ev şablon nehatibe bikaranîn, mirov dikare zincîrê bi <code><etimon:…></code> di cih de berdewam bike. '''Not:''' ev guherîner bêyî '''î''' tê nivîsîn (<code>etimon</code>, ne <code>etîmon</code>), ji ber ku navên guherînerên di nav <code><></code> de tenê bi herfên ASCII dikarin bên nivîsîn.
<pre>{{etîmon|ku|:deyn|fa:testxyz<etimon::mîr<pal:testabc<t:mal>>>|metn=++}}</pre>
: Deyn ji farisî ''testxyz'', mîrasmayî ji farisiya navîn ''testabc'' (“mal”).
Di hundir de pêşî kelîmeya mifteyî, paşê kelîmeyên jêder her yek di nav <code><></code> de tên nivîsîn; guherînerên wan jî di nav <code><></code> de, tavilê pey kelîmeyê. Çend gav jî dibin: <code><etimon::mîr<pal:a>:deyn<ar:b>></code>.
Eger rûpela hedefê hebe û tê de ev şablon hebe, etîmolojiya di cih de nayê bikaranîn.
=== Parametre ===
{| class="wikitable"
! Parametre !! Mane !! Navê îngilîzî
|-
| {{para|1}} || Koda zimanê rûpelê. Lazim e.
|-
| {{para|metn}} || Metnê etîmolojiyê nîşan dide; binêre [[#Metn]]. || {{para|text}}
|-
| {{para|dar}} || Bi <code>1</code> dara etîmolojiyê nîşan dide. || {{para|tree}}
|-
| {{para|id}} || Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan.
|-
| {{para|title}} || Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be.
|-
| {{para|crz}} || Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: <code>reh</code>, <code>kelîme</code>, <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>. || {{para|pos}}
|-
| {{para|cotreh}} || Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda. || {{para|doublet}}
|-
| {{para|tarîxa-etîm}} || Tarîxa peyitandina pêşîn, wek <code>1901</code>, <code>1500s</code>, <code>14c</code>, <code>c,1900</code>, <code>before,1850</code>, <code>r,1501,1558</code>. || {{para|etydate}}
|-
| {{para|niqtena}} || Bi <code>1</code> niqteya dawiyê nayê zêdekirin. || {{para|nodot}}
|-
| {{para|niqte}} || Li şûna niqteya dawiyê nîşaneke din. || {{para|dot}}
|-
| {{para|katna}} || Bi <code>1</code> kategorî nayên zêdekirin. Herwiha {{para|nekat}}. || {{para|nocat}}
|-
| {{para|darna}} || Bi <code>1</code> ev etîmolojî di dara rûpelên din de dernakeve. || {{para|notree}}
|-
| {{para|exnihilo}} || Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin.
|-
| {{para|json}} || Bi <code>1</code> li şûna metnî daneyên xam vedigerîne; ji bo ceribandinê ye.
|}
=== Kelîmeyên mifteyî ===
Kelîmeya mifteyî bi du niqteyan dest pê dike û eleqeya di navbera her du kelîmeyan de diyar dike. Navên îngilîzî jî tên qebûlkirin.
{| class="wikitable"
! Kelîmeya mifteyî !! Mane !! Navên din
|-
| <code>:mîr</code> || Kelîmeya ku ji zimanê bav û kalan maye || <code>:mîrasmayî</code>, <code>:inh</code>
|-
| <code>:deyn</code> || Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin || <code>:bor</code>, <code>:borrowed</code>
|-
| <code>:deynh</code> || [[Nimînok:Ferhengok#deynkirina hînbûyî|Deynkirina hînbûyî]]: ne bi riya têkiliya rojane, bi qesd hatiye girtin || <code>:lbor</code>
|-
| <code>:deynhq</code> || Deynkirina hînbûyî ya ku hinekî hatiye guhertin || <code>:slbor</code>
|-
| <code>:deynort</code> || [[Nimînok:Ferhengok#deynkirina ortografîk|Deynkirina ortografîk]] || <code>:obor</code>
|-
| <code>:deynne</code> || [[Nimînok:Ferhengok#deynkirina neadaptekirî|Deynkirina neadaptekirî]] || <code>:ubor</code>
|-
| <code>:drş</code> || Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be || <code>:dariştî</code>, <code>:der</code>
|-
| <code>:ji</code> || Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e || <code>:from</code>
|-
| <code>:drşnd</code> || Dariştin heye lê cureyê wê ne diyar e || <code>:uder</code>
|-
| <code>:qf</code> || Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e || <code>:qertaf</code>, <code>:af</code>
|-
| <code>:reh</code> || Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e ("Peyvên … yên aîdî rehê …") û di metn û darê de xuya nabe || <code>:root</code>
|-
| <code>:yekser</code> || [[Nimînok:Ferhengok#yekser|Wergerandina yekser]]; zincîr li vir disekine || <code>:cal</code>, <code>:clq</code>
|-
| <code>:yekserq</code> || Wergerandina yekser a qismî; zincîr li vir disekine || <code>:yekserqismî</code>, <code>:pcal</code>
|-
| <code>:wergirtin</code> || [[Nimînok:Ferhengok#wergirtin|Wergirtina maneyê]]; mana wergirtî bi <code><maneid:…></code> tê nîşankirin || <code>:sl</code>
|-
| <code>:lihevanîn</code> || Lihevanîna dengî-maneyî || <code>:psm</code>
|-
| <code>:tesîr</code> || Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine || <code>:influence</code>
|-
| <code>:têkilkirin</code> || [[Nimînok:Ferhengok#têkilkirin|Têkilkirina]] du kelîmeyan || <code>:blend</code>
|-
| <code>:ûnîverbasyon</code> || [[Nimînok:Ferhengok#ûnîverbasyon|Ûnîverbasyon]] || <code>:ûnîv</code>, <code>:univ</code>
|-
| <code>:qusandin</code> || [[Nimînok:Ferhengok#qusandin|Qusandin]] || <code>:clip</code>
|-
| <code>:paşvesazî</code> || [[Nimînok:Ferhengok#paşvesazî|Paşvesazî]] || <code>:bf</code>
|-
| <code>:elîpsîz</code> || [[Nimînok:Ferhengok#elîpsîz|Elîpsîz]] || <code>:elîp</code>, <code>:ellip</code>
|-
| <code>:nomînalîzasyon</code> || [[Nimînok:Ferhengok#nomînalîzasyon|Nomînalîzasyon]] || <code>:nomîn</code>, <code>:nom</code>
|-
| <code>:translîterasyon</code> || [[Nimînok:Ferhengok#translîterasyon|Translîterasyon]] || <code>:translît</code>, <code>:translit</code>
|-
| <code>:redûblîkasyon</code> || [[Nimînok:Ferhengok#redûblîkasyon|Redûblîkasyon]] || <code>:redûb</code>, <code>:redup</code>
|-
| <code>:kurtkirin</code> || Kurtkirina kelîmeyekê || <code>:abbr</code>, <code>:abbrev</code>, <code>:abbreviation</code>
|-
| <code>:sylabbr</code> || Kurtkirin li gorî kîteyan || <code>:sylabbrev</code>, <code>:syllabic abbreviation</code>
|-
| <code>:akronîm</code> || [[Nimînok:Ferhengok#akronîm|Akronîm]] || <code>:acro</code>
|-
| <code>:înîtîalîzm</code> || [[Nimînok:Ferhengok#înîtîalîzm|Înîtîalîzm]] || <code>:înît</code>, <code>:init</code>
|-
| <code>:metatez</code> || [[Nimînok:Ferhengok#metatez|Metatez]] || <code>:meta</code>
|-
| <code>:afeq</code> || Wek <code>:qf</code>, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike
|-
| <code>:apheresis</code> || Şiklê ku dengê destpêkê winda kiriye || <code>:apheretic</code>, <code>:aphetic</code>
|-
| <code>:denominal</code> || Fiîla ji îsmekê çêbûyî || <code>:denom</code>
|-
| <code>:deverbal</code> || Kelîmeya ji fiîlekê çêbûyî
|-
| <code>:vrd</code> || Dariştina vṛddhî (sanskrîtî); bi qertaf: <code>:vrd-af</code>
|-
| <code>:sa-af</code> || Pêkhateya sanskrîtî
|}
=== Guherîner ===
Guherîner di nav <code><></code> de tên nivîsîn û tavilê tên pey kelîmeyê yan kelîmeya mifteyî: <code>fa:خانه<tr:xâne><t:mal></code>. Navên guherînerên di nav <code><></code> de her tim bi herfên ASCII ne.
==== Guherînerên kelîmeyê ====
{| class="wikitable"
! Guherîner !! Mane !! Navên din
|-
| <code><t:…></code> || Tercimeya kelîmeyê bi kurmancî || <code><w:…></code>
|-
| <code><tr:…></code> || Translîterasyon
|-
| <code><ts:…></code> || Transkrîpsiyon
|-
| <code><cuda:…></code> || Şiklê ku tê nîşandan, eger ne wek navê rûpelê be || <code><alt:…></code>
|-
| <code><id:…></code> || Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan
|-
| <code><crz:…></code> || Cureyê rêzimanî yê kelîmeyê || <code><pos:…></code>
|-
| <code><c:…></code> || Cinsiyet: <code>n</code> (nêr), <code>m</code> (mê), <code>nt</code> (nêtar) || <code><z:…></code>, <code><g:…></code>
|-
| <code><q:…></code> || Wesf li pêşiyê kelîmeyê
|-
| <code><qq:…></code> || Wesf li pey kelîmeyê
|-
| <code><hrf:…></code> || Mana herfiyen || <code><lit:…></code>
|-
| <code><ref:…></code> || Çavkanî; binêre [[#Çavkanî]]
|-
| <code><nediyar></code> || Ev gav ne teqez e || <code><unc></code>
|-
| <code><crztip:…></code> || Kelîme ji bo kategoriyan wek <code>reh</code> yan <code>kelîme</code> tê hesibandin || <code><postype:…></code>
|-
| <code><etimon:…></code> || Etîmolojiya di cih de; binêre jor || <code><ety:…></code>
|-
| <code><aftype:…></code> || Di nav <code>:qf</code> de: cureyê qertafê; binêre [[#Cureyên qertafan]]
|-
| <code><deyn></code>, <code><deynh></code>, <code><deynhq></code> || Di nav <code>:qf</code> de: ev parçe deynkirî ye
|}
==== Guherînerên kelîmeya mifteyî ====
{| class="wikitable"
! Guherîner !! Mane !! Navên din
|-
| <code><unc></code> || Ev gav ne teqez e: "Mihtemelen…"
|-
| <code><grdk:…></code> || Girêdeka di navbera kelîmeyên jêder de, li şûna "yan jî" || <code><conj:…></code>
|-
| <code><anlz></code> || [[Nimînok:Ferhengok#analîza şiklî|Analîza şiklî]] || <code><surf></code>
|-
| <code><hrf:…></code> || Di nav <code>:qf</code> de: mana herfiyen || <code><lit:…></code>
|-
| <code><maneid:…></code> || Di nav <code>:wergirtin</code> de: nasnameya maneya wergirtî || <code><senseid:…></code>
|-
| <code><metn:…></code> || Di nav <code>:ji</code> û <code>:drş</code> de: metnekî din li şûna "Ji" || <code><text:…></code>
|-
| <code><ref:…></code> || Çavkaniya vê gavê
|}
=== Çavkanî ===
Çavkanî bi <code><ref:…></code> li kelîmeyekê yan li kelîmeya mifteyî tên zêdekirin. Ji bo çend çavkaniyan <code> !!! </code> (bi valahiyan) dikeve navbera wan. Çavkanî tenê wextê {{para|metn}} hatibe dayîn xuya dibin, û tenê li ser wê rûpelê, ne li ser rûpelên dûndeyan.
* <code>la:verbum<ref:{{ş|R:L&S}}></code> – çavkaniyek
* <code>la:verbum<ref:{{ş|R:L&S}} !!! {{ş|R:Tsabolov}}></code> – du çavkanî
* <code>la:verbum<ref:{{ş|R:L&S}}<<name:LS>>></code> – çavkaniya bi nav, ku paşê bi <code><ref:<<name:LS>>></code> tê dubarekirin
* Bi <code><<group:…>></code> kom tê diyarkirin.
=== Dar ===
Bi {{para|dar|1}} dara etîmolojiyê tê nîşandan. Dar ji eynî daneyan tê çêkirin, yanî ji zincîra ku ji rûpelan tê berhevkirin.
Kelîmeyên mifteyî yên ku zincîrê pêş de nabin (<code>:yekser</code>, <code>:yekserq</code>, <code>:wergirtin</code>, <code>:tesîr</code>) di darê de etîmolojiya jorîn nîşan nadin; li şûna wê xetek bi niqteyan xuya dibe. Kelîmeya ku di darê de dubare dibe jî etîmolojiya xwe cardin nîşan nade û bi çarçoveyeke niqteyî tê xuyakirin.
Dar bi gedgeta [[MediaWiki:Gadget-EtytreeZoom.js|EtytreeZoom]] tê biçûk û mezin kirin.
=== Metn ===
Bi {{para|metn}} metnê etîmolojiyê tê çêkirin. Li ser Wîkîferhenga kurdî ev ji bo hemû zimanan vekirî ye ([[Modul:etymon/data/text_allowed]]).
Nirxên {{para|metn}}:
* <code>++</code> – tevahiya zincîrê
* <code>+</code> – tenê gava pêşîn
* <code>*</code> – heta kelîmeya pêşîn a ku rûpela wê heye
* hejmarek – ewqas gav
* <code>:kod</code> – heta zimanê bi wê kodê
* <code>:kod*</code> – heta wî zimanî, eger rûpela wî tune be heta rûpela pêşîn a heyî
=== Cureyên qertafan ===
Di nav <code>:qf</code> de bi <code><aftype:…></code> tê diyarkirin ka parçe çi ye: <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>, <code>circumfix</code>, <code>infix</code>, <code>non-affix</code>. Kurtiyên <code>pre</code>, <code>suf</code>, <code>in</code>, <code>inter</code>, <code>circum</code>, <code>naf</code> û <code>root</code> jî tên qebûlkirin.
=== Rewşên xisûsî ===
Ji bo zimanên çînî (malbata <code>zhx</code>) dar, metn û kategorî girtî ne û translîterasyon nayê nîşandan.
'''Not:''' ev şablon li sernavê beşê dinêre û divê ew navê zimanê parametreya 1 be. Loma nimûneyên jorîn di beşên asta sisiyan de ne; di beşeke asta duduyan de (wek <code>== Bikaranîn ==</code>) şablon xeletiyekê dide.
=== Binêre ===
* {{ş|dû}} – dûndeyên kelîmeyekê
* {{ş|dara dûnde}} – dara dûndeyan
* [[Nimînok:Ferhengok]] – ferhengoka terimên etîmolojiyê
* [[Şablon:etîmon/testcases]] – ceribandin
<includeonly>
[[Kategorî:Etîmolojî (şablon)]]
</includeonly>
ejv60u4ameg78ugob060kc8e8537jd6
Bikarhêner:Wikihez/etydate-cer2
2
1359260
6532087
2026-09-18T19:12:10Z
Wikihez
7344
wrapper to test Modul:etydate/ceribandin
6532087
wikitext
text/x-wiki
<includeonly>{{#invoke:etydate/ceribandin|etydate}}</includeonly>
0i4qzzayd3ouxzdgvra0rvxcge78c0k
Bikarhêner:Wikihez/Gadget-test/etimon.js
2
1359261
6532101
2026-09-18T20:34:29Z
Wikihez
7344
Etymology: add a builder for {{etîmon}} to the shared template dialog, with its keywords, modifiers and metn= values in data-main.json
6532101
javascript
text/javascript
// <nowiki>
/*
* Page: [[MediaWiki:Gadget-wikt.cite/etimon.js]]
*
* The builder behind {{etîmon}}: one call is read into steps of "kelîmeya mifteyî + kelîmeyên jêder",
* every source word carrying its own <guherîner>s and, when its page has no etymology of its own, an
* inline <etimon:…> chain of further steps.
*
* Keywords, modifiers, the metn= values and the named parameters all come from the "etimon" block of
* data-main.json, so a new one is added there rather than here. cite.openTemplateDialog() hands every
* {{etîmon}} call to openDialog(), which is what DefSideBoxes and the wizard both call.
*/
(function () {
"use strict";
var edit = require("ext.gadget.wikt.edit");
var util = edit.util;
var langs = edit.langs;
var wt = edit.wt;
var data = edit.data.etimon || {};
var NAME = "etîmon";
// Every name the template answers to: a call written under one of its redirects still opens the builder.
var NAMES = ["etîmon", "etimon", "etymon"];
// <etimon:…> is spelled without "î": modifier names inside <> are ASCII only.
var INLINE_KEYS = ["etimon", "ety"];
function isEtimonName(name) {
return NAMES.indexOf($.trim(name || "").toLowerCase().replace(/^şablon:\s*/i, "")) !== -1;
}
// ---- the tables ---------------------------------------------------------------------------------
function keywords() {
return data.keywords || [];
}
function wordMods() {
return data.wordMods || [];
}
function keywordMods() {
return data.keywordMods || [];
}
// The entry for a key or for one of its documented aliases, so ":inh" is understood as ":mîr".
function defFor(defs, key) {
var found = null;
defs.forEach(function (def) {
if (found) {
return;
}
if (def.key === key || (def.aliases || []).indexOf(key) !== -1) {
found = def;
}
});
return found;
}
function isKeywordModName(key) {
return !!defFor(keywordMods(), key);
}
// ---- reading a call ----------------------------------------------------------------------------
// The ">" closing the "<" at start, skipping the nested ones an <etimon:…> or an <id:…> inside it has.
function matchAngle(text, start) {
var depth = 0;
for (var i = start; i < text.length; i++) {
var ch = text.charAt(i);
if (ch === "<") {
depth++;
} else if (ch === ">") {
depth--;
if (depth === 0) {
return i;
}
}
}
return -1;
}
// Splits on the "|" that separate parameters, and only those: a <ref:{{ş|R:X}}> carries pipes of its own.
function splitParams(text) {
var out = [];
var buf = "";
var braces = 0;
var angles = 0;
for (var i = 0; i < text.length; i++) {
var two = text.substr(i, 2);
if (two === "{{" || two === "}}") {
braces += two === "{{" ? 1 : -1;
buf += two;
i++;
continue;
}
var ch = text.charAt(i);
if (ch === "<") {
angles++;
} else if (ch === ">") {
angles = Math.max(0, angles - 1);
}
if (ch === "|" && braces <= 0 && angles === 0) {
out.push(buf);
buf = "";
continue;
}
buf += ch;
}
out.push(buf);
return out;
}
function parseMod(inner) {
var at = inner.indexOf(":");
if (at === -1) {
return { key: $.trim(inner), flag: true };
}
return { key: $.trim(inner.slice(0, at)), value: inner.slice(at + 1) };
}
// "fa:خانه<tr:xâne><t:mal>" -> { head: "fa:خانه", mods: [...] }
function splitMods(text) {
var head = "";
var mods = [];
var i = 0;
while (i < text.length) {
if (text.charAt(i) === "<") {
var end = matchAngle(text, i);
if (end === -1) {
head += text.slice(i);
break;
}
mods.push(parseMod(text.slice(i + 1, end)));
i = end + 1;
continue;
}
head += text.charAt(i);
i++;
}
return { head: head, mods: mods };
}
function emptyWord() {
return { lang: "", word: "", mods: [], steps: [] };
}
function emptyStep() {
return { keyword: "", mods: [], words: [] };
}
function parseWord(text) {
var split = splitMods($.trim(text));
var word = emptyWord();
var head = split.head;
// A language code, or a language family ("ira:-"); anything else is the word itself.
var m = /^([a-zA-Z][a-zA-Z0-9._-]*):([\s\S]*)$/.exec(head);
if (m) {
word.lang = m[1];
head = m[2];
}
word.word = head;
split.mods.forEach(function (mo) {
if (INLINE_KEYS.indexOf(mo.key) !== -1) {
word.steps = parseChain(mo.value || "");
return;
}
word.mods.push(mo);
});
return word;
}
// The inside of an <etimon:…>: ":kelîmeyeke mifteyî" followed by each source word in its own <…>.
// A group named after a keyword modifier belongs to the keyword, which is how Modul:etymon reads it too.
function parseChain(text) {
var steps = [];
var i = 0;
function current() {
if (!steps.length) {
steps.push(emptyStep());
}
return steps[steps.length - 1];
}
while (i < text.length) {
var ch = text.charAt(i);
if (ch === ":") {
var j = i + 1;
while (j < text.length && text.charAt(j) !== ":" && text.charAt(j) !== "<") {
j++;
}
var step = emptyStep();
step.keyword = $.trim(text.slice(i + 1, j));
steps.push(step);
i = j;
continue;
}
if (ch === "<") {
var end = matchAngle(text, i);
if (end === -1) {
break;
}
var inner = text.slice(i + 1, end);
i = end + 1;
var name = /^([^:>]+)/.exec(inner);
var step2 = current();
if (!step2.words.length && name && isKeywordModName($.trim(name[1]))) {
step2.mods.push(parseMod(inner));
} else {
step2.words.push(parseWord(inner));
}
continue;
}
i++;
}
return steps;
}
// One {{etîmon}} call -> the model the form edits, or null for anything else.
function parseCall(callWikitext) {
var call = wt.parseTemplateCalls(callWikitext || "").calls[0];
if (!call || !isEtimonName(call.name)) {
return null;
}
var model = { lang: "", steps: [], named: {}, namedOrder: [] };
var positional = 0;
splitParams(call.params.join("|")).forEach(function (raw) {
// A name cannot hold "<": that is a modifier, so "fa:x<t:a=b>" stays positional.
var m = /^\s*([^|={}<>\n]+?)\s*=([\s\S]*)$/.exec(raw);
if (m) {
if (model.named[m[1]] === undefined) {
model.namedOrder.push(m[1]);
}
model.named[m[1]] = $.trim(m[2]);
return;
}
positional++;
var value = $.trim(raw);
if (positional === 1) {
model.lang = value;
return;
}
if (value.charAt(0) === ":") {
var split = splitMods(value);
var step = emptyStep();
step.keyword = $.trim(split.head.slice(1));
step.mods = split.mods;
model.steps.push(step);
return;
}
if (!model.steps.length) {
model.steps.push(emptyStep());
}
model.steps[model.steps.length - 1].words.push(parseWord(value));
});
return model;
}
// ---- writing it back ---------------------------------------------------------------------------
function joinMods(mods) {
return (mods || []).map(function (mo) {
return mo.flag ? "<" + mo.key + ">" : "<" + mo.key + ":" + (mo.value || "") + ">";
}).join("");
}
// A row nobody filled in: no word, no language, nothing hanging off it.
function wordIsEmpty(word) {
return !$.trim(word.word || "") && !$.trim(word.lang || "") &&
!(word.mods || []).length && !(word.steps || []).length;
}
function joinWord(word) {
var lang = $.trim(word.lang || "");
var out = (lang ? lang + ":" : "") + $.trim(word.word || "") + joinMods(word.mods);
if ((word.steps || []).length) {
out += "<etimon:" + joinChain(word.steps) + ">";
}
return out;
}
function joinChain(steps) {
return (steps || []).map(function (step) {
return ":" + $.trim(step.keyword || "") + joinMods(step.mods) +
(step.words || []).filter(function (word) {
return !wordIsEmpty(word);
}).map(function (word) {
return "<" + joinWord(word) + ">";
}).join("");
}).join("");
}
function buildCall(model) {
var parts = [NAME, $.trim(model.lang || "")];
(model.steps || []).forEach(function (step) {
var keyword = $.trim(step.keyword || "");
if (keyword || (step.mods || []).length) {
parts.push(":" + keyword + joinMods(step.mods));
}
(step.words || []).forEach(function (word) {
if (!wordIsEmpty(word)) {
parts.push(joinWord(word));
}
});
});
(model.namedOrder || []).forEach(function (key) {
var value = model.named[key];
if (value !== undefined && value !== null && value !== "") {
parts.push(key + "=" + value);
}
});
return "{{" + parts.join("|") + "}}";
}
// Which metn= choice a written value belongs to, and what is left over for that choice's own box:
// "3" belongs to the number choice, ":pal*" to the ":kod*" one.
function splitMetn(value) {
var current = $.trim(value || "");
var out = { choice: "", rest: "" };
if (!current) {
return out;
}
(data.metnChoices || []).forEach(function (choice) {
if (out.choice) {
return;
}
if (!choice.free) {
if (choice.value === current) {
out.choice = choice.value;
}
return;
}
if (choice.value === "1" && /^\d+$/.test(current)) {
out.choice = choice.value;
out.rest = current;
} else if (choice.value === ":*" && /^:.+\*$/.test(current)) {
out.choice = choice.value;
out.rest = current.slice(1, -1);
} else if (choice.value === ":" && /^:[^*]+$/.test(current)) {
out.choice = choice.value;
out.rest = current.slice(1);
}
});
return out;
}
// The inverse: what the dropdown and its box together mean as a metn= value.
function joinMetn(choiceValue, rest) {
var choice = null;
(data.metnChoices || []).forEach(function (c) {
if (c.value === choiceValue) {
choice = c;
}
});
if (!choice) {
return "";
}
if (!choice.free) {
return choice.value;
}
var typed = $.trim(rest || "");
if (!typed) {
return "";
}
if (choice.value === "1") {
return typed;
}
return ":" + typed + (choice.value === ":*" ? "*" : "");
}
function setNamed(model, key, value) {
if (model.namedOrder.indexOf(key) === -1) {
model.namedOrder.push(key);
}
model.named[key] = value;
}
// ---- the form ----------------------------------------------------------------------------------
// Chips for one list of modifiers, plus the ⊕ that adds another. The pills, the value box and the
// chips are the same widgetry a sense word row uses, so they look and behave the same here.
function modifierEditor(mods, defs, onChange) {
var $wrap = $("<div class='dsb-etimon-mods'></div>");
var $chips = $("<div class='dsb-word-mods'></div>");
var $btn = $("<button type='button' class='dsb-mod-btn'>⊕</button>")
.attr("title", util.msg.addModifier);
var $picker = $("<div class='dsb-mod-picker'></div>").hide();
function label(def) {
return def ? def.key + " — " + def.desc : "";
}
// Same box for adding and for editing: a modifier with a fixed set of values gets a dropdown.
function openValueEditor(def, index) {
$picker.hide();
$wrap.children(".dsb-mod-val-wrap").remove();
var $box = $("<div class='dsb-mod-val-wrap'></div>");
var $label = $("<span class='dsb-mod-val-label'></span>").text(def.key);
var current = index === -1 ? "" : (mods[index].value || "");
var $field;
if ((def.values || []).length) {
$field = $("<select class='dsb-mod-val-input'></select>");
$field.append($("<option value=''></option>"));
def.values.forEach(function (value) {
$field.append($("<option></option>").val(value).text(value));
});
$field.val(current);
} else {
$field = $("<input type='text' class='dsb-mod-val-input'>")
.attr("size", 24).attr("placeholder", def.desc).val(current);
}
var $ok = $("<button type='button' class='dsb-mod-confirm'>✓</button>");
var $no = $("<button type='button' class='dsb-mod-cancel'>✕</button>");
function apply() {
var value = $.trim(String($field.val() || ""));
if (value) {
if (index === -1) {
mods.push({ key: def.key, value: value });
} else {
mods[index].value = value;
}
onChange();
render();
}
$box.remove();
}
$ok.on("click", apply);
$no.on("click", function () {
$box.remove();
});
$field.on("keydown", function (e) {
if (e.which === 13) {
e.preventDefault();
apply();
}
if (e.which === 27) {
$box.remove();
}
});
$box.append($label, $field, $ok, $no);
$wrap.append($box);
$field.focus();
}
function render() {
$chips.empty();
mods.forEach(function (mo, index) {
var def = defFor(defs, mo.key);
var $chip = $("<span class='dsb-word-mod-chip' role='button' tabindex='0'></span>")
.attr("title", def ? def.desc : mo.key)
.text(mo.flag ? mo.key : mo.key + ": " + (mo.value || ""));
var $x = $("<button type='button' class='dsb-word-mod-chip-remove'>×</button>")
.attr("title", util.msg.removeModifier);
$x.on("click", function (e) {
e.stopPropagation();
mods.splice(index, 1);
onChange();
render();
});
$chip.on("click", function () {
if (def && !mo.flag) {
openValueEditor(def, index);
}
});
$chip.append($x);
$chips.append($chip);
});
$chips.toggle(!!mods.length);
}
var pillsBuilt = false;
$btn.on("click", function (e) {
e.preventDefault();
if (!pillsBuilt) {
pillsBuilt = true;
defs.forEach(function (def) {
var $pill = $("<button type='button' class='dsb-mod-pill'></button>")
.text(def.key).attr("title", label(def)).data("mod-key", def.key);
$pill.on("click", function (ev) {
ev.preventDefault();
if (def.flag) {
mods.push({ key: def.key, flag: true });
$picker.hide();
onChange();
render();
return;
}
openValueEditor(def, -1);
});
$picker.append($pill);
});
}
var used = {};
mods.forEach(function (mo) {
used[mo.key] = true;
});
$picker.children(".dsb-mod-pill").each(function () {
var isUsed = !!used[$(this).data("mod-key")];
$(this).prop("disabled", isUsed).toggleClass("dsb-mod-pill-used", isUsed);
});
$picker.toggle();
});
render();
$wrap.append($chips, $btn, $picker);
return $wrap;
}
function languageInput(value, onChange) {
var $input = $("<input type='text' class='dsb-input dsb-etimon-lang'>")
.attr("list", langs.datalistId())
.attr("placeholder", "koda zimanî…")
.val(value || "");
$input.on("input change", function () {
if (langs.missingFromCore($input.val())) {
langs.ensureFull();
}
onChange($.trim($input.val()));
});
return $input;
}
// The whole form for one call. Structural changes (a step or a word added or dropped) rebuild it from
// the model, which every box writes into as it is typed in.
function buildForm(model, onResize) {
var $element = $("<div class='dsb-etimon'></div>");
var $preview = $("<code class='dsb-etimon-preview'></code>");
function changed() {
$preview.text(buildCall(model));
}
function structureChanged() {
render();
if (onResize) {
onResize();
}
}
function keywordSelect(step) {
var $select = $("<select class='dsb-etimon-keyword'></select>");
$select.append($("<option value=''>— kelîmeya mifteyî —</option>"));
keywords().forEach(function (def) {
$select.append($("<option></option>").val(def.key).text(def.key + " — " + def.desc));
});
// A keyword written under an alias, or one the table does not know, keeps its own option.
var known = defFor(keywords(), step.keyword);
if (step.keyword && (!known || known.key !== step.keyword)) {
$select.append($("<option></option>").val(step.keyword)
.text(step.keyword + (known ? " — " + known.desc : " — (ne di belgeyê de)")));
}
$select.val(step.keyword);
$select.on("change", function () {
step.keyword = $select.val();
changed();
structureChanged(); // the hints under it (how many words, what they mean) follow the keyword
});
$select.attr("data-placeholder", "Kelîmeya mifteyî");
return util.wrapNativeSelect($select);
}
function wordRow(step, word, words, nested) {
var $li = $("<li class='dsb-etimon-word'></li>");
var $row = $("<div class='dsb-etimon-word-row'></div>");
var $lang = languageInput(word.lang, function (value) {
word.lang = value;
changed();
});
var $word = $("<input type='text' class='dsb-input dsb-etimon-word-input'>")
.attr("placeholder", "kelîme ( - ji bo navê zimên bi tenê )")
.val(word.word || "");
$word.on("input", function () {
word.word = $word.val();
changed();
});
var $remove = $("<button type='button' class='dsb-etimon-remove'>×</button>")
.attr("title", "Vê kelîmeyê jê bibe");
$remove.on("click", function () {
words.splice(words.indexOf(word), 1);
if (!words.length && !nested) {
words.push(emptyWord());
}
changed();
structureChanged();
});
$row.append($lang, $word, modifierEditor(word.mods, wordMods(), changed), $remove);
$li.append($row);
// The way on to the next step when the source word's own page carries no {{etîmon}}.
if ((word.steps || []).length) {
var $nested = $("<div class='dsb-etimon-nested'></div>");
$nested.append($("<div class='dsb-etimon-nested-head'></div>").append(
$("<span class='dsb-adv-label'>Etîmolojiya di cih de</span>"),
$("<button type='button' class='dsb-etimon-remove'>×</button>")
.attr("title", "Etîmolojiya di cih de jê bibe")
.on("click", function () {
word.steps = [];
changed();
structureChanged();
})
));
renderSteps($nested, word.steps, true);
$li.append($nested);
} else {
$li.append($("<button type='button' class='dsb-etimon-add'></button>")
.text("+ Etîmolojiya di cih de")
.attr("title", "Zincîrê li vir bidomîne, eger rûpela vê kelîmeyê tune be")
.on("click", function () {
word.steps = [$.extend(emptyStep(), { words: [emptyWord()] })];
changed();
structureChanged();
}));
}
return $li;
}
function stepBlock(steps, step, nested) {
var $block = $("<div class='dsb-etimon-step'></div>");
var $head = $("<div class='dsb-etimon-step-head'></div>");
$head.append(keywordSelect(step));
$head.append(modifierEditor(step.mods, keywordMods(), changed));
if (steps.length > 1 || nested) {
$head.append($("<button type='button' class='dsb-etimon-remove'>×</button>")
.attr("title", "Vê gavê jê bibe")
.on("click", function () {
steps.splice(steps.indexOf(step), 1);
changed();
structureChanged();
}));
}
$block.append($head);
var def = defFor(keywords(), step.keyword);
if (def && def.min > 1) {
$block.append($("<div class='dsb-tpl-help'></div>")
.text("Ev kelîmeya mifteyî bi kêmî " + def.min + " kelîmeyan dixwaze."));
}
if (def && def.invisible) {
$block.append($("<div class='dsb-tpl-help'></div>")
.text("Di metnê de xuya nabe; tenê kategoriyan çêdike."));
}
if (!step.words.length) {
step.words.push(emptyWord());
}
var $words = $("<ul class='dsb-etimon-words'></ul>");
step.words.forEach(function (word) {
$words.append(wordRow(step, word, step.words, nested));
});
$block.append($words);
$block.append($("<button type='button' class='dsb-etimon-add'>+ Kelîme</button>")
.on("click", function () {
step.words.push(emptyWord());
structureChanged();
}));
return $block;
}
function renderSteps($host, steps, nested) {
if (!steps.length) {
steps.push($.extend(emptyStep(), { words: [emptyWord()] }));
}
steps.forEach(function (step) {
$host.append(stepBlock(steps, step, nested));
});
$host.append($("<button type='button' class='dsb-etimon-add'></button>")
.text("+ Gaveke etîmolojiyê")
.attr("title", "Gaveke din a eynî bangkirinê")
.on("click", function () {
steps.push($.extend(emptyStep(), { words: [emptyWord()] }));
structureChanged();
}));
}
// metn= picks how much of the chain is written out; the values that need a number or a language
// code ("3", ":pal") open a box of their own.
function metnControl() {
var $wrap = $("<div class='dsb-etimon-metn'></div>");
var choices = data.metnChoices || [];
var $select = $("<select class='dsb-etimon-metn-select'></select>");
$select.append($("<option value=''>— metn nayê nîşandan —</option>"));
choices.forEach(function (choice) {
$select.append($("<option></option>").val(choice.value).text(choice.value + " — " + choice.desc));
});
var split = splitMetn(model.named.metn);
$select.val(split.choice);
var $free = $("<input type='text' class='dsb-input dsb-etimon-metn-free'>").val(split.rest);
function choiceFor(value) {
var found = null;
choices.forEach(function (choice) {
if (choice.value === value) {
found = choice;
}
});
return found;
}
function apply() {
var choice = choiceFor($select.val());
$free.toggle(!!(choice && choice.free));
if (choice && choice.free) {
$free.attr("placeholder", choice.value === "1" ? "hejmar…" : "koda zimanî…");
}
setNamed(model, "metn", joinMetn($select.val(), $free.val()));
changed();
}
$select.on("change", apply);
$free.on("input", apply);
apply();
$select.attr("data-placeholder", "metn");
$wrap.append($("<span class='dsb-adv-label'>Metn</span>"), util.wrapNativeSelect($select), $free);
return $wrap;
}
function namedParams() {
var $wrap = $("<div class='dsb-etimon-named'></div>");
(data.params || []).forEach(function (param) {
var value = model.named[param.key] || "";
var $row = $("<div class='dsb-etimon-param'></div>");
if (param.type === "flag") {
$row.addClass("dsb-etimon-param-flag");
var id = "dsb-etimon-" + param.key.replace(/[^A-Za-z0-9]/g, "");
var $box = $("<input type='checkbox'>").attr("id", id).prop("checked", value === "1");
$box.on("change", function () {
setNamed(model, param.key, $box.prop("checked") ? "1" : "");
changed();
});
$row.append($box, $("<label class='dsb-adv-label'></label>").attr("for", id)
.text(param.key + " — " + param.desc));
} else {
var $field;
if (param.type === "select") {
$field = $("<select class='dsb-etimon-param-select'></select>");
$field.append($("<option value=''></option>"));
(param.values || []).forEach(function (v) {
$field.append($("<option></option>").val(v).text(v));
});
$field.val(value);
} else {
$field = $("<input type='text' class='dsb-input'>").val(value);
}
$field.on("input change", function () {
setNamed(model, param.key, $.trim(String($field.val() || "")));
changed();
});
$row.append($("<label class='dsb-adv-label'></label>").text(param.key), $field,
$("<div class='dsb-tpl-help'></div>").text(param.desc));
}
$wrap.append($row);
});
return $wrap;
}
function render() {
$element.empty();
$element.append($("<div class='dsb-tpl-name'></div>").append(
$("<a></a>").attr("href", mw.util.getUrl("Şablon:" + NAME))
.attr("target", "_blank").text("{{" + NAME + "}}")
));
var $lang = $("<div class='dsb-etimon-pagelang'></div>");
$lang.append($("<span class='dsb-adv-label'>Zimanê rûpelê</span>"),
languageInput(model.lang, function (value) {
model.lang = value;
changed();
}));
$element.append($lang);
var $steps = $("<div class='dsb-etimon-steps'></div>");
renderSteps($steps, model.steps, false);
$element.append($steps);
$element.append(metnControl());
var $more = $("<details class='dsb-etimon-more'></details>");
$more.append($("<summary>Parametreyên din</summary>"), namedParams());
$more.on("toggle", function () {
if (onResize) {
onResize();
}
});
$element.append($more);
$element.append($("<div class='dsb-etimon-preview-wrap'></div>").append($preview));
changed();
}
render();
return {
$element: $element,
values: function () {
return buildCall(model);
}
};
}
// A call for a page in this language with one empty step, and metn=++ so it actually writes something.
function emptyModel(lang) {
var model = { lang: lang || "", steps: [$.extend(emptyStep(), { words: [emptyWord()] })],
named: {}, namedOrder: [] };
setNamed(model, "metn", "++");
return model;
}
// ---- the dialog --------------------------------------------------------------------------------
var manager = null;
function windowManager() {
if (!manager) {
manager = new OO.ui.WindowManager();
$(document.body).append(manager.$element);
}
return manager;
}
// Opens one {{etîmon}} call in the builder. Resolves with the edited wikitext, "" for "Jê bibe", or
// null when it is cancelled -- the contract cite.openTemplateDialog() has, since it is called in its
// place. One at a time, for the same reason: a second window the manager does not track is dead.
var busy = false;
function openDialog(callWikitext) {
var done = $.Deferred();
if (busy) {
return done.resolve(null).promise();
}
var parsed = parseCall(callWikitext);
if (!parsed) {
return done.resolve(null).promise();
}
var model = parsed.steps.length ? parsed : emptyModel(parsed.lang);
busy = true;
done.always(function () {
busy = false;
});
mw.loader.using(["oojs-ui-core", "oojs-ui-windows"]).then(function () {
var result = null;
var ParentDialog = OO.ui.ProcessDialog;
function EtimonDialog(config) {
ParentDialog.call(this, config);
}
OO.inheritClass(EtimonDialog, ParentDialog);
EtimonDialog.static.name = "etimonDialog";
EtimonDialog.static.title = "{{" + NAME + "}}";
EtimonDialog.static.actions = [
{ action: "save", label: "Biguhêre", flags: ["primary", "progressive"] },
{ action: "remove", label: "Jê bibe", flags: "destructive" },
{ label: util.msg.cancel, flags: "safe" }
];
EtimonDialog.prototype.initialize = function () {
var dialog = this;
ParentDialog.prototype.initialize.apply(this, arguments);
this.panel = new OO.ui.PanelLayout({ padded: true, expanded: false });
this.form = buildForm(model, function () {
dialog.updateSize();
});
this.panel.$element.append(this.form.$element);
this.$body.append(this.panel.$element);
};
EtimonDialog.prototype.getBodyHeight = function () {
return this.panel.$element.outerHeight(true);
};
EtimonDialog.prototype.getActionProcess = function (action) {
var dialog = this;
if (action === "save" || action === "remove") {
return new OO.ui.Process(function () {
result = action === "remove" ? "" : dialog.form.values();
dialog.close();
});
}
return ParentDialog.prototype.getActionProcess.call(this, action);
};
var windows = windowManager();
var dialog = new EtimonDialog({ size: "large" });
windows.addWindows([dialog]);
var instance = windows.openWindow(dialog);
instance.closed.then(function () {
windows.clearWindows();
done.resolve(result);
});
instance.opening.fail(function () {
windows.clearWindows();
done.resolve(null);
});
}, function () {
done.resolve(null);
});
return done.promise();
}
module.exports = {
NAME: NAME,
splitMetn: splitMetn,
joinMetn: joinMetn,
isEtimonName: isEtimonName,
parseCall: parseCall,
buildCall: buildCall,
parseChain: parseChain,
joinChain: joinChain,
openDialog: openDialog
};
}());
// </nowiki>
0f8lhj4opr0t05r0puhkb948jxb4i9w
6532108
6532101
2026-09-18T20:38:17Z
Wikihez
7344
Etymology: show the chosen keyword and metn= value in their searchable boxes
6532108
javascript
text/javascript
// <nowiki>
/*
* Page: [[MediaWiki:Gadget-wikt.cite/etimon.js]]
*
* The builder behind {{etîmon}}: one call is read into steps of "kelîmeya mifteyî + kelîmeyên jêder",
* every source word carrying its own <guherîner>s and, when its page has no etymology of its own, an
* inline <etimon:…> chain of further steps.
*
* Keywords, modifiers, the metn= values and the named parameters all come from the "etimon" block of
* data-main.json, so a new one is added there rather than here. cite.openTemplateDialog() hands every
* {{etîmon}} call to openDialog(), which is what DefSideBoxes and the wizard both call.
*/
(function () {
"use strict";
var edit = require("ext.gadget.wikt.edit");
var util = edit.util;
var langs = edit.langs;
var wt = edit.wt;
var data = edit.data.etimon || {};
var NAME = "etîmon";
// Every name the template answers to: a call written under one of its redirects still opens the builder.
var NAMES = ["etîmon", "etimon", "etymon"];
// <etimon:…> is spelled without "î": modifier names inside <> are ASCII only.
var INLINE_KEYS = ["etimon", "ety"];
function isEtimonName(name) {
return NAMES.indexOf($.trim(name || "").toLowerCase().replace(/^şablon:\s*/i, "")) !== -1;
}
// ---- the tables ---------------------------------------------------------------------------------
function keywords() {
return data.keywords || [];
}
function wordMods() {
return data.wordMods || [];
}
function keywordMods() {
return data.keywordMods || [];
}
// The entry for a key or for one of its documented aliases, so ":inh" is understood as ":mîr".
function defFor(defs, key) {
var found = null;
defs.forEach(function (def) {
if (found) {
return;
}
if (def.key === key || (def.aliases || []).indexOf(key) !== -1) {
found = def;
}
});
return found;
}
function isKeywordModName(key) {
return !!defFor(keywordMods(), key);
}
// ---- reading a call ----------------------------------------------------------------------------
// The ">" closing the "<" at start, skipping the nested ones an <etimon:…> or an <id:…> inside it has.
function matchAngle(text, start) {
var depth = 0;
for (var i = start; i < text.length; i++) {
var ch = text.charAt(i);
if (ch === "<") {
depth++;
} else if (ch === ">") {
depth--;
if (depth === 0) {
return i;
}
}
}
return -1;
}
// Splits on the "|" that separate parameters, and only those: a <ref:{{ş|R:X}}> carries pipes of its own.
function splitParams(text) {
var out = [];
var buf = "";
var braces = 0;
var angles = 0;
for (var i = 0; i < text.length; i++) {
var two = text.substr(i, 2);
if (two === "{{" || two === "}}") {
braces += two === "{{" ? 1 : -1;
buf += two;
i++;
continue;
}
var ch = text.charAt(i);
if (ch === "<") {
angles++;
} else if (ch === ">") {
angles = Math.max(0, angles - 1);
}
if (ch === "|" && braces <= 0 && angles === 0) {
out.push(buf);
buf = "";
continue;
}
buf += ch;
}
out.push(buf);
return out;
}
function parseMod(inner) {
var at = inner.indexOf(":");
if (at === -1) {
return { key: $.trim(inner), flag: true };
}
return { key: $.trim(inner.slice(0, at)), value: inner.slice(at + 1) };
}
// "fa:خانه<tr:xâne><t:mal>" -> { head: "fa:خانه", mods: [...] }
function splitMods(text) {
var head = "";
var mods = [];
var i = 0;
while (i < text.length) {
if (text.charAt(i) === "<") {
var end = matchAngle(text, i);
if (end === -1) {
head += text.slice(i);
break;
}
mods.push(parseMod(text.slice(i + 1, end)));
i = end + 1;
continue;
}
head += text.charAt(i);
i++;
}
return { head: head, mods: mods };
}
function emptyWord() {
return { lang: "", word: "", mods: [], steps: [] };
}
function emptyStep() {
return { keyword: "", mods: [], words: [] };
}
function parseWord(text) {
var split = splitMods($.trim(text));
var word = emptyWord();
var head = split.head;
// A language code, or a language family ("ira:-"); anything else is the word itself.
var m = /^([a-zA-Z][a-zA-Z0-9._-]*):([\s\S]*)$/.exec(head);
if (m) {
word.lang = m[1];
head = m[2];
}
word.word = head;
split.mods.forEach(function (mo) {
if (INLINE_KEYS.indexOf(mo.key) !== -1) {
word.steps = parseChain(mo.value || "");
return;
}
word.mods.push(mo);
});
return word;
}
// The inside of an <etimon:…>: ":kelîmeyeke mifteyî" followed by each source word in its own <…>.
// A group named after a keyword modifier belongs to the keyword, which is how Modul:etymon reads it too.
function parseChain(text) {
var steps = [];
var i = 0;
function current() {
if (!steps.length) {
steps.push(emptyStep());
}
return steps[steps.length - 1];
}
while (i < text.length) {
var ch = text.charAt(i);
if (ch === ":") {
var j = i + 1;
while (j < text.length && text.charAt(j) !== ":" && text.charAt(j) !== "<") {
j++;
}
var step = emptyStep();
step.keyword = $.trim(text.slice(i + 1, j));
steps.push(step);
i = j;
continue;
}
if (ch === "<") {
var end = matchAngle(text, i);
if (end === -1) {
break;
}
var inner = text.slice(i + 1, end);
i = end + 1;
var name = /^([^:>]+)/.exec(inner);
var step2 = current();
if (!step2.words.length && name && isKeywordModName($.trim(name[1]))) {
step2.mods.push(parseMod(inner));
} else {
step2.words.push(parseWord(inner));
}
continue;
}
i++;
}
return steps;
}
// One {{etîmon}} call -> the model the form edits, or null for anything else.
function parseCall(callWikitext) {
var call = wt.parseTemplateCalls(callWikitext || "").calls[0];
if (!call || !isEtimonName(call.name)) {
return null;
}
var model = { lang: "", steps: [], named: {}, namedOrder: [] };
var positional = 0;
splitParams(call.params.join("|")).forEach(function (raw) {
// A name cannot hold "<": that is a modifier, so "fa:x<t:a=b>" stays positional.
var m = /^\s*([^|={}<>\n]+?)\s*=([\s\S]*)$/.exec(raw);
if (m) {
if (model.named[m[1]] === undefined) {
model.namedOrder.push(m[1]);
}
model.named[m[1]] = $.trim(m[2]);
return;
}
positional++;
var value = $.trim(raw);
if (positional === 1) {
model.lang = value;
return;
}
if (value.charAt(0) === ":") {
var split = splitMods(value);
var step = emptyStep();
step.keyword = $.trim(split.head.slice(1));
step.mods = split.mods;
model.steps.push(step);
return;
}
if (!model.steps.length) {
model.steps.push(emptyStep());
}
model.steps[model.steps.length - 1].words.push(parseWord(value));
});
return model;
}
// ---- writing it back ---------------------------------------------------------------------------
function joinMods(mods) {
return (mods || []).map(function (mo) {
return mo.flag ? "<" + mo.key + ">" : "<" + mo.key + ":" + (mo.value || "") + ">";
}).join("");
}
// A row nobody filled in: no word, no language, nothing hanging off it.
function wordIsEmpty(word) {
return !$.trim(word.word || "") && !$.trim(word.lang || "") &&
!(word.mods || []).length && !(word.steps || []).length;
}
function joinWord(word) {
var lang = $.trim(word.lang || "");
var out = (lang ? lang + ":" : "") + $.trim(word.word || "") + joinMods(word.mods);
if ((word.steps || []).length) {
out += "<etimon:" + joinChain(word.steps) + ">";
}
return out;
}
function joinChain(steps) {
return (steps || []).map(function (step) {
return ":" + $.trim(step.keyword || "") + joinMods(step.mods) +
(step.words || []).filter(function (word) {
return !wordIsEmpty(word);
}).map(function (word) {
return "<" + joinWord(word) + ">";
}).join("");
}).join("");
}
function buildCall(model) {
var parts = [NAME, $.trim(model.lang || "")];
(model.steps || []).forEach(function (step) {
var keyword = $.trim(step.keyword || "");
if (keyword || (step.mods || []).length) {
parts.push(":" + keyword + joinMods(step.mods));
}
(step.words || []).forEach(function (word) {
if (!wordIsEmpty(word)) {
parts.push(joinWord(word));
}
});
});
(model.namedOrder || []).forEach(function (key) {
var value = model.named[key];
if (value !== undefined && value !== null && value !== "") {
parts.push(key + "=" + value);
}
});
return "{{" + parts.join("|") + "}}";
}
// Which metn= choice a written value belongs to, and what is left over for that choice's own box:
// "3" belongs to the number choice, ":pal*" to the ":kod*" one.
function splitMetn(value) {
var current = $.trim(value || "");
var out = { choice: "", rest: "" };
if (!current) {
return out;
}
(data.metnChoices || []).forEach(function (choice) {
if (out.choice) {
return;
}
if (!choice.free) {
if (choice.value === current) {
out.choice = choice.value;
}
return;
}
if (choice.value === "1" && /^\d+$/.test(current)) {
out.choice = choice.value;
out.rest = current;
} else if (choice.value === ":*" && /^:.+\*$/.test(current)) {
out.choice = choice.value;
out.rest = current.slice(1, -1);
} else if (choice.value === ":" && /^:[^*]+$/.test(current)) {
out.choice = choice.value;
out.rest = current.slice(1);
}
});
return out;
}
// The inverse: what the dropdown and its box together mean as a metn= value.
function joinMetn(choiceValue, rest) {
var choice = null;
(data.metnChoices || []).forEach(function (c) {
if (c.value === choiceValue) {
choice = c;
}
});
if (!choice) {
return "";
}
if (!choice.free) {
return choice.value;
}
var typed = $.trim(rest || "");
if (!typed) {
return "";
}
if (choice.value === "1") {
return typed;
}
return ":" + typed + (choice.value === ":*" ? "*" : "");
}
function setNamed(model, key, value) {
if (model.namedOrder.indexOf(key) === -1) {
model.namedOrder.push(key);
}
model.named[key] = value;
}
// ---- the form ----------------------------------------------------------------------------------
// Chips for one list of modifiers, plus the ⊕ that adds another. The pills, the value box and the
// chips are the same widgetry a sense word row uses, so they look and behave the same here.
function modifierEditor(mods, defs, onChange) {
var $wrap = $("<div class='dsb-etimon-mods'></div>");
var $chips = $("<div class='dsb-word-mods'></div>");
var $btn = $("<button type='button' class='dsb-mod-btn'>⊕</button>")
.attr("title", util.msg.addModifier);
var $picker = $("<div class='dsb-mod-picker'></div>").hide();
function label(def) {
return def ? def.key + " — " + def.desc : "";
}
// Same box for adding and for editing: a modifier with a fixed set of values gets a dropdown.
function openValueEditor(def, index) {
$picker.hide();
$wrap.children(".dsb-mod-val-wrap").remove();
var $box = $("<div class='dsb-mod-val-wrap'></div>");
var $label = $("<span class='dsb-mod-val-label'></span>").text(def.key);
var current = index === -1 ? "" : (mods[index].value || "");
var $field;
if ((def.values || []).length) {
$field = $("<select class='dsb-mod-val-input'></select>");
$field.append($("<option value=''></option>"));
def.values.forEach(function (value) {
$field.append($("<option></option>").val(value).text(value));
});
$field.val(current);
} else {
$field = $("<input type='text' class='dsb-mod-val-input'>")
.attr("size", 24).attr("placeholder", def.desc).val(current);
}
var $ok = $("<button type='button' class='dsb-mod-confirm'>✓</button>");
var $no = $("<button type='button' class='dsb-mod-cancel'>✕</button>");
function apply() {
var value = $.trim(String($field.val() || ""));
if (value) {
if (index === -1) {
mods.push({ key: def.key, value: value });
} else {
mods[index].value = value;
}
onChange();
render();
}
$box.remove();
}
$ok.on("click", apply);
$no.on("click", function () {
$box.remove();
});
$field.on("keydown", function (e) {
if (e.which === 13) {
e.preventDefault();
apply();
}
if (e.which === 27) {
$box.remove();
}
});
$box.append($label, $field, $ok, $no);
$wrap.append($box);
$field.focus();
}
function render() {
$chips.empty();
mods.forEach(function (mo, index) {
var def = defFor(defs, mo.key);
var $chip = $("<span class='dsb-word-mod-chip' role='button' tabindex='0'></span>")
.attr("title", def ? def.desc : mo.key)
.text(mo.flag ? mo.key : mo.key + ": " + (mo.value || ""));
var $x = $("<button type='button' class='dsb-word-mod-chip-remove'>×</button>")
.attr("title", util.msg.removeModifier);
$x.on("click", function (e) {
e.stopPropagation();
mods.splice(index, 1);
onChange();
render();
});
$chip.on("click", function () {
if (def && !mo.flag) {
openValueEditor(def, index);
}
});
$chip.append($x);
$chips.append($chip);
});
$chips.toggle(!!mods.length);
}
var pillsBuilt = false;
$btn.on("click", function (e) {
e.preventDefault();
if (!pillsBuilt) {
pillsBuilt = true;
defs.forEach(function (def) {
var $pill = $("<button type='button' class='dsb-mod-pill'></button>")
.text(def.key).attr("title", label(def)).data("mod-key", def.key);
$pill.on("click", function (ev) {
ev.preventDefault();
if (def.flag) {
mods.push({ key: def.key, flag: true });
$picker.hide();
onChange();
render();
return;
}
openValueEditor(def, -1);
});
$picker.append($pill);
});
}
var used = {};
mods.forEach(function (mo) {
used[mo.key] = true;
});
$picker.children(".dsb-mod-pill").each(function () {
var isUsed = !!used[$(this).data("mod-key")];
$(this).prop("disabled", isUsed).toggleClass("dsb-mod-pill-used", isUsed);
});
$picker.toggle();
});
render();
$wrap.append($chips, $btn, $picker);
return $wrap;
}
function languageInput(value, onChange) {
var $input = $("<input type='text' class='dsb-input dsb-etimon-lang'>")
.attr("list", langs.datalistId())
.attr("placeholder", "koda zimanî…")
.val(value || "");
$input.on("input change", function () {
if (langs.missingFromCore($input.val())) {
langs.ensureFull();
}
onChange($.trim($input.val()));
});
return $input;
}
// The whole form for one call. Structural changes (a step or a word added or dropped) rebuild it from
// the model, which every box writes into as it is typed in.
function buildForm(model, onResize) {
var $element = $("<div class='dsb-etimon'></div>");
var $preview = $("<code class='dsb-etimon-preview'></code>");
function changed() {
$preview.text(buildCall(model));
}
function structureChanged() {
render();
if (onResize) {
onResize();
}
}
function keywordSelect(step) {
var $select = $("<select class='dsb-etimon-keyword'></select>");
$select.append($("<option value=''>— kelîmeya mifteyî —</option>"));
keywords().forEach(function (def) {
$select.append($("<option></option>").val(def.key).text(def.key + " — " + def.desc));
});
// A keyword written under an alias, or one the table does not know, keeps its own option.
var known = defFor(keywords(), step.keyword);
if (step.keyword && (!known || known.key !== step.keyword)) {
$select.append($("<option></option>").val(step.keyword)
.text(step.keyword + (known ? " — " + known.desc : " — (ne di belgeyê de)")));
}
$select.val(step.keyword);
$select.on("change", function () {
step.keyword = $select.val();
changed();
structureChanged(); // the hints under it (how many words, what they mean) follow the keyword
});
$select.attr("data-placeholder", "Kelîmeya mifteyî");
var $wrapped = util.wrapNativeSelect($select);
// The searchable box reads the selection only when told to, so a keyword already chosen shows.
$select.trigger("wiktku:refresh");
return $wrapped;
}
function wordRow(step, word, words, nested) {
var $li = $("<li class='dsb-etimon-word'></li>");
var $row = $("<div class='dsb-etimon-word-row'></div>");
var $lang = languageInput(word.lang, function (value) {
word.lang = value;
changed();
});
var $word = $("<input type='text' class='dsb-input dsb-etimon-word-input'>")
.attr("placeholder", "kelîme ( - = tenê navê zimên )")
.val(word.word || "");
$word.on("input", function () {
word.word = $word.val();
changed();
});
var $remove = $("<button type='button' class='dsb-etimon-remove'>×</button>")
.attr("title", "Vê kelîmeyê jê bibe");
$remove.on("click", function () {
words.splice(words.indexOf(word), 1);
if (!words.length && !nested) {
words.push(emptyWord());
}
changed();
structureChanged();
});
$row.append($lang, $word, modifierEditor(word.mods, wordMods(), changed), $remove);
$li.append($row);
// The way on to the next step when the source word's own page carries no {{etîmon}}.
if ((word.steps || []).length) {
var $nested = $("<div class='dsb-etimon-nested'></div>");
$nested.append($("<div class='dsb-etimon-nested-head'></div>").append(
$("<span class='dsb-adv-label'>Etîmolojiya di cih de</span>"),
$("<button type='button' class='dsb-etimon-remove'>×</button>")
.attr("title", "Etîmolojiya di cih de jê bibe")
.on("click", function () {
word.steps = [];
changed();
structureChanged();
})
));
renderSteps($nested, word.steps, true);
$li.append($nested);
} else {
$li.append($("<button type='button' class='dsb-etimon-add'></button>")
.text("+ Etîmolojiya di cih de")
.attr("title", "Zincîrê li vir bidomîne, eger rûpela vê kelîmeyê tune be")
.on("click", function () {
word.steps = [$.extend(emptyStep(), { words: [emptyWord()] })];
changed();
structureChanged();
}));
}
return $li;
}
function stepBlock(steps, step, nested) {
var $block = $("<div class='dsb-etimon-step'></div>");
var $head = $("<div class='dsb-etimon-step-head'></div>");
$head.append(keywordSelect(step));
$head.append(modifierEditor(step.mods, keywordMods(), changed));
if (steps.length > 1 || nested) {
$head.append($("<button type='button' class='dsb-etimon-remove'>×</button>")
.attr("title", "Vê gavê jê bibe")
.on("click", function () {
steps.splice(steps.indexOf(step), 1);
changed();
structureChanged();
}));
}
$block.append($head);
var def = defFor(keywords(), step.keyword);
if (def && def.min > 1) {
$block.append($("<div class='dsb-tpl-help'></div>")
.text("Ev kelîmeya mifteyî bi kêmî " + def.min + " kelîmeyan dixwaze."));
}
if (def && def.invisible) {
$block.append($("<div class='dsb-tpl-help'></div>")
.text("Di metnê de xuya nabe; tenê kategoriyan çêdike."));
}
if (!step.words.length) {
step.words.push(emptyWord());
}
var $words = $("<ul class='dsb-etimon-words'></ul>");
step.words.forEach(function (word) {
$words.append(wordRow(step, word, step.words, nested));
});
$block.append($words);
$block.append($("<button type='button' class='dsb-etimon-add'>+ Kelîme</button>")
.on("click", function () {
step.words.push(emptyWord());
structureChanged();
}));
return $block;
}
function renderSteps($host, steps, nested) {
if (!steps.length) {
steps.push($.extend(emptyStep(), { words: [emptyWord()] }));
}
steps.forEach(function (step) {
$host.append(stepBlock(steps, step, nested));
});
$host.append($("<button type='button' class='dsb-etimon-add'></button>")
.text("+ Gaveke etîmolojiyê")
.attr("title", "Gaveke din a eynî bangkirinê")
.on("click", function () {
steps.push($.extend(emptyStep(), { words: [emptyWord()] }));
structureChanged();
}));
}
// metn= picks how much of the chain is written out; the values that need a number or a language
// code ("3", ":pal") open a box of their own.
function metnControl() {
var $wrap = $("<div class='dsb-etimon-metn'></div>");
var choices = data.metnChoices || [];
var $select = $("<select class='dsb-etimon-metn-select'></select>");
$select.append($("<option value=''>— metn nayê nîşandan —</option>"));
choices.forEach(function (choice) {
$select.append($("<option></option>").val(choice.value).text(choice.value + " — " + choice.desc));
});
var split = splitMetn(model.named.metn);
$select.val(split.choice);
var $free = $("<input type='text' class='dsb-input dsb-etimon-metn-free'>").val(split.rest);
function choiceFor(value) {
var found = null;
choices.forEach(function (choice) {
if (choice.value === value) {
found = choice;
}
});
return found;
}
function apply() {
var choice = choiceFor($select.val());
$free.toggle(!!(choice && choice.free));
if (choice && choice.free) {
$free.attr("placeholder", choice.value === "1" ? "hejmar…" : "koda zimanî…");
}
setNamed(model, "metn", joinMetn($select.val(), $free.val()));
changed();
}
$select.on("change", apply);
$free.on("input", apply);
apply();
$select.attr("data-placeholder", "metn");
$wrap.append($("<span class='dsb-adv-label'>Metn</span>"), util.wrapNativeSelect($select), $free);
$select.trigger("wiktku:refresh");
return $wrap;
}
function namedParams() {
var $wrap = $("<div class='dsb-etimon-named'></div>");
(data.params || []).forEach(function (param) {
var value = model.named[param.key] || "";
var $row = $("<div class='dsb-etimon-param'></div>");
if (param.type === "flag") {
$row.addClass("dsb-etimon-param-flag");
var id = "dsb-etimon-" + param.key.replace(/[^A-Za-z0-9]/g, "");
var $box = $("<input type='checkbox'>").attr("id", id).prop("checked", value === "1");
$box.on("change", function () {
setNamed(model, param.key, $box.prop("checked") ? "1" : "");
changed();
});
$row.append($box, $("<label class='dsb-adv-label'></label>").attr("for", id)
.text(param.key + " — " + param.desc));
} else {
var $field;
if (param.type === "select") {
$field = $("<select class='dsb-etimon-param-select'></select>");
$field.append($("<option value=''></option>"));
(param.values || []).forEach(function (v) {
$field.append($("<option></option>").val(v).text(v));
});
$field.val(value);
} else {
$field = $("<input type='text' class='dsb-input'>").val(value);
}
$field.on("input change", function () {
setNamed(model, param.key, $.trim(String($field.val() || "")));
changed();
});
$row.append($("<label class='dsb-adv-label'></label>").text(param.key), $field,
$("<div class='dsb-tpl-help'></div>").text(param.desc));
}
$wrap.append($row);
});
return $wrap;
}
function render() {
$element.empty();
$element.append($("<div class='dsb-tpl-name'></div>").append(
$("<a></a>").attr("href", mw.util.getUrl("Şablon:" + NAME))
.attr("target", "_blank").text("{{" + NAME + "}}")
));
var $lang = $("<div class='dsb-etimon-pagelang'></div>");
$lang.append($("<span class='dsb-adv-label'>Zimanê rûpelê</span>"),
languageInput(model.lang, function (value) {
model.lang = value;
changed();
}));
$element.append($lang);
var $steps = $("<div class='dsb-etimon-steps'></div>");
renderSteps($steps, model.steps, false);
$element.append($steps);
$element.append(metnControl());
var $more = $("<details class='dsb-etimon-more'></details>");
$more.append($("<summary>Parametreyên din</summary>"), namedParams());
$more.on("toggle", function () {
if (onResize) {
onResize();
}
});
$element.append($more);
$element.append($("<div class='dsb-etimon-preview-wrap'></div>").append($preview));
changed();
}
render();
return {
$element: $element,
values: function () {
return buildCall(model);
}
};
}
// A call for a page in this language with one empty step, and metn=++ so it actually writes something.
function emptyModel(lang) {
var model = { lang: lang || "", steps: [$.extend(emptyStep(), { words: [emptyWord()] })],
named: {}, namedOrder: [] };
setNamed(model, "metn", "++");
return model;
}
// ---- the dialog --------------------------------------------------------------------------------
var manager = null;
function windowManager() {
if (!manager) {
manager = new OO.ui.WindowManager();
$(document.body).append(manager.$element);
}
return manager;
}
// Opens one {{etîmon}} call in the builder. Resolves with the edited wikitext, "" for "Jê bibe", or
// null when it is cancelled -- the contract cite.openTemplateDialog() has, since it is called in its
// place. One at a time, for the same reason: a second window the manager does not track is dead.
var busy = false;
function openDialog(callWikitext) {
var done = $.Deferred();
if (busy) {
return done.resolve(null).promise();
}
var parsed = parseCall(callWikitext);
if (!parsed) {
return done.resolve(null).promise();
}
var model = parsed.steps.length ? parsed : emptyModel(parsed.lang);
busy = true;
done.always(function () {
busy = false;
});
mw.loader.using(["oojs-ui-core", "oojs-ui-windows"]).then(function () {
var result = null;
var ParentDialog = OO.ui.ProcessDialog;
function EtimonDialog(config) {
ParentDialog.call(this, config);
}
OO.inheritClass(EtimonDialog, ParentDialog);
EtimonDialog.static.name = "etimonDialog";
EtimonDialog.static.title = "{{" + NAME + "}}";
EtimonDialog.static.actions = [
{ action: "save", label: "Biguhêre", flags: ["primary", "progressive"] },
{ action: "remove", label: "Jê bibe", flags: "destructive" },
{ label: util.msg.cancel, flags: "safe" }
];
EtimonDialog.prototype.initialize = function () {
var dialog = this;
ParentDialog.prototype.initialize.apply(this, arguments);
this.panel = new OO.ui.PanelLayout({ padded: true, expanded: false });
this.form = buildForm(model, function () {
dialog.updateSize();
});
this.panel.$element.append(this.form.$element);
this.$body.append(this.panel.$element);
};
EtimonDialog.prototype.getBodyHeight = function () {
return this.panel.$element.outerHeight(true);
};
EtimonDialog.prototype.getActionProcess = function (action) {
var dialog = this;
if (action === "save" || action === "remove") {
return new OO.ui.Process(function () {
result = action === "remove" ? "" : dialog.form.values();
dialog.close();
});
}
return ParentDialog.prototype.getActionProcess.call(this, action);
};
var windows = windowManager();
var dialog = new EtimonDialog({ size: "large" });
windows.addWindows([dialog]);
var instance = windows.openWindow(dialog);
instance.closed.then(function () {
windows.clearWindows();
done.resolve(result);
});
instance.opening.fail(function () {
windows.clearWindows();
done.resolve(null);
});
}, function () {
done.resolve(null);
});
return done.promise();
}
module.exports = {
NAME: NAME,
splitMetn: splitMetn,
joinMetn: joinMetn,
isEtimonName: isEtimonName,
parseCall: parseCall,
buildCall: buildCall,
parseChain: parseChain,
joinChain: joinChain,
openDialog: openDialog
};
}());
// </nowiki>
ridgq5fwslkolcur42tesqz99r7vcvu
6532113
6532108
2026-09-18T20:45:26Z
Wikihez
7344
Etymology: offer a modifier only under the keywords it applies to
6532113
javascript
text/javascript
// <nowiki>
/*
* Page: [[MediaWiki:Gadget-wikt.cite/etimon.js]]
*
* The builder behind {{etîmon}}: one call is read into steps of "kelîmeya mifteyî + kelîmeyên jêder",
* every source word carrying its own <guherîner>s and, when its page has no etymology of its own, an
* inline <etimon:…> chain of further steps.
*
* Keywords, modifiers, the metn= values and the named parameters all come from the "etimon" block of
* data-main.json, so a new one is added there rather than here. cite.openTemplateDialog() hands every
* {{etîmon}} call to openDialog(), which is what DefSideBoxes and the wizard both call.
*/
(function () {
"use strict";
var edit = require("ext.gadget.wikt.edit");
var util = edit.util;
var langs = edit.langs;
var wt = edit.wt;
var data = edit.data.etimon || {};
var NAME = "etîmon";
// Every name the template answers to: a call written under one of its redirects still opens the builder.
var NAMES = ["etîmon", "etimon", "etymon"];
// <etimon:…> is spelled without "î": modifier names inside <> are ASCII only.
var INLINE_KEYS = ["etimon", "ety"];
function isEtimonName(name) {
return NAMES.indexOf($.trim(name || "").toLowerCase().replace(/^şablon:\s*/i, "")) !== -1;
}
// ---- the tables ---------------------------------------------------------------------------------
function keywords() {
return data.keywords || [];
}
function wordMods() {
return data.wordMods || [];
}
function keywordMods() {
return data.keywordMods || [];
}
// The entry for a key or for one of its documented aliases, so ":inh" is understood as ":mîr".
function defFor(defs, key) {
var found = null;
defs.forEach(function (def) {
if (found) {
return;
}
if (def.key === key || (def.aliases || []).indexOf(key) !== -1) {
found = def;
}
});
return found;
}
function isKeywordModName(key) {
return !!defFor(keywordMods(), key);
}
// ---- reading a call ----------------------------------------------------------------------------
// The ">" closing the "<" at start, skipping the nested ones an <etimon:…> or an <id:…> inside it has.
function matchAngle(text, start) {
var depth = 0;
for (var i = start; i < text.length; i++) {
var ch = text.charAt(i);
if (ch === "<") {
depth++;
} else if (ch === ">") {
depth--;
if (depth === 0) {
return i;
}
}
}
return -1;
}
// Splits on the "|" that separate parameters, and only those: a <ref:{{ş|R:X}}> carries pipes of its own.
function splitParams(text) {
var out = [];
var buf = "";
var braces = 0;
var angles = 0;
for (var i = 0; i < text.length; i++) {
var two = text.substr(i, 2);
if (two === "{{" || two === "}}") {
braces += two === "{{" ? 1 : -1;
buf += two;
i++;
continue;
}
var ch = text.charAt(i);
if (ch === "<") {
angles++;
} else if (ch === ">") {
angles = Math.max(0, angles - 1);
}
if (ch === "|" && braces <= 0 && angles === 0) {
out.push(buf);
buf = "";
continue;
}
buf += ch;
}
out.push(buf);
return out;
}
function parseMod(inner) {
var at = inner.indexOf(":");
if (at === -1) {
return { key: $.trim(inner), flag: true };
}
return { key: $.trim(inner.slice(0, at)), value: inner.slice(at + 1) };
}
// "fa:خانه<tr:xâne><t:mal>" -> { head: "fa:خانه", mods: [...] }
function splitMods(text) {
var head = "";
var mods = [];
var i = 0;
while (i < text.length) {
if (text.charAt(i) === "<") {
var end = matchAngle(text, i);
if (end === -1) {
head += text.slice(i);
break;
}
mods.push(parseMod(text.slice(i + 1, end)));
i = end + 1;
continue;
}
head += text.charAt(i);
i++;
}
return { head: head, mods: mods };
}
function emptyWord() {
return { lang: "", word: "", mods: [], steps: [] };
}
function emptyStep() {
return { keyword: "", mods: [], words: [] };
}
function parseWord(text) {
var split = splitMods($.trim(text));
var word = emptyWord();
var head = split.head;
// A language code, or a language family ("ira:-"); anything else is the word itself.
var m = /^([a-zA-Z][a-zA-Z0-9._-]*):([\s\S]*)$/.exec(head);
if (m) {
word.lang = m[1];
head = m[2];
}
word.word = head;
split.mods.forEach(function (mo) {
if (INLINE_KEYS.indexOf(mo.key) !== -1) {
word.steps = parseChain(mo.value || "");
return;
}
word.mods.push(mo);
});
return word;
}
// The inside of an <etimon:…>: ":kelîmeyeke mifteyî" followed by each source word in its own <…>.
// A group named after a keyword modifier belongs to the keyword, which is how Modul:etymon reads it too.
function parseChain(text) {
var steps = [];
var i = 0;
function current() {
if (!steps.length) {
steps.push(emptyStep());
}
return steps[steps.length - 1];
}
while (i < text.length) {
var ch = text.charAt(i);
if (ch === ":") {
var j = i + 1;
while (j < text.length && text.charAt(j) !== ":" && text.charAt(j) !== "<") {
j++;
}
var step = emptyStep();
step.keyword = $.trim(text.slice(i + 1, j));
steps.push(step);
i = j;
continue;
}
if (ch === "<") {
var end = matchAngle(text, i);
if (end === -1) {
break;
}
var inner = text.slice(i + 1, end);
i = end + 1;
var name = /^([^:>]+)/.exec(inner);
var step2 = current();
if (!step2.words.length && name && isKeywordModName($.trim(name[1]))) {
step2.mods.push(parseMod(inner));
} else {
step2.words.push(parseWord(inner));
}
continue;
}
i++;
}
return steps;
}
// One {{etîmon}} call -> the model the form edits, or null for anything else.
function parseCall(callWikitext) {
var call = wt.parseTemplateCalls(callWikitext || "").calls[0];
if (!call || !isEtimonName(call.name)) {
return null;
}
var model = { lang: "", steps: [], named: {}, namedOrder: [] };
var positional = 0;
splitParams(call.params.join("|")).forEach(function (raw) {
// A name cannot hold "<": that is a modifier, so "fa:x<t:a=b>" stays positional.
var m = /^\s*([^|={}<>\n]+?)\s*=([\s\S]*)$/.exec(raw);
if (m) {
if (model.named[m[1]] === undefined) {
model.namedOrder.push(m[1]);
}
model.named[m[1]] = $.trim(m[2]);
return;
}
positional++;
var value = $.trim(raw);
if (positional === 1) {
model.lang = value;
return;
}
if (value.charAt(0) === ":") {
var split = splitMods(value);
var step = emptyStep();
step.keyword = $.trim(split.head.slice(1));
step.mods = split.mods;
model.steps.push(step);
return;
}
if (!model.steps.length) {
model.steps.push(emptyStep());
}
model.steps[model.steps.length - 1].words.push(parseWord(value));
});
return model;
}
// ---- writing it back ---------------------------------------------------------------------------
function joinMods(mods) {
return (mods || []).map(function (mo) {
return mo.flag ? "<" + mo.key + ">" : "<" + mo.key + ":" + (mo.value || "") + ">";
}).join("");
}
// A row nobody filled in: no word, no language, nothing hanging off it.
function wordIsEmpty(word) {
return !$.trim(word.word || "") && !$.trim(word.lang || "") &&
!(word.mods || []).length && !(word.steps || []).length;
}
function joinWord(word) {
var lang = $.trim(word.lang || "");
var out = (lang ? lang + ":" : "") + $.trim(word.word || "") + joinMods(word.mods);
if ((word.steps || []).length) {
out += "<etimon:" + joinChain(word.steps) + ">";
}
return out;
}
function joinChain(steps) {
return (steps || []).map(function (step) {
return ":" + $.trim(step.keyword || "") + joinMods(step.mods) +
(step.words || []).filter(function (word) {
return !wordIsEmpty(word);
}).map(function (word) {
return "<" + joinWord(word) + ">";
}).join("");
}).join("");
}
function buildCall(model) {
var parts = [NAME, $.trim(model.lang || "")];
(model.steps || []).forEach(function (step) {
var keyword = $.trim(step.keyword || "");
if (keyword || (step.mods || []).length) {
parts.push(":" + keyword + joinMods(step.mods));
}
(step.words || []).forEach(function (word) {
if (!wordIsEmpty(word)) {
parts.push(joinWord(word));
}
});
});
(model.namedOrder || []).forEach(function (key) {
var value = model.named[key];
if (value !== undefined && value !== null && value !== "") {
parts.push(key + "=" + value);
}
});
return "{{" + parts.join("|") + "}}";
}
// Which metn= choice a written value belongs to, and what is left over for that choice's own box:
// "3" belongs to the number choice, ":pal*" to the ":kod*" one.
function splitMetn(value) {
var current = $.trim(value || "");
var out = { choice: "", rest: "" };
if (!current) {
return out;
}
(data.metnChoices || []).forEach(function (choice) {
if (out.choice) {
return;
}
if (!choice.free) {
if (choice.value === current) {
out.choice = choice.value;
}
return;
}
if (choice.value === "1" && /^\d+$/.test(current)) {
out.choice = choice.value;
out.rest = current;
} else if (choice.value === ":*" && /^:.+\*$/.test(current)) {
out.choice = choice.value;
out.rest = current.slice(1, -1);
} else if (choice.value === ":" && /^:[^*]+$/.test(current)) {
out.choice = choice.value;
out.rest = current.slice(1);
}
});
return out;
}
// The inverse: what the dropdown and its box together mean as a metn= value.
function joinMetn(choiceValue, rest) {
var choice = null;
(data.metnChoices || []).forEach(function (c) {
if (c.value === choiceValue) {
choice = c;
}
});
if (!choice) {
return "";
}
if (!choice.free) {
return choice.value;
}
var typed = $.trim(rest || "");
if (!typed) {
return "";
}
if (choice.value === "1") {
return typed;
}
return ":" + typed + (choice.value === ":*" ? "*" : "");
}
function setNamed(model, key, value) {
if (model.namedOrder.indexOf(key) === -1) {
model.namedOrder.push(key);
}
model.named[key] = value;
}
// ---- the form ----------------------------------------------------------------------------------
// Chips for one list of modifiers, plus the ⊕ that adds another. The pills, the value box and the
// chips are the same widgetry a sense word row uses, so they look and behave the same here.
// Whether a modifier applies under the keyword it is being offered for: an "only" list in the data
// (aftype under :qf, maneid under :wergirtin) keeps it off every other keyword's picker.
function modApplies(def, keyword) {
if (!(def.only || []).length) {
return true;
}
var canonical = defFor(keywords(), keyword);
return def.only.indexOf(canonical ? canonical.key : keyword) !== -1;
}
function modifierEditor(mods, defs, onChange, keywordOf) {
var $wrap = $("<div class='dsb-etimon-mods'></div>");
var $chips = $("<div class='dsb-word-mods'></div>");
var $btn = $("<button type='button' class='dsb-mod-btn'>⊕</button>")
.attr("title", util.msg.addModifier);
var $picker = $("<div class='dsb-mod-picker'></div>").hide();
function label(def) {
return def ? def.key + " — " + def.desc : "";
}
// Same box for adding and for editing: a modifier with a fixed set of values gets a dropdown.
function openValueEditor(def, index) {
$picker.hide();
$wrap.children(".dsb-mod-val-wrap").remove();
var $box = $("<div class='dsb-mod-val-wrap'></div>");
var $label = $("<span class='dsb-mod-val-label'></span>").text(def.key);
var current = index === -1 ? "" : (mods[index].value || "");
var $field;
if ((def.values || []).length) {
$field = $("<select class='dsb-mod-val-input'></select>");
$field.append($("<option value=''></option>"));
def.values.forEach(function (value) {
$field.append($("<option></option>").val(value).text(value));
});
$field.val(current);
} else {
$field = $("<input type='text' class='dsb-mod-val-input'>")
.attr("size", 24).attr("placeholder", def.desc).val(current);
}
var $ok = $("<button type='button' class='dsb-mod-confirm'>✓</button>");
var $no = $("<button type='button' class='dsb-mod-cancel'>✕</button>");
function apply() {
var value = $.trim(String($field.val() || ""));
if (value) {
if (index === -1) {
mods.push({ key: def.key, value: value });
} else {
mods[index].value = value;
}
onChange();
render();
}
$box.remove();
}
$ok.on("click", apply);
$no.on("click", function () {
$box.remove();
});
$field.on("keydown", function (e) {
if (e.which === 13) {
e.preventDefault();
apply();
}
if (e.which === 27) {
$box.remove();
}
});
$box.append($label, $field, $ok, $no);
$wrap.append($box);
$field.focus();
}
function render() {
$chips.empty();
mods.forEach(function (mo, index) {
var def = defFor(defs, mo.key);
var $chip = $("<span class='dsb-word-mod-chip' role='button' tabindex='0'></span>")
.attr("title", def ? def.desc : mo.key)
.text(mo.flag ? mo.key : mo.key + ": " + (mo.value || ""));
var $x = $("<button type='button' class='dsb-word-mod-chip-remove'>×</button>")
.attr("title", util.msg.removeModifier);
$x.on("click", function (e) {
e.stopPropagation();
mods.splice(index, 1);
onChange();
render();
});
$chip.on("click", function () {
if (def && !mo.flag) {
openValueEditor(def, index);
}
});
$chip.append($x);
$chips.append($chip);
});
$chips.toggle(!!mods.length);
}
// Rebuilt per open rather than once: the keyword can change while the row is on screen, and with
// it which modifiers are on offer.
$btn.on("click", function (e) {
e.preventDefault();
var keyword = keywordOf ? keywordOf() : "";
$picker.empty();
defs.forEach(function (def) {
if (!modApplies(def, keyword)) {
return;
}
var $pill = $("<button type='button' class='dsb-mod-pill'></button>")
.text(def.key).attr("title", label(def)).data("mod-key", def.key);
$pill.on("click", function (ev) {
ev.preventDefault();
if (def.flag) {
mods.push({ key: def.key, flag: true });
$picker.hide();
onChange();
render();
return;
}
openValueEditor(def, -1);
});
$picker.append($pill);
});
var used = {};
mods.forEach(function (mo) {
used[mo.key] = true;
});
$picker.children(".dsb-mod-pill").each(function () {
var isUsed = !!used[$(this).data("mod-key")];
$(this).prop("disabled", isUsed).toggleClass("dsb-mod-pill-used", isUsed);
});
$picker.toggle();
});
render();
$wrap.append($chips, $btn, $picker);
return $wrap;
}
function languageInput(value, onChange) {
var $input = $("<input type='text' class='dsb-input dsb-etimon-lang'>")
.attr("list", langs.datalistId())
.attr("placeholder", "koda zimanî…")
.val(value || "");
$input.on("input change", function () {
if (langs.missingFromCore($input.val())) {
langs.ensureFull();
}
onChange($.trim($input.val()));
});
return $input;
}
// The whole form for one call. Structural changes (a step or a word added or dropped) rebuild it from
// the model, which every box writes into as it is typed in.
function buildForm(model, onResize) {
var $element = $("<div class='dsb-etimon'></div>");
var $preview = $("<code class='dsb-etimon-preview'></code>");
function changed() {
$preview.text(buildCall(model));
}
function structureChanged() {
render();
if (onResize) {
onResize();
}
}
function keywordSelect(step) {
var $select = $("<select class='dsb-etimon-keyword'></select>");
$select.append($("<option value=''>— kelîmeya mifteyî —</option>"));
keywords().forEach(function (def) {
$select.append($("<option></option>").val(def.key).text(def.key + " — " + def.desc));
});
// A keyword written under an alias, or one the table does not know, keeps its own option.
var known = defFor(keywords(), step.keyword);
if (step.keyword && (!known || known.key !== step.keyword)) {
$select.append($("<option></option>").val(step.keyword)
.text(step.keyword + (known ? " — " + known.desc : " — (ne di belgeyê de)")));
}
$select.val(step.keyword);
$select.on("change", function () {
step.keyword = $select.val();
changed();
structureChanged(); // the hints under it (how many words, what they mean) follow the keyword
});
$select.attr("data-placeholder", "Kelîmeya mifteyî");
var $wrapped = util.wrapNativeSelect($select);
// The searchable box reads the selection only when told to, so a keyword already chosen shows.
$select.trigger("wiktku:refresh");
return $wrapped;
}
function wordRow(step, word, words, nested) {
var $li = $("<li class='dsb-etimon-word'></li>");
var $row = $("<div class='dsb-etimon-word-row'></div>");
var $lang = languageInput(word.lang, function (value) {
word.lang = value;
changed();
});
var $word = $("<input type='text' class='dsb-input dsb-etimon-word-input'>")
.attr("placeholder", "kelîme ( - = tenê navê zimên )")
.val(word.word || "");
$word.on("input", function () {
word.word = $word.val();
changed();
});
var $remove = $("<button type='button' class='dsb-etimon-remove'>×</button>")
.attr("title", "Vê kelîmeyê jê bibe");
$remove.on("click", function () {
words.splice(words.indexOf(word), 1);
if (!words.length && !nested) {
words.push(emptyWord());
}
changed();
structureChanged();
});
$row.append($lang, $word, modifierEditor(word.mods, wordMods(), changed, function () {
return step.keyword;
}), $remove);
$li.append($row);
// The way on to the next step when the source word's own page carries no {{etîmon}}.
if ((word.steps || []).length) {
var $nested = $("<div class='dsb-etimon-nested'></div>");
$nested.append($("<div class='dsb-etimon-nested-head'></div>").append(
$("<span class='dsb-adv-label'>Etîmolojiya di cih de</span>"),
$("<button type='button' class='dsb-etimon-remove'>×</button>")
.attr("title", "Etîmolojiya di cih de jê bibe")
.on("click", function () {
word.steps = [];
changed();
structureChanged();
})
));
renderSteps($nested, word.steps, true);
$li.append($nested);
} else {
$li.append($("<button type='button' class='dsb-etimon-add'></button>")
.text("+ Etîmolojiya di cih de")
.attr("title", "Zincîrê li vir bidomîne, eger rûpela vê kelîmeyê tune be")
.on("click", function () {
word.steps = [$.extend(emptyStep(), { words: [emptyWord()] })];
changed();
structureChanged();
}));
}
return $li;
}
function stepBlock(steps, step, nested) {
var $block = $("<div class='dsb-etimon-step'></div>");
var $head = $("<div class='dsb-etimon-step-head'></div>");
$head.append(keywordSelect(step));
$head.append(modifierEditor(step.mods, keywordMods(), changed, function () {
return step.keyword;
}));
if (steps.length > 1 || nested) {
$head.append($("<button type='button' class='dsb-etimon-remove'>×</button>")
.attr("title", "Vê gavê jê bibe")
.on("click", function () {
steps.splice(steps.indexOf(step), 1);
changed();
structureChanged();
}));
}
$block.append($head);
var def = defFor(keywords(), step.keyword);
if (def && def.min > 1) {
$block.append($("<div class='dsb-tpl-help'></div>")
.text("Ev kelîmeya mifteyî bi kêmî " + def.min + " kelîmeyan dixwaze."));
}
if (def && def.invisible) {
$block.append($("<div class='dsb-tpl-help'></div>")
.text("Di metnê de xuya nabe; tenê kategoriyan çêdike."));
}
if (!step.words.length) {
step.words.push(emptyWord());
}
var $words = $("<ul class='dsb-etimon-words'></ul>");
step.words.forEach(function (word) {
$words.append(wordRow(step, word, step.words, nested));
});
$block.append($words);
$block.append($("<button type='button' class='dsb-etimon-add'>+ Kelîme</button>")
.on("click", function () {
step.words.push(emptyWord());
structureChanged();
}));
return $block;
}
function renderSteps($host, steps, nested) {
if (!steps.length) {
steps.push($.extend(emptyStep(), { words: [emptyWord()] }));
}
steps.forEach(function (step) {
$host.append(stepBlock(steps, step, nested));
});
$host.append($("<button type='button' class='dsb-etimon-add'></button>")
.text("+ Gaveke etîmolojiyê")
.attr("title", "Gaveke din a eynî bangkirinê")
.on("click", function () {
steps.push($.extend(emptyStep(), { words: [emptyWord()] }));
structureChanged();
}));
}
// metn= picks how much of the chain is written out; the values that need a number or a language
// code ("3", ":pal") open a box of their own.
function metnControl() {
var $wrap = $("<div class='dsb-etimon-metn'></div>");
var choices = data.metnChoices || [];
var $select = $("<select class='dsb-etimon-metn-select'></select>");
$select.append($("<option value=''>— metn nayê nîşandan —</option>"));
choices.forEach(function (choice) {
$select.append($("<option></option>").val(choice.value).text(choice.value + " — " + choice.desc));
});
var split = splitMetn(model.named.metn);
$select.val(split.choice);
var $free = $("<input type='text' class='dsb-input dsb-etimon-metn-free'>").val(split.rest);
function choiceFor(value) {
var found = null;
choices.forEach(function (choice) {
if (choice.value === value) {
found = choice;
}
});
return found;
}
function apply() {
var choice = choiceFor($select.val());
$free.toggle(!!(choice && choice.free));
if (choice && choice.free) {
$free.attr("placeholder", choice.value === "1" ? "hejmar…" : "koda zimanî…");
}
setNamed(model, "metn", joinMetn($select.val(), $free.val()));
changed();
}
$select.on("change", apply);
$free.on("input", apply);
apply();
$select.attr("data-placeholder", "metn");
$wrap.append($("<span class='dsb-adv-label'>Metn</span>"), util.wrapNativeSelect($select), $free);
$select.trigger("wiktku:refresh");
return $wrap;
}
function namedParams() {
var $wrap = $("<div class='dsb-etimon-named'></div>");
(data.params || []).forEach(function (param) {
var value = model.named[param.key] || "";
var $row = $("<div class='dsb-etimon-param'></div>");
if (param.type === "flag") {
$row.addClass("dsb-etimon-param-flag");
var id = "dsb-etimon-" + param.key.replace(/[^A-Za-z0-9]/g, "");
var $box = $("<input type='checkbox'>").attr("id", id).prop("checked", value === "1");
$box.on("change", function () {
setNamed(model, param.key, $box.prop("checked") ? "1" : "");
changed();
});
$row.append($box, $("<label class='dsb-adv-label'></label>").attr("for", id)
.text(param.key + " — " + param.desc));
} else {
var $field;
if (param.type === "select") {
$field = $("<select class='dsb-etimon-param-select'></select>");
$field.append($("<option value=''></option>"));
(param.values || []).forEach(function (v) {
$field.append($("<option></option>").val(v).text(v));
});
$field.val(value);
} else {
$field = $("<input type='text' class='dsb-input'>").val(value);
}
$field.on("input change", function () {
setNamed(model, param.key, $.trim(String($field.val() || "")));
changed();
});
$row.append($("<label class='dsb-adv-label'></label>").text(param.key), $field,
$("<div class='dsb-tpl-help'></div>").text(param.desc));
}
$wrap.append($row);
});
return $wrap;
}
function render() {
$element.empty();
$element.append($("<div class='dsb-tpl-name'></div>").append(
$("<a></a>").attr("href", mw.util.getUrl("Şablon:" + NAME))
.attr("target", "_blank").text("{{" + NAME + "}}")
));
var $lang = $("<div class='dsb-etimon-pagelang'></div>");
$lang.append($("<span class='dsb-adv-label'>Zimanê rûpelê</span>"),
languageInput(model.lang, function (value) {
model.lang = value;
changed();
}));
$element.append($lang);
var $steps = $("<div class='dsb-etimon-steps'></div>");
renderSteps($steps, model.steps, false);
$element.append($steps);
$element.append(metnControl());
var $more = $("<details class='dsb-etimon-more'></details>");
$more.append($("<summary>Parametreyên din</summary>"), namedParams());
$more.on("toggle", function () {
if (onResize) {
onResize();
}
});
$element.append($more);
$element.append($("<div class='dsb-etimon-preview-wrap'></div>").append($preview));
changed();
}
render();
return {
$element: $element,
values: function () {
return buildCall(model);
}
};
}
// A call for a page in this language with one empty step, and metn=++ so it actually writes something.
function emptyModel(lang) {
var model = { lang: lang || "", steps: [$.extend(emptyStep(), { words: [emptyWord()] })],
named: {}, namedOrder: [] };
setNamed(model, "metn", "++");
return model;
}
// ---- the dialog --------------------------------------------------------------------------------
var manager = null;
function windowManager() {
if (!manager) {
manager = new OO.ui.WindowManager();
$(document.body).append(manager.$element);
}
return manager;
}
// Opens one {{etîmon}} call in the builder. Resolves with the edited wikitext, "" for "Jê bibe", or
// null when it is cancelled -- the contract cite.openTemplateDialog() has, since it is called in its
// place. One at a time, for the same reason: a second window the manager does not track is dead.
var busy = false;
function openDialog(callWikitext) {
var done = $.Deferred();
if (busy) {
return done.resolve(null).promise();
}
var parsed = parseCall(callWikitext);
if (!parsed) {
return done.resolve(null).promise();
}
var model = parsed.steps.length ? parsed : emptyModel(parsed.lang);
busy = true;
done.always(function () {
busy = false;
});
mw.loader.using(["oojs-ui-core", "oojs-ui-windows"]).then(function () {
var result = null;
var ParentDialog = OO.ui.ProcessDialog;
function EtimonDialog(config) {
ParentDialog.call(this, config);
}
OO.inheritClass(EtimonDialog, ParentDialog);
EtimonDialog.static.name = "etimonDialog";
EtimonDialog.static.title = "{{" + NAME + "}}";
EtimonDialog.static.actions = [
{ action: "save", label: "Biguhêre", flags: ["primary", "progressive"] },
{ action: "remove", label: "Jê bibe", flags: "destructive" },
{ label: util.msg.cancel, flags: "safe" }
];
EtimonDialog.prototype.initialize = function () {
var dialog = this;
ParentDialog.prototype.initialize.apply(this, arguments);
this.panel = new OO.ui.PanelLayout({ padded: true, expanded: false });
this.form = buildForm(model, function () {
dialog.updateSize();
});
this.panel.$element.append(this.form.$element);
this.$body.append(this.panel.$element);
};
EtimonDialog.prototype.getBodyHeight = function () {
return this.panel.$element.outerHeight(true);
};
EtimonDialog.prototype.getActionProcess = function (action) {
var dialog = this;
if (action === "save" || action === "remove") {
return new OO.ui.Process(function () {
result = action === "remove" ? "" : dialog.form.values();
dialog.close();
});
}
return ParentDialog.prototype.getActionProcess.call(this, action);
};
var windows = windowManager();
var dialog = new EtimonDialog({ size: "large" });
windows.addWindows([dialog]);
var instance = windows.openWindow(dialog);
instance.closed.then(function () {
windows.clearWindows();
done.resolve(result);
});
instance.opening.fail(function () {
windows.clearWindows();
done.resolve(null);
});
}, function () {
done.resolve(null);
});
return done.promise();
}
module.exports = {
NAME: NAME,
splitMetn: splitMetn,
joinMetn: joinMetn,
isEtimonName: isEtimonName,
parseCall: parseCall,
buildCall: buildCall,
parseChain: parseChain,
joinChain: joinChain,
openDialog: openDialog
};
}());
// </nowiki>
7aybws9jjcegzsiby4k61s0wssyjgp4
6532115
6532113
2026-09-18T20:46:35Z
Wikihez
7344
Etymology: keep the in-place chain out of the modifier picker, it has its own button
6532115
javascript
text/javascript
// <nowiki>
/*
* Page: [[MediaWiki:Gadget-wikt.cite/etimon.js]]
*
* The builder behind {{etîmon}}: one call is read into steps of "kelîmeya mifteyî + kelîmeyên jêder",
* every source word carrying its own <guherîner>s and, when its page has no etymology of its own, an
* inline <etimon:…> chain of further steps.
*
* Keywords, modifiers, the metn= values and the named parameters all come from the "etimon" block of
* data-main.json, so a new one is added there rather than here. cite.openTemplateDialog() hands every
* {{etîmon}} call to openDialog(), which is what DefSideBoxes and the wizard both call.
*/
(function () {
"use strict";
var edit = require("ext.gadget.wikt.edit");
var util = edit.util;
var langs = edit.langs;
var wt = edit.wt;
var data = edit.data.etimon || {};
var NAME = "etîmon";
// Every name the template answers to: a call written under one of its redirects still opens the builder.
var NAMES = ["etîmon", "etimon", "etymon"];
// <etimon:…> is spelled without "î": modifier names inside <> are ASCII only.
var INLINE_KEYS = ["etimon", "ety"];
function isEtimonName(name) {
return NAMES.indexOf($.trim(name || "").toLowerCase().replace(/^şablon:\s*/i, "")) !== -1;
}
// ---- the tables ---------------------------------------------------------------------------------
function keywords() {
return data.keywords || [];
}
function wordMods() {
return data.wordMods || [];
}
function keywordMods() {
return data.keywordMods || [];
}
// The entry for a key or for one of its documented aliases, so ":inh" is understood as ":mîr".
function defFor(defs, key) {
var found = null;
defs.forEach(function (def) {
if (found) {
return;
}
if (def.key === key || (def.aliases || []).indexOf(key) !== -1) {
found = def;
}
});
return found;
}
function isKeywordModName(key) {
return !!defFor(keywordMods(), key);
}
// ---- reading a call ----------------------------------------------------------------------------
// The ">" closing the "<" at start, skipping the nested ones an <etimon:…> or an <id:…> inside it has.
function matchAngle(text, start) {
var depth = 0;
for (var i = start; i < text.length; i++) {
var ch = text.charAt(i);
if (ch === "<") {
depth++;
} else if (ch === ">") {
depth--;
if (depth === 0) {
return i;
}
}
}
return -1;
}
// Splits on the "|" that separate parameters, and only those: a <ref:{{ş|R:X}}> carries pipes of its own.
function splitParams(text) {
var out = [];
var buf = "";
var braces = 0;
var angles = 0;
for (var i = 0; i < text.length; i++) {
var two = text.substr(i, 2);
if (two === "{{" || two === "}}") {
braces += two === "{{" ? 1 : -1;
buf += two;
i++;
continue;
}
var ch = text.charAt(i);
if (ch === "<") {
angles++;
} else if (ch === ">") {
angles = Math.max(0, angles - 1);
}
if (ch === "|" && braces <= 0 && angles === 0) {
out.push(buf);
buf = "";
continue;
}
buf += ch;
}
out.push(buf);
return out;
}
function parseMod(inner) {
var at = inner.indexOf(":");
if (at === -1) {
return { key: $.trim(inner), flag: true };
}
return { key: $.trim(inner.slice(0, at)), value: inner.slice(at + 1) };
}
// "fa:خانه<tr:xâne><t:mal>" -> { head: "fa:خانه", mods: [...] }
function splitMods(text) {
var head = "";
var mods = [];
var i = 0;
while (i < text.length) {
if (text.charAt(i) === "<") {
var end = matchAngle(text, i);
if (end === -1) {
head += text.slice(i);
break;
}
mods.push(parseMod(text.slice(i + 1, end)));
i = end + 1;
continue;
}
head += text.charAt(i);
i++;
}
return { head: head, mods: mods };
}
function emptyWord() {
return { lang: "", word: "", mods: [], steps: [] };
}
function emptyStep() {
return { keyword: "", mods: [], words: [] };
}
function parseWord(text) {
var split = splitMods($.trim(text));
var word = emptyWord();
var head = split.head;
// A language code, or a language family ("ira:-"); anything else is the word itself.
var m = /^([a-zA-Z][a-zA-Z0-9._-]*):([\s\S]*)$/.exec(head);
if (m) {
word.lang = m[1];
head = m[2];
}
word.word = head;
split.mods.forEach(function (mo) {
if (INLINE_KEYS.indexOf(mo.key) !== -1) {
word.steps = parseChain(mo.value || "");
return;
}
word.mods.push(mo);
});
return word;
}
// The inside of an <etimon:…>: ":kelîmeyeke mifteyî" followed by each source word in its own <…>.
// A group named after a keyword modifier belongs to the keyword, which is how Modul:etymon reads it too.
function parseChain(text) {
var steps = [];
var i = 0;
function current() {
if (!steps.length) {
steps.push(emptyStep());
}
return steps[steps.length - 1];
}
while (i < text.length) {
var ch = text.charAt(i);
if (ch === ":") {
var j = i + 1;
while (j < text.length && text.charAt(j) !== ":" && text.charAt(j) !== "<") {
j++;
}
var step = emptyStep();
step.keyword = $.trim(text.slice(i + 1, j));
steps.push(step);
i = j;
continue;
}
if (ch === "<") {
var end = matchAngle(text, i);
if (end === -1) {
break;
}
var inner = text.slice(i + 1, end);
i = end + 1;
var name = /^([^:>]+)/.exec(inner);
var step2 = current();
if (!step2.words.length && name && isKeywordModName($.trim(name[1]))) {
step2.mods.push(parseMod(inner));
} else {
step2.words.push(parseWord(inner));
}
continue;
}
i++;
}
return steps;
}
// One {{etîmon}} call -> the model the form edits, or null for anything else.
function parseCall(callWikitext) {
var call = wt.parseTemplateCalls(callWikitext || "").calls[0];
if (!call || !isEtimonName(call.name)) {
return null;
}
var model = { lang: "", steps: [], named: {}, namedOrder: [] };
var positional = 0;
splitParams(call.params.join("|")).forEach(function (raw) {
// A name cannot hold "<": that is a modifier, so "fa:x<t:a=b>" stays positional.
var m = /^\s*([^|={}<>\n]+?)\s*=([\s\S]*)$/.exec(raw);
if (m) {
if (model.named[m[1]] === undefined) {
model.namedOrder.push(m[1]);
}
model.named[m[1]] = $.trim(m[2]);
return;
}
positional++;
var value = $.trim(raw);
if (positional === 1) {
model.lang = value;
return;
}
if (value.charAt(0) === ":") {
var split = splitMods(value);
var step = emptyStep();
step.keyword = $.trim(split.head.slice(1));
step.mods = split.mods;
model.steps.push(step);
return;
}
if (!model.steps.length) {
model.steps.push(emptyStep());
}
model.steps[model.steps.length - 1].words.push(parseWord(value));
});
return model;
}
// ---- writing it back ---------------------------------------------------------------------------
function joinMods(mods) {
return (mods || []).map(function (mo) {
return mo.flag ? "<" + mo.key + ">" : "<" + mo.key + ":" + (mo.value || "") + ">";
}).join("");
}
// A row nobody filled in: no word, no language, nothing hanging off it.
function wordIsEmpty(word) {
return !$.trim(word.word || "") && !$.trim(word.lang || "") &&
!(word.mods || []).length && !(word.steps || []).length;
}
function joinWord(word) {
var lang = $.trim(word.lang || "");
var out = (lang ? lang + ":" : "") + $.trim(word.word || "") + joinMods(word.mods);
if ((word.steps || []).length) {
out += "<etimon:" + joinChain(word.steps) + ">";
}
return out;
}
function joinChain(steps) {
return (steps || []).map(function (step) {
return ":" + $.trim(step.keyword || "") + joinMods(step.mods) +
(step.words || []).filter(function (word) {
return !wordIsEmpty(word);
}).map(function (word) {
return "<" + joinWord(word) + ">";
}).join("");
}).join("");
}
function buildCall(model) {
var parts = [NAME, $.trim(model.lang || "")];
(model.steps || []).forEach(function (step) {
var keyword = $.trim(step.keyword || "");
if (keyword || (step.mods || []).length) {
parts.push(":" + keyword + joinMods(step.mods));
}
(step.words || []).forEach(function (word) {
if (!wordIsEmpty(word)) {
parts.push(joinWord(word));
}
});
});
(model.namedOrder || []).forEach(function (key) {
var value = model.named[key];
if (value !== undefined && value !== null && value !== "") {
parts.push(key + "=" + value);
}
});
return "{{" + parts.join("|") + "}}";
}
// Which metn= choice a written value belongs to, and what is left over for that choice's own box:
// "3" belongs to the number choice, ":pal*" to the ":kod*" one.
function splitMetn(value) {
var current = $.trim(value || "");
var out = { choice: "", rest: "" };
if (!current) {
return out;
}
(data.metnChoices || []).forEach(function (choice) {
if (out.choice) {
return;
}
if (!choice.free) {
if (choice.value === current) {
out.choice = choice.value;
}
return;
}
if (choice.value === "1" && /^\d+$/.test(current)) {
out.choice = choice.value;
out.rest = current;
} else if (choice.value === ":*" && /^:.+\*$/.test(current)) {
out.choice = choice.value;
out.rest = current.slice(1, -1);
} else if (choice.value === ":" && /^:[^*]+$/.test(current)) {
out.choice = choice.value;
out.rest = current.slice(1);
}
});
return out;
}
// The inverse: what the dropdown and its box together mean as a metn= value.
function joinMetn(choiceValue, rest) {
var choice = null;
(data.metnChoices || []).forEach(function (c) {
if (c.value === choiceValue) {
choice = c;
}
});
if (!choice) {
return "";
}
if (!choice.free) {
return choice.value;
}
var typed = $.trim(rest || "");
if (!typed) {
return "";
}
if (choice.value === "1") {
return typed;
}
return ":" + typed + (choice.value === ":*" ? "*" : "");
}
function setNamed(model, key, value) {
if (model.namedOrder.indexOf(key) === -1) {
model.namedOrder.push(key);
}
model.named[key] = value;
}
// ---- the form ----------------------------------------------------------------------------------
// Chips for one list of modifiers, plus the ⊕ that adds another. The pills, the value box and the
// chips are the same widgetry a sense word row uses, so they look and behave the same here.
// Whether a modifier applies under the keyword it is being offered for: an "only" list in the data
// (aftype under :qf, maneid under :wergirtin) keeps it off every other keyword's picker.
function modApplies(def, keyword) {
if (!(def.only || []).length) {
return true;
}
var canonical = defFor(keywords(), keyword);
return def.only.indexOf(canonical ? canonical.key : keyword) !== -1;
}
function modifierEditor(mods, defs, onChange, keywordOf) {
var $wrap = $("<div class='dsb-etimon-mods'></div>");
var $chips = $("<div class='dsb-word-mods'></div>");
var $btn = $("<button type='button' class='dsb-mod-btn'>⊕</button>")
.attr("title", util.msg.addModifier);
var $picker = $("<div class='dsb-mod-picker'></div>").hide();
function label(def) {
return def ? def.key + " — " + def.desc : "";
}
// Same box for adding and for editing: a modifier with a fixed set of values gets a dropdown.
function openValueEditor(def, index) {
$picker.hide();
$wrap.children(".dsb-mod-val-wrap").remove();
var $box = $("<div class='dsb-mod-val-wrap'></div>");
var $label = $("<span class='dsb-mod-val-label'></span>").text(def.key);
var current = index === -1 ? "" : (mods[index].value || "");
var $field;
if ((def.values || []).length) {
$field = $("<select class='dsb-mod-val-input'></select>");
$field.append($("<option value=''></option>"));
def.values.forEach(function (value) {
$field.append($("<option></option>").val(value).text(value));
});
$field.val(current);
} else {
$field = $("<input type='text' class='dsb-mod-val-input'>")
.attr("size", 24).attr("placeholder", def.desc).val(current);
}
var $ok = $("<button type='button' class='dsb-mod-confirm'>✓</button>");
var $no = $("<button type='button' class='dsb-mod-cancel'>✕</button>");
function apply() {
var value = $.trim(String($field.val() || ""));
if (value) {
if (index === -1) {
mods.push({ key: def.key, value: value });
} else {
mods[index].value = value;
}
onChange();
render();
}
$box.remove();
}
$ok.on("click", apply);
$no.on("click", function () {
$box.remove();
});
$field.on("keydown", function (e) {
if (e.which === 13) {
e.preventDefault();
apply();
}
if (e.which === 27) {
$box.remove();
}
});
$box.append($label, $field, $ok, $no);
$wrap.append($box);
$field.focus();
}
function render() {
$chips.empty();
mods.forEach(function (mo, index) {
var def = defFor(defs, mo.key);
var $chip = $("<span class='dsb-word-mod-chip' role='button' tabindex='0'></span>")
.attr("title", def ? def.desc : mo.key)
.text(mo.flag ? mo.key : mo.key + ": " + (mo.value || ""));
var $x = $("<button type='button' class='dsb-word-mod-chip-remove'>×</button>")
.attr("title", util.msg.removeModifier);
$x.on("click", function (e) {
e.stopPropagation();
mods.splice(index, 1);
onChange();
render();
});
$chip.on("click", function () {
if (def && !mo.flag) {
openValueEditor(def, index);
}
});
$chip.append($x);
$chips.append($chip);
});
$chips.toggle(!!mods.length);
}
// Rebuilt per open rather than once: the keyword can change while the row is on screen, and with
// it which modifiers are on offer.
$btn.on("click", function (e) {
e.preventDefault();
var keyword = keywordOf ? keywordOf() : "";
$picker.empty();
defs.forEach(function (def) {
// <etimon:…> has the "+ Etîmolojiya di cih de" button of its own; as a pill it would be a
// box asking for a whole chain in one line.
if (INLINE_KEYS.indexOf(def.key) !== -1 || !modApplies(def, keyword)) {
return;
}
var $pill = $("<button type='button' class='dsb-mod-pill'></button>")
.text(def.key).attr("title", label(def)).data("mod-key", def.key);
$pill.on("click", function (ev) {
ev.preventDefault();
if (def.flag) {
mods.push({ key: def.key, flag: true });
$picker.hide();
onChange();
render();
return;
}
openValueEditor(def, -1);
});
$picker.append($pill);
});
var used = {};
mods.forEach(function (mo) {
used[mo.key] = true;
});
$picker.children(".dsb-mod-pill").each(function () {
var isUsed = !!used[$(this).data("mod-key")];
$(this).prop("disabled", isUsed).toggleClass("dsb-mod-pill-used", isUsed);
});
$picker.toggle();
});
render();
$wrap.append($chips, $btn, $picker);
return $wrap;
}
function languageInput(value, onChange) {
var $input = $("<input type='text' class='dsb-input dsb-etimon-lang'>")
.attr("list", langs.datalistId())
.attr("placeholder", "koda zimanî…")
.val(value || "");
$input.on("input change", function () {
if (langs.missingFromCore($input.val())) {
langs.ensureFull();
}
onChange($.trim($input.val()));
});
return $input;
}
// The whole form for one call. Structural changes (a step or a word added or dropped) rebuild it from
// the model, which every box writes into as it is typed in.
function buildForm(model, onResize) {
var $element = $("<div class='dsb-etimon'></div>");
var $preview = $("<code class='dsb-etimon-preview'></code>");
function changed() {
$preview.text(buildCall(model));
}
function structureChanged() {
render();
if (onResize) {
onResize();
}
}
function keywordSelect(step) {
var $select = $("<select class='dsb-etimon-keyword'></select>");
$select.append($("<option value=''>— kelîmeya mifteyî —</option>"));
keywords().forEach(function (def) {
$select.append($("<option></option>").val(def.key).text(def.key + " — " + def.desc));
});
// A keyword written under an alias, or one the table does not know, keeps its own option.
var known = defFor(keywords(), step.keyword);
if (step.keyword && (!known || known.key !== step.keyword)) {
$select.append($("<option></option>").val(step.keyword)
.text(step.keyword + (known ? " — " + known.desc : " — (ne di belgeyê de)")));
}
$select.val(step.keyword);
$select.on("change", function () {
step.keyword = $select.val();
changed();
structureChanged(); // the hints under it (how many words, what they mean) follow the keyword
});
$select.attr("data-placeholder", "Kelîmeya mifteyî");
var $wrapped = util.wrapNativeSelect($select);
// The searchable box reads the selection only when told to, so a keyword already chosen shows.
$select.trigger("wiktku:refresh");
return $wrapped;
}
function wordRow(step, word, words, nested) {
var $li = $("<li class='dsb-etimon-word'></li>");
var $row = $("<div class='dsb-etimon-word-row'></div>");
var $lang = languageInput(word.lang, function (value) {
word.lang = value;
changed();
});
var $word = $("<input type='text' class='dsb-input dsb-etimon-word-input'>")
.attr("placeholder", "kelîme ( - = tenê navê zimên )")
.val(word.word || "");
$word.on("input", function () {
word.word = $word.val();
changed();
});
var $remove = $("<button type='button' class='dsb-etimon-remove'>×</button>")
.attr("title", "Vê kelîmeyê jê bibe");
$remove.on("click", function () {
words.splice(words.indexOf(word), 1);
if (!words.length && !nested) {
words.push(emptyWord());
}
changed();
structureChanged();
});
$row.append($lang, $word, modifierEditor(word.mods, wordMods(), changed, function () {
return step.keyword;
}), $remove);
$li.append($row);
// The way on to the next step when the source word's own page carries no {{etîmon}}.
if ((word.steps || []).length) {
var $nested = $("<div class='dsb-etimon-nested'></div>");
$nested.append($("<div class='dsb-etimon-nested-head'></div>").append(
$("<span class='dsb-adv-label'>Etîmolojiya di cih de</span>"),
$("<button type='button' class='dsb-etimon-remove'>×</button>")
.attr("title", "Etîmolojiya di cih de jê bibe")
.on("click", function () {
word.steps = [];
changed();
structureChanged();
})
));
renderSteps($nested, word.steps, true);
$li.append($nested);
} else {
$li.append($("<button type='button' class='dsb-etimon-add'></button>")
.text("+ Etîmolojiya di cih de")
.attr("title", "Zincîrê li vir bidomîne, eger rûpela vê kelîmeyê tune be")
.on("click", function () {
word.steps = [$.extend(emptyStep(), { words: [emptyWord()] })];
changed();
structureChanged();
}));
}
return $li;
}
function stepBlock(steps, step, nested) {
var $block = $("<div class='dsb-etimon-step'></div>");
var $head = $("<div class='dsb-etimon-step-head'></div>");
$head.append(keywordSelect(step));
$head.append(modifierEditor(step.mods, keywordMods(), changed, function () {
return step.keyword;
}));
if (steps.length > 1 || nested) {
$head.append($("<button type='button' class='dsb-etimon-remove'>×</button>")
.attr("title", "Vê gavê jê bibe")
.on("click", function () {
steps.splice(steps.indexOf(step), 1);
changed();
structureChanged();
}));
}
$block.append($head);
var def = defFor(keywords(), step.keyword);
if (def && def.min > 1) {
$block.append($("<div class='dsb-tpl-help'></div>")
.text("Ev kelîmeya mifteyî bi kêmî " + def.min + " kelîmeyan dixwaze."));
}
if (def && def.invisible) {
$block.append($("<div class='dsb-tpl-help'></div>")
.text("Di metnê de xuya nabe; tenê kategoriyan çêdike."));
}
if (!step.words.length) {
step.words.push(emptyWord());
}
var $words = $("<ul class='dsb-etimon-words'></ul>");
step.words.forEach(function (word) {
$words.append(wordRow(step, word, step.words, nested));
});
$block.append($words);
$block.append($("<button type='button' class='dsb-etimon-add'>+ Kelîme</button>")
.on("click", function () {
step.words.push(emptyWord());
structureChanged();
}));
return $block;
}
function renderSteps($host, steps, nested) {
if (!steps.length) {
steps.push($.extend(emptyStep(), { words: [emptyWord()] }));
}
steps.forEach(function (step) {
$host.append(stepBlock(steps, step, nested));
});
$host.append($("<button type='button' class='dsb-etimon-add'></button>")
.text("+ Gaveke etîmolojiyê")
.attr("title", "Gaveke din a eynî bangkirinê")
.on("click", function () {
steps.push($.extend(emptyStep(), { words: [emptyWord()] }));
structureChanged();
}));
}
// metn= picks how much of the chain is written out; the values that need a number or a language
// code ("3", ":pal") open a box of their own.
function metnControl() {
var $wrap = $("<div class='dsb-etimon-metn'></div>");
var choices = data.metnChoices || [];
var $select = $("<select class='dsb-etimon-metn-select'></select>");
$select.append($("<option value=''>— metn nayê nîşandan —</option>"));
choices.forEach(function (choice) {
$select.append($("<option></option>").val(choice.value).text(choice.value + " — " + choice.desc));
});
var split = splitMetn(model.named.metn);
$select.val(split.choice);
var $free = $("<input type='text' class='dsb-input dsb-etimon-metn-free'>").val(split.rest);
function choiceFor(value) {
var found = null;
choices.forEach(function (choice) {
if (choice.value === value) {
found = choice;
}
});
return found;
}
function apply() {
var choice = choiceFor($select.val());
$free.toggle(!!(choice && choice.free));
if (choice && choice.free) {
$free.attr("placeholder", choice.value === "1" ? "hejmar…" : "koda zimanî…");
}
setNamed(model, "metn", joinMetn($select.val(), $free.val()));
changed();
}
$select.on("change", apply);
$free.on("input", apply);
apply();
$select.attr("data-placeholder", "metn");
$wrap.append($("<span class='dsb-adv-label'>Metn</span>"), util.wrapNativeSelect($select), $free);
$select.trigger("wiktku:refresh");
return $wrap;
}
function namedParams() {
var $wrap = $("<div class='dsb-etimon-named'></div>");
(data.params || []).forEach(function (param) {
var value = model.named[param.key] || "";
var $row = $("<div class='dsb-etimon-param'></div>");
if (param.type === "flag") {
$row.addClass("dsb-etimon-param-flag");
var id = "dsb-etimon-" + param.key.replace(/[^A-Za-z0-9]/g, "");
var $box = $("<input type='checkbox'>").attr("id", id).prop("checked", value === "1");
$box.on("change", function () {
setNamed(model, param.key, $box.prop("checked") ? "1" : "");
changed();
});
$row.append($box, $("<label class='dsb-adv-label'></label>").attr("for", id)
.text(param.key + " — " + param.desc));
} else {
var $field;
if (param.type === "select") {
$field = $("<select class='dsb-etimon-param-select'></select>");
$field.append($("<option value=''></option>"));
(param.values || []).forEach(function (v) {
$field.append($("<option></option>").val(v).text(v));
});
$field.val(value);
} else {
$field = $("<input type='text' class='dsb-input'>").val(value);
}
$field.on("input change", function () {
setNamed(model, param.key, $.trim(String($field.val() || "")));
changed();
});
$row.append($("<label class='dsb-adv-label'></label>").text(param.key), $field,
$("<div class='dsb-tpl-help'></div>").text(param.desc));
}
$wrap.append($row);
});
return $wrap;
}
function render() {
$element.empty();
$element.append($("<div class='dsb-tpl-name'></div>").append(
$("<a></a>").attr("href", mw.util.getUrl("Şablon:" + NAME))
.attr("target", "_blank").text("{{" + NAME + "}}")
));
var $lang = $("<div class='dsb-etimon-pagelang'></div>");
$lang.append($("<span class='dsb-adv-label'>Zimanê rûpelê</span>"),
languageInput(model.lang, function (value) {
model.lang = value;
changed();
}));
$element.append($lang);
var $steps = $("<div class='dsb-etimon-steps'></div>");
renderSteps($steps, model.steps, false);
$element.append($steps);
$element.append(metnControl());
var $more = $("<details class='dsb-etimon-more'></details>");
$more.append($("<summary>Parametreyên din</summary>"), namedParams());
$more.on("toggle", function () {
if (onResize) {
onResize();
}
});
$element.append($more);
$element.append($("<div class='dsb-etimon-preview-wrap'></div>").append($preview));
changed();
}
render();
return {
$element: $element,
values: function () {
return buildCall(model);
}
};
}
// A call for a page in this language with one empty step, and metn=++ so it actually writes something.
function emptyModel(lang) {
var model = { lang: lang || "", steps: [$.extend(emptyStep(), { words: [emptyWord()] })],
named: {}, namedOrder: [] };
setNamed(model, "metn", "++");
return model;
}
// ---- the dialog --------------------------------------------------------------------------------
var manager = null;
function windowManager() {
if (!manager) {
manager = new OO.ui.WindowManager();
$(document.body).append(manager.$element);
}
return manager;
}
// Opens one {{etîmon}} call in the builder. Resolves with the edited wikitext, "" for "Jê bibe", or
// null when it is cancelled -- the contract cite.openTemplateDialog() has, since it is called in its
// place. One at a time, for the same reason: a second window the manager does not track is dead.
var busy = false;
function openDialog(callWikitext) {
var done = $.Deferred();
if (busy) {
return done.resolve(null).promise();
}
var parsed = parseCall(callWikitext);
if (!parsed) {
return done.resolve(null).promise();
}
var model = parsed.steps.length ? parsed : emptyModel(parsed.lang);
busy = true;
done.always(function () {
busy = false;
});
mw.loader.using(["oojs-ui-core", "oojs-ui-windows"]).then(function () {
var result = null;
var ParentDialog = OO.ui.ProcessDialog;
function EtimonDialog(config) {
ParentDialog.call(this, config);
}
OO.inheritClass(EtimonDialog, ParentDialog);
EtimonDialog.static.name = "etimonDialog";
EtimonDialog.static.title = "{{" + NAME + "}}";
EtimonDialog.static.actions = [
{ action: "save", label: "Biguhêre", flags: ["primary", "progressive"] },
{ action: "remove", label: "Jê bibe", flags: "destructive" },
{ label: util.msg.cancel, flags: "safe" }
];
EtimonDialog.prototype.initialize = function () {
var dialog = this;
ParentDialog.prototype.initialize.apply(this, arguments);
this.panel = new OO.ui.PanelLayout({ padded: true, expanded: false });
this.form = buildForm(model, function () {
dialog.updateSize();
});
this.panel.$element.append(this.form.$element);
this.$body.append(this.panel.$element);
};
EtimonDialog.prototype.getBodyHeight = function () {
return this.panel.$element.outerHeight(true);
};
EtimonDialog.prototype.getActionProcess = function (action) {
var dialog = this;
if (action === "save" || action === "remove") {
return new OO.ui.Process(function () {
result = action === "remove" ? "" : dialog.form.values();
dialog.close();
});
}
return ParentDialog.prototype.getActionProcess.call(this, action);
};
var windows = windowManager();
var dialog = new EtimonDialog({ size: "large" });
windows.addWindows([dialog]);
var instance = windows.openWindow(dialog);
instance.closed.then(function () {
windows.clearWindows();
done.resolve(result);
});
instance.opening.fail(function () {
windows.clearWindows();
done.resolve(null);
});
}, function () {
done.resolve(null);
});
return done.promise();
}
module.exports = {
NAME: NAME,
splitMetn: splitMetn,
joinMetn: joinMetn,
isEtimonName: isEtimonName,
parseCall: parseCall,
buildCall: buildCall,
parseChain: parseChain,
joinChain: joinChain,
openDialog: openDialog
};
}());
// </nowiki>
0ypo26x0ppmsioshslv0gahgza61pgo
6532547
6532115
2026-09-19T08:52:41Z
Wikihez
7344
Etymology: keep dar= and id= in the open, below metn=
6532547
javascript
text/javascript
// <nowiki>
/*
* Page: [[MediaWiki:Gadget-wikt.cite/etimon.js]]
*
* The builder behind {{etîmon}}: one call is read into steps of "kelîmeya mifteyî + kelîmeyên jêder",
* every source word carrying its own <guherîner>s and, when its page has no etymology of its own, an
* inline <etimon:…> chain of further steps.
*
* Keywords, modifiers, the metn= values and the named parameters all come from the "etimon" block of
* data-main.json, so a new one is added there rather than here. cite.openTemplateDialog() hands every
* {{etîmon}} call to openDialog(), which is what DefSideBoxes and the wizard both call.
*/
(function () {
"use strict";
var edit = require("ext.gadget.wikt.edit");
var util = edit.util;
var langs = edit.langs;
var wt = edit.wt;
var data = edit.data.etimon || {};
var NAME = "etîmon";
// Every name the template answers to: a call written under one of its redirects still opens the builder.
var NAMES = ["etîmon", "etimon", "etymon"];
// <etimon:…> is spelled without "î": modifier names inside <> are ASCII only.
var INLINE_KEYS = ["etimon", "ety"];
function isEtimonName(name) {
return NAMES.indexOf($.trim(name || "").toLowerCase().replace(/^şablon:\s*/i, "")) !== -1;
}
// ---- the tables ---------------------------------------------------------------------------------
function keywords() {
return data.keywords || [];
}
function wordMods() {
return data.wordMods || [];
}
function keywordMods() {
return data.keywordMods || [];
}
// The entry for a key or for one of its documented aliases, so ":inh" is understood as ":mîr".
function defFor(defs, key) {
var found = null;
defs.forEach(function (def) {
if (found) {
return;
}
if (def.key === key || (def.aliases || []).indexOf(key) !== -1) {
found = def;
}
});
return found;
}
function isKeywordModName(key) {
return !!defFor(keywordMods(), key);
}
// ---- reading a call ----------------------------------------------------------------------------
// The ">" closing the "<" at start, skipping the nested ones an <etimon:…> or an <id:…> inside it has.
function matchAngle(text, start) {
var depth = 0;
for (var i = start; i < text.length; i++) {
var ch = text.charAt(i);
if (ch === "<") {
depth++;
} else if (ch === ">") {
depth--;
if (depth === 0) {
return i;
}
}
}
return -1;
}
// Splits on the "|" that separate parameters, and only those: a <ref:{{ş|R:X}}> carries pipes of its own.
function splitParams(text) {
var out = [];
var buf = "";
var braces = 0;
var angles = 0;
for (var i = 0; i < text.length; i++) {
var two = text.substr(i, 2);
if (two === "{{" || two === "}}") {
braces += two === "{{" ? 1 : -1;
buf += two;
i++;
continue;
}
var ch = text.charAt(i);
if (ch === "<") {
angles++;
} else if (ch === ">") {
angles = Math.max(0, angles - 1);
}
if (ch === "|" && braces <= 0 && angles === 0) {
out.push(buf);
buf = "";
continue;
}
buf += ch;
}
out.push(buf);
return out;
}
function parseMod(inner) {
var at = inner.indexOf(":");
if (at === -1) {
return { key: $.trim(inner), flag: true };
}
return { key: $.trim(inner.slice(0, at)), value: inner.slice(at + 1) };
}
// "fa:خانه<tr:xâne><t:mal>" -> { head: "fa:خانه", mods: [...] }
function splitMods(text) {
var head = "";
var mods = [];
var i = 0;
while (i < text.length) {
if (text.charAt(i) === "<") {
var end = matchAngle(text, i);
if (end === -1) {
head += text.slice(i);
break;
}
mods.push(parseMod(text.slice(i + 1, end)));
i = end + 1;
continue;
}
head += text.charAt(i);
i++;
}
return { head: head, mods: mods };
}
function emptyWord() {
return { lang: "", word: "", mods: [], steps: [] };
}
function emptyStep() {
return { keyword: "", mods: [], words: [] };
}
function parseWord(text) {
var split = splitMods($.trim(text));
var word = emptyWord();
var head = split.head;
// A language code, or a language family ("ira:-"); anything else is the word itself.
var m = /^([a-zA-Z][a-zA-Z0-9._-]*):([\s\S]*)$/.exec(head);
if (m) {
word.lang = m[1];
head = m[2];
}
word.word = head;
split.mods.forEach(function (mo) {
if (INLINE_KEYS.indexOf(mo.key) !== -1) {
word.steps = parseChain(mo.value || "");
return;
}
word.mods.push(mo);
});
return word;
}
// The inside of an <etimon:…>: ":kelîmeyeke mifteyî" followed by each source word in its own <…>.
// A group named after a keyword modifier belongs to the keyword, which is how Modul:etymon reads it too.
function parseChain(text) {
var steps = [];
var i = 0;
function current() {
if (!steps.length) {
steps.push(emptyStep());
}
return steps[steps.length - 1];
}
while (i < text.length) {
var ch = text.charAt(i);
if (ch === ":") {
var j = i + 1;
while (j < text.length && text.charAt(j) !== ":" && text.charAt(j) !== "<") {
j++;
}
var step = emptyStep();
step.keyword = $.trim(text.slice(i + 1, j));
steps.push(step);
i = j;
continue;
}
if (ch === "<") {
var end = matchAngle(text, i);
if (end === -1) {
break;
}
var inner = text.slice(i + 1, end);
i = end + 1;
var name = /^([^:>]+)/.exec(inner);
var step2 = current();
if (!step2.words.length && name && isKeywordModName($.trim(name[1]))) {
step2.mods.push(parseMod(inner));
} else {
step2.words.push(parseWord(inner));
}
continue;
}
i++;
}
return steps;
}
// One {{etîmon}} call -> the model the form edits, or null for anything else.
function parseCall(callWikitext) {
var call = wt.parseTemplateCalls(callWikitext || "").calls[0];
if (!call || !isEtimonName(call.name)) {
return null;
}
var model = { lang: "", steps: [], named: {}, namedOrder: [] };
var positional = 0;
splitParams(call.params.join("|")).forEach(function (raw) {
// A name cannot hold "<": that is a modifier, so "fa:x<t:a=b>" stays positional.
var m = /^\s*([^|={}<>\n]+?)\s*=([\s\S]*)$/.exec(raw);
if (m) {
if (model.named[m[1]] === undefined) {
model.namedOrder.push(m[1]);
}
model.named[m[1]] = $.trim(m[2]);
return;
}
positional++;
var value = $.trim(raw);
if (positional === 1) {
model.lang = value;
return;
}
if (value.charAt(0) === ":") {
var split = splitMods(value);
var step = emptyStep();
step.keyword = $.trim(split.head.slice(1));
step.mods = split.mods;
model.steps.push(step);
return;
}
if (!model.steps.length) {
model.steps.push(emptyStep());
}
model.steps[model.steps.length - 1].words.push(parseWord(value));
});
return model;
}
// ---- writing it back ---------------------------------------------------------------------------
function joinMods(mods) {
return (mods || []).map(function (mo) {
return mo.flag ? "<" + mo.key + ">" : "<" + mo.key + ":" + (mo.value || "") + ">";
}).join("");
}
// A row nobody filled in: no word, no language, nothing hanging off it.
function wordIsEmpty(word) {
return !$.trim(word.word || "") && !$.trim(word.lang || "") &&
!(word.mods || []).length && !(word.steps || []).length;
}
function joinWord(word) {
var lang = $.trim(word.lang || "");
var out = (lang ? lang + ":" : "") + $.trim(word.word || "") + joinMods(word.mods);
if ((word.steps || []).length) {
out += "<etimon:" + joinChain(word.steps) + ">";
}
return out;
}
function joinChain(steps) {
return (steps || []).map(function (step) {
return ":" + $.trim(step.keyword || "") + joinMods(step.mods) +
(step.words || []).filter(function (word) {
return !wordIsEmpty(word);
}).map(function (word) {
return "<" + joinWord(word) + ">";
}).join("");
}).join("");
}
function buildCall(model) {
var parts = [NAME, $.trim(model.lang || "")];
(model.steps || []).forEach(function (step) {
var keyword = $.trim(step.keyword || "");
if (keyword || (step.mods || []).length) {
parts.push(":" + keyword + joinMods(step.mods));
}
(step.words || []).forEach(function (word) {
if (!wordIsEmpty(word)) {
parts.push(joinWord(word));
}
});
});
(model.namedOrder || []).forEach(function (key) {
var value = model.named[key];
if (value !== undefined && value !== null && value !== "") {
parts.push(key + "=" + value);
}
});
return "{{" + parts.join("|") + "}}";
}
// Which metn= choice a written value belongs to, and what is left over for that choice's own box:
// "3" belongs to the number choice, ":pal*" to the ":kod*" one.
function splitMetn(value) {
var current = $.trim(value || "");
var out = { choice: "", rest: "" };
if (!current) {
return out;
}
(data.metnChoices || []).forEach(function (choice) {
if (out.choice) {
return;
}
if (!choice.free) {
if (choice.value === current) {
out.choice = choice.value;
}
return;
}
if (choice.value === "1" && /^\d+$/.test(current)) {
out.choice = choice.value;
out.rest = current;
} else if (choice.value === ":*" && /^:.+\*$/.test(current)) {
out.choice = choice.value;
out.rest = current.slice(1, -1);
} else if (choice.value === ":" && /^:[^*]+$/.test(current)) {
out.choice = choice.value;
out.rest = current.slice(1);
}
});
return out;
}
// The inverse: what the dropdown and its box together mean as a metn= value.
function joinMetn(choiceValue, rest) {
var choice = null;
(data.metnChoices || []).forEach(function (c) {
if (c.value === choiceValue) {
choice = c;
}
});
if (!choice) {
return "";
}
if (!choice.free) {
return choice.value;
}
var typed = $.trim(rest || "");
if (!typed) {
return "";
}
if (choice.value === "1") {
return typed;
}
return ":" + typed + (choice.value === ":*" ? "*" : "");
}
function setNamed(model, key, value) {
if (model.namedOrder.indexOf(key) === -1) {
model.namedOrder.push(key);
}
model.named[key] = value;
}
// ---- the form ----------------------------------------------------------------------------------
// Chips for one list of modifiers, plus the ⊕ that adds another. The pills, the value box and the
// chips are the same widgetry a sense word row uses, so they look and behave the same here.
// Whether a modifier applies under the keyword it is being offered for: an "only" list in the data
// (aftype under :qf, maneid under :wergirtin) keeps it off every other keyword's picker.
function modApplies(def, keyword) {
if (!(def.only || []).length) {
return true;
}
var canonical = defFor(keywords(), keyword);
return def.only.indexOf(canonical ? canonical.key : keyword) !== -1;
}
function modifierEditor(mods, defs, onChange, keywordOf) {
var $wrap = $("<div class='dsb-etimon-mods'></div>");
var $chips = $("<div class='dsb-word-mods'></div>");
var $btn = $("<button type='button' class='dsb-mod-btn'>⊕</button>")
.attr("title", util.msg.addModifier);
var $picker = $("<div class='dsb-mod-picker'></div>").hide();
function label(def) {
return def ? def.key + " — " + def.desc : "";
}
// Same box for adding and for editing: a modifier with a fixed set of values gets a dropdown.
function openValueEditor(def, index) {
$picker.hide();
$wrap.children(".dsb-mod-val-wrap").remove();
var $box = $("<div class='dsb-mod-val-wrap'></div>");
var $label = $("<span class='dsb-mod-val-label'></span>").text(def.key);
var current = index === -1 ? "" : (mods[index].value || "");
var $field;
if ((def.values || []).length) {
$field = $("<select class='dsb-mod-val-input'></select>");
$field.append($("<option value=''></option>"));
def.values.forEach(function (value) {
$field.append($("<option></option>").val(value).text(value));
});
$field.val(current);
} else {
$field = $("<input type='text' class='dsb-mod-val-input'>")
.attr("size", 24).attr("placeholder", def.desc).val(current);
}
var $ok = $("<button type='button' class='dsb-mod-confirm'>✓</button>");
var $no = $("<button type='button' class='dsb-mod-cancel'>✕</button>");
function apply() {
var value = $.trim(String($field.val() || ""));
if (value) {
if (index === -1) {
mods.push({ key: def.key, value: value });
} else {
mods[index].value = value;
}
onChange();
render();
}
$box.remove();
}
$ok.on("click", apply);
$no.on("click", function () {
$box.remove();
});
$field.on("keydown", function (e) {
if (e.which === 13) {
e.preventDefault();
apply();
}
if (e.which === 27) {
$box.remove();
}
});
$box.append($label, $field, $ok, $no);
$wrap.append($box);
$field.focus();
}
function render() {
$chips.empty();
mods.forEach(function (mo, index) {
var def = defFor(defs, mo.key);
var $chip = $("<span class='dsb-word-mod-chip' role='button' tabindex='0'></span>")
.attr("title", def ? def.desc : mo.key)
.text(mo.flag ? mo.key : mo.key + ": " + (mo.value || ""));
var $x = $("<button type='button' class='dsb-word-mod-chip-remove'>×</button>")
.attr("title", util.msg.removeModifier);
$x.on("click", function (e) {
e.stopPropagation();
mods.splice(index, 1);
onChange();
render();
});
$chip.on("click", function () {
if (def && !mo.flag) {
openValueEditor(def, index);
}
});
$chip.append($x);
$chips.append($chip);
});
$chips.toggle(!!mods.length);
}
// Rebuilt per open rather than once: the keyword can change while the row is on screen, and with
// it which modifiers are on offer.
$btn.on("click", function (e) {
e.preventDefault();
var keyword = keywordOf ? keywordOf() : "";
$picker.empty();
defs.forEach(function (def) {
// <etimon:…> has the "+ Etîmolojiya di cih de" button of its own; as a pill it would be a
// box asking for a whole chain in one line.
if (INLINE_KEYS.indexOf(def.key) !== -1 || !modApplies(def, keyword)) {
return;
}
var $pill = $("<button type='button' class='dsb-mod-pill'></button>")
.text(def.key).attr("title", label(def)).data("mod-key", def.key);
$pill.on("click", function (ev) {
ev.preventDefault();
if (def.flag) {
mods.push({ key: def.key, flag: true });
$picker.hide();
onChange();
render();
return;
}
openValueEditor(def, -1);
});
$picker.append($pill);
});
var used = {};
mods.forEach(function (mo) {
used[mo.key] = true;
});
$picker.children(".dsb-mod-pill").each(function () {
var isUsed = !!used[$(this).data("mod-key")];
$(this).prop("disabled", isUsed).toggleClass("dsb-mod-pill-used", isUsed);
});
$picker.toggle();
});
render();
$wrap.append($chips, $btn, $picker);
return $wrap;
}
function languageInput(value, onChange) {
var $input = $("<input type='text' class='dsb-input dsb-etimon-lang'>")
.attr("list", langs.datalistId())
.attr("placeholder", "koda zimanî…")
.val(value || "");
$input.on("input change", function () {
if (langs.missingFromCore($input.val())) {
langs.ensureFull();
}
onChange($.trim($input.val()));
});
return $input;
}
// The whole form for one call. Structural changes (a step or a word added or dropped) rebuild it from
// the model, which every box writes into as it is typed in.
function buildForm(model, onResize) {
var $element = $("<div class='dsb-etimon'></div>");
var $preview = $("<code class='dsb-etimon-preview'></code>");
function changed() {
$preview.text(buildCall(model));
}
function structureChanged() {
render();
if (onResize) {
onResize();
}
}
function keywordSelect(step) {
var $select = $("<select class='dsb-etimon-keyword'></select>");
$select.append($("<option value=''>— kelîmeya mifteyî —</option>"));
keywords().forEach(function (def) {
$select.append($("<option></option>").val(def.key).text(def.key + " — " + def.desc));
});
// A keyword written under an alias, or one the table does not know, keeps its own option.
var known = defFor(keywords(), step.keyword);
if (step.keyword && (!known || known.key !== step.keyword)) {
$select.append($("<option></option>").val(step.keyword)
.text(step.keyword + (known ? " — " + known.desc : " — (ne di belgeyê de)")));
}
$select.val(step.keyword);
$select.on("change", function () {
step.keyword = $select.val();
changed();
structureChanged(); // the hints under it (how many words, what they mean) follow the keyword
});
$select.attr("data-placeholder", "Kelîmeya mifteyî");
var $wrapped = util.wrapNativeSelect($select);
// The searchable box reads the selection only when told to, so a keyword already chosen shows.
$select.trigger("wiktku:refresh");
return $wrapped;
}
function wordRow(step, word, words, nested) {
var $li = $("<li class='dsb-etimon-word'></li>");
var $row = $("<div class='dsb-etimon-word-row'></div>");
var $lang = languageInput(word.lang, function (value) {
word.lang = value;
changed();
});
var $word = $("<input type='text' class='dsb-input dsb-etimon-word-input'>")
.attr("placeholder", "kelîme ( - = tenê navê zimên )")
.val(word.word || "");
$word.on("input", function () {
word.word = $word.val();
changed();
});
var $remove = $("<button type='button' class='dsb-etimon-remove'>×</button>")
.attr("title", "Vê kelîmeyê jê bibe");
$remove.on("click", function () {
words.splice(words.indexOf(word), 1);
if (!words.length && !nested) {
words.push(emptyWord());
}
changed();
structureChanged();
});
$row.append($lang, $word, modifierEditor(word.mods, wordMods(), changed, function () {
return step.keyword;
}), $remove);
$li.append($row);
// The way on to the next step when the source word's own page carries no {{etîmon}}.
if ((word.steps || []).length) {
var $nested = $("<div class='dsb-etimon-nested'></div>");
$nested.append($("<div class='dsb-etimon-nested-head'></div>").append(
$("<span class='dsb-adv-label'>Etîmolojiya di cih de</span>"),
$("<button type='button' class='dsb-etimon-remove'>×</button>")
.attr("title", "Etîmolojiya di cih de jê bibe")
.on("click", function () {
word.steps = [];
changed();
structureChanged();
})
));
renderSteps($nested, word.steps, true);
$li.append($nested);
} else {
$li.append($("<button type='button' class='dsb-etimon-add'></button>")
.text("+ Etîmolojiya di cih de")
.attr("title", "Zincîrê li vir bidomîne, eger rûpela vê kelîmeyê tune be")
.on("click", function () {
word.steps = [$.extend(emptyStep(), { words: [emptyWord()] })];
changed();
structureChanged();
}));
}
return $li;
}
function stepBlock(steps, step, nested) {
var $block = $("<div class='dsb-etimon-step'></div>");
var $head = $("<div class='dsb-etimon-step-head'></div>");
$head.append(keywordSelect(step));
$head.append(modifierEditor(step.mods, keywordMods(), changed, function () {
return step.keyword;
}));
if (steps.length > 1 || nested) {
$head.append($("<button type='button' class='dsb-etimon-remove'>×</button>")
.attr("title", "Vê gavê jê bibe")
.on("click", function () {
steps.splice(steps.indexOf(step), 1);
changed();
structureChanged();
}));
}
$block.append($head);
var def = defFor(keywords(), step.keyword);
if (def && def.min > 1) {
$block.append($("<div class='dsb-tpl-help'></div>")
.text("Ev kelîmeya mifteyî bi kêmî " + def.min + " kelîmeyan dixwaze."));
}
if (def && def.invisible) {
$block.append($("<div class='dsb-tpl-help'></div>")
.text("Di metnê de xuya nabe; tenê kategoriyan çêdike."));
}
if (!step.words.length) {
step.words.push(emptyWord());
}
var $words = $("<ul class='dsb-etimon-words'></ul>");
step.words.forEach(function (word) {
$words.append(wordRow(step, word, step.words, nested));
});
$block.append($words);
$block.append($("<button type='button' class='dsb-etimon-add'>+ Kelîme</button>")
.on("click", function () {
step.words.push(emptyWord());
structureChanged();
}));
return $block;
}
function renderSteps($host, steps, nested) {
if (!steps.length) {
steps.push($.extend(emptyStep(), { words: [emptyWord()] }));
}
steps.forEach(function (step) {
$host.append(stepBlock(steps, step, nested));
});
$host.append($("<button type='button' class='dsb-etimon-add'></button>")
.text("+ Gaveke etîmolojiyê")
.attr("title", "Gaveke din a eynî bangkirinê")
.on("click", function () {
steps.push($.extend(emptyStep(), { words: [emptyWord()] }));
structureChanged();
}));
}
// metn= picks how much of the chain is written out; the values that need a number or a language
// code ("3", ":pal") open a box of their own.
function metnControl() {
var $wrap = $("<div class='dsb-etimon-metn'></div>");
var choices = data.metnChoices || [];
var $select = $("<select class='dsb-etimon-metn-select'></select>");
$select.append($("<option value=''>— metn nayê nîşandan —</option>"));
choices.forEach(function (choice) {
$select.append($("<option></option>").val(choice.value).text(choice.value + " — " + choice.desc));
});
var split = splitMetn(model.named.metn);
$select.val(split.choice);
var $free = $("<input type='text' class='dsb-input dsb-etimon-metn-free'>").val(split.rest);
function choiceFor(value) {
var found = null;
choices.forEach(function (choice) {
if (choice.value === value) {
found = choice;
}
});
return found;
}
function apply() {
var choice = choiceFor($select.val());
$free.toggle(!!(choice && choice.free));
if (choice && choice.free) {
$free.attr("placeholder", choice.value === "1" ? "hejmar…" : "koda zimanî…");
}
setNamed(model, "metn", joinMetn($select.val(), $free.val()));
changed();
}
$select.on("change", apply);
$free.on("input", apply);
apply();
$select.attr("data-placeholder", "metn");
$wrap.append($("<span class='dsb-adv-label'>Metn</span>"), util.wrapNativeSelect($select), $free);
$select.trigger("wiktku:refresh");
return $wrap;
}
// The parameters marked "primary" in the data sit in the open next to Metn; the rest are behind
// "Parametreyên din".
function namedParams(primary) {
var $wrap = $("<div class='dsb-etimon-named'></div>");
(data.params || []).forEach(function (param) {
if (!!param.primary !== !!primary) {
return;
}
var value = model.named[param.key] || "";
var $row = $("<div class='dsb-etimon-param'></div>");
if (param.type === "flag") {
$row.addClass("dsb-etimon-param-flag");
var id = "dsb-etimon-" + param.key.replace(/[^A-Za-z0-9]/g, "");
var $box = $("<input type='checkbox'>").attr("id", id).prop("checked", value === "1");
$box.on("change", function () {
setNamed(model, param.key, $box.prop("checked") ? "1" : "");
changed();
});
$row.append($box, $("<label class='dsb-adv-label'></label>").attr("for", id)
.text(param.key + " — " + param.desc));
} else {
var $field;
if (param.type === "select") {
$field = $("<select class='dsb-etimon-param-select'></select>");
$field.append($("<option value=''></option>"));
(param.values || []).forEach(function (v) {
$field.append($("<option></option>").val(v).text(v));
});
$field.val(value);
} else {
$field = $("<input type='text' class='dsb-input'>").val(value);
}
$field.on("input change", function () {
setNamed(model, param.key, $.trim(String($field.val() || "")));
changed();
});
$row.append($("<label class='dsb-adv-label'></label>").text(param.key), $field,
$("<div class='dsb-tpl-help'></div>").text(param.desc));
}
$wrap.append($row);
});
return $wrap;
}
function render() {
$element.empty();
$element.append($("<div class='dsb-tpl-name'></div>").append(
$("<a></a>").attr("href", mw.util.getUrl("Şablon:" + NAME))
.attr("target", "_blank").text("{{" + NAME + "}}")
));
var $lang = $("<div class='dsb-etimon-pagelang'></div>");
$lang.append($("<span class='dsb-adv-label'>Zimanê rûpelê</span>"),
languageInput(model.lang, function (value) {
model.lang = value;
changed();
}));
$element.append($lang);
var $steps = $("<div class='dsb-etimon-steps'></div>");
renderSteps($steps, model.steps, false);
$element.append($steps);
$element.append(metnControl());
$element.append(namedParams(true));
var $more = $("<details class='dsb-etimon-more'></details>");
$more.append($("<summary>Parametreyên din</summary>"), namedParams(false));
$more.on("toggle", function () {
if (onResize) {
onResize();
}
});
$element.append($more);
$element.append($("<div class='dsb-etimon-preview-wrap'></div>").append($preview));
changed();
}
render();
return {
$element: $element,
values: function () {
return buildCall(model);
}
};
}
// A call for a page in this language with one empty step, and metn=++ so it actually writes something.
function emptyModel(lang) {
var model = { lang: lang || "", steps: [$.extend(emptyStep(), { words: [emptyWord()] })],
named: {}, namedOrder: [] };
setNamed(model, "metn", "++");
return model;
}
// ---- the dialog --------------------------------------------------------------------------------
var manager = null;
function windowManager() {
if (!manager) {
manager = new OO.ui.WindowManager();
$(document.body).append(manager.$element);
}
return manager;
}
// Opens one {{etîmon}} call in the builder. Resolves with the edited wikitext, "" for "Jê bibe", or
// null when it is cancelled -- the contract cite.openTemplateDialog() has, since it is called in its
// place. One at a time, for the same reason: a second window the manager does not track is dead.
var busy = false;
function openDialog(callWikitext) {
var done = $.Deferred();
if (busy) {
return done.resolve(null).promise();
}
var parsed = parseCall(callWikitext);
if (!parsed) {
return done.resolve(null).promise();
}
var model = parsed.steps.length ? parsed : emptyModel(parsed.lang);
busy = true;
done.always(function () {
busy = false;
});
mw.loader.using(["oojs-ui-core", "oojs-ui-windows"]).then(function () {
var result = null;
var ParentDialog = OO.ui.ProcessDialog;
function EtimonDialog(config) {
ParentDialog.call(this, config);
}
OO.inheritClass(EtimonDialog, ParentDialog);
EtimonDialog.static.name = "etimonDialog";
EtimonDialog.static.title = "{{" + NAME + "}}";
EtimonDialog.static.actions = [
{ action: "save", label: "Biguhêre", flags: ["primary", "progressive"] },
{ action: "remove", label: "Jê bibe", flags: "destructive" },
{ label: util.msg.cancel, flags: "safe" }
];
EtimonDialog.prototype.initialize = function () {
var dialog = this;
ParentDialog.prototype.initialize.apply(this, arguments);
this.panel = new OO.ui.PanelLayout({ padded: true, expanded: false });
this.form = buildForm(model, function () {
dialog.updateSize();
});
this.panel.$element.append(this.form.$element);
this.$body.append(this.panel.$element);
};
EtimonDialog.prototype.getBodyHeight = function () {
return this.panel.$element.outerHeight(true);
};
EtimonDialog.prototype.getActionProcess = function (action) {
var dialog = this;
if (action === "save" || action === "remove") {
return new OO.ui.Process(function () {
result = action === "remove" ? "" : dialog.form.values();
dialog.close();
});
}
return ParentDialog.prototype.getActionProcess.call(this, action);
};
var windows = windowManager();
var dialog = new EtimonDialog({ size: "large" });
windows.addWindows([dialog]);
var instance = windows.openWindow(dialog);
instance.closed.then(function () {
windows.clearWindows();
done.resolve(result);
});
instance.opening.fail(function () {
windows.clearWindows();
done.resolve(null);
});
}, function () {
done.resolve(null);
});
return done.promise();
}
module.exports = {
NAME: NAME,
splitMetn: splitMetn,
joinMetn: joinMetn,
isEtimonName: isEtimonName,
parseCall: parseCall,
buildCall: buildCall,
parseChain: parseChain,
joinChain: joinChain,
openDialog: openDialog
};
}());
// </nowiki>
0hgkc2xbam4rrflo1vp56kdw9vlxu5g
6532614
6532547
2026-09-19T09:02:36Z
Wikihez
7344
DefSideBoxes: hide the pending-changes box while a dialog is open
6532614
javascript
text/javascript
// <nowiki>
/*
* Page: [[MediaWiki:Gadget-wikt.cite/etimon.js]]
*
* The builder behind {{etîmon}}: one call is read into steps of "kelîmeya mifteyî + kelîmeyên jêder",
* every source word carrying its own <guherîner>s and, when its page has no etymology of its own, an
* inline <etimon:…> chain of further steps.
*
* Keywords, modifiers, the metn= values and the named parameters all come from the "etimon" block of
* data-main.json, so a new one is added there rather than here. cite.openTemplateDialog() hands every
* {{etîmon}} call to openDialog(), which is what DefSideBoxes and the wizard both call.
*/
(function () {
"use strict";
var edit = require("ext.gadget.wikt.edit");
var util = edit.util;
var langs = edit.langs;
var wt = edit.wt;
var data = edit.data.etimon || {};
var NAME = "etîmon";
// Every name the template answers to: a call written under one of its redirects still opens the builder.
var NAMES = ["etîmon", "etimon", "etymon"];
// <etimon:…> is spelled without "î": modifier names inside <> are ASCII only.
var INLINE_KEYS = ["etimon", "ety"];
function isEtimonName(name) {
return NAMES.indexOf($.trim(name || "").toLowerCase().replace(/^şablon:\s*/i, "")) !== -1;
}
// ---- the tables ---------------------------------------------------------------------------------
function keywords() {
return data.keywords || [];
}
function wordMods() {
return data.wordMods || [];
}
function keywordMods() {
return data.keywordMods || [];
}
// The entry for a key or for one of its documented aliases, so ":inh" is understood as ":mîr".
function defFor(defs, key) {
var found = null;
defs.forEach(function (def) {
if (found) {
return;
}
if (def.key === key || (def.aliases || []).indexOf(key) !== -1) {
found = def;
}
});
return found;
}
function isKeywordModName(key) {
return !!defFor(keywordMods(), key);
}
// ---- reading a call ----------------------------------------------------------------------------
// The ">" closing the "<" at start, skipping the nested ones an <etimon:…> or an <id:…> inside it has.
function matchAngle(text, start) {
var depth = 0;
for (var i = start; i < text.length; i++) {
var ch = text.charAt(i);
if (ch === "<") {
depth++;
} else if (ch === ">") {
depth--;
if (depth === 0) {
return i;
}
}
}
return -1;
}
// Splits on the "|" that separate parameters, and only those: a <ref:{{ş|R:X}}> carries pipes of its own.
function splitParams(text) {
var out = [];
var buf = "";
var braces = 0;
var angles = 0;
for (var i = 0; i < text.length; i++) {
var two = text.substr(i, 2);
if (two === "{{" || two === "}}") {
braces += two === "{{" ? 1 : -1;
buf += two;
i++;
continue;
}
var ch = text.charAt(i);
if (ch === "<") {
angles++;
} else if (ch === ">") {
angles = Math.max(0, angles - 1);
}
if (ch === "|" && braces <= 0 && angles === 0) {
out.push(buf);
buf = "";
continue;
}
buf += ch;
}
out.push(buf);
return out;
}
function parseMod(inner) {
var at = inner.indexOf(":");
if (at === -1) {
return { key: $.trim(inner), flag: true };
}
return { key: $.trim(inner.slice(0, at)), value: inner.slice(at + 1) };
}
// "fa:خانه<tr:xâne><t:mal>" -> { head: "fa:خانه", mods: [...] }
function splitMods(text) {
var head = "";
var mods = [];
var i = 0;
while (i < text.length) {
if (text.charAt(i) === "<") {
var end = matchAngle(text, i);
if (end === -1) {
head += text.slice(i);
break;
}
mods.push(parseMod(text.slice(i + 1, end)));
i = end + 1;
continue;
}
head += text.charAt(i);
i++;
}
return { head: head, mods: mods };
}
function emptyWord() {
return { lang: "", word: "", mods: [], steps: [] };
}
function emptyStep() {
return { keyword: "", mods: [], words: [] };
}
function parseWord(text) {
var split = splitMods($.trim(text));
var word = emptyWord();
var head = split.head;
// A language code, or a language family ("ira:-"); anything else is the word itself.
var m = /^([a-zA-Z][a-zA-Z0-9._-]*):([\s\S]*)$/.exec(head);
if (m) {
word.lang = m[1];
head = m[2];
}
word.word = head;
split.mods.forEach(function (mo) {
if (INLINE_KEYS.indexOf(mo.key) !== -1) {
word.steps = parseChain(mo.value || "");
return;
}
word.mods.push(mo);
});
return word;
}
// The inside of an <etimon:…>: ":kelîmeyeke mifteyî" followed by each source word in its own <…>.
// A group named after a keyword modifier belongs to the keyword, which is how Modul:etymon reads it too.
function parseChain(text) {
var steps = [];
var i = 0;
function current() {
if (!steps.length) {
steps.push(emptyStep());
}
return steps[steps.length - 1];
}
while (i < text.length) {
var ch = text.charAt(i);
if (ch === ":") {
var j = i + 1;
while (j < text.length && text.charAt(j) !== ":" && text.charAt(j) !== "<") {
j++;
}
var step = emptyStep();
step.keyword = $.trim(text.slice(i + 1, j));
steps.push(step);
i = j;
continue;
}
if (ch === "<") {
var end = matchAngle(text, i);
if (end === -1) {
break;
}
var inner = text.slice(i + 1, end);
i = end + 1;
var name = /^([^:>]+)/.exec(inner);
var step2 = current();
if (!step2.words.length && name && isKeywordModName($.trim(name[1]))) {
step2.mods.push(parseMod(inner));
} else {
step2.words.push(parseWord(inner));
}
continue;
}
i++;
}
return steps;
}
// One {{etîmon}} call -> the model the form edits, or null for anything else.
function parseCall(callWikitext) {
var call = wt.parseTemplateCalls(callWikitext || "").calls[0];
if (!call || !isEtimonName(call.name)) {
return null;
}
var model = { lang: "", steps: [], named: {}, namedOrder: [] };
var positional = 0;
splitParams(call.params.join("|")).forEach(function (raw) {
// A name cannot hold "<": that is a modifier, so "fa:x<t:a=b>" stays positional.
var m = /^\s*([^|={}<>\n]+?)\s*=([\s\S]*)$/.exec(raw);
if (m) {
if (model.named[m[1]] === undefined) {
model.namedOrder.push(m[1]);
}
model.named[m[1]] = $.trim(m[2]);
return;
}
positional++;
var value = $.trim(raw);
if (positional === 1) {
model.lang = value;
return;
}
if (value.charAt(0) === ":") {
var split = splitMods(value);
var step = emptyStep();
step.keyword = $.trim(split.head.slice(1));
step.mods = split.mods;
model.steps.push(step);
return;
}
if (!model.steps.length) {
model.steps.push(emptyStep());
}
model.steps[model.steps.length - 1].words.push(parseWord(value));
});
return model;
}
// ---- writing it back ---------------------------------------------------------------------------
function joinMods(mods) {
return (mods || []).map(function (mo) {
return mo.flag ? "<" + mo.key + ">" : "<" + mo.key + ":" + (mo.value || "") + ">";
}).join("");
}
// A row nobody filled in: no word, no language, nothing hanging off it.
function wordIsEmpty(word) {
return !$.trim(word.word || "") && !$.trim(word.lang || "") &&
!(word.mods || []).length && !(word.steps || []).length;
}
function joinWord(word) {
var lang = $.trim(word.lang || "");
var out = (lang ? lang + ":" : "") + $.trim(word.word || "") + joinMods(word.mods);
if ((word.steps || []).length) {
out += "<etimon:" + joinChain(word.steps) + ">";
}
return out;
}
function joinChain(steps) {
return (steps || []).map(function (step) {
return ":" + $.trim(step.keyword || "") + joinMods(step.mods) +
(step.words || []).filter(function (word) {
return !wordIsEmpty(word);
}).map(function (word) {
return "<" + joinWord(word) + ">";
}).join("");
}).join("");
}
function buildCall(model) {
var parts = [NAME, $.trim(model.lang || "")];
(model.steps || []).forEach(function (step) {
var keyword = $.trim(step.keyword || "");
if (keyword || (step.mods || []).length) {
parts.push(":" + keyword + joinMods(step.mods));
}
(step.words || []).forEach(function (word) {
if (!wordIsEmpty(word)) {
parts.push(joinWord(word));
}
});
});
(model.namedOrder || []).forEach(function (key) {
var value = model.named[key];
if (value !== undefined && value !== null && value !== "") {
parts.push(key + "=" + value);
}
});
return "{{" + parts.join("|") + "}}";
}
// Which metn= choice a written value belongs to, and what is left over for that choice's own box:
// "3" belongs to the number choice, ":pal*" to the ":kod*" one.
function splitMetn(value) {
var current = $.trim(value || "");
var out = { choice: "", rest: "" };
if (!current) {
return out;
}
(data.metnChoices || []).forEach(function (choice) {
if (out.choice) {
return;
}
if (!choice.free) {
if (choice.value === current) {
out.choice = choice.value;
}
return;
}
if (choice.value === "1" && /^\d+$/.test(current)) {
out.choice = choice.value;
out.rest = current;
} else if (choice.value === ":*" && /^:.+\*$/.test(current)) {
out.choice = choice.value;
out.rest = current.slice(1, -1);
} else if (choice.value === ":" && /^:[^*]+$/.test(current)) {
out.choice = choice.value;
out.rest = current.slice(1);
}
});
return out;
}
// The inverse: what the dropdown and its box together mean as a metn= value.
function joinMetn(choiceValue, rest) {
var choice = null;
(data.metnChoices || []).forEach(function (c) {
if (c.value === choiceValue) {
choice = c;
}
});
if (!choice) {
return "";
}
if (!choice.free) {
return choice.value;
}
var typed = $.trim(rest || "");
if (!typed) {
return "";
}
if (choice.value === "1") {
return typed;
}
return ":" + typed + (choice.value === ":*" ? "*" : "");
}
function setNamed(model, key, value) {
if (model.namedOrder.indexOf(key) === -1) {
model.namedOrder.push(key);
}
model.named[key] = value;
}
// ---- the form ----------------------------------------------------------------------------------
// Chips for one list of modifiers, plus the ⊕ that adds another. The pills, the value box and the
// chips are the same widgetry a sense word row uses, so they look and behave the same here.
// Whether a modifier applies under the keyword it is being offered for: an "only" list in the data
// (aftype under :qf, maneid under :wergirtin) keeps it off every other keyword's picker.
function modApplies(def, keyword) {
if (!(def.only || []).length) {
return true;
}
var canonical = defFor(keywords(), keyword);
return def.only.indexOf(canonical ? canonical.key : keyword) !== -1;
}
function modifierEditor(mods, defs, onChange, keywordOf) {
var $wrap = $("<div class='dsb-etimon-mods'></div>");
var $chips = $("<div class='dsb-word-mods'></div>");
var $btn = $("<button type='button' class='dsb-mod-btn'>⊕</button>")
.attr("title", util.msg.addModifier);
var $picker = $("<div class='dsb-mod-picker'></div>").hide();
function label(def) {
return def ? def.key + " — " + def.desc : "";
}
// Same box for adding and for editing: a modifier with a fixed set of values gets a dropdown.
function openValueEditor(def, index) {
$picker.hide();
$wrap.children(".dsb-mod-val-wrap").remove();
var $box = $("<div class='dsb-mod-val-wrap'></div>");
var $label = $("<span class='dsb-mod-val-label'></span>").text(def.key);
var current = index === -1 ? "" : (mods[index].value || "");
var $field;
if ((def.values || []).length) {
$field = $("<select class='dsb-mod-val-input'></select>");
$field.append($("<option value=''></option>"));
def.values.forEach(function (value) {
$field.append($("<option></option>").val(value).text(value));
});
$field.val(current);
} else {
$field = $("<input type='text' class='dsb-mod-val-input'>")
.attr("size", 24).attr("placeholder", def.desc).val(current);
}
var $ok = $("<button type='button' class='dsb-mod-confirm'>✓</button>");
var $no = $("<button type='button' class='dsb-mod-cancel'>✕</button>");
function apply() {
var value = $.trim(String($field.val() || ""));
if (value) {
if (index === -1) {
mods.push({ key: def.key, value: value });
} else {
mods[index].value = value;
}
onChange();
render();
}
$box.remove();
}
$ok.on("click", apply);
$no.on("click", function () {
$box.remove();
});
$field.on("keydown", function (e) {
if (e.which === 13) {
e.preventDefault();
apply();
}
if (e.which === 27) {
$box.remove();
}
});
$box.append($label, $field, $ok, $no);
$wrap.append($box);
$field.focus();
}
function render() {
$chips.empty();
mods.forEach(function (mo, index) {
var def = defFor(defs, mo.key);
var $chip = $("<span class='dsb-word-mod-chip' role='button' tabindex='0'></span>")
.attr("title", def ? def.desc : mo.key)
.text(mo.flag ? mo.key : mo.key + ": " + (mo.value || ""));
var $x = $("<button type='button' class='dsb-word-mod-chip-remove'>×</button>")
.attr("title", util.msg.removeModifier);
$x.on("click", function (e) {
e.stopPropagation();
mods.splice(index, 1);
onChange();
render();
});
$chip.on("click", function () {
if (def && !mo.flag) {
openValueEditor(def, index);
}
});
$chip.append($x);
$chips.append($chip);
});
$chips.toggle(!!mods.length);
}
// Rebuilt per open rather than once: the keyword can change while the row is on screen, and with
// it which modifiers are on offer.
$btn.on("click", function (e) {
e.preventDefault();
var keyword = keywordOf ? keywordOf() : "";
$picker.empty();
defs.forEach(function (def) {
// <etimon:…> has the "+ Etîmolojiya di cih de" button of its own; as a pill it would be a
// box asking for a whole chain in one line.
if (INLINE_KEYS.indexOf(def.key) !== -1 || !modApplies(def, keyword)) {
return;
}
var $pill = $("<button type='button' class='dsb-mod-pill'></button>")
.text(def.key).attr("title", label(def)).data("mod-key", def.key);
$pill.on("click", function (ev) {
ev.preventDefault();
if (def.flag) {
mods.push({ key: def.key, flag: true });
$picker.hide();
onChange();
render();
return;
}
openValueEditor(def, -1);
});
$picker.append($pill);
});
var used = {};
mods.forEach(function (mo) {
used[mo.key] = true;
});
$picker.children(".dsb-mod-pill").each(function () {
var isUsed = !!used[$(this).data("mod-key")];
$(this).prop("disabled", isUsed).toggleClass("dsb-mod-pill-used", isUsed);
});
$picker.toggle();
});
render();
$wrap.append($chips, $btn, $picker);
return $wrap;
}
function languageInput(value, onChange) {
var $input = $("<input type='text' class='dsb-input dsb-etimon-lang'>")
.attr("list", langs.datalistId())
.attr("placeholder", "koda zimanî…")
.val(value || "");
$input.on("input change", function () {
if (langs.missingFromCore($input.val())) {
langs.ensureFull();
}
onChange($.trim($input.val()));
});
return $input;
}
// The whole form for one call. Structural changes (a step or a word added or dropped) rebuild it from
// the model, which every box writes into as it is typed in.
function buildForm(model, onResize) {
var $element = $("<div class='dsb-etimon'></div>");
var $preview = $("<code class='dsb-etimon-preview'></code>");
function changed() {
$preview.text(buildCall(model));
}
function structureChanged() {
render();
if (onResize) {
onResize();
}
}
function keywordSelect(step) {
var $select = $("<select class='dsb-etimon-keyword'></select>");
$select.append($("<option value=''>— kelîmeya mifteyî —</option>"));
keywords().forEach(function (def) {
$select.append($("<option></option>").val(def.key).text(def.key + " — " + def.desc));
});
// A keyword written under an alias, or one the table does not know, keeps its own option.
var known = defFor(keywords(), step.keyword);
if (step.keyword && (!known || known.key !== step.keyword)) {
$select.append($("<option></option>").val(step.keyword)
.text(step.keyword + (known ? " — " + known.desc : " — (ne di belgeyê de)")));
}
$select.val(step.keyword);
$select.on("change", function () {
step.keyword = $select.val();
changed();
structureChanged(); // the hints under it (how many words, what they mean) follow the keyword
});
$select.attr("data-placeholder", "Kelîmeya mifteyî");
var $wrapped = util.wrapNativeSelect($select);
// The searchable box reads the selection only when told to, so a keyword already chosen shows.
$select.trigger("wiktku:refresh");
return $wrapped;
}
function wordRow(step, word, words, nested) {
var $li = $("<li class='dsb-etimon-word'></li>");
var $row = $("<div class='dsb-etimon-word-row'></div>");
var $lang = languageInput(word.lang, function (value) {
word.lang = value;
changed();
});
var $word = $("<input type='text' class='dsb-input dsb-etimon-word-input'>")
.attr("placeholder", "kelîme ( - = tenê navê zimên )")
.val(word.word || "");
$word.on("input", function () {
word.word = $word.val();
changed();
});
var $remove = $("<button type='button' class='dsb-etimon-remove'>×</button>")
.attr("title", "Vê kelîmeyê jê bibe");
$remove.on("click", function () {
words.splice(words.indexOf(word), 1);
if (!words.length && !nested) {
words.push(emptyWord());
}
changed();
structureChanged();
});
$row.append($lang, $word, modifierEditor(word.mods, wordMods(), changed, function () {
return step.keyword;
}), $remove);
$li.append($row);
// The way on to the next step when the source word's own page carries no {{etîmon}}.
if ((word.steps || []).length) {
var $nested = $("<div class='dsb-etimon-nested'></div>");
$nested.append($("<div class='dsb-etimon-nested-head'></div>").append(
$("<span class='dsb-adv-label'>Etîmolojiya di cih de</span>"),
$("<button type='button' class='dsb-etimon-remove'>×</button>")
.attr("title", "Etîmolojiya di cih de jê bibe")
.on("click", function () {
word.steps = [];
changed();
structureChanged();
})
));
renderSteps($nested, word.steps, true);
$li.append($nested);
} else {
$li.append($("<button type='button' class='dsb-etimon-add'></button>")
.text("+ Etîmolojiya di cih de")
.attr("title", "Zincîrê li vir bidomîne, eger rûpela vê kelîmeyê tune be")
.on("click", function () {
word.steps = [$.extend(emptyStep(), { words: [emptyWord()] })];
changed();
structureChanged();
}));
}
return $li;
}
function stepBlock(steps, step, nested) {
var $block = $("<div class='dsb-etimon-step'></div>");
var $head = $("<div class='dsb-etimon-step-head'></div>");
$head.append(keywordSelect(step));
$head.append(modifierEditor(step.mods, keywordMods(), changed, function () {
return step.keyword;
}));
if (steps.length > 1 || nested) {
$head.append($("<button type='button' class='dsb-etimon-remove'>×</button>")
.attr("title", "Vê gavê jê bibe")
.on("click", function () {
steps.splice(steps.indexOf(step), 1);
changed();
structureChanged();
}));
}
$block.append($head);
var def = defFor(keywords(), step.keyword);
if (def && def.min > 1) {
$block.append($("<div class='dsb-tpl-help'></div>")
.text("Ev kelîmeya mifteyî bi kêmî " + def.min + " kelîmeyan dixwaze."));
}
if (def && def.invisible) {
$block.append($("<div class='dsb-tpl-help'></div>")
.text("Di metnê de xuya nabe; tenê kategoriyan çêdike."));
}
if (!step.words.length) {
step.words.push(emptyWord());
}
var $words = $("<ul class='dsb-etimon-words'></ul>");
step.words.forEach(function (word) {
$words.append(wordRow(step, word, step.words, nested));
});
$block.append($words);
$block.append($("<button type='button' class='dsb-etimon-add'>+ Kelîme</button>")
.on("click", function () {
step.words.push(emptyWord());
structureChanged();
}));
return $block;
}
function renderSteps($host, steps, nested) {
if (!steps.length) {
steps.push($.extend(emptyStep(), { words: [emptyWord()] }));
}
steps.forEach(function (step) {
$host.append(stepBlock(steps, step, nested));
});
$host.append($("<button type='button' class='dsb-etimon-add'></button>")
.text("+ Gaveke etîmolojiyê")
.attr("title", "Gaveke din a eynî bangkirinê")
.on("click", function () {
steps.push($.extend(emptyStep(), { words: [emptyWord()] }));
structureChanged();
}));
}
// metn= picks how much of the chain is written out; the values that need a number or a language
// code ("3", ":pal") open a box of their own.
function metnControl() {
var $wrap = $("<div class='dsb-etimon-metn'></div>");
var choices = data.metnChoices || [];
var $select = $("<select class='dsb-etimon-metn-select'></select>");
$select.append($("<option value=''>— metn nayê nîşandan —</option>"));
choices.forEach(function (choice) {
$select.append($("<option></option>").val(choice.value).text(choice.value + " — " + choice.desc));
});
var split = splitMetn(model.named.metn);
$select.val(split.choice);
var $free = $("<input type='text' class='dsb-input dsb-etimon-metn-free'>").val(split.rest);
function choiceFor(value) {
var found = null;
choices.forEach(function (choice) {
if (choice.value === value) {
found = choice;
}
});
return found;
}
function apply() {
var choice = choiceFor($select.val());
$free.toggle(!!(choice && choice.free));
if (choice && choice.free) {
$free.attr("placeholder", choice.value === "1" ? "hejmar…" : "koda zimanî…");
}
setNamed(model, "metn", joinMetn($select.val(), $free.val()));
changed();
}
$select.on("change", apply);
$free.on("input", apply);
apply();
$select.attr("data-placeholder", "metn");
$wrap.append($("<span class='dsb-adv-label'>Metn</span>"), util.wrapNativeSelect($select), $free);
$select.trigger("wiktku:refresh");
return $wrap;
}
// The parameters marked "primary" in the data sit in the open next to Metn; the rest are behind
// "Parametreyên din".
function namedParams(primary) {
var $wrap = $("<div class='dsb-etimon-named'></div>");
(data.params || []).forEach(function (param) {
if (!!param.primary !== !!primary) {
return;
}
var value = model.named[param.key] || "";
var $row = $("<div class='dsb-etimon-param'></div>");
if (param.type === "flag") {
$row.addClass("dsb-etimon-param-flag");
var id = "dsb-etimon-" + param.key.replace(/[^A-Za-z0-9]/g, "");
var $box = $("<input type='checkbox'>").attr("id", id).prop("checked", value === "1");
$box.on("change", function () {
setNamed(model, param.key, $box.prop("checked") ? "1" : "");
changed();
});
$row.append($box, $("<label class='dsb-adv-label'></label>").attr("for", id)
.text(param.key + " — " + param.desc));
} else {
var $field;
if (param.type === "select") {
$field = $("<select class='dsb-etimon-param-select'></select>");
$field.append($("<option value=''></option>"));
(param.values || []).forEach(function (v) {
$field.append($("<option></option>").val(v).text(v));
});
$field.val(value);
} else {
$field = $("<input type='text' class='dsb-input'>").val(value);
}
$field.on("input change", function () {
setNamed(model, param.key, $.trim(String($field.val() || "")));
changed();
});
$row.append($("<label class='dsb-adv-label'></label>").text(param.key), $field,
$("<div class='dsb-tpl-help'></div>").text(param.desc));
}
$wrap.append($row);
});
return $wrap;
}
function render() {
$element.empty();
$element.append($("<div class='dsb-tpl-name'></div>").append(
$("<a></a>").attr("href", mw.util.getUrl("Şablon:" + NAME))
.attr("target", "_blank").text("{{" + NAME + "}}")
));
var $lang = $("<div class='dsb-etimon-pagelang'></div>");
$lang.append($("<span class='dsb-adv-label'>Zimanê rûpelê</span>"),
languageInput(model.lang, function (value) {
model.lang = value;
changed();
}));
$element.append($lang);
var $steps = $("<div class='dsb-etimon-steps'></div>");
renderSteps($steps, model.steps, false);
$element.append($steps);
$element.append(metnControl());
$element.append(namedParams(true));
var $more = $("<details class='dsb-etimon-more'></details>");
$more.append($("<summary>Parametreyên din</summary>"), namedParams(false));
$more.on("toggle", function () {
if (onResize) {
onResize();
}
});
$element.append($more);
$element.append($("<div class='dsb-etimon-preview-wrap'></div>").append($preview));
changed();
}
render();
return {
$element: $element,
values: function () {
return buildCall(model);
}
};
}
// A call for a page in this language with one empty step, and metn=++ so it actually writes something.
function emptyModel(lang) {
var model = { lang: lang || "", steps: [$.extend(emptyStep(), { words: [emptyWord()] })],
named: {}, namedOrder: [] };
setNamed(model, "metn", "++");
return model;
}
// ---- the dialog --------------------------------------------------------------------------------
var manager = null;
function windowManager() {
if (!manager) {
manager = new OO.ui.WindowManager();
$(document.body).append(manager.$element);
}
return manager;
}
// Opens one {{etîmon}} call in the builder. Resolves with the edited wikitext, "" for "Jê bibe", or
// null when it is cancelled -- the contract cite.openTemplateDialog() has, since it is called in its
// place. One at a time, for the same reason: a second window the manager does not track is dead.
var busy = false;
function openDialog(callWikitext) {
var done = $.Deferred();
if (busy) {
return done.resolve(null).promise();
}
var parsed = parseCall(callWikitext);
if (!parsed) {
return done.resolve(null).promise();
}
var model = parsed.steps.length ? parsed : emptyModel(parsed.lang);
busy = true;
done.always(function () {
busy = false;
});
mw.loader.using(["oojs-ui-core", "oojs-ui-windows"]).then(function () {
var result = null;
var ParentDialog = OO.ui.ProcessDialog;
function EtimonDialog(config) {
ParentDialog.call(this, config);
}
OO.inheritClass(EtimonDialog, ParentDialog);
EtimonDialog.static.name = "etimonDialog";
EtimonDialog.static.title = "{{" + NAME + "}}";
EtimonDialog.static.actions = [
{ action: "save", label: "Biguhêre", flags: ["primary", "progressive"] },
{ action: "remove", label: "Jê bibe", flags: "destructive" },
{ label: util.msg.cancel, flags: "safe" }
];
EtimonDialog.prototype.initialize = function () {
var dialog = this;
ParentDialog.prototype.initialize.apply(this, arguments);
this.panel = new OO.ui.PanelLayout({ padded: true, expanded: false });
this.form = buildForm(model, function () {
dialog.updateSize();
});
this.panel.$element.append(this.form.$element);
this.$body.append(this.panel.$element);
};
EtimonDialog.prototype.getBodyHeight = function () {
return this.panel.$element.outerHeight(true);
};
EtimonDialog.prototype.getActionProcess = function (action) {
var dialog = this;
if (action === "save" || action === "remove") {
return new OO.ui.Process(function () {
result = action === "remove" ? "" : dialog.form.values();
dialog.close();
});
}
return ParentDialog.prototype.getActionProcess.call(this, action);
};
// Marks the page while this is showing, so a floating box of ours (DefSideBoxes' queue) does
// not sit over a dialog the page's stacking order puts underneath it.
$(document.body).addClass("wikt-dialog-open");
done.always(function () {
$(document.body).removeClass("wikt-dialog-open");
});
var windows = windowManager();
var dialog = new EtimonDialog({ size: "large" });
windows.addWindows([dialog]);
var instance = windows.openWindow(dialog);
instance.closed.then(function () {
windows.clearWindows();
done.resolve(result);
});
instance.opening.fail(function () {
windows.clearWindows();
done.resolve(null);
});
}, function () {
done.resolve(null);
});
return done.promise();
}
module.exports = {
NAME: NAME,
splitMetn: splitMetn,
joinMetn: joinMetn,
isEtimonName: isEtimonName,
parseCall: parseCall,
buildCall: buildCall,
parseChain: parseChain,
joinChain: joinChain,
openDialog: openDialog
};
}());
// </nowiki>
orb9bq3exeqyqbljyoghbnqtsft1vqv
Kategorî:Anagram bi tirkî
14
1359262
6532117
2026-09-19T07:13:46Z
Şêr
1103
Rûpel bi "{{katbike}}" hat çêkirin
6532117
wikitext
text/x-wiki
{{katbike}}
1dpx16ue3vl1l6c1hkqu0q6ftpl2ezh
Kategorî:Anagram bi almanî
14
1359263
6532118
2026-09-19T07:14:09Z
Şêr
1103
Rûpel bi "{{katbike}}" hat çêkirin
6532118
wikitext
text/x-wiki
{{katbike}}
1dpx16ue3vl1l6c1hkqu0q6ftpl2ezh
سني
0
1359265
6532922
2026-09-19T09:52:13Z
Wikihez
7344
[[Bikarhêner:Wikihez/templateScript2.js|TS]]: Ji [[en:سني|en.wikt]], [[Bikarhêner:Wikihez/templateScript2.js|TS]]: Ji [[en:سني|en.wikt]]
6532922
wikitext
text/x-wiki
== {{ziman|ar}} ==
=== Bilêvkirin ===
{{ar-pr|سُنِّيّ}}
=== Rengdêr ===
{{rengdêr|ar|سُنِّيّ}}
# {{e|ar|Îslam}} [[sinî]]
==== Etîmolojî ====
{{etîmon|ar|:qertaf|السُّنَّة<t:[[sinet]]ên pêxember Muhammedî><etimon:ji<ar:سُنَّة<t:edet, norm>>>|ـِيّ<id:nîsbe>|text=+|tree=1}}
==== Dûnde ====
* {{dû|az|sünni|deyn=1}}
* {{dû|chg|سنی|deyn=1}}
** {{dû|uz|sunniy}}
* {{dû|fa-cls|سُنِّی|deyn=1}}
** {{dû|prs|سُنِّی}}
** {{dû|fa-ira|سُنّی}}
** {{dû|tg|суннӣ}}
* {{dû|en|Sunni|deyn=1}}
* {{dû|ota|سنی|tr=sünnî|deyn=1}}
** {{dû|tr|Sünni}}
6yrysh9kota0pjoj9e5p2b8ok87pajl
MediaWiki:Gadget-wikt.cite/etimon.js
8
1359266
6533052
2026-09-19T10:12:54Z
Wikihez
7344
Etymology: a builder for {{etîmon}} — keywords, modifiers, metn= values and in-place chains, driven by the etimon block of data-main.json
6533052
javascript
text/javascript
// <nowiki>
/*
* Page: [[MediaWiki:Gadget-wikt.cite/etimon.js]]
*
* The builder behind {{etîmon}}: one call is read into steps of "kelîmeya mifteyî + kelîmeyên jêder",
* every source word carrying its own <guherîner>s and, when its page has no etymology of its own, an
* inline <etimon:…> chain of further steps.
*
* Keywords, modifiers, the metn= values and the named parameters all come from the "etimon" block of
* data-main.json, so a new one is added there rather than here. cite.openTemplateDialog() hands every
* {{etîmon}} call to openDialog(), which is what DefSideBoxes and the wizard both call.
*/
(function () {
"use strict";
var edit = require("ext.gadget.wikt.edit");
var util = edit.util;
var langs = edit.langs;
var wt = edit.wt;
var data = edit.data.etimon || {};
var NAME = "etîmon";
// Every name the template answers to: a call written under one of its redirects still opens the builder.
var NAMES = ["etîmon", "etimon", "etymon"];
// <etimon:…> is spelled without "î": modifier names inside <> are ASCII only.
var INLINE_KEYS = ["etimon", "ety"];
function isEtimonName(name) {
return NAMES.indexOf($.trim(name || "").toLowerCase().replace(/^şablon:\s*/i, "")) !== -1;
}
// ---- the tables ---------------------------------------------------------------------------------
function keywords() {
return data.keywords || [];
}
function wordMods() {
return data.wordMods || [];
}
function keywordMods() {
return data.keywordMods || [];
}
// The entry for a key or for one of its documented aliases, so ":inh" is understood as ":mîr".
function defFor(defs, key) {
var found = null;
defs.forEach(function (def) {
if (found) {
return;
}
if (def.key === key || (def.aliases || []).indexOf(key) !== -1) {
found = def;
}
});
return found;
}
function isKeywordModName(key) {
return !!defFor(keywordMods(), key);
}
// ---- reading a call ----------------------------------------------------------------------------
// The ">" closing the "<" at start, skipping the nested ones an <etimon:…> or an <id:…> inside it has.
function matchAngle(text, start) {
var depth = 0;
for (var i = start; i < text.length; i++) {
var ch = text.charAt(i);
if (ch === "<") {
depth++;
} else if (ch === ">") {
depth--;
if (depth === 0) {
return i;
}
}
}
return -1;
}
// Splits on the "|" that separate parameters, and only those: a <ref:{{ş|R:X}}> carries pipes of its own.
function splitParams(text) {
var out = [];
var buf = "";
var braces = 0;
var angles = 0;
for (var i = 0; i < text.length; i++) {
var two = text.substr(i, 2);
if (two === "{{" || two === "}}") {
braces += two === "{{" ? 1 : -1;
buf += two;
i++;
continue;
}
var ch = text.charAt(i);
if (ch === "<") {
angles++;
} else if (ch === ">") {
angles = Math.max(0, angles - 1);
}
if (ch === "|" && braces <= 0 && angles === 0) {
out.push(buf);
buf = "";
continue;
}
buf += ch;
}
out.push(buf);
return out;
}
function parseMod(inner) {
var at = inner.indexOf(":");
if (at === -1) {
return { key: $.trim(inner), flag: true };
}
return { key: $.trim(inner.slice(0, at)), value: inner.slice(at + 1) };
}
// "fa:خانه<tr:xâne><t:mal>" -> { head: "fa:خانه", mods: [...] }
function splitMods(text) {
var head = "";
var mods = [];
var i = 0;
while (i < text.length) {
if (text.charAt(i) === "<") {
var end = matchAngle(text, i);
if (end === -1) {
head += text.slice(i);
break;
}
mods.push(parseMod(text.slice(i + 1, end)));
i = end + 1;
continue;
}
head += text.charAt(i);
i++;
}
return { head: head, mods: mods };
}
function emptyWord() {
return { lang: "", word: "", mods: [], steps: [] };
}
function emptyStep() {
return { keyword: "", mods: [], words: [] };
}
function parseWord(text) {
var split = splitMods($.trim(text));
var word = emptyWord();
var head = split.head;
// A language code, or a language family ("ira:-"); anything else is the word itself.
var m = /^([a-zA-Z][a-zA-Z0-9._-]*):([\s\S]*)$/.exec(head);
if (m) {
word.lang = m[1];
head = m[2];
}
word.word = head;
split.mods.forEach(function (mo) {
if (INLINE_KEYS.indexOf(mo.key) !== -1) {
word.steps = parseChain(mo.value || "");
return;
}
word.mods.push(mo);
});
return word;
}
// The inside of an <etimon:…>: ":kelîmeyeke mifteyî" followed by each source word in its own <…>.
// A group named after a keyword modifier belongs to the keyword, which is how Modul:etymon reads it too.
function parseChain(text) {
var steps = [];
var i = 0;
function current() {
if (!steps.length) {
steps.push(emptyStep());
}
return steps[steps.length - 1];
}
while (i < text.length) {
var ch = text.charAt(i);
if (ch === ":") {
var j = i + 1;
while (j < text.length && text.charAt(j) !== ":" && text.charAt(j) !== "<") {
j++;
}
var step = emptyStep();
step.keyword = $.trim(text.slice(i + 1, j));
steps.push(step);
i = j;
continue;
}
if (ch === "<") {
var end = matchAngle(text, i);
if (end === -1) {
break;
}
var inner = text.slice(i + 1, end);
i = end + 1;
var name = /^([^:>]+)/.exec(inner);
var step2 = current();
if (!step2.words.length && name && isKeywordModName($.trim(name[1]))) {
step2.mods.push(parseMod(inner));
} else {
step2.words.push(parseWord(inner));
}
continue;
}
i++;
}
return steps;
}
// One {{etîmon}} call -> the model the form edits, or null for anything else.
function parseCall(callWikitext) {
var call = wt.parseTemplateCalls(callWikitext || "").calls[0];
if (!call || !isEtimonName(call.name)) {
return null;
}
var model = { lang: "", steps: [], named: {}, namedOrder: [] };
var positional = 0;
splitParams(call.params.join("|")).forEach(function (raw) {
// A name cannot hold "<": that is a modifier, so "fa:x<t:a=b>" stays positional.
var m = /^\s*([^|={}<>\n]+?)\s*=([\s\S]*)$/.exec(raw);
if (m) {
if (model.named[m[1]] === undefined) {
model.namedOrder.push(m[1]);
}
model.named[m[1]] = $.trim(m[2]);
return;
}
positional++;
var value = $.trim(raw);
if (positional === 1) {
model.lang = value;
return;
}
if (value.charAt(0) === ":") {
var split = splitMods(value);
var step = emptyStep();
step.keyword = $.trim(split.head.slice(1));
step.mods = split.mods;
model.steps.push(step);
return;
}
if (!model.steps.length) {
model.steps.push(emptyStep());
}
model.steps[model.steps.length - 1].words.push(parseWord(value));
});
return model;
}
// ---- writing it back ---------------------------------------------------------------------------
function joinMods(mods) {
return (mods || []).map(function (mo) {
return mo.flag ? "<" + mo.key + ">" : "<" + mo.key + ":" + (mo.value || "") + ">";
}).join("");
}
// A row nobody filled in: no word, no language, nothing hanging off it.
function wordIsEmpty(word) {
return !$.trim(word.word || "") && !$.trim(word.lang || "") &&
!(word.mods || []).length && !(word.steps || []).length;
}
function joinWord(word) {
var lang = $.trim(word.lang || "");
var out = (lang ? lang + ":" : "") + $.trim(word.word || "") + joinMods(word.mods);
if ((word.steps || []).length) {
out += "<etimon:" + joinChain(word.steps) + ">";
}
return out;
}
function joinChain(steps) {
return (steps || []).map(function (step) {
return ":" + $.trim(step.keyword || "") + joinMods(step.mods) +
(step.words || []).filter(function (word) {
return !wordIsEmpty(word);
}).map(function (word) {
return "<" + joinWord(word) + ">";
}).join("");
}).join("");
}
function buildCall(model) {
var parts = [NAME, $.trim(model.lang || "")];
(model.steps || []).forEach(function (step) {
var keyword = $.trim(step.keyword || "");
if (keyword || (step.mods || []).length) {
parts.push(":" + keyword + joinMods(step.mods));
}
(step.words || []).forEach(function (word) {
if (!wordIsEmpty(word)) {
parts.push(joinWord(word));
}
});
});
(model.namedOrder || []).forEach(function (key) {
var value = model.named[key];
if (value !== undefined && value !== null && value !== "") {
parts.push(key + "=" + value);
}
});
return "{{" + parts.join("|") + "}}";
}
// Which metn= choice a written value belongs to, and what is left over for that choice's own box:
// "3" belongs to the number choice, ":pal*" to the ":kod*" one.
function splitMetn(value) {
var current = $.trim(value || "");
var out = { choice: "", rest: "" };
if (!current) {
return out;
}
(data.metnChoices || []).forEach(function (choice) {
if (out.choice) {
return;
}
if (!choice.free) {
if (choice.value === current) {
out.choice = choice.value;
}
return;
}
if (choice.value === "1" && /^\d+$/.test(current)) {
out.choice = choice.value;
out.rest = current;
} else if (choice.value === ":*" && /^:.+\*$/.test(current)) {
out.choice = choice.value;
out.rest = current.slice(1, -1);
} else if (choice.value === ":" && /^:[^*]+$/.test(current)) {
out.choice = choice.value;
out.rest = current.slice(1);
}
});
return out;
}
// The inverse: what the dropdown and its box together mean as a metn= value.
function joinMetn(choiceValue, rest) {
var choice = null;
(data.metnChoices || []).forEach(function (c) {
if (c.value === choiceValue) {
choice = c;
}
});
if (!choice) {
return "";
}
if (!choice.free) {
return choice.value;
}
var typed = $.trim(rest || "");
if (!typed) {
return "";
}
if (choice.value === "1") {
return typed;
}
return ":" + typed + (choice.value === ":*" ? "*" : "");
}
function setNamed(model, key, value) {
if (model.namedOrder.indexOf(key) === -1) {
model.namedOrder.push(key);
}
model.named[key] = value;
}
// ---- the form ----------------------------------------------------------------------------------
// Chips for one list of modifiers, plus the ⊕ that adds another. The pills, the value box and the
// chips are the same widgetry a sense word row uses, so they look and behave the same here.
// Whether a modifier applies under the keyword it is being offered for: an "only" list in the data
// (aftype under :qf, maneid under :wergirtin) keeps it off every other keyword's picker.
function modApplies(def, keyword) {
if (!(def.only || []).length) {
return true;
}
var canonical = defFor(keywords(), keyword);
return def.only.indexOf(canonical ? canonical.key : keyword) !== -1;
}
function modifierEditor(mods, defs, onChange, keywordOf) {
var $wrap = $("<div class='dsb-etimon-mods'></div>");
var $chips = $("<div class='dsb-word-mods'></div>");
var $btn = $("<button type='button' class='dsb-mod-btn'>⊕</button>")
.attr("title", util.msg.addModifier);
var $picker = $("<div class='dsb-mod-picker'></div>").hide();
function label(def) {
return def ? def.key + " — " + def.desc : "";
}
// Same box for adding and for editing: a modifier with a fixed set of values gets a dropdown.
function openValueEditor(def, index) {
$picker.hide();
$wrap.children(".dsb-mod-val-wrap").remove();
var $box = $("<div class='dsb-mod-val-wrap'></div>");
var $label = $("<span class='dsb-mod-val-label'></span>").text(def.key);
var current = index === -1 ? "" : (mods[index].value || "");
var $field;
if ((def.values || []).length) {
$field = $("<select class='dsb-mod-val-input'></select>");
$field.append($("<option value=''></option>"));
def.values.forEach(function (value) {
$field.append($("<option></option>").val(value).text(value));
});
$field.val(current);
} else {
$field = $("<input type='text' class='dsb-mod-val-input'>")
.attr("size", 24).attr("placeholder", def.desc).val(current);
}
var $ok = $("<button type='button' class='dsb-mod-confirm'>✓</button>");
var $no = $("<button type='button' class='dsb-mod-cancel'>✕</button>");
function apply() {
var value = $.trim(String($field.val() || ""));
if (value) {
if (index === -1) {
mods.push({ key: def.key, value: value });
} else {
mods[index].value = value;
}
onChange();
render();
}
$box.remove();
}
$ok.on("click", apply);
$no.on("click", function () {
$box.remove();
});
$field.on("keydown", function (e) {
if (e.which === 13) {
e.preventDefault();
apply();
}
if (e.which === 27) {
$box.remove();
}
});
$box.append($label, $field, $ok, $no);
$wrap.append($box);
$field.focus();
}
function render() {
$chips.empty();
mods.forEach(function (mo, index) {
var def = defFor(defs, mo.key);
var $chip = $("<span class='dsb-word-mod-chip' role='button' tabindex='0'></span>")
.attr("title", def ? def.desc : mo.key)
.text(mo.flag ? mo.key : mo.key + ": " + (mo.value || ""));
var $x = $("<button type='button' class='dsb-word-mod-chip-remove'>×</button>")
.attr("title", util.msg.removeModifier);
$x.on("click", function (e) {
e.stopPropagation();
mods.splice(index, 1);
onChange();
render();
});
$chip.on("click", function () {
if (def && !mo.flag) {
openValueEditor(def, index);
}
});
$chip.append($x);
$chips.append($chip);
});
$chips.toggle(!!mods.length);
}
// Rebuilt per open rather than once: the keyword can change while the row is on screen, and with
// it which modifiers are on offer.
$btn.on("click", function (e) {
e.preventDefault();
var keyword = keywordOf ? keywordOf() : "";
$picker.empty();
defs.forEach(function (def) {
// <etimon:…> has the "+ Etîmolojiya di cih de" button of its own; as a pill it would be a
// box asking for a whole chain in one line.
if (INLINE_KEYS.indexOf(def.key) !== -1 || !modApplies(def, keyword)) {
return;
}
var $pill = $("<button type='button' class='dsb-mod-pill'></button>")
.text(def.key).attr("title", label(def)).data("mod-key", def.key);
$pill.on("click", function (ev) {
ev.preventDefault();
if (def.flag) {
mods.push({ key: def.key, flag: true });
$picker.hide();
onChange();
render();
return;
}
openValueEditor(def, -1);
});
$picker.append($pill);
});
var used = {};
mods.forEach(function (mo) {
used[mo.key] = true;
});
$picker.children(".dsb-mod-pill").each(function () {
var isUsed = !!used[$(this).data("mod-key")];
$(this).prop("disabled", isUsed).toggleClass("dsb-mod-pill-used", isUsed);
});
$picker.toggle();
});
render();
$wrap.append($chips, $btn, $picker);
return $wrap;
}
function languageInput(value, onChange) {
var $input = $("<input type='text' class='dsb-input dsb-etimon-lang'>")
.attr("list", langs.datalistId())
.attr("placeholder", "koda zimanî…")
.val(value || "");
$input.on("input change", function () {
if (langs.missingFromCore($input.val())) {
langs.ensureFull();
}
onChange($.trim($input.val()));
});
return $input;
}
// The whole form for one call. Structural changes (a step or a word added or dropped) rebuild it from
// the model, which every box writes into as it is typed in.
function buildForm(model, onResize) {
var $element = $("<div class='dsb-etimon'></div>");
var $preview = $("<code class='dsb-etimon-preview'></code>");
function changed() {
$preview.text(buildCall(model));
}
function structureChanged() {
render();
if (onResize) {
onResize();
}
}
function keywordSelect(step) {
var $select = $("<select class='dsb-etimon-keyword'></select>");
$select.append($("<option value=''>— kelîmeya mifteyî —</option>"));
keywords().forEach(function (def) {
$select.append($("<option></option>").val(def.key).text(def.key + " — " + def.desc));
});
// A keyword written under an alias, or one the table does not know, keeps its own option.
var known = defFor(keywords(), step.keyword);
if (step.keyword && (!known || known.key !== step.keyword)) {
$select.append($("<option></option>").val(step.keyword)
.text(step.keyword + (known ? " — " + known.desc : " — (ne di belgeyê de)")));
}
$select.val(step.keyword);
$select.on("change", function () {
step.keyword = $select.val();
changed();
structureChanged(); // the hints under it (how many words, what they mean) follow the keyword
});
$select.attr("data-placeholder", "Kelîmeya mifteyî");
var $wrapped = util.wrapNativeSelect($select);
// The searchable box reads the selection only when told to, so a keyword already chosen shows.
$select.trigger("wiktku:refresh");
return $wrapped;
}
function wordRow(step, word, words, nested) {
var $li = $("<li class='dsb-etimon-word'></li>");
var $row = $("<div class='dsb-etimon-word-row'></div>");
var $lang = languageInput(word.lang, function (value) {
word.lang = value;
changed();
});
var $word = $("<input type='text' class='dsb-input dsb-etimon-word-input'>")
.attr("placeholder", "kelîme ( - = tenê navê zimên )")
.val(word.word || "");
$word.on("input", function () {
word.word = $word.val();
changed();
});
var $remove = $("<button type='button' class='dsb-etimon-remove'>×</button>")
.attr("title", "Vê kelîmeyê jê bibe");
$remove.on("click", function () {
words.splice(words.indexOf(word), 1);
if (!words.length && !nested) {
words.push(emptyWord());
}
changed();
structureChanged();
});
$row.append($lang, $word, modifierEditor(word.mods, wordMods(), changed, function () {
return step.keyword;
}), $remove);
$li.append($row);
// The way on to the next step when the source word's own page carries no {{etîmon}}.
if ((word.steps || []).length) {
var $nested = $("<div class='dsb-etimon-nested'></div>");
$nested.append($("<div class='dsb-etimon-nested-head'></div>").append(
$("<span class='dsb-adv-label'>Etîmolojiya di cih de</span>"),
$("<button type='button' class='dsb-etimon-remove'>×</button>")
.attr("title", "Etîmolojiya di cih de jê bibe")
.on("click", function () {
word.steps = [];
changed();
structureChanged();
})
));
renderSteps($nested, word.steps, true);
$li.append($nested);
} else {
$li.append($("<button type='button' class='dsb-etimon-add'></button>")
.text("+ Etîmolojiya di cih de")
.attr("title", "Zincîrê li vir bidomîne, eger rûpela vê kelîmeyê tune be")
.on("click", function () {
word.steps = [$.extend(emptyStep(), { words: [emptyWord()] })];
changed();
structureChanged();
}));
}
return $li;
}
function stepBlock(steps, step, nested) {
var $block = $("<div class='dsb-etimon-step'></div>");
var $head = $("<div class='dsb-etimon-step-head'></div>");
$head.append(keywordSelect(step));
$head.append(modifierEditor(step.mods, keywordMods(), changed, function () {
return step.keyword;
}));
if (steps.length > 1 || nested) {
$head.append($("<button type='button' class='dsb-etimon-remove'>×</button>")
.attr("title", "Vê gavê jê bibe")
.on("click", function () {
steps.splice(steps.indexOf(step), 1);
changed();
structureChanged();
}));
}
$block.append($head);
var def = defFor(keywords(), step.keyword);
if (def && def.min > 1) {
$block.append($("<div class='dsb-tpl-help'></div>")
.text("Ev kelîmeya mifteyî bi kêmî " + def.min + " kelîmeyan dixwaze."));
}
if (def && def.invisible) {
$block.append($("<div class='dsb-tpl-help'></div>")
.text("Di metnê de xuya nabe; tenê kategoriyan çêdike."));
}
if (!step.words.length) {
step.words.push(emptyWord());
}
var $words = $("<ul class='dsb-etimon-words'></ul>");
step.words.forEach(function (word) {
$words.append(wordRow(step, word, step.words, nested));
});
$block.append($words);
$block.append($("<button type='button' class='dsb-etimon-add'>+ Kelîme</button>")
.on("click", function () {
step.words.push(emptyWord());
structureChanged();
}));
return $block;
}
function renderSteps($host, steps, nested) {
if (!steps.length) {
steps.push($.extend(emptyStep(), { words: [emptyWord()] }));
}
steps.forEach(function (step) {
$host.append(stepBlock(steps, step, nested));
});
$host.append($("<button type='button' class='dsb-etimon-add'></button>")
.text("+ Gaveke etîmolojiyê")
.attr("title", "Gaveke din a eynî bangkirinê")
.on("click", function () {
steps.push($.extend(emptyStep(), { words: [emptyWord()] }));
structureChanged();
}));
}
// metn= picks how much of the chain is written out; the values that need a number or a language
// code ("3", ":pal") open a box of their own.
function metnControl() {
var $wrap = $("<div class='dsb-etimon-metn'></div>");
var choices = data.metnChoices || [];
var $select = $("<select class='dsb-etimon-metn-select'></select>");
$select.append($("<option value=''>— metn nayê nîşandan —</option>"));
choices.forEach(function (choice) {
$select.append($("<option></option>").val(choice.value).text(choice.value + " — " + choice.desc));
});
var split = splitMetn(model.named.metn);
$select.val(split.choice);
var $free = $("<input type='text' class='dsb-input dsb-etimon-metn-free'>").val(split.rest);
function choiceFor(value) {
var found = null;
choices.forEach(function (choice) {
if (choice.value === value) {
found = choice;
}
});
return found;
}
function apply() {
var choice = choiceFor($select.val());
$free.toggle(!!(choice && choice.free));
if (choice && choice.free) {
$free.attr("placeholder", choice.value === "1" ? "hejmar…" : "koda zimanî…");
}
setNamed(model, "metn", joinMetn($select.val(), $free.val()));
changed();
}
$select.on("change", apply);
$free.on("input", apply);
apply();
$select.attr("data-placeholder", "metn");
$wrap.append($("<span class='dsb-adv-label'>Metn</span>"), util.wrapNativeSelect($select), $free);
$select.trigger("wiktku:refresh");
return $wrap;
}
// The parameters marked "primary" in the data sit in the open next to Metn; the rest are behind
// "Parametreyên din".
function namedParams(primary) {
var $wrap = $("<div class='dsb-etimon-named'></div>");
(data.params || []).forEach(function (param) {
if (!!param.primary !== !!primary) {
return;
}
var value = model.named[param.key] || "";
var $row = $("<div class='dsb-etimon-param'></div>");
if (param.type === "flag") {
$row.addClass("dsb-etimon-param-flag");
var id = "dsb-etimon-" + param.key.replace(/[^A-Za-z0-9]/g, "");
var $box = $("<input type='checkbox'>").attr("id", id).prop("checked", value === "1");
$box.on("change", function () {
setNamed(model, param.key, $box.prop("checked") ? "1" : "");
changed();
});
$row.append($box, $("<label class='dsb-adv-label'></label>").attr("for", id)
.text(param.key + " — " + param.desc));
} else {
var $field;
if (param.type === "select") {
$field = $("<select class='dsb-etimon-param-select'></select>");
$field.append($("<option value=''></option>"));
(param.values || []).forEach(function (v) {
$field.append($("<option></option>").val(v).text(v));
});
$field.val(value);
} else {
$field = $("<input type='text' class='dsb-input'>").val(value);
}
$field.on("input change", function () {
setNamed(model, param.key, $.trim(String($field.val() || "")));
changed();
});
$row.append($("<label class='dsb-adv-label'></label>").text(param.key), $field,
$("<div class='dsb-tpl-help'></div>").text(param.desc));
}
$wrap.append($row);
});
return $wrap;
}
function render() {
$element.empty();
$element.append($("<div class='dsb-tpl-name'></div>").append(
$("<a></a>").attr("href", mw.util.getUrl("Şablon:" + NAME))
.attr("target", "_blank").text("{{" + NAME + "}}")
));
var $lang = $("<div class='dsb-etimon-pagelang'></div>");
$lang.append($("<span class='dsb-adv-label'>Zimanê rûpelê</span>"),
languageInput(model.lang, function (value) {
model.lang = value;
changed();
}));
$element.append($lang);
var $steps = $("<div class='dsb-etimon-steps'></div>");
renderSteps($steps, model.steps, false);
$element.append($steps);
$element.append(metnControl());
$element.append(namedParams(true));
var $more = $("<details class='dsb-etimon-more'></details>");
$more.append($("<summary>Parametreyên din</summary>"), namedParams(false));
$more.on("toggle", function () {
if (onResize) {
onResize();
}
});
$element.append($more);
$element.append($("<div class='dsb-etimon-preview-wrap'></div>").append($preview));
changed();
}
render();
return {
$element: $element,
values: function () {
return buildCall(model);
}
};
}
// A call for a page in this language with one empty step, and metn=++ so it actually writes something.
function emptyModel(lang) {
var model = { lang: lang || "", steps: [$.extend(emptyStep(), { words: [emptyWord()] })],
named: {}, namedOrder: [] };
setNamed(model, "metn", "++");
return model;
}
// ---- the dialog --------------------------------------------------------------------------------
var manager = null;
function windowManager() {
if (!manager) {
manager = new OO.ui.WindowManager();
$(document.body).append(manager.$element);
}
return manager;
}
// Opens one {{etîmon}} call in the builder. Resolves with the edited wikitext, "" for "Jê bibe", or
// null when it is cancelled -- the contract cite.openTemplateDialog() has, since it is called in its
// place. One at a time, for the same reason: a second window the manager does not track is dead.
var busy = false;
function openDialog(callWikitext) {
var done = $.Deferred();
if (busy) {
return done.resolve(null).promise();
}
var parsed = parseCall(callWikitext);
if (!parsed) {
return done.resolve(null).promise();
}
var model = parsed.steps.length ? parsed : emptyModel(parsed.lang);
busy = true;
done.always(function () {
busy = false;
});
mw.loader.using(["oojs-ui-core", "oojs-ui-windows"]).then(function () {
var result = null;
var ParentDialog = OO.ui.ProcessDialog;
function EtimonDialog(config) {
ParentDialog.call(this, config);
}
OO.inheritClass(EtimonDialog, ParentDialog);
EtimonDialog.static.name = "etimonDialog";
EtimonDialog.static.title = "{{" + NAME + "}}";
EtimonDialog.static.actions = [
{ action: "save", label: "Biguhêre", flags: ["primary", "progressive"] },
{ action: "remove", label: "Jê bibe", flags: "destructive" },
{ label: util.msg.cancel, flags: "safe" }
];
EtimonDialog.prototype.initialize = function () {
var dialog = this;
ParentDialog.prototype.initialize.apply(this, arguments);
this.panel = new OO.ui.PanelLayout({ padded: true, expanded: false });
this.form = buildForm(model, function () {
dialog.updateSize();
});
this.panel.$element.append(this.form.$element);
this.$body.append(this.panel.$element);
};
EtimonDialog.prototype.getBodyHeight = function () {
return this.panel.$element.outerHeight(true);
};
EtimonDialog.prototype.getActionProcess = function (action) {
var dialog = this;
if (action === "save" || action === "remove") {
return new OO.ui.Process(function () {
result = action === "remove" ? "" : dialog.form.values();
dialog.close();
});
}
return ParentDialog.prototype.getActionProcess.call(this, action);
};
// Marks the page while this is showing, so a floating box of ours (DefSideBoxes' queue) does
// not sit over a dialog the page's stacking order puts underneath it.
$(document.body).addClass("wikt-dialog-open");
done.always(function () {
$(document.body).removeClass("wikt-dialog-open");
});
var windows = windowManager();
var dialog = new EtimonDialog({ size: "large" });
windows.addWindows([dialog]);
var instance = windows.openWindow(dialog);
instance.closed.then(function () {
windows.clearWindows();
done.resolve(result);
});
instance.opening.fail(function () {
windows.clearWindows();
done.resolve(null);
});
}, function () {
done.resolve(null);
});
return done.promise();
}
module.exports = {
NAME: NAME,
splitMetn: splitMetn,
joinMetn: joinMetn,
isEtimonName: isEtimonName,
parseCall: parseCall,
buildCall: buildCall,
parseChain: parseChain,
joinChain: joinChain,
openDialog: openDialog
};
}());
// </nowiki>
orb9bq3exeqyqbljyoghbnqtsft1vqv