Wîkîferheng
kuwiktionary
https://ku.wiktionary.org/wiki/Destp%C3%AAk
MediaWiki 1.47.0-wmf.13
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
xelat
0
4697
6291979
6291766
2026-07-29T11:59:52Z
Bikarhêner
3719
6291979
wikitext
text/x-wiki
{{Binêre herwiha|Xelat}}
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-IPA}}
* {{deng|ku|LL-Q36163 (kmr)-Ebulfîda-xelat.wav|Deng|Bidlîs}}
* {{ku-kîte}}
=== Navdêr ===
{{ku-tewîn-nav|xelat|mê}}
{{ku-tewîn-nav|xelat|nêr}}
[[Wêne:Medals.jpg|thumb|250pix|çend [[medalye]] ku wek xelat tên dayîn]]
{{navdêr|ku|z=m/n}}, {{t-ya nerm}}
# Tiştê kesek [[wergirtin|werdigire]] dema [[biserketin|bi ser dikeve]]<br>(bi taybetî di [[pêşbazî|pêşbaziyekê]] ango [[pêşbirk]]ekê de).
#: {{nm|ku|Xelata yekem 1 000 dolar e.|Yê bibe yekem dê hezar dolaran wergire.|rêz=1}}
#* {{jêder|ku|{{Jêgirtin/Melayê Cizîrî/Dîwana Melayê Cizirî}}|jêgirtin=[[ba#Daçek 2|Ba]] mujde û emr û berat</br>Nîşan hinarin hem '''xelat'''</br>Şehzadeya gulgûn qeba}}
==== Bi alfabeyên din ====
* {{ku-ar|خهلات}}
==== Bikaranîn ====
* Zayenda vê peyvê di [[kurmanciya navendî]] û [[kurmanciya rojavayî|rojavayî]] de bi piranî mê ye lê di [[kurmanciya rojhilatî]] de bi gelemperî nêr e.
==== Bide ber ====
* {{g|ku|xalet}}
==== Jê ====
{{kol3|ku|cure=Jê
|xelat bûn<q:lêker>
|xelat dan<q:lêker>
|welat girtin
|xelat kirin
|xelat girtin
|xelat danîn
|xelatbûn<q:navdêr>
|xelatdan<q:navdêr>
|welatgirtin
|xelatkirin
|xelatwergirtin
|xelatgirtin
|xelatdanîn
|xelatgirtî<q:rengdêr>
|xelatbexş
|xelatbexşî
|xelatdar
|xelatdarî
|xelatder
|xelatder
|xelatgir
|welatgirî
|xelatî
|xelatwergir
|welatwergirî
}}
==== Etîmolojî ====
Hevreha {{hv|ckb|خهڵات}}, {{hv|fa|خلعت|tr=xel'et|w=[[eba]]yê xelatkirinê}}, {{hv|ota|خلعت}}, {{hv|az|xələt|w=xilat, [[keftan]]}}, {{hv|uz|xalat}}, {{hv|ru|халат}}, {{hv|tr|halat}}... Hemû ji {{deyn|ar|ku|خِلْعَة}} ([[eba]]yê xelatkirinê) ji {{g|ar|خَلَعَ}} ([[ji xwe kirin]], [[ji ber xwe kirin]], [[veşelandin]]). Di zimanên din de wateya "[[eba]], [[kiras]]" yan "ebayê/cilê xelatkirinê" dide lê kurdî (kurmancî û soranî) de wateya "padaşt, xelat" wergirtiye. Bo guherîna ''-i-'' bi ''-e-'' (x'''i'''l'et > x'''e'''lat bidin ber ''[[welat]]'' û ''ʕe'' anku عە (xil'''ʕe'''t > ''xel'''a'''t'') bidin ber ''[['eql]]'' > ''[[aqil]]''.
{{biçûk|
;Çavkanî:
* {{Chyet}},
* {{Tsabolov}}
}}
==== Bi zaravayên din ====
* {{Z|ckb}}: {{W-|ckb|خهڵات}}
Bi kurmancî : psin.
==== Werger ====
{{werger-ser}}
* {{Z|sq}}: {{W+|sq|çmim|n}}
* {{Z|de}}: {{W+|de|Preis|n}}
* {{Z|as}}: {{W-|as|বঁটা}}
* {{Z|az}}: {{W+|az|mükafat}}
* {{Z|be}}: {{W-|be|прэ́мія|m}}, {{W-|be|прыз|n}}, {{W-|be|узнагаро́да|m}}, {{W-|be|нагаро́да|m}}
* {{Z|bn}}: {{W-|bn|প্রাইজ}}, {{W-|bn|পুরষ্কার}}
* {{Z|bg}}: {{W+|bg|награ́да|m}}, {{W+|bg|пре́мия|m}}
* {{Z|my}}: {{W+|my|ဆု}}
* {{Z|cs}}: {{W+|cs|cena|m}}, {{W-|cs|ocenění|nt}}
* {{Z|chr}}: {{W-|chr|ᎠᏓᎪᎾᏙᏗ}}
* {{Z|zh}}:
*: {{Z|cmn}}: {{W+|cmn|獎品|tr=jiǎngpǐn}}, {{W+|cmn|獎金|tr=jiǎngjīn}}
* {{Z|da}}: {{W-|da|præmie|g}}, {{W+|da|pris|g}}
* {{Z|ar}}: {{W-|ar|جَائِزَة|m}}, {{W-|ar|مُكَافَأَة|m}}
* {{Z|hy}}: {{W+|hy|մրցանակ}}
* {{Z|et}}: {{W-|et|auhind}}
* {{Z|fa}}: {{W+|fa|جایزه|tr=jâyeze}}, {{W+|fa|مکافات|tr=mokâfât}}, {{W+|fa|انعام|tr=en'âm}}
* {{Z|fi}}: {{W+|fi|palkinto}}
* {{Z|fr}}: {{W+|fr|prix|n}}
* {{Z|ka}}: {{W-|ka|პრიზი}}, {{W+|ka|ჯილდო}}
* {{Z|hi}}: {{W+|hi|इनाम|n}}, {{W+|hi|पुरस्कार|n}}
* {{Z|nl}}: {{W+|nl|prijs|n}}, {{W+|nl|beloning|m}}, {{W+|nl|premie|m}}
* {{Z|he}}: {{W+|he|פְּרָס|n|tr=pras}}
* {{Z|en}}: {{W+|en|prize}}
* {{Z|ga}}: {{W-|ga|duais|m}}
* {{Z|it}}: {{W+|it|premio|n}}
* {{Z|ja}}: {{W+|ja|賞|tr=しょう, shō}}
* {{Z|ca}}: {{W+|ca|premi|n}}
* {{Z|ky}}: {{W+|ky|байге}}, {{W-|ky|приз}}, {{W+|ky|сыйлык}}
* {{Z|ko}}: {{W+|ko|상}}
* {{Z|ltg}}: {{W-|ltg|duovaņs}}, {{W-|ltg|prizs}}
* {{Z|la}}: {{W-|la|praemium|nt}}
* {{Z|lv}}: {{W-|lv|balva|m}}, {{W-|lv|prēmija|m}}
* {{Z|lo}}: {{W-|lo|ລາງວັນ}}
* {{Z|lt}}: {{W-|lt|prizas|n}}, {{W-|lt|premija|m}}
* {{Z|mk}}: {{W-|mk|награда|m}}
* {{Z|mi}}: {{W-|mi|puiaki}}, {{W-|mi|tohu puiaki}}, {{W-|mi|paraihe}}
* {{Z|hu}}: {{W+|hu|díj}}
* {{Z|mn}}:
*: Kirîlî: {{W+|mn|шагнал}}
*: Mongolî: {{W-|mn|ᠱᠠᠩᠨᠠᠯ}}
* {{Z|nds}}: {{W+|nds|Pries}}
* {{Z|no}}:
*: {{Z|nb}}: {{W+|nb|premie|n}}, {{W+|nb|pris|n}}
* {{Z|oc}}: {{W+|oc|prèmi|n}}
* {{Z|uz}}: {{W+|uz|mukofot}}, {{W+|uz|sovrin}}
* {{Z|ps}}: {{W+|ps|انعام|n|tr=en'ãm}}
* {{Z|pl}}: {{W+|pl|nagroda|m}}
* {{Z|pt}}: {{W+|pt|prêmio|n}}, {{W+|pt|prémio|n}}
* {{Z|kk}}: {{W-|kk|жүлде}}, {{W-|kk|марапат}}, {{W-|kk|сыйлық}}, {{W-|kk|бәйге}}
* {{Z|ro}}: {{W+|ro|premiu|nt}}
* {{Z|ru}}: {{W+|ru|пре́мия|m}}, {{W+|ru|приз|n}}, {{W+|ru|награ́да|m}}
* {{Z|sa}}: {{W+|sa|मीढ|nt}}
* {{Z|sh}}:
*: Kirîlî: {{W-|sh|на̑града|m}}
*: Latînî: {{W+|sh|nȃgrada|m}}
* {{Z|sk}}: {{W+|sk|cena|m}}
* {{Z|sl}}: {{W+|sl|nagrada|m}}
* {{Z|es}}: {{W+|es|premio|n}}
* {{Z|sv}}: {{W+|sv|pris|nt}}, {{W+|sv|vinst|g}}
* {{Z|tg}}: {{W+|tg|мукофот}}, {{W-|tg|ҷоиза}}, {{W+|tg|инъом}}
* {{Z|th}}: {{W+|th|รางวัล}}
* {{Z|tt}}: {{W+|tt|бүләк}}
* {{Z|tr}}: {{W+|tr|ödül}}, {{W+|tr|mükafat}}
* {{Z|tk}}: {{W+|tk|baýrak}}
* {{Z|ur}}: {{W+|ur|انعام|n|tr=in'ām}}
* {{Z|uk}}: {{W+|uk|пре́мія|m}}, {{W-|uk|приз|n}}, {{W-|uk|нагоро́да|m}}
* {{Z|vi}}: {{W+|vi|giải thưởng}}, {{W+|vi|giải}}
* {{Z|cy}}: {{W+|cy|gwobr|m}}
* {{Z|km}}: {{W+|km|រង្វាន់}}
* {{Z|yi}}: {{W-|yi|פּרײַז|n}}, {{W-|yi|פּרעמיע|m}}, {{W-|yi|פּריז|n}}
* {{Z|el}}: {{W+|el|βραβείο|nt}}
*: Kevn: {{W-|grc|βραβεῖον|nt}}, {{W-|grc|ἆθλον|nt}}
{{werger-bin}}
:{{werger çavkanî|en|prize|beş=Ev qismê Wergerê|oldid=75653361}}
7omr76kj0rikjy14tbkx73fhihonpr8
peristin
0
8324
6292023
6253418
2026-07-29T15:45:29Z
Keyomerd
8814
/* Jê */
6292023
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{deng|ku|LL-Q36163 (kmr)-Ebulfîda-peristin.wav|Deng|Bidlîs}}
* {{ku-kîte}}
=== Lêker ===
{{lêker|ku|c=x-gh}}
# [[îbadet]] kirin, [[îbadet]] bo kesekê/î yan tiştekê/î kirin (bi taybetî bo [[xweda]]yekî), [[rojî]] û [[nivêj]] kirin
#: {{mk|ku|Hin kes Xwedê '''diperêsin''', hin jî Şeytanî.}}
#* {{jêder|ku|jêgirtin=Pesin bo Yezdanê Xwedanê gerdûnê,<br>Dilnerm û dilovan,<br>Serdarê Roja Dadkirinê.<br>Tu yî yê em '''diperêsin''', Tu yî yê em hawara xwe digihîninê.<br>Rêya rast nîşanî me bide,<br>rêya yên Te xweş viyane;<br>ne rêya wan yên xezeba Te lê ye<br>û rêwenda digerrin.|Qur'an 1:1-7, wergerandin: Husein Muhammed, https://zimannas.wordpress.com/2015/07/11/184/}}
# bi [[temam]]î li gor kesekê/î yan [[rêbaz]]ekê [[meşîn]]
#: {{mk|ku|Ew Apoyî '''diperêse'''.|Bi her awayî bi gotinên Abdullah Öcalanî dike.|rêz=1}}
==== Ji wêjeya klasîk ====
* {{jêder|ku|{{Jêgirtin/Feqiyê Teyran}}|jêgirtin=Kesê bi işq û muhbet</br>Bi dil yekê '''peristî'''</br>Daim dê bête xizmet}}
==== Bi alfabeyên din ====
* {{ku-ar|پەرستن}}
==== Formên alternatîv ====
* [[perestin]]
* [[perizîn]]
* [[perêsîn]]
==== Tewîn ====
''Lêker'':
* -perês-
==== Bide ber ====
* [[parastin]]
==== Etîmolojî ====
Têkilî [[پرستيدن]] (perestîden) ya farisî, ''peristaten'' ya [[pehlewî]], ''peyri-sta'' (li pêş rawestîn) ya avestayî ji ji {{ji|ira-pro||-}} ''peri-'' (ber, pêş) + ''sta-'' ([[rawestîn]]) ji {{ji|ine-pro|ku|-}} *[[per-]] (ber, pêş) + *[[stā-]] (rawe'''sta'''n, rawestîn, sekinîn). Peyva ermeniya kevn [[պաշտեմ]] (peştim: [[xizmet]] kirin) ji zimanek îranî hatiye deynkirin.
==== Jê ====
{{stûn|
* [[peristîş]]
* [[peristîşî]]
* [[peristkar]]
* [[peristkarî]]
* [[peristmend]]
* [[peristmendî]]
* [[peristyar]]
* [[peristyarî]]
* [[perestar]]
* [[-perês]]
* [[-perêsî]]
* [[-perist]]
* [[-peristî]]
}}
==== Werger ====
{{werger-ser}}
* {{Z|af}}: {{W-|af|adoreer}}, {{W-|af|aanbid}}
* {{Z|sq}}: {{W+|sq|adhuroj}}
* {{Z|de}}: {{W+|de|anbeten}}, {{W+|de|verehren}}, {{W+|de|vergöttern}}, {{W-|de|abgöttisch lieben}}, {{W-|de|tief bewundern}}, {{W+|de|schwärmen}}, {{W+|de|Anbetung}} {{m}}, {{W+|de|anhimmeln}}, {{W+|de|Kultus}} {{n}}, {{W+|de|Apotheose|f|guman=erê}}, {{W+|de|abgöttisch|guman=erê}}
* {{Z|da}}: {{W+|da|dyrke}}
* {{Z|ar}}: {{W-|ar|عبادة}}, {{W-|ar|تعبد}}, {{W-|ar|توقير}}, {{W-|ar|تأليه}}, {{W-|ar|تمجيد}}
* {{Z|eo}}: {{W-|eo|adori}}
* {{Z|fa}}: {{W+|fa|پرستیدن}}, {{W+|fa|پرستیدن|guman=erê}}
* {{Z|fo}}: {{W-|fo|tilbiðja}}
* {{Z|fi}}: {{W+|fi|palvoa}}
* {{Z|fr}}: {{W+|fr|vénérer}}, {{W+|fr|adorer}}, {{W+|fr|idolâtrer}}, [[avoir]] [[un]] [[culte]] [[pour]].
* {{Z|fy}}: {{W-|fy|ferearje}}, {{W-|fy|oanbidde}}
* {{Z|nl}}: {{W+|nl|aanbidden}}, {{W+|nl|adoreren}}, {{W+|nl|verafgoden}}, {{W+|nl|vereren}}
* {{Z|io}}: {{W+|io|veneracar}}
* {{Z|en}}: to {{W+|en|worship}}, to {{W+|en|venerate}}, to {{W+|en|adore}}, {{W+|en|apotheosis}}, {{W+|en|adonize|guman=erê}}, {{W+|en|adoring|guman=erê}}, {{W+|en|idolization|guman=erê}}
* {{Z|it}}: {{W+|it|adorare}}, {{W+|it|venerare}}
* {{Z|ca}}: {{W+|ca|adorar}}
* {{Z|la}}: {{W+|la|adorare}}
* {{Z|hu}}: {{W+|hu|imád}}
* {{Z|no}}: {{W+|no|tilbe}}
* {{Z|pap}}: {{W-|pap|adorá}}
* {{Z|pt}}: {{W+|pt|adorar}}, {{W+|pt|idolatrar}}, {{W+|pt|reverenciar}}
* {{Z|ro}}: {{W+|ro|diviniza}}, {{W+|ro|venera}}, {{W+|ro|adora}}
* {{Z|ru}}: {{W+|ru|боготворить}}
* {{Z|srn}}: {{W-|srn|anbegi}}
* {{Z|es}}: {{W+|es|adorar}}
* {{Z|sw}}: {{W-|sw|kuabudu}}
* {{Z|sv}}: {{W+|sv|förära}}, {{W+|sv|tillbedja}}
* {{Z|tr}}: {{W+|tr|tapınmak}}, [[ibadet]] etmek, {{W+|tr|diyanet}}, {{W+|tr|tapınma}}, {{W+|tr|tapış}}, {{W+|tr|tapma}}, {{W+|tr|tapmak}}, {{W+|tr|kült|guman=erê}}, {{W+|tr|tapınış|guman=erê}}
{{werger-bin}}
=== Navdêr ===
{{ku-tewîn-nav|peristin|mê}}
{{navdêr|ku|z=m}}
# [[îbadetkirin]]
#* {{bêmînak|ku}}
# [[meşîn]]a li dû [[rêbaz]]ekê yan kesekê/î <br>bêyî ku bi ti [[awa]]yî wan [[rexne]] bike yan hin ji [[kiryar]] yan [[biryar]]ên wan [[pejirandin|nepejirîne]]
#* {{bêmînak|ku}}
==== Werger ====
{{werger-ser}}
{{werger-bin}}
joet8jzwjib7mzmk4i240thk77mmjr0
dagirtin
0
16071
6292092
6234831
2026-07-29T21:50:00Z
~2026-42321-82
15195
6292092
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-IPA}}
* {{ku-kîte}}
=== Lêker ===
{{ku-tewîn-lk|dagirtin|form=gerguhêz|niha=gir|borî=girt|pêşgir=da}}
{{lêker|ku|c=p-gh}}
# Ne[[hêlan]] [[vala]], [[xalî]] ne[[hiştin]].
#: {{hevmane|ku|tijî kirin|mişt kirin}}
#* {{jêder|ku|jêgirtin=Li cîhê ku dar dest pê dikin, rengê kesk zora rengên spî û şîn dibe. Keskahiyeke bedew li rengên wêneyê zêde dibe. Keskahî hemû milê jor ê bergehê '''dadigire'''.|{{Jêgirtin/Mehmed Uzun/Bîra qederê/2002}}}}
# Tiştek bi tiştekî ve [[givaştin]].
#: {{hevmane|ku|çespandin|pê lê kirin}}
#* {{jêder|ku|jg=tiliya xwe bi ser tetikê de '''dagirt'''|''Şopên Geş'', r. 113, 2003|url=http://tirej.name/pirtukxane/54.pdf}}
# {{f|ku|Xorasan}} [[parastin]], [[rawestandin]], [[sekinandin]]
#* {{bêmînak|ku}}
==== Bi alfabeyên din ====
* {{ku-ar|داگرتن}}
==== Bide ber ====
* {{g|ku|hilgirtin}}
* {{g|ku|jê girtin}}
* {{g|ku|ragirtin}}
* {{g|ku|vegirtin}}
==== Jê ====
* {{g|ku|dagir}}
* {{g|ku|dagirtî}}
==== Etîmolojî ====
Ji {{qertaf|ku|da-|girtin}}.
==== Werger ====
{{werger-ser|tijî kirin, tê kirin, mişt kirin}}
* {{Z|de}}: {{W+|de|füllen}}
* {{Z|rup}}: {{W-|rup|umplu}}
* {{Z|az}}: {{W+|az|doldurmaq}}
* {{Z|bn}}: {{W+|bn|ভরা}}
* {{Z|bg}}: {{W+|bg|пълня}}
* {{Z|my}}: {{W+|my|ဖြည့်}}
* {{Z|cim}}: {{W-|cim|büllan}}
* {{Z|chr}}: {{W-|chr|ᎠᎧᎵᎢᎭ}}
* {{Z|zh}}:
*: {{Z|cmn}}: {{W-|cmn|裝滿|tr=zhuāngmǎn}}, {{W-|cmn|填滿|tr=tiánmǎn}}
* {{Z|dlm}}: {{W-|dlm|emplar}}
* {{Z|ar}}: {{W-|ar|مَلَأَ}}
*: {{Z|arz}}: {{W-|arz|ملى|tr=malā}}
*: {{Z|ary}}: {{W-|ary|عمّر|tr=ʕəmmər}}
* {{Z|hy}}: {{W+|hy|լցնել}}
* {{Z|eo}}: {{W-|eo|plenigi}}
* {{Z|fi}}: {{W+|fi|täyttää}}
* {{Z|fr}}: {{W+|fr|remplir}}
* {{Z|fur}}: {{W-|fur|jemplâ}}, {{W-|fur|implenâ}}
* {{Z|gd}}: {{W-|gd|sàsaich}}
* {{Z|gl}}: {{W+|gl|encher}}
* {{Z|got}}: {{W-|got|𐍆𐌿𐌻𐌻𐌾𐌰𐌽}}
* {{Z|gn}}: {{W-|gn|myenyhẽ}}
* {{Z|nl}}: {{W+|nl|opvullen}}, {{W+|nl|aanvullen}}
* {{Z|he}}: {{W+|he|מלא|tr=malé}}
* {{Z|enm}}: {{W-|enm|fillen}}
* {{Z|en}}: {{W+|en|fill}}
* {{Z|ga}}: {{W-|ga|líon}}
* {{Z|it}}: {{W+|it|imbottire}}, {{W+|it|riempire}}
* {{Z|ja}}: {{W+|ja|満たす|tr=みたす, mitasu|sc=Jpan}}, {{W+|ja|一杯|cuda=一杯にする|tr=いっぱいにする, ippai ni suru|sc=Jpan}}
* {{Z|ca}}: {{W+|ca|emplenar}}
* {{Z|qu}}: {{W-|qu|hunt'achiy}}, {{W-|qu|hunt'ay}}
* {{Z|ko}}: {{W+|ko|채우다}}
* {{Z|lad}}: {{W-|lad|inchir}}, {{W-|lad|yenar}}
* {{Z|la}}: {{W-|la|pleō}}
* {{Z|lt}}: {{W+|lt|pìldyti}}
* {{Z|ml}}: {{W+|ml|നിറയ്ക്കുക}}
* {{Z|mi}}: {{W-|mi|whakakī}}
* {{Z|hu}}: {{W+|hu|megtölt}}
* {{Z|oc}}: {{W+|oc|emplenar}}
* {{Z|pl}}: {{W+|pl|napełniać}}, {{W+|pl|napełnić}}, {{W+|pl|wypełniać|impf}}, {{W+|pl|wypełnić|pf}}
* {{Z|pt}}: {{W+|pt|encher}}
* {{Z|rm}}: {{W-|rm|emplenir}}, {{W-|rm|amplanir}}, {{W-|rm|amplaneir}}, {{W-|rm|implir}}, {{W-|rm|stuppar}}
* {{Z|ro}}: {{W+|ro|umple|cuda=a umple}}, {{W+|ro|împlini}}
* {{Z|ru}}: {{W+|ru|заполня́ть|impf}}, {{W+|ru|запо́лнить|pf}}; {{W+|ru|наполня́ть|impf}}, {{W+|ru|напо́лнить|pf}}
* {{Z|scn}}: {{W+|scn|jìnchiri}}, {{W+|scn|ìnchiri}}, {{W+|scn|ìnciri}}
* {{Z|sh}}: {{W+|sh|pȕniti}}
* {{Z|sk}}: {{W-|sk|naplniť}}, {{W-|sk|napĺňať}}, {{W-|sk|vyplniť}}, {{W-|sk|vypĺňať}}
* Sorbî:
*: {{Z|dsb}}: {{W-|dsb|połniś|impf}}
* {{Z|es}}: {{W+|es|llenar}}
* {{Z|sv}}: {{W+|sv|fylla}}
* {{Z|th}}: {{W-|th|[[ทำให้]][[เต็ม]]}}
* {{Z|tr}}: {{W+|tr|kapmak}}, {{W+|tr|kaplamak}}
* {{Z|uga}}: {{W-|uga|𐎎𐎍𐎀}}
* {{Z|vec}}: {{W-|vec|inpir}}, {{W-|vec|inpinir}}, {{W+|vec|inpienir}}
* {{Z|vo}}: {{W+|vo|fulükön}}
* {{Z|wa}}: {{W+|wa|rimpli}}, {{W+|wa|rapleni}}
* {{Z|cy}}: {{W+|cy|llenwi}}
* {{Z|km}}: {{W+|km|បំពេញ|tr=bɑmpɨɲ|sc=Khmr}}
* {{Z|el}}: {{W+|el|γεμίζω}}
*: Kevn: {{W-|grc|πίμπλημι}}, {{W-|grc|πληρόω}}, {{W-|grc|μεστόω}}
{{werger-bin}}
:{{werger çavkanî|en|fill|beş=Ev qismê Wergerê|oldid=75669115}}
=== Navdêr ===
{{ku-tewîn-nav|dagirtin|mê}}
{{navdêr|ku|z=m}}
# [[tijîkirin]], [[miştkirin]]
#: {{mk|ku|'''dagirtina''' amanan bi avê}}
==== Werger ====
{{werger-ser}}
{{werger-bin}}
h8ay7xudpp5ctkhmnp5c1nj093imw4u
Ilocano
0
30009
6292130
5902795
2026-07-29T22:28:34Z
Wikihez
7344
6292130
wikitext
text/x-wiki
== {{ziman|trv}} ==
=== Navdêr ===
{{navdêr|trv}}
# [[îlokanoyî]]
#* {{bêmînak|trv}}
=== Rengdêr ===
{{rengdêr|trv}}
# [[îlokanoyî]]
#* {{bêmînak|trv}}
sa09prnjmq49mfc4f5cb84m7s8lsbzl
tilozî
0
31072
6291999
5931937
2026-07-29T13:33:35Z
Nenas nepênî
14450
/* Navdêr */
6291999
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-IPA}}
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku|z=n}}
# {{guherto|tirozî}}
# {{guherto|qetik}}
p9uqryjfu5nt7wl4a5hgaxe8bsell15
tirozî
0
31073
6291995
6245532
2026-07-29T13:29:52Z
Nenas nepênî
14450
/* Formên alternatîv */
6291995
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-IPA}}
* {{ku-kîte}}
=== Navdêr ===
[[Wêne:Tirozî.jpg|thumb|tirozî]]
{{wp|tirozî}}
{{navdêr|ku|z=n}}
# {{f|ku|sebze}} [[cure|Cureyekî]] [[xiyar]]an e ku rengê wî ji [[xiyar]]an [[spî]]tir e û bi taybetî di nav [[av]]a [[şor]] de tên [[parastin]] û [[paşî]] tên [[xwarin]].
#: {{hevmane|ku|ecûr|werzik}}
==== Formên alternatîv ====
* [[tilozî]]
* [[trozî]]
* [[tirûzî]]
* [[xiyar şûr]]
* [[qetik]]
==== Navê zanistî ====
Cucumis melo var. flexuosus
==== Etîmolojî ====
Bi esehî nayê zanîn, belkî têkilî peyva ''[[tirşî]]''.
==== Werger ====
{{werger-ser}}
* {{Z|ar}}: {{W-|ar|قثاء}}
* {{Z|en}}: {{W+|en|snake cucumber}}, {{W+|en|Armenian cucumber}}
{{werger-bin}}
psyb7wz5u575iulwn6dbzijmrvdn9zn
6291996
6291995
2026-07-29T13:30:56Z
Nenas nepênî
14450
/* Navdêr */
6291996
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-IPA}}
* {{ku-kîte}}
=== Navdêr ===
[[Wêne:Tirozî.jpg|thumb|tirozî]]
{{wp|tirozî}}
{{navdêr|ku|z=n}}
# {{f|ku|sebze}} [[cure|Cureyekî]] [[xiyar]]an e ku rengê wî ji [[xiyar]]an [[spî]]tir e û bi taybetî di nav [[av]]a [[şor]] de tên [[parastin]] û [[paşî]] tên [[xwarin]].
#: {{hevmane|ku|ecûr|werzik|qetik}}
==== Formên alternatîv ====
* [[tilozî]]
* [[trozî]]
* [[tirûzî]]
* [[xiyar şûr]]
* [[qetik]]
==== Navê zanistî ====
Cucumis melo var. flexuosus
==== Etîmolojî ====
Bi esehî nayê zanîn, belkî têkilî peyva ''[[tirşî]]''.
==== Werger ====
{{werger-ser}}
* {{Z|ar}}: {{W-|ar|قثاء}}
* {{Z|en}}: {{W+|en|snake cucumber}}, {{W+|en|Armenian cucumber}}
{{werger-bin}}
menmzpao9rs0x70bof98xbks00m1b1c
6291997
6291996
2026-07-29T13:32:23Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6291997
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-IPA}}
* {{ku-kîte}}
=== Navdêr ===
[[Wêne:Tirozî.jpg|thumb|tirozî]]
{{wp|tirozî}}
{{navdêr|ku|z=n}}
# {{f|ku|sebze}} [[cure|Cureyekî]] [[xiyar]]an e ku rengê wî ji [[xiyar]]an [[spî]]tir e û bi taybetî di nav [[av]]a [[şor]] de tên [[parastin]] û [[paşî]] tên [[xwarin]].
#: {{hevmane|ku|ecûr|werzik|qetik|xiyar şûr}}
==== Formên alternatîv ====
* [[tilozî]]
* [[trozî]]
* [[tirûzî]]
==== Navê zanistî ====
Cucumis melo var. flexuosus
==== Etîmolojî ====
Bi esehî nayê zanîn, belkî têkilî peyva ''[[tirşî]]''.
==== Werger ====
{{werger-ser}}
* {{Z|ar}}: {{W-|ar|قثاء}}
* {{Z|en}}: {{W+|en|snake cucumber}}, {{W+|en|Armenian cucumber}}
{{werger-bin}}
6jgeh48elbkris8y8whdo3f1h6vcrld
6291998
6291997
2026-07-29T13:33:24Z
Wikihez
7344
6291998
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-IPA}}
* {{ku-kîte}}
=== Navdêr ===
[[Wêne:Tirozî.jpg|thumb|tirozî]]
{{navdêr|ku|z=n}}
# {{f|ku|sebze}} [[cure|Cureyekî]] [[xiyar]]an e ku rengê wî ji [[xiyar]]an [[spî]]tir e û bi taybetî di nav [[av]]a [[şor]] de tên [[parastin]] û [[paşî]] tên [[xwarin]].
#: {{hevmane|ku|ecûr|werzik|qetik|xiyar şûr}}
==== Formên alternatîv ====
* [[tilozî]]
* [[trozî]]
* [[tirûzî]]
==== Navê zanistî ====
Cucumis melo var. flexuosus
==== Etîmolojî ====
Bi esehî nayê zanîn, belkî têkilî peyva ''[[tirşî]]''.
====Binêre herwiha====
*{{wpedî|tirozî}}
==== Werger ====
{{werger-ser}}
* {{Z|ar}}: {{W-|ar|قثاء}}
* {{Z|en}}: {{W+|en|snake cucumber}}, {{W+|en|Armenian cucumber}}
{{werger-bin}}
iwmlgovgol4hbkeipqji686tjkdsue7
ayakkabı
0
34481
6292008
5905836
2026-07-29T13:50:15Z
Nenas nepênî
14450
/* Navdêr */
6292008
wikitext
text/x-wiki
== {{ziman|tr}} ==
=== Bilêvkirin ===
* {{deng|tr|LL-Q256 (tur)-ToprakM-ayakkabı.wav|Deng|dever=}}
=== Navdêr ===
{{navdêr|tr}}
# [[pêlav]], [[sol]], [[şekal]], [[şikal]], [[êmenî]]
#* {{bêmînak|tr}}
4nrlvqfsdj9bnyanw8fn2ds9qkawn6w
6292036
6292008
2026-07-29T17:30:42Z
Ghybu
1393
/* Navdêr */ + postal
6292036
wikitext
text/x-wiki
== {{ziman|tr}} ==
=== Bilêvkirin ===
* {{deng|tr|LL-Q256 (tur)-ToprakM-ayakkabı.wav|Deng|dever=}}
=== Navdêr ===
{{navdêr|tr}}
# [[pêlav]], [[sol]], [[şekal]], [[şikal]], [[êmenî]], [[postal]]
#* {{bêmînak|tr}}
67v5mg8m60jdwwe3s4phpvvef44f2ca
provoke
0
37894
6292143
6124656
2026-07-30T07:57:55Z
Wikihez
7344
/* Binêre herwiha */
6292143
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Rengdêr ===
{{rengdêr|en}}
# ''(provoke kirin):'' [[tirane pê kirin]], [[esebî kirin]], [[arandin]], [[aciz]] kirin, [[enirandin]]
#* {{bêmînak|ku}}
==== Binêre herwiha ====
{{kol3|ku
|[[arandin]]|[[cixirandin]]|[[ajawe]] kirin|[[provokasyon]] kirin|[[xeyidandin]]|[[enirandin]]|[[esebî]] kirin|[[qehirandin]]|[[şarandin]]|[[sîqilandin]]|[[halan]]|[[tehrîk]] kirin|[[lê sor kirin]]|[[teşwîq]] kirin|[[engizandin]]|[[belişandin]]|[[pîj]] kirin|[[ajawe]] kirin|[[han dan]]|[[fît]] kirin|[[xiroşme]] kirin|[[cilixandin]]|[[lê gur kirin]]|[[sil]] kirin|[[zilqitandin]]|[[aciz]] kirin|[[#|provoke kirin]]
}}
==== Etîmolojî ====
Ji {{ji|fr}}, têkildarî [[provokasyon]]
==== Jê ====
{{kol3|ku|cure=Jê
|provoke bûn<pos:lêker>
|provoke kirin<pos:lêker>
|provokebûn<pos:navdêr>
|provokekirin<pos:navdêr>
|provokebûyî<pos:rengdêr>
|provokekirî<pos:rengdêr>
}}
==== Werger ====
'''provoke kirin''':
{{werger-ser}}
* {{Z|fi}}: {{W+|fi|provosoida}}
* {{Z|fr}}: {{W+|fr|provoquer}}, {{W-|fr|insiter}}, {{W+|fr|indigner}}, {{W+|fr|agacer}}, {{W+|fr|exciter}}
* {{Z|en}}: to {{W+|en|provoke}}
{{werger-bin}}
== {{ziman|en}} ==
=== Bilêvkirin ===
* {{deng|en|en-us-provoke.ogg|dever=DYA}}
=== Lêker ===
{{lêker|en}}
# [[tirane pê kirin]], [[esebî kirin]], [[arandin]], [[aciz]] kirin, [[enirandin]]
#* {{bêmînak|en}}
2xlbgbb8u4873by4w2fwep0xrmivnfe
6292152
6292143
2026-07-30T08:22:29Z
Wikihez
7344
bnr [[provoke kirin]]
6292152
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Rengdêr ===
{{rengdêr|en}}
# {{mane?|ku}}
#* {{bêmînak|ku}}
==== Etîmolojî ====
Ji {{ji|fr}}, têkildarî [[provokasyon]]
==== Jê ====
{{kol3|ku|cure=Jê
|provoke bûn<pos:lêker>
|provoke kirin<pos:lêker>
|provokebûn<pos:navdêr>
|provokekirin<pos:navdêr>
|provokebûyî<pos:rengdêr>
|provokekirî<pos:rengdêr>
}}
==== Werger ====
{{werger-ser}}
{{werger-bin}}
== {{ziman|en}} ==
=== Bilêvkirin ===
* {{deng|en|en-us-provoke.ogg|dever=DYA}}
=== Lêker ===
{{lêker|en}}
# [[tirane pê kirin]], [[esebî kirin]], [[arandin]], [[aciz]] kirin, [[enirandin]]
#* {{bêmînak|en}}
an0dwwbtpu0eryxpyddgb169acp8ldy
6292153
6292152
2026-07-30T08:22:38Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292153
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Rengdêr ===
{{rengdêr|ku}}
# {{mane?|ku}}
#* {{bêmînak|ku}}
==== Etîmolojî ====
Ji {{ji|fr}}, têkildarî [[provokasyon]]
==== Jê ====
{{kol3|ku|cure=Jê
|provoke bûn<pos:lêker>
|provoke kirin<pos:lêker>
|provokebûn<pos:navdêr>
|provokekirin<pos:navdêr>
|provokebûyî<pos:rengdêr>
|provokekirî<pos:rengdêr>
}}
==== Werger ====
{{werger-ser}}
{{werger-bin}}
== {{ziman|en}} ==
=== Bilêvkirin ===
* {{deng|en|en-us-provoke.ogg|dever=DYA}}
=== Lêker ===
{{lêker|en}}
# [[tirane pê kirin]], [[esebî kirin]], [[arandin]], [[aciz]] kirin, [[enirandin]]
#* {{bêmînak|en}}
a86qpa1ntpd86q72f15rsa7u8j5896f
organiser
0
39417
6292131
6242031
2026-07-29T22:29:06Z
Wikihez
7344
6292131
wikitext
text/x-wiki
== {{ziman|fr}} ==
=== Bilêvkirin ===
* {{deng|fr|LL-Q150 (fra)-Lepticed7-organiser.wav|Deng|dever=Aude, Fransa}}
* {{deng|fr|LL-Q150 (fra)-Jérémy-Günther-Heinz Jähnick-organiser.wav|Deng|dever=Somain, Fransa}}
=== Lêker ===
{{lêker|fr}}
# [[bi rêk xistin]], [[organîze]] kirin, [[bi cih anîn]], [[saz]] kirin, [[organîze]] kirin, [[dirist]] kirin, [[damezrandin]], [[danîn]], [[encam]] dan, [[li dar xistin]]
#* {{bêmînak|fr}}
=== Navdêr ===
{{navdêr|fr}}
# [[organîzeker]], [[sazker]], [[bicihîner]]
#* {{bêmînak|fr}}
hj0srsxbptl3864q0fl89fr2qp17ut1
bîyene
0
47275
6292028
6013914
2026-07-29T15:55:51Z
Ghybu
1393
/* Tewandin */
6292028
wikitext
text/x-wiki
{{bnr-h|biyene}}
== {{ziman|zza}} ==
=== Lêker ===
{{lêker|zza|c=x-ngh}}
# [[bûn]], [[bûyîn]]
#* {{bêmînak|zza}}
==== Tewandin ====
* Dema niha: b'''en'''-
* Dema borî:
{{diq-tewîn-lk|dem=Dema niha
| ez = bena / beno
| ti = benî (n)<br />bena (m)
| o = beno
| a = bena
| ma = benê / benî / benîme
| şima = benê / benî
| ê = benê / benî
}}
6q6hi4l743exjuu5jbq5wkm1et8nlau
şodir
0
47352
6292053
6256522
2026-07-29T19:00:42Z
Ghybu
1393
/* {{ziman|zza}} */
6292053
wikitext
text/x-wiki
== {{ziman|zza}} ==
===Bilêvkirin===
* {{zza-IPA}}
* {{zza-kîte}}
=== Navdêr ===
[[Wêne:Autumn From Up High (15597135248).jpg|thumb|Şodir.]]
{{navdêr|zza|z=n}}
# [[spêde]], [[sibe]], [[sihar]]
#* {{bêmînak|zza}}
==== Formên alternatîv ====
* {{hw|zza|sodir}}
* {{hw|zza|sora}}
* {{hw|zza|şewdir}}
* {{hw|zza|şewra}}
====Tewandin====
{{zza-tewîn-nav}}
suyf13qzd6y70nviaty4idk358p9j7b
bit
0
48456
6292101
6291311
2026-07-29T22:04:35Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292101
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Formeke lêkerê ===
{{lêker|ku|form=erê}}
# ''Formeke'' [[bûn]].
#: {{hevmane|ku|be|bît|bitin|bîtin}}
#: {{nm|ku|Ew dê mezin '''bit'''.|Ew dê mezin be.|rêz=1}}
# ''Formeke'' [[birin]].
==== Formên alternatîv ====
* [[bitin]]
== {{ziman|en}} ==
=== Bilêvkirin ===
:bit
* {{deng|en|en-us-bit.ogg|dever=DYA}}
* {{deng|en|LL-Q1860 (eng)-Nattes à chat-bit.wav|Deng|dever=}}
* {{deng|en|LL-Q1860 (eng)-Back ache-bit.wav|Deng|dever=London, QY}}
* {{deng|en|LL-Q1860 (eng)-Vealhurl-bit.wav|Deng|dever=Başûrê Îngilistanê, QY}}
* {{deng|en|LL-Q1860 (eng)-Assorted-Interests-bit.wav|Deng|dever=New York City, DYA}}
=== Navdêr ===
{{navdêr|en}}
# [[piç]]
#: {{nm|en|A '''bit'''.|[[piçek]]|rêz=1}}
# [[lixav]]
== {{ziman|tr}} ==
=== Bilêvkirin ===
* {{deng|tr|LL-Q256 (tur)-ToprakM-bit.wav|Deng|dever=}}
=== Navdêr ===
{{navdêr|tr}}
# [[sipih]]
#* {{bêmînak|tr}}
# [[spî]], [[spih]]
#* {{bêmînak|tr}}
== {{ziman|za}} ==
=== Navdêr ===
{{navdêr|za}}
# {{mijar|za|heywan}} {{g|ku|werdek}}, {{g|ku|miravî}}, {{g|ku|bet}}, {{g|ku|ordek}}
#* {{bêmînak|za}}
=== Çavkanî ===
{{rûpela wergerê|za|werdek}}
iw2he4da9e7d29fx59ptw31gvbxy4wu
thin
0
49309
6292144
6084235
2026-07-30T08:17:52Z
Wikihez
7344
[[Bikarhêner:Wikihez/templateScript2.js|TS]]: Ji [[en:thin|en.wikt]]
6292144
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Bilêvkirin ===
* {{IPA|en|/ˈθɪn/}}
** {{deng|en|en-us-thin.ogg|dever=DYA}}
** {{deng|en|LL-Q1860 (eng)-Back ache-thin.wav|dever=London, QY}}}
* {{IPA|en|/ˈθən/|dever=NZ}}
* {{IPA|en|/ˈfɪn/|dever=QY}}
* {{deng|en|LL-Q1860 (eng)-SpringProof-thin.wav|Deng|dever=Los Angeles, DYA}}
* {{deng|en|Thin-pronunciation-nonlabial-audio.ogg|dever=DYA}}
* {{kîte|en|thin}}
* {{hevdeng|en|fin|aa1=th-fronting|tin|aa2=th-stopping}}
=== Rengdêr ===
[[File:Young Woman Wearing U.S. Army T-shirt.jpg|thumb|{{zim|en|Woman with a '''thin''' waist}}]]
{{en-rengdêr|er}}
# [[zirav]], [[tenik]]
#* {{bêmînak|en}}
==== Dijmane ====
* {{g|en|thick}}
==== Jê ====
* {{g|en|thinness}}
=== Lêker ===
{{lêker|en|}}
# [[zelal kirin]], [[av lê zêde kirin]], [[biav kirin]]
#* {{bêmînak|en}}
tminz7iskw60zqm2i3mjp8epue1do21
çeşme
0
51194
6292001
6230004
2026-07-29T13:42:50Z
Nenas nepênî
14450
6292001
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Navdêr ===
{{navdêr|ku}}
# [[kanî]], [[kehnî]], [[kun]]a ku [[av]] jê [[zan|dizê]] anku tê
#* {{bêmînak|ku}}
# [[mislix]]
==== Têkildar ====
* [[çeşm]]
==== Ji wêjeyê ====
* {{jêder|ku|jêgirtin=Her yek ji newal û [[koh]] û [[deşt]]an.<br>Reh subhetê goşiyê [[beheşt]]an.<br>Her [[rewde]] [[riyad]] [[xuld]] [[ekber]].<br>Her [[çeşme]] ji eyn [[ava kewserê|ab kewser]]. <br>Her koh ji rengê [[Tûr]]ê Mûsa.<br>Ji [[enwar]] [[tecelî|tecelliyê]] tepîsa.<br>Her [[nehr]] ji rengê ejdeha bû. <br>Her sebze, bi muicîzan esa bû.<br>Her dar ji feydê nûbuharî.<br>Têk şuile dida ji [[nûr]] barî. <br>Her gul ji mîsalî [[ateş]]ê Tûr. <br>Yek [[meşele]] bê qusûr û [[nor]].<br>Her [[murx]] seher bi xwe kelîmek.<br> Her [[totî]] û [[qumrî|qumriyek]] [[nedîm]]ek... <br>Her [[nexil]] neda kunende her gah.<br>[[teşbîh|Teşbîh]] [[şecer]] digo: ''Ena Ellah''.<br> [[xergoş|Xergoş]] û xezal û gur û [[ahû]].|Ehmedê Xanî: ''Mem û Zîn'', 1695}}
==== Etîmolojî ====
Ji {{ji|fa|ku|چشمه|tr=çeşme}}, [[hevreh]]a pehlewî ''çeşmeg'', têkilî [[çav]], bi farisî û pehlewî ''çeşm''.
==== Werger ====
{{werger-ser}}
* {{Z|en}}:{{W+|en|fountain|guman=erê}}
{{werger-bin}}
== {{ziman|tr}} ==
=== Bilêvkirin ===
* {{deng|tr|LL-Q256 (tur)-ToprakM-çeşme.wav|Deng|dever=}}
* {{deng|tr|LL-Q256 (tur)-MustafaCavlak-çeşme.wav|Deng|dever=Tirkiye}}
=== Navdêr ===
{{navdêr|tr}}
# [[kanî]], [[kanîk]]
#* {{bêmînak|tr}}
==== Etîmolojî ====
Ji farisî
== {{ziman|tk}} ==
=== Navdêr ===
{{navdêr|tk}}
# {{g|ku|kanî}}, {{g|ku|kehnî}}
#* {{bêmînak|tk}}
=== Çavkanî ===
{{rûpela wergerê|tk|kanî}}
g4ultq4z5ha33b0umef8rsezv39oypd
perestar
0
62426
6292025
6285650
2026-07-29T15:46:06Z
Keyomerd
8814
/* Etîmolojî */
6292025
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku}}
# [[hemşîre]], [[sister]], pîşeyeke profesyonel e beşa tenduristiyê ye. Perestar tedawiya ku ji hêla bijîşkan ve hatiye nivîsîn didin nexweşan û di rêveberiya tedawî û lênihêrînê de ciyekî girîng digirin.
==== Ji wêjeya klasîk ====
* {{jêder|ku|{{Jêgirtin/Ehmedê Xanî/Mem û Zîn}}|jêgirtin=Goya ko kirin bi zêr mutella</br>Meşşate û daye û '''perestar'''</br>'işqê kirî cumle germibazar}}
==== Jê ====
* [[perestarane]]
* [[perestarî]]
* [[perestarîtî]]
* [[perestartî]]
==== Etîmolojî ====
Ji {{paş|ku|peristin|-ar}}.
==== Werger ====
{{werger-ser}}
* {{Z|de}}: {{W-|de|krankesnschwester|f}}, {{W+|de|Pfleger|m}}, {{W-|de|Krankesnschwester}}
* {{Z|zh}}: [[护士]] (hù shì)
* {{Z|id}}: {{W+|id|rawat}}, {{W+|id|perawat}}, {{W+|id|suster}}
* {{Z|eo}}: {{W+|eo|kuracisto}}, [[flegisto|flegist(in)o]]
* {{Z|fa}}: {{W+|fa|پرستار|guman=erê}}
* {{Z|fi}}: {{W+|fi|sairaanhoitaja}}
* {{Z|fr}}: {{W+|fr|infirmière|f}}, {{W+|fr|infirmier|m}}
* {{Z|nl}}: [[verpleegster]] (1), [[zoogmoeder]] (2)
* {{Z|en}}: [[nurse]] (a person trained to provided care for the sick), {{W+|en|nurser|guman=erê}}
* {{Z|ga}}: {{W-|ga|banaltra}}, {{W-|ga|altra}}
* {{Z|it}}: {{W+|it|infermiere}}, {{W+|it|infermiera}}
* {{Z|ja}}: [[看護師]] ([[かんごし]], [[kangoshi]]), [[看護婦]] ([[かんごふ]], [[kangofu]])
* {{Z|nb}}: {{W+|nb|sykepleier}}
* {{Z|pl}}: {{W+|pl|pielęgniarka|f}}, {{W+|pl|siostra|f}}
* {{Z|sk}}: {{W+|sk|sestra|f}}, {{W-|sk|ošetrovateľ|m}}, {{W-|sk|ošetrovateľka|f}}
* {{Z|es}}: {{W+|es|enfermera|f}}
* {{Z|tr}}: {{W-|tr|hamşire}}, {{W+|tr|hemşire}}
{{werger-bin}}
o3j9e6xcg3jl3p3wm4q7xwrnly9sj5o
mangers
0
91317
6292135
6043310
2026-07-30T07:44:11Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292135
wikitext
text/x-wiki
== {{ziman|fr}} ==
=== Bilêvkirin ===
* {{deng|fr|LL-Q150 (fra)-0x010C-mangers.wav|Deng|dever=Muntzenheim, Fransa}}
=== Formeke navdêrê ===
{{navdêr|fr|z=n|form=erê}}
# {{pirjimar|fr|manger}}
== {{ziman|en}} ==
=== Formeke navdêrê ===
{{navdêr|en|form=erê}}
# {{pirjimar|en|manger}}
r0taf7njqlpc0lkh4yor66yasyb5ahi
deinetwegen
0
118154
6292113
4898906
2026-07-29T22:13:22Z
Wikihez
7344
6292113
wikitext
text/x-wiki
== {{ziman|de}} ==
=== Bilêvkirin ===
* {{deng|de|De-deinetwegen.ogg|Deng}}
=== Hoker ===
{{hoker|de}}
# bo [[xatir|xatirê]] te, [[li ser]] [[nav|navê]] te
lavje5gp5gnuxsuqtjc96fgehigw3l2
düğme
0
133764
6292002
5157946
2026-07-29T13:44:27Z
Nenas nepênî
14450
/* Navdêr */
6292002
wikitext
text/x-wiki
== {{ziman|tr}} ==
=== Bilêvkirin ===
* {{deng|tr|LL-Q256 (tur)-ToprakM-düğme.wav|Deng|dever=}}
=== Navdêr ===
{{navdêr|tr}}
# [[bişkok]], [[pişkok]]
# [[bişkoşk]], [[bişkov]], [[bişkoj]], [[bişkote]], [[mêvok]], [[mîwek]], [[qumçe]], [[qumçik]], [[qufçik]], [[qupçe]] (ji yên kincan, lihêfan û hwd)
# [[bişkovk]] (ji bo yên hacetan, mîna bişkoja elektrîkê)
p3qxepb04mmptnef4u6qcj1we25jx6q
6292004
6292002
2026-07-29T13:45:19Z
Nenas nepênî
14450
/* Navdêr */
6292004
wikitext
text/x-wiki
== {{ziman|tr}} ==
=== Bilêvkirin ===
* {{deng|tr|LL-Q256 (tur)-ToprakM-düğme.wav|Deng|dever=}}
=== Navdêr ===
{{navdêr|tr}}
# [[bişkok]], [[pişkok]]
# [[bişkoşk]], [[pişkok]], [[bişkov]], [[bişkoj]], [[bişkote]], [[mêvok]], [[mîwek]], [[qumçe]], [[qumçik]], [[qufçik]], [[qupçe]] (ji yên kincan, lihêfan û hwd)
# [[bişkovk]] (ji bo yên hacetan, mîna bişkoja elektrîkê)
856qze0baq7j218i41t028nnfsa66os
karpuz
0
146940
6291993
5135484
2026-07-29T13:22:34Z
Nenas nepênî
14450
/* Navdêr */
6291993
wikitext
text/x-wiki
== {{ziman|tr}} ==
=== Bilêvkirin ===
* {{deng|tr|LL-Q256 (tur)-ToprakM-karpuz.wav|Deng|dever=}}
=== Navdêr ===
{{navdêr|tr}}
# [[zebeş]], [[debeş]], [[şebeş]], [[şiftî]]
# [[şiftî]], [[şûtî]], [[şwîtî]], [[henî]], [[hendiwan]], [[şotî]], [[cebeş]] (Citrullus vulgaris
# [[hendivan]] (mêweya vê riwekê)
# [[zebeş]] (tiştê wekî zebeşê gir û gilover in)
128ip85ybglmwii0cg5k0gaghsf7kbm
kötüleme
0
151725
6292006
4617915
2026-07-29T13:47:09Z
Nenas nepênî
14450
/* Navdêr */
6292006
wikitext
text/x-wiki
== {{ziman|tr}} ==
=== Navdêr ===
{{navdêr|tr}}
# [[zemkirin]], [[serhevdekirin]], [[dakirin]]
# [[nexweşbûn]] (xerabûna tenduristiya yekî)
# [[xerabûn]] (ji bo tiştan)
shs1hfbi529flqpvyyxyuy6mshrdxxl
Makyavelizm
0
153025
6292134
5146090
2026-07-30T07:43:50Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292134
wikitext
text/x-wiki
== {{ziman|tr}} ==
=== Serenav ===
{{serenav|tr}}
# [[makyaveltî]], [[makyavelîzm]]
flwc0z0h1jx3a1beseee2kxazvzgjbp
siya
0
163512
6292165
6242338
2026-07-30T11:48:07Z
Ghybu
1393
/* {{ziman|zza}} */
6292165
wikitext
text/x-wiki
== {{ziman|zza}} ==
=== Rengdêr ===
{{rengdêr|zza}}
# [[reş]]
==== Tewandin ====
{{zza-tewîn-rd}}
== {{ziman|tr}}==
=== Navdêr ===
{{navdêr|tr}}
# Berepaş birina qeyîkê.
== {{ziman|bcl}} ==
=== Cînav ===
{{cînav|bcl}}
# [[ew#ku|ew]]
h3xm9fzurwmmvc83c98a8a5wtud4c5z
trajik
0
168398
6292073
4635311
2026-07-29T20:13:09Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292073
wikitext
text/x-wiki
== {{ziman|tr}} ==
=== Rengdêr ===
{{rengdêr|tr}}
# [[trajîk]]
# [[dilsotîner]], [[fecî]]
ccf5vk6mn8sg4tqjxsfununqnybw3yu
gerçekten
0
178036
6292010
5850720
2026-07-29T13:52:54Z
Nenas nepênî
14450
/* Mane */
6292010
wikitext
text/x-wiki
== {{ziman|tr}} ==
=== Bilêvkirin ===
* {{deng|tr|LL-Q256 (tur)-ToprakM-gerçekten.wav|Deng|dever=}}
=== Mane ===
{{bêcure|tr}}
# [[bi rastî]], [[heqîqeten]], [[jidil]], [[esasen]]
9yhpwpqthpxl83sg0ptvm7ozdr44ftz
6292011
6292010
2026-07-29T13:53:38Z
Nenas nepênî
14450
/* Mane */
6292011
wikitext
text/x-wiki
== {{ziman|tr}} ==
=== Bilêvkirin ===
* {{deng|tr|LL-Q256 (tur)-ToprakM-gerçekten.wav|Deng|dever=}}
=== Mane ===
{{bêcure|tr}}
# [[bi rastî]], [[heqîqeten]], [[ji dil]], [[esasen]]
ew9za8iyk3qvymdfcxu29gdbbbv70ck
gilêne
0
179524
6292123
5163208
2026-07-29T22:24:44Z
Wikihez
7344
6292123
wikitext
text/x-wiki
{{bnr-h|Gilêne}}
== {{ziman|ku}} ==
=== Navdêr ===
{{navdêr|de}}
# {{K|ku|aman}}[[aman|Aman]]ên ji [[ax]]ê tên [[çêkirin]], amanên ku ji axa [[kulzan]] tên çêkirin.
#:[[sifal]]
==== Bi alfabeyên din ====
* {{ku-ar|گلێنە}}
==== Etîmolojî ====
Ji {{deyn|ckb|ku}}
==== Werger ====
{{werger-ser}}
* {{Z|de}}: {{W|de|Hornhaut}} {{m}}
* {{Z|fa}}: {{W|fa|پرده چشم}}, {{W|fa|سفیدی چشم}}, {{W|fa|لایه چشم}}
* {{Z|en}}: {{W|en|kerato-}}, {{W|en|pottery}}, {{W|en|cornea}}, {{W|en|crockery}}, {{W|en|earthenware}},
* {{Z|tr}}: {{W|tr|kornea}}, {{W|tr|saydam tabaka}}, {{W|tr|ciban}}
{{werger-bin}}
205fvw23y3wsreptohgic7tfowoxv25
6292124
6292123
2026-07-29T22:24:56Z
Wikihez
7344
[[Bikarhêner:Wikihez/templateScript2.js|TS]]: sererastkirin
6292124
wikitext
text/x-wiki
{{bnr-h|Gilêne}}
== {{ziman|ku}} ==
=== Navdêr ===
{{navdêr|de}}
# {{K|ku|aman}}[[aman|Aman]]ên ji [[ax]]ê tên [[çêkirin]], amanên ku ji axa [[kulzan]] tên çêkirin.
#: {{hevmane|ku|sifal}}
==== Bi alfabeyên din ====
* {{ku-ar|گلێنە}}
==== Etîmolojî ====
Ji {{deyn|ckb|ku}}
==== Werger ====
{{werger-ser}}
* {{Z|de}}: {{W|de|Hornhaut}} {{m}}
* {{Z|fa}}: {{W|fa|پرده چشم}}, {{W|fa|سفیدی چشم}}, {{W|fa|لایه چشم}}
* {{Z|en}}: {{W|en|kerato-}}, {{W|en|pottery}}, {{W|en|cornea}}, {{W|en|crockery}}, {{W|en|earthenware}},
* {{Z|tr}}: {{W|tr|kornea}}, {{W|tr|saydam tabaka}}, {{W|tr|ciban}}
{{werger-bin}}
5xo172un3vaf14xpjhlbnj5r2trnobt
6292140
6292124
2026-07-30T07:54:32Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292140
wikitext
text/x-wiki
{{bnr-h|Gilêne}}
== {{ziman|ku}} ==
=== Navdêr ===
{{navdêr|ku}}
# {{K|ku|aman}}[[aman|Aman]]ên ji [[ax]]ê tên [[çêkirin]], amanên ku ji axa [[kulzan]] tên çêkirin.
#: {{hevmane|ku|sifal}}
==== Bi alfabeyên din ====
* {{ku-ar|گلێنە}}
==== Etîmolojî ====
Ji {{deyn|ckb|ku}}
==== Werger ====
{{werger-ser}}
* {{Z|de}}: {{W|de|Hornhaut}} {{m}}
* {{Z|fa}}: {{W|fa|پرده چشم}}, {{W|fa|سفیدی چشم}}, {{W|fa|لایه چشم}}
* {{Z|en}}: {{W|en|kerato-}}, {{W|en|pottery}}, {{W|en|cornea}}, {{W|en|crockery}}, {{W|en|earthenware}},
* {{Z|tr}}: {{W|tr|kornea}}, {{W|tr|saydam tabaka}}, {{W|tr|ciban}}
{{werger-bin}}
tvkp3k8baesbetqm15g95nv4ua3r5ho
xiyar şûr
0
188935
6292000
6140029
2026-07-29T13:34:56Z
Nenas nepênî
14450
/* Navdêr */
6292000
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku}}
# {{g|ku|tilozî}}
# {{g|mu|qetik}}
==== Etîmolojî ====
Ji {{heve|ku|xiyar|şûr}}.
j2oup88gt6jysogq57htij35s16j5au
6292009
6292000
2026-07-29T13:51:45Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292009
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku}}
# {{g|ku|tilozî}}
# {{g|ku|qetik}}
==== Etîmolojî ====
Ji {{heve|ku|xiyar|şûr}}.
5jss9wx1t7345vush7fxsysnqiadi8h
ergriffen
0
217839
6292114
4899064
2026-07-29T22:13:32Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292114
wikitext
text/x-wiki
== {{ziman|de}} ==
=== Bilêvkirin ===
* {{deng|de|De-ergriffen.ogg|Deng}}
=== Formeke lêkerê ===
{{lêker|de|form=erê}}
# {{partîsîpa borî|de|ergreifen}}
## [[birî]]
## [[bidestxistî]], [[dagirkirî]]
hvcqajryntn85hd0zfn7xxewk77o54j
estene
0
261664
6292027
4741662
2026-07-29T15:55:15Z
Ghybu
1393
/* Tewandin */
6292027
wikitext
text/x-wiki
== {{ziman|zza}} ==
=== Lêker ===
{{lêker|zza|c=x-ngh}}
# [[hebûn]], [[heyîn]]
==== Tewandin ====
* Dema niha: est-
* Dema borî:
{{diq-tewîn-lk|dem=Dema niha
| ez = esta
| ti = estî (n)<br /> esta (m)
| o = esto
| a = esta
| ma = estê / estî / estîme
| şima = estê / estî
| ê = estê / estî
}}
7ox4knmbt9mzypnxm034lqm93gvtn4q
Şablon:diq-tewîn-lk
10
261788
6292018
6239695
2026-07-29T15:21:57Z
Ghybu
1393
6292018
wikitext
text/x-wiki
<includeonly>{{tabloya-tewandinê-ser
|title=Tewandina ''{{zim|zza|{{{1|{{PAGENAME}}}}}}}''{{#if:{{{devok}}}|<br>— {{{devok}}}|}}
|palette=purple|tall=yes
}}
! colspan="4" class="outer" |Dema {{{dem}}}
|-
! colspan="2" |[[yekjimar|Yekjimar]]
! colspan="2" |[[pirjimar|Pirjimar]]
|-
|{{zim|zza|{{#ifeq:{{{1|}}}|têper|[[mi]]|[[ez]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{mi}}}|{{{ez}}}}}}}
|{{zim|zza|[[ma]]}}
| width=35% | {{zim|zza|{{{ma}}}}}
|-
|{{zim|zza|{{#ifeq:{{{1|}}}|têper|[[to]]|[[ti]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{to}}}|{{{ti}}}}}}}
|{{zim|zza|[[şima]]}}
| width=35% | {{zim|zza|{{{şima}}}}}
|-
|{{zim|zza|{{#ifeq:{{{1|}}}|têper|[[ey]]|[[o]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{ey}}}|{{{o}}}}}}}
| rowspan="2" | {{zim|zza|{{#ifeq:{{{1|}}}|têper|[[înan]]|[[ê]]}}}}
| width=35% rowspan="2" | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{înan}}}|{{{ê}}}}}}}
|-
| {{zim|zza|{{#ifeq:{{{1|}}}|têper|[[aye]]|[[a]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{aye}}}|{{{a}}}}}}}
|-
{{tabloya-tewandinê-bin}}</includeonly><noinclude>
{{Belgekirin}}
</noinclude>
ng9l6qd68xzfvac00cv569ytentlqa5
6292019
6292018
2026-07-29T15:22:15Z
Ghybu
1393
6292019
wikitext
text/x-wiki
<includeonly>{{tabloya-tewandinê-ser
|title=Tewandina ''{{zim|zza|{{{1|{{PAGENAME}}}}}}}''{{#if:{{{devok|}}}|<br>— {{{devok}}}|}}
|palette=purple|tall=yes
}}
! colspan="4" class="outer" |Dema {{{dem}}}
|-
! colspan="2" |[[yekjimar|Yekjimar]]
! colspan="2" |[[pirjimar|Pirjimar]]
|-
|{{zim|zza|{{#ifeq:{{{1|}}}|têper|[[mi]]|[[ez]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{mi}}}|{{{ez}}}}}}}
|{{zim|zza|[[ma]]}}
| width=35% | {{zim|zza|{{{ma}}}}}
|-
|{{zim|zza|{{#ifeq:{{{1|}}}|têper|[[to]]|[[ti]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{to}}}|{{{ti}}}}}}}
|{{zim|zza|[[şima]]}}
| width=35% | {{zim|zza|{{{şima}}}}}
|-
|{{zim|zza|{{#ifeq:{{{1|}}}|têper|[[ey]]|[[o]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{ey}}}|{{{o}}}}}}}
| rowspan="2" | {{zim|zza|{{#ifeq:{{{1|}}}|têper|[[înan]]|[[ê]]}}}}
| width=35% rowspan="2" | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{înan}}}|{{{ê}}}}}}}
|-
| {{zim|zza|{{#ifeq:{{{1|}}}|têper|[[aye]]|[[a]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{aye}}}|{{{a}}}}}}}
|-
{{tabloya-tewandinê-bin}}</includeonly><noinclude>
{{Belgekirin}}
</noinclude>
2rcgu1y44qwdyvqfy7t5j6q5ia2byzg
6292020
6292019
2026-07-29T15:23:44Z
Ghybu
1393
6292020
wikitext
text/x-wiki
<includeonly>{{tabloya-tewandinê-ser
|title=Tewandina ''{{zim|zza|{{{1|{{PAGENAME}}}}}}}''{{#if:{{{devok|}}}|<br>— {{{devok}}}|}}
|palette=purple|tall=yes
}}
! colspan="4" class="outer" | {{{dem}}}
|-
! colspan="2" |[[yekjimar|Yekjimar]]
! colspan="2" |[[pirjimar|Pirjimar]]
|-
|{{zim|zza|{{#ifeq:{{{1|}}}|têper|[[mi]]|[[ez]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{mi}}}|{{{ez}}}}}}}
|{{zim|zza|[[ma]]}}
| width=35% | {{zim|zza|{{{ma}}}}}
|-
|{{zim|zza|{{#ifeq:{{{1|}}}|têper|[[to]]|[[ti]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{to}}}|{{{ti}}}}}}}
|{{zim|zza|[[şima]]}}
| width=35% | {{zim|zza|{{{şima}}}}}
|-
|{{zim|zza|{{#ifeq:{{{1|}}}|têper|[[ey]]|[[o]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{ey}}}|{{{o}}}}}}}
| rowspan="2" | {{zim|zza|{{#ifeq:{{{1|}}}|têper|[[înan]]|[[ê]]}}}}
| width=35% rowspan="2" | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{înan}}}|{{{ê}}}}}}}
|-
| {{zim|zza|{{#ifeq:{{{1|}}}|têper|[[aye]]|[[a]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{aye}}}|{{{a}}}}}}}
|-
{{tabloya-tewandinê-bin}}</includeonly><noinclude>
{{Belgekirin}}
</noinclude>
90c30026k4wm5mcc2bwbkhzw7r4e7r2
6292022
6292020
2026-07-29T15:42:47Z
Ghybu
1393
6292022
wikitext
text/x-wiki
<includeonly>{{tabloya-tewandinê-ser
|title=Tewandina ''{{zim|zza|{{{1|{{PAGENAME}}}}}}}''{{#if:{{{devok|}}}|<br>— {{{devok}}}|}}
|palette=purple|tall=yes
}}
! colspan="4" class="outer" | {{{dem}}}
|-
! colspan="2" |[[yekjimar|Yekjimar]]
! colspan="2" |[[pirjimar|Pirjimar]]
|-
|style="font-weight: bold;" | {{zim|zza|{{#ifeq:{{{1|}}}|têper|[[mi]]|[[ez]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{mi}}}|{{{ez}}}}}}}
|style="font-weight: bold;" | {{zim|zza|[[ma]]}}
| width=35% | {{zim|zza|{{{ma}}}}}
|-
|style="font-weight: bold;" | {{zim|zza|{{#ifeq:{{{1|}}}|têper|[[to]]|[[ti]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{to}}}|{{{ti}}}}}}}
|style="font-weight: bold;" | {{zim|zza|[[şima]]}}
| width=35% | {{zim|zza|{{{şima}}}}}
|-
|style="font-weight: bold;" | {{zim|zza|{{#ifeq:{{{1|}}}|têper|[[ey]]|[[o]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{ey}}}|{{{o}}}}}}}
| rowspan="2" style="font-weight: bold;" | {{zim|zza|{{#ifeq:{{{1|}}}|têper|[[înan]]|[[ê]]}}}}
| width=35% rowspan="2" | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{înan}}}|{{{ê}}}}}}}
|-
|style="font-weight: bold;" | {{zim|zza|{{#ifeq:{{{1|}}}|têper|[[aye]]|[[a]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{aye}}}|{{{a}}}}}}}
|-
{{tabloya-tewandinê-bin}}</includeonly><noinclude>
{{Belgekirin}}
</noinclude>
6vwjkiw9nfs0v25t7kuj8nu1guy9p3s
6292024
6292022
2026-07-29T15:46:05Z
Ghybu
1393
Guhartoya [[Special:Diff/6292022|6292022]] yê [[Special:Contributions/Ghybu|Ghybu]] ([[User talk:Ghybu|gotûbêj]]) şûnde kir
6292024
wikitext
text/x-wiki
<includeonly>{{tabloya-tewandinê-ser
|title=Tewandina ''{{zim|zza|{{{1|{{PAGENAME}}}}}}}''{{#if:{{{devok|}}}|<br>— {{{devok}}}|}}
|palette=purple|tall=yes
}}
! colspan="4" class="outer" | {{{dem}}}
|-
! colspan="2" |[[yekjimar|Yekjimar]]
! colspan="2" |[[pirjimar|Pirjimar]]
|-
|{{zim|zza|{{#ifeq:{{{1|}}}|têper|[[mi]]|[[ez]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{mi}}}|{{{ez}}}}}}}
|{{zim|zza|[[ma]]}}
| width=35% | {{zim|zza|{{{ma}}}}}
|-
|{{zim|zza|{{#ifeq:{{{1|}}}|têper|[[to]]|[[ti]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{to}}}|{{{ti}}}}}}}
|{{zim|zza|[[şima]]}}
| width=35% | {{zim|zza|{{{şima}}}}}
|-
|{{zim|zza|{{#ifeq:{{{1|}}}|têper|[[ey]]|[[o]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{ey}}}|{{{o}}}}}}}
| rowspan="2" | {{zim|zza|{{#ifeq:{{{1|}}}|têper|[[înan]]|[[ê]]}}}}
| width=35% rowspan="2" | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{înan}}}|{{{ê}}}}}}}
|-
| {{zim|zza|{{#ifeq:{{{1|}}}|têper|[[aye]]|[[a]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{aye}}}|{{{a}}}}}}}
|-
{{tabloya-tewandinê-bin}}</includeonly><noinclude>
{{Belgekirin}}
</noinclude>
90c30026k4wm5mcc2bwbkhzw7r4e7r2
6292026
6292024
2026-07-29T15:51:27Z
Ghybu
1393
6292026
wikitext
text/x-wiki
<includeonly>{{tabloya-tewandinê-ser
|title=Tewandina ''{{zim|zza|{{{1|{{PAGENAME}}}}}}}''{{#if:{{{devok|}}}|<br>{{pad|0.5em}}— ''{{nobold|Devok:}}'' {{{devok}}}|}}
|palette=purple|tall=yes
}}
! colspan="4" class="outer" | {{{dem}}}
|-
! colspan="2" |[[yekjimar|Yekjimar]]
! colspan="2" |[[pirjimar|Pirjimar]]
|-
|{{zim|zza|{{#ifeq:{{{1|}}}|têper|[[mi]]|[[ez]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{mi}}}|{{{ez}}}}}}}
|{{zim|zza|[[ma]]}}
| width=35% | {{zim|zza|{{{ma}}}}}
|-
|{{zim|zza|{{#ifeq:{{{1|}}}|têper|[[to]]|[[ti]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{to}}}|{{{ti}}}}}}}
|{{zim|zza|[[şima]]}}
| width=35% | {{zim|zza|{{{şima}}}}}
|-
|{{zim|zza|{{#ifeq:{{{1|}}}|têper|[[ey]]|[[o]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{ey}}}|{{{o}}}}}}}
| rowspan="2" | {{zim|zza|{{#ifeq:{{{1|}}}|têper|[[înan]]|[[ê]]}}}}
| width=35% rowspan="2" | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{înan}}}|{{{ê}}}}}}}
|-
| {{zim|zza|{{#ifeq:{{{1|}}}|têper|[[aye]]|[[a]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{1|}}}|têper|{{{aye}}}|{{{a}}}}}}}
|-
{{tabloya-tewandinê-bin}}</includeonly><noinclude>
{{Belgekirin}}
</noinclude>
l2zuswrpzor7wh60763p3q8rfsqd7zg
6292029
6292026
2026-07-29T16:21:11Z
Ghybu
1393
6292029
wikitext
text/x-wiki
<includeonly>{{tabloya-tewandinê-ser
|title=Tewandina ''{{zim|zza|{{{1|{{PAGENAME}}}}}}}''{{#if:{{{devok|}}}|<br>{{pad|0.5em}}— ''{{nobold|Devok:}}'' {{{devok}}}|}}
|palette=purple|tall=yes
}}
! colspan="4" class="outer" | {{{dem}}}
|-
! colspan="2" |[[yekjimar|Yekjimar]]
! colspan="2" |[[pirjimar|Pirjimar]]
|-
| {{zim|zza|{{#ifeq:{{{cure|}}}|gerguhêz|[[mi]]|[[ez]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{cure|}}}|gerguhêz|{{{mi}}}|{{{ez}}}}}}}
| {{zim|zza|[[ma]]}}
| width=35% | {{zim|zza|{{{ma}}}}}
|-
| {{zim|zza|{{#ifeq:{{{cure|}}}|gerguhêz|[[to]]|[[ti]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{cure|}}}|gerguhêz|{{{to}}}|{{{ti}}}}}}}
| {{zim|zza|[[şima]]}}
| width=35% | {{zim|zza|{{{şima}}}}}
|-
| {{zim|zza|{{#ifeq:{{{cure|}}}|gerguhêz|[[ey]]|[[o]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{cure|}}}|gerguhêz|{{{ey}}}|{{{o}}}}}}}
| rowspan="2" | {{zim|zza|{{#ifeq:{{{cure|}}}|gerguhêz|[[înan]]|[[ê]]}}}}
| width=35% rowspan="2" | {{zim|zza|{{#ifeq:{{{cure|}}}|gerguhêz|{{{înan}}}|{{{ê}}}}}}}
|-
| {{zim|zza|{{#ifeq:{{{cure|}}}|gerguhêz|[[aye]]|[[a]]}}}}
| width=35% | {{zim|zza|{{#ifeq:{{{cure|}}}|gerguhêz|{{{aye}}}|{{{a}}}}}}}
|-
{{tabloya-tewandinê-bin}}</includeonly><noinclude>
{{Belgekirin}}
</noinclude>
ea8vz7nndm4uwqs7bfwv02uj7lc6tb7
Şablon:diq-tewîn-lk/belge
10
261790
6292016
6239913
2026-07-29T15:08:39Z
Ghybu
1393
6292016
wikitext
text/x-wiki
{| style="background-color: transparent;"
| valign="top" |
* Lêkerên netêper
{{diq-tewîn-lk|dem = dem
| ez =
| ti =
| o =
| a =
| ma =
| şima =
| ê =
}}
| valign="top" |
* Lêkerên têper
{{diq-tewîn-lk|têper|dem = dem
| mi =
| to =
| ey =
| aye =
| ma =
| şima =
| înan =
}}
|}
;Kod
{| style="background-color: transparent;"
| valign="top" |
* Lêkerên netêper
<pre style="overflow:auto; margin:0; width:15em;">
{{diq-tewîn-lk|dem =
| ez =
| ti =
| o =
| a =
| ma =
| şima =
| ê =
}}
</pre>
| valign="top" |
* Lêkerên têper
<pre style="overflow:auto; margin:0; width:15em;">
{{diq-tewîn-lk|têper|dem =
| mi =
| to =
| ey =
| aye =
| ma =
| şima =
| înan =
}}
</pre>
|}
== Binêre ==
* {{ş|zza-tewîn-nav}}
* {{ş|zza-tewîn-lk}}
* {{ş|zza-tewîn-rd}}
<includeonly>
[[Kategorî:Şablonên zazakî]]
</includeonly>
dent7eoq2d2yarech3jgs7or2qvf4gi
6292030
6292016
2026-07-29T16:22:48Z
Ghybu
1393
6292030
wikitext
text/x-wiki
; Lêkerên negerguhêz
{{diq-tewîn-lk|dem={{{dem}}}|devok={{{devok}}}
| ez =
| ti =
| o =
| a =
| ma =
| şima =
| ê =
}}
<syntaxhighlight lang="wikitext" copy>
{{diq-tewîn-lk|dem={{{dem}}}|devok={{{devok}}}
| ez =
| ti =
| o =
| a =
| ma =
| şima =
| ê =
}}
</syntaxhighlight>
; Lêkerên gerguhêz
{{diq-tewîn-lk|cure=gerguhêz|dem={{{dem}}}|devok={{{devok}}}
| mi =
| to =
| ey =
| aye =
| ma =
| şima =
| înan =
}}
<syntaxhighlight lang="wikitext" copy>
{{diq-tewîn-lk|dem={{{dem}}}|devok={{{devok}}}
| mi =
| to =
| ey =
| aye =
| ma =
| şima =
| înan =
}}
</syntaxhighlight>
== Binêre ==
* {{ş|zza-tewîn-nav}}
* {{ş|zza-tewîn-lk}}
* {{ş|zza-tewîn-rd}}
<includeonly>
[[Kategorî:Şablonên zazakî]]
</includeonly>
tnzh8k4li1wkt2qrouijjj499a1zbc0
6292031
6292030
2026-07-29T16:23:13Z
Ghybu
1393
6292031
wikitext
text/x-wiki
; Lêkerên gerguhêz
{{diq-tewîn-lk|cure=gerguhêz|dem={{{dem}}}|devok={{{devok}}}
| mi =
| to =
| ey =
| aye =
| ma =
| şima =
| înan =
}}
<syntaxhighlight lang="wikitext" copy>
{{diq-tewîn-lk|dem={{{dem}}}|devok={{{devok}}}
| mi =
| to =
| ey =
| aye =
| ma =
| şima =
| înan =
}}
</syntaxhighlight>
; Lêkerên negerguhêz
{{diq-tewîn-lk|dem={{{dem}}}|devok={{{devok}}}
| ez =
| ti =
| o =
| a =
| ma =
| şima =
| ê =
}}
<syntaxhighlight lang="wikitext" copy>
{{diq-tewîn-lk|dem={{{dem}}}|devok={{{devok}}}
| ez =
| ti =
| o =
| a =
| ma =
| şima =
| ê =
}}
</syntaxhighlight>
== Binêre ==
* {{ş|zza-tewîn-nav}}
* {{ş|zza-tewîn-lk}}
* {{ş|zza-tewîn-rd}}
<includeonly>
[[Kategorî:Şablonên zazakî]]
</includeonly>
6ux3p7kmeay692k4ryjnd33jgobrgv9
6292032
6292031
2026-07-29T16:25:26Z
Ghybu
1393
6292032
wikitext
text/x-wiki
; Lêkerên gerguhêz
{{diq-tewîn-lk|cure=gerguhêz|dem={{{dem}}}|devok={{{devok}}}
| mi =
| to =
| ey =
| aye =
| ma =
| şima =
| înan =
}}
<syntaxhighlight lang="wikitext" copy>
{{diq-tewîn-lk|dem=|devok=
| mi =
| to =
| ey =
| aye =
| ma =
| şima =
| înan =
}}
</syntaxhighlight>
; Lêkerên negerguhêz
{{diq-tewîn-lk|dem={{{dem}}}|devok={{{devok}}}
| ez =
| ti =
| o =
| a =
| ma =
| şima =
| ê =
}}
<syntaxhighlight lang="wikitext" copy>
{{diq-tewîn-lk|dem=|devok=
| ez =
| ti =
| o =
| a =
| ma =
| şima =
| ê =
}}
</syntaxhighlight>
== Binêre ==
* {{ş|zza-tewîn-nav}}
* {{ş|zza-tewîn-lk}}
* {{ş|zza-tewîn-rd}}
<includeonly>
[[Kategorî:Şablonên zazakî]]
</includeonly>
fchmy3r4zsxy6bwc7hfbu5pwcir5xqv
6292033
6292032
2026-07-29T16:26:36Z
Ghybu
1393
6292033
wikitext
text/x-wiki
== Bikaranîn ==
; Lêkerên gerguhêz
{{diq-tewîn-lk|cure=gerguhêz|dem={{{dem}}}|devok={{{devok}}}
| mi =
| to =
| ey =
| aye =
| ma =
| şima =
| înan =
}}
<syntaxhighlight lang="wikitext" copy>
{{diq-tewîn-lk|dem=|devok=
| mi =
| to =
| ey =
| aye =
| ma =
| şima =
| înan =
}}
</syntaxhighlight>
; Lêkerên negerguhêz
{{diq-tewîn-lk|dem={{{dem}}}|devok={{{devok}}}
| ez =
| ti =
| o =
| a =
| ma =
| şima =
| ê =
}}
<syntaxhighlight lang="wikitext" copy>
{{diq-tewîn-lk|dem=|devok=
| ez =
| ti =
| o =
| a =
| ma =
| şima =
| ê =
}}
</syntaxhighlight>
== Binêre ==
* {{ş|zza-tewîn-nav}}
* {{ş|zza-tewîn-lk}}
* {{ş|zza-tewîn-rd}}
<includeonly>
[[Kategorî:Şablonên zazakî]]
</includeonly>
fra18vtlhshdtt1ujp85pfsmzw5lxua
6292034
6292033
2026-07-29T16:31:13Z
Ghybu
1393
/* Bikaranîn */
6292034
wikitext
text/x-wiki
== Bikaranîn ==
; Lêkerên gerguhêz
<syntaxhighlight lang="wikitext" copy>
{{diq-tewîn-lk|dem=|devok=
| mi =
| to =
| ey =
| aye =
| ma =
| şima =
| înan =
}}
</syntaxhighlight>
{{diq-tewîn-lk|cure=gerguhêz|dem={{{dem}}}|devok={{{devok}}}
| mi =
| to =
| ey =
| aye =
| ma =
| şima =
| înan =
}}
; Lêkerên negerguhêz
<syntaxhighlight lang="wikitext" copy>
{{diq-tewîn-lk|dem=|devok=
| ez =
| ti =
| o =
| a =
| ma =
| şima =
| ê =
}}
</syntaxhighlight>
{{diq-tewîn-lk|dem={{{dem}}}|devok={{{devok}}}
| ez =
| ti =
| o =
| a =
| ma =
| şima =
| ê =
}}
== Binêre ==
* {{ş|zza-tewîn-nav}}
* {{ş|zza-tewîn-lk}}
* {{ş|zza-tewîn-rd}}
<includeonly>
[[Kategorî:Şablonên zazakî]]
</includeonly>
qvqnr836yb90o599pau8veicwkbn5bv
girkirin
0
263558
6292037
6211616
2026-07-29T17:33:55Z
~2026-42026-75
15188
/* Etîmolojî */
6292037
wikitext
text/x-wiki
{{bnr-l|gir kirin}}
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-IPA}}
* {{ku-kîte}}
=== Navdêr ===
{{ku-tewîn-nav|girkirin|mê}}
{{navdêr|ku|z=m}}
# [[agir hilkirin]] <ref>{{Ferhenga Kamêran}}</ref>
==== Dijmane ====
* [[hûrkirin]]
==== Etîmolojî ====
Ji {{pêk|ku|gir|kirin}}.
# kurmancî kîn .
==== Werger ====
{{werger-ser}}
* {{Z|tr}}: {{W|tr|büyültme}}, {{W|tr|irileştirme}}, {{W|tr|kocamanlaştırma}}
{{werger-bin}}
=== Çavkanî ===
{{çavkanî}}
81ghvpa40jpw1fbqjaifnu7pv1klw06
6292038
6292037
2026-07-29T17:48:06Z
Wikihez
7344
Guhartinên [[Special:Contributions/~2026-42026-75|~2026-42026-75]] ([[User talk:~2026-42026-75|gotûbêj]]) hatine betalkirin, vegerand guhartoya dawî ya [[User:JiyanBot|JiyanBot]]
6211616
wikitext
text/x-wiki
{{bnr-l|gir kirin}}
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-IPA}}
* {{ku-kîte}}
=== Navdêr ===
{{ku-tewîn-nav|girkirin|mê}}
{{navdêr|ku|z=m}}
# [[agir hilkirin]] <ref>{{Ferhenga Kamêran}}</ref>
==== Dijmane ====
* [[hûrkirin]]
==== Etîmolojî ====
Ji {{pêk|ku|gir|kirin}}.
==== Werger ====
{{werger-ser}}
* {{Z|tr}}: {{W|tr|büyültme}}, {{W|tr|irileştirme}}, {{W|tr|kocamanlaştırma}}
{{werger-bin}}
=== Çavkanî ===
{{çavkanî}}
g64oxqwkqp4yqa4xvivmorctnkrrzoz
ئاش
0
268287
6292072
5044974
2026-07-29T20:03:48Z
Ghybu
1393
/* Navdêr */
6292072
wikitext
text/x-wiki
{{bnr-h|یاس|يأس|ياس|تاش|یاش|ياش|باش|باس|تاس|ئاش|ئاس|پاش|باش}}
== {{ziman|ckb}} ==
=== Navdêr ===
{{navdêr|ckb}}
# [[aş]]
# [[xwarin]]
==== Jê ====
* {{g|ckb|بەرداش}}
* {{g|ckb|ئاشەوان}}
43lh3a119346nsp04fjnp2iz0o106nx
Afganistan
0
284439
6292158
6049947
2026-07-30T09:16:43Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292158
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Serenav ===
{{serenav|ku|z=m}}
# [[welat]]eke li [[Asya]]yê ye, [[nav]]ê wê yê [[fermî]] Komara Afgansitanê ya Islamî, [[paytext]]: [[Kabûl]]. [[ziman]]ên fermî; [[farisî]] û [[paşto]]yî ne
==== Hevmane ====
* [[Efxanistan]]
* [[Afgxanistan]]
* [[Afxanistan]]
==== Têkildar ====
* [[Peştûnistan]]
==== Etîmolojî ====
Ji {{qertaf|ku|afgan|-istan}}.
==== Jê ====
•[[afganî]]
==== Werger ====
{{werger-ser}}
* {{Z|de}}: {{W+|de|Afghanistan|n}}
* {{Z|az}}: {{W+|az|Əfqanıstan}}
* {{Z|zh}}: {{W+|zh|阿富汗}}
* {{Z|ar}}: {{W+|ar|أفغانستان}}
* {{Z|hy}}: {{W+|hy|Աֆղանստան}}
* {{Z|fa}}: {{W+|fa|افغانستان}}
* {{Z|fr}}: {{W+|fr|Afghanistan}}
* {{Z|en}}: {{W+|en|Afghanistan}}
* {{Z|it}}: {{W+|it|Afghanistan}}
* {{Z|uz}}: {{W+|uz|Afgʻoniston}}
* {{Z|ps}}: {{W+|ps|افغانستان}}
* {{Z|ru}}: {{W+|ru|Афганистан}}
* {{Z|es}}: {{W+|es|Afganistán}}
* {{Z|tg}}: {{W+|tg|Афғонистон}}
* {{Z|tr}}: {{W+|tr|Afganistan}}
* {{Z|tk}}: {{W-|tk|Owganystan}}
{{werger-bin}}
== {{ziman|sq}} ==
=== Serenav ===
{{serenav|sq|z=n}}
# {{f|sq|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|sq|Efxanistan}}
== {{ziman|eu}} ==
=== Serenav ===
{{serenav|eu}}
# {{f|eu|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|eu|Efxanistan}}
== {{ziman|et}} ==
=== Serenav ===
{{serenav|et}}
# {{f|et|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|et|Efxanistan}}
== {{ziman|fo}} ==
=== Serenav ===
{{serenav|fo|z=nt}}
# {{f|fo|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|fo|Efxanistan}}
== {{ziman|fi}} ==
=== Serenav ===
{{serenav|fi}}
# {{f|fi|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|fi|Efxanistan}}
== {{ziman|frp}} ==
=== Serenav ===
{{serenav|frp}}
# {{f|frp|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|frp|Efxanistan}}
== {{ziman|fy}} ==
=== Serenav ===
{{serenav|fy}}
# {{f|fy|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|fy|Efxanistan}}
== {{ziman|gag}} ==
=== Serenav ===
{{serenav|gag}}
# {{f|gag|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|gag|Efxanistan}}
== {{ziman|ht}} ==
=== Serenav ===
{{serenav|ht}}
# {{f|ht|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|ht|Efxanistan}}
== {{ziman|ha}} ==
=== Serenav ===
{{serenav|ha}}
# {{f|ha|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|ha|Efxanistan}}
== {{ziman|io}} ==
=== Serenav ===
{{serenav|io}}
# {{f|io|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|io|Efxanistan}}
== {{ziman|it}} ==
=== Serenav ===
{{serenav|it|z=n}}
# {{f|it|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|it|Efxanistan}}
== {{ziman|is}} ==
=== Serenav ===
{{serenav|is}}
# {{f|is|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|is|Efxanistan}}
== {{ziman|jv}} ==
=== Serenav ===
{{serenav|jv}}
# {{f|jv|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|jv|Efxanistan}}
== {{ziman|kln}} ==
=== Serenav ===
{{serenav|kln}}
# {{f|kln|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|kln|Efxanistan}}
== {{ziman|kam}} ==
=== Serenav ===
{{serenav|kam}}
# {{f|kam|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|kam|Efxanistan}}
== {{ziman|ca}} ==
=== Serenav ===
{{serenav|ca|z=n}}
# {{f|ca|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|ca|Efxanistan}}
== {{ziman|ki}} ==
=== Serenav ===
{{serenav|ki}}
# {{f|ki|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|ki|Efxanistan}}
== {{ziman|lad}} ==
=== Serenav ===
{{serenav|lad}}
# {{f|lad|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|lad|Efxanistan}}
== {{ziman|li}} ==
=== Serenav ===
{{serenav|li}}
# {{f|li|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|li|Efxanistan}}
== {{ziman|luy}} ==
=== Serenav ===
{{serenav|luy}}
# {{f|luy|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|luy|Efxanistan}}
== {{ziman|luo}} ==
=== Serenav ===
{{serenav|luo}}
# {{f|luo|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|luo|Efxanistan}}
== {{ziman|mt}} ==
=== Bilêvkirin ===
* {{deng|mt|LL-Q9166 (mlt)-GħawdxiVeru-Afganistan.wav|Deng|dever=Malta}}
=== Serenav ===
{{serenav|mt}}
# {{f|mt|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|mt|Efxanistan}}
== {{ziman|mer}} ==
=== Serenav ===
{{serenav|mer}}
# {{f|mer|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|mer|Efxanistan}}
== {{ziman|min}} ==
=== Serenav ===
{{serenav|min}}
# {{f|min|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|min|Efxanistan}}
== {{ziman|na}} ==
=== Serenav ===
{{serenav|na}}
# {{f|na|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|na|Efxanistan}}
== {{ziman|oc}} ==
=== Serenav ===
{{serenav|oc}}
# {{f|oc|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|oc|Efxanistan}}
== {{ziman|pl}} ==
=== Serenav ===
{{serenav|pl}}
# {{f|pl|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|pl|Efxanistan}}
== {{ziman|ro}} ==
=== Serenav ===
{{serenav|ro|z=nt}}
# {{f|ro|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|ro|Efxanistan}}
== {{ziman|szl}} ==
=== Serenav ===
{{serenav|szl}}
# {{f|szl|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|szl|Efxanistan}}
== {{ziman|sh}} ==
=== Serenav ===
{{serenav|sh|Afganìstān|z=n}}
# {{f|sh|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|sh|Efxanistan}}
== {{ziman|sk}} ==
=== Serenav ===
{{serenav|sk|z=n}}
# {{f|sk|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|sk|Efxanistan}}
== {{ziman|sl}} ==
=== Serenav ===
{{serenav|sl|Afgánistan|z=n}}
# {{f|sl|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|sl|Efxanistan}}
== {{ziman|tr}} ==
=== Bilêvkirin ===
* {{deng|tr|LL-Q256 (tur)-ToprakM-Afganistan.wav|Deng|dever=Îzmîr, Tirkiye}}
=== Serenav ===
{{serenav|tr}}
# {{f|tr|dewletên Asyayê}} {{g|ku|Efxanistan}}
== {{ziman|vec}} ==
=== Serenav ===
{{serenav|vec}}
# {{f|vec|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|vec|Efxanistan}}
== {{ziman|vep}} ==
=== Serenav ===
{{serenav|vep}}
# {{f|vep|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|vep|Efxanistan}}
== {{ziman|vro}} ==
=== Serenav ===
{{serenav|vro}}
# {{f|vro|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|vro|Efxanistan}}
== {{ziman|war}} ==
=== Serenav ===
{{serenav|war}}
# {{f|war|dewletên Asyayê}} {{g|ku|Efxanistan}}
=== Çavkanî ===
{{rûpela wergerê|war|Efxanistan}}
m2ang31lxljsb9td328b7c2htyxo9y2
avarice
0
295102
6292156
6091354
2026-07-30T08:25:20Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292156
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Bilêvkirin ===
* {{deng|en|en-us-avarice.ogg|dever=DYA}}
=== Navdêr ===
{{navdêr|en|j=nj+|p=avarices}}
# [[tematî]], [[temayî]], [[çavbirçîtî]]
6n6h1306qwjin2sritkxs0xdua7ouu3
provoke kirin
0
300246
6292154
6267230
2026-07-30T08:22:43Z
Wikihez
7344
ji [[provoke]]
6292154
wikitext
text/x-wiki
{{bnr-n|provokekirin}}
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-IPA}}
* {{ku-kîte}}
=== Lêker ===
{{ku-tewîn-lk|provoke kirin|form=gerguhêz|niha=k|borî=kir|pêşgir=provoke|valahî=erê}}
{{lêker|ku|c=h-gh}}
# [[tirane pê kirin]], [[esebî kirin]], [[arandin]], [[aciz]] kirin, [[enirandin]]
#* {{bênimûne|ku}}
==== Etîmolojî ====
Ji {{heve|ku|provoke|kirin}}.
==== Binêre herwiha ====
{{kol3|ku
|[[arandin]]|[[cixirandin]]|[[ajawe]] kirin|[[provokasyon]] kirin|[[xeyidandin]]|[[enirandin]]|[[esebî]] kirin|[[qehirandin]]|[[şarandin]]|[[sîqilandin]]|[[halan]]|[[tehrîk]] kirin|[[lê sor kirin]]|[[teşwîq]] kirin|[[engizandin]]|[[belişandin]]|[[pîj]] kirin|[[ajawe]] kirin|[[han dan]]|[[fît]] kirin|[[xiroşme]] kirin|[[cilixandin]]|[[lê gur kirin]]|[[sil]] kirin|[[zilqitandin]]|[[aciz]] kirin|[[#|provoke kirin]]
}}
==== Werger ====
{{werger-ser}}
* {{Z|fi}}: {{W+|fi|provosoida}}
* {{Z|fr}}: {{W+|fr|provoquer}}, {{W-|fr|insiter}}, {{W+|fr|indigner}}, {{W+|fr|agacer}}, {{W+|fr|exciter}}
* {{Z|de}}: {{W+|de|anspornen}}, {{W+|de|antreiben}}, {{W+|de|aufhetzen}}, {{W+|de|herausfordern}}, {{W+|de|provozieren|guman=erê}}
* {{Z|fa}}: {{W+|fa|انگیختن}}
* {{Z|en}}: to {{W+|en|provoke}}, {{W+|en|impel}}, {{W+|en|incite}}, {{W+|en|instigate}}, {{W+|en|prod}}, {{W+|en|provocate}}, {{W+|en|spur}}, {{W+|en|spur on}}, {{W+|en|stimulate}}, {{W+|en|stir}}, {{W+|en|stir up}}, {{W+|en|trigger}}
{{werger-bin}}
8kfcbqa143xqrjtn9yu6f36qi3rtydr
Flugzeugführer
0
309756
6292117
4070215
2026-07-29T22:15:04Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292117
wikitext
text/x-wiki
== {{ziman|de}} ==
=== Navdêr ===
{{navdêr|de}}
# [[firvan]], [[pîlot]]
e3g0h69uhsoqqjrz35a8j2f93bh25yz
God
0
312317
6292125
6092195
2026-07-29T22:25:25Z
Wikihez
7344
6292125
wikitext
text/x-wiki
{{binêre herwiha|god}}
== {{ziman|en}} ==
=== Bilêvkirin ===
* {{deng|en|En-uk-God.ogg|dever=QY}}
* {{deng|en|en-us-god.ogg|dever=DYA}}
=== Navdêr ===
{{navdêr|en}}
# [[Xwedê]]
== {{ziman|nl}} ==
=== Navdêr ===
{{navdêr|nl|z=}}
# [[xwedê]], [[xwedawend]], [[yezdan]], [[îlah]]
== {{ziman|nv}} ==
=== Navdêr ===
{{navdêr|nv}}
# [[xwedê]], [[xwedawend]], [[yezdan]], [[îlah]]
kf1y75popylr1xoxxqdnhtbcxnyi4x0
breiten
0
313761
6292103
5039715
2026-07-29T22:05:36Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292103
wikitext
text/x-wiki
== {{ziman|de}} ==
=== Bilêvkirin ===
* {{deng|de|De-breiten.ogg|Deng}}
* {{deng|de|De-breiten2.ogg|Deng}}
=== Lêker ===
{{lêker|de}}
# [[fireh bûn]], [[berbelav bûn]]
# [[dirêj bûn]]
e7lexj432akykhn1o9h6h00d6is6027
-d
0
359039
6292112
6023179
2026-07-29T22:12:53Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292112
wikitext
text/x-wiki
{{binêre herwiha/d}}
== {{ziman|ku}} ==
=== Paşgir ===
{{paşgir|ku}}
# [[nîşan]]a [[demên borî]] ya [[piranî|piraniya]] [[lêker]]ên [[gerguhêz]] ([[transitîv]])
#: ''çand, stand, diran...'' (bidin ber rehê demên neborî ''-çîn-, -stîn-, -dirîn-'')
==== Têkildar ====
* [[-t]]
* [[-î]]
==== Werger ====
{{werger-ser}}
* {{Z|dz}}: {{W-|dz|ཅི}}
* {{Z|eo}}: {{W+|eo|-is}}
* {{Z|fa}}: {{W-|fa|ـده|tr=-de}}, {{W-|fa|ـد|tr=-d}}, {{W-|fa|ـته|tr=-te}}, {{W-|fa|ـت|tr=-t}}
* {{Z|en}}: {{W+|en|-ed}}, {{W+|en|-d}}, {{W+|en|-t}}
* {{Z|ja}}: {{W-|ja|-た|tr=-ta}}
* {{Z|ko}}: {{W-|ko|-았|tr=-at}}
* {{Z|hu}}: {{W-|hu|[[-t]]/[[-tt]]/[[-ott]]/[[-ett]]/[[-ött]]}}
* {{Z|no}}:
*: {{Z|nb}}: {{W+|nb|-a|}}, {{W+|nb|-et}}, {{W-|nb|-te}}, {{W-|nb|-de}}, {{W-|nb|-dd}}, {{W-|nb|-tt}}, {{W-|nb|-tø}}, {{W-|nb|-øt}}, {{W-|nb|-øyt}}
*: {{Z|nn}}: {{W-|nn|-a}}, {{W-|nn|-te}}, {{W-|nn|-de}}, {{W-|nn|-dd}}, {{W-|nn|-tt}}, {{W-|nn|-aut}}
* {{Z|pl}}: {{W-|pl|-ł}}
* {{Z|ru}}: {{W+|ru|-л|n}}, {{W+|ru|-ла|m}}, {{W+|ru|-ло|nt}}, {{W+|ru|-ли|p}}
* {{Z|es}}: {{W+|es|-ado}}
* {{Z|sv}}: {{W+|sv|-de}}, {{W+|sv|-t}}
* {{Z|tr}}: {{W+|tr|-di}}, {{W+|tr|-ti}}, {{W+|tr|-dı}}, {{W+|tr|-tı}}, {{W+|tr|-du}}, {{W+|tr|-tu}}, {{W+|tr|-dü}}, {{W+|tr|-tü}},
* {{Z|uk}}: {{W-|uk|-в|n}}, {{W-|uk|-ла|m}}, {{W-|uk|-ло|nt}}, {{W-|uk|-ли|p}}
{{werger-bin}}
:{{werger çavkanî|en|-ed|beş=Ev qismê Wergerê|oldid=82486685}}
== {{ziman|en}} ==
=== Paşgir ===
{{paşgir|en}}
# {{bnr|-ed}}
rk9562krdytow3p5v5bm2nndv6y3j7m
cockroach
0
387571
6292110
6093120
2026-07-29T22:11:44Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292110
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Bilêvkirin ===
* {{deng|en|en-us-cockroach.ogg|dever=DYA}}
=== Navdêr ===
[[Wêne:Missiemuseum Steyl-Tegelen, vlinders & geleedpotigen 14.jpg|thumb|Sîsirk li mozexanekê.]]
{{navdêr|en}}
# [[kêz]], [[sîsirk]]
== {{ziman|en}} ==
=== Navdêr ===
{{navdêr|en}}
# {{mijar|en|heywan}} {{g|ku|sîsirk}} ([[kêz]]eke nav malan)
=== Çavkanî ===
{{rûpela wergerê|en|sîsirk}}
81qeioas3wxg824my02a6x6enl3za4a
6292111
6292110
2026-07-29T22:12:24Z
Wikihez
7344
6292111
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Bilêvkirin ===
* {{deng|en|en-us-cockroach.ogg|dever=DYA}}
=== Navdêr ===
[[Wêne:Missiemuseum Steyl-Tegelen, vlinders & geleedpotigen 14.jpg|thumb|{{zim|en|cockroach}}]]
{{navdêr|en}}
# {{mijar|en|buxik}} [[kêz]], [[sîsirk]]
alo2gikw9jpakatc9m518s7lwr2ywt1
geweitet
0
456414
6292122
4981754
2026-07-29T22:23:59Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292122
wikitext
text/x-wiki
== {{ziman|de}} ==
=== Bilêvkirin ===
* {{deng|de|De-geweitet.ogg|Deng}}
=== Formeke lêkerê ===
{{lêker|de|form=erê}}
# {{partîsîpa borî|de|weiten}}
## [[belkirî]], [[belbûyî]], [[firehkirî]], [[firehbûyî]]
fx7esxrhoj0k8gz4m52yei3ndtrco82
NASA
0
475295
6292137
6284923
2026-07-30T07:46:02Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292137
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Kurtenav ===
{{kurtenav|en}}
# Kurteya ''[[national|National]] [[aeronautics|Aeronautics]] and [[space|Space]] [[administration|Administration]]'' ([[daîre|Daîreya]] [[feza|Feza]] û [[hewavanî|Hewavaniya]] [[neteweyî|Neteweyî]] ya [[DYA]]yê)
==== Etîmolojî ====
{{bêetîmolojî|en}}
pon71638fidlr941uk10eitzuhydflc
6292138
6292137
2026-07-30T07:52:46Z
Wikihez
7344
/* {{ziman|en}} */ [[Bikarhêner:Wikihez/templateScript2.js|TS]]: Ji [[en:NASA|en.wikt]]
6292138
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Bilêvkirin ===
* {{IPA|en|/ˈnæsə/}}
* {{deng|en|LL-Q1860 (eng)-Vealhurl-NASA.wav|dever=Îngilistana başûr}}
* {{deng|en|En-us-NASA.oga|dever=DYA}}
=== Kurtenav ===
{{kurtenav|en}}
# {{kurtkirin|en|[[national|National]] [[aeronautics|Aeronautics]] and [[space|Space]] [[administration|Administration]]|w=[[daîre|Daîreya]] [[feza|Feza]] û [[hewavanî|Hewavaniya]] [[neteweyî|Neteweyî]] ya [[DYA]]yê}}
==== Formên alternatîv ====
* {{hw|en|N.A.S.A.|Nasa||Brîtanî, Awistralyayî, Zelandaya Nû}}
rh7512jhdodcrwgws0lt64zsr9mqin7
Nasa
0
476897
6292136
4909046
2026-07-30T07:45:26Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292136
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Navdêr ===
{{navdêr|ku}}
# {{guharto|ku|NASA}}
75hdfg12ctd9xcly9maujxksgpirit1
6292139
6292136
2026-07-30T07:53:16Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292139
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Serenav ===
{{serenav|en}}
# {{guharto|ku|NASA}}
iyt494wwci4uuis4x56armwujzvqgks
God forbid
0
523811
6292126
4669223
2026-07-29T22:26:14Z
Wikihez
7344
[[Bikarhêner:Wikihez/templateScript2.js|TS]]: Ji [[en:God forbid|en.wikt]]
6292126
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{deng|en|en-au-God forbid.ogg|dever=Awistralya}}
===Baneşan===
{{baneşan|en}}
# {{e|en|biwêjî}} [[Xwedê neke]], [[Xwedê nekirî]], [[Xudê nekit]]
jg7o8f5uxb4ed1wzr8tsmqischjhkv8
6292127
6292126
2026-07-29T22:27:11Z
Wikihez
7344
[[Bikarhêner:Wikihez/templateScript2.js|TS]]: Ji [[en:God forbid|en.wikt]]
6292127
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{deng|en|en-au-God forbid.ogg|dever=Awistralya}}
===Baneşan===
{{baneşan|en}}
# {{e|en|biwêjî}} [[Xwedê neke]], [[Xwedê nekirî]], [[Xudê nekit]]
#: {{hevmane|en|heaven forbid|heaven forfend}}
#: {{dijmane|en|God willing|Lord willing}}
#: {{ux|en|If, '''God forbid''', there's a fire, head for the nearest exit.}}
ej9k1y2vhls71p9i49kwodn2wlx8utl
6292132
6292127
2026-07-30T07:43:23Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292132
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Bilêvkirin ===
* {{deng|en|en-au-God forbid.ogg|dever=Awistralya}}
===Baneşan===
{{baneşan|en}}
# {{e|en|biwêjî}} [[Xwedê neke]], [[Xwedê nekirî]], [[Xudê nekit]]
#: {{hevmane|en|heaven forbid|heaven forfend}}
#: {{dijmane|en|God willing|Lord willing}}
#: {{ux|en|If, '''God forbid''', there's a fire, head for the nearest exit.}}
karq8qchfkic9cy75sqegxq5t6i14sz
gray matter
0
523893
6292128
6255915
2026-07-29T22:27:32Z
Wikihez
7344
[[Bikarhêner:Wikihez/templateScript2.js|TS]]: sererastkirin
6292128
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Navdêr ===
{{navdêr|en}}
# [[hiş]], [[mejî]], [[aqil]]
==== Formên alternatîv ====
* {{g|en|grey matter}}
bh3tizurxi9hcof9ls3soiavxutol1v
inenarrable
0
533472
6292133
4194244
2026-07-30T07:43:42Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292133
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Rengdêr ===
{{rengdêr|en}}
# ya ku [[hatin|nayê]] [[gotin]]
mxa1tnr8oy0w9bifmvhyo952p1td9e3
berbac
0
539030
6292100
5819219
2026-07-29T22:04:15Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292100
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Rengdêr ===
{{rengdêr|ku}}
# [[bacbar]]
==== Etîmolojî ====
Ji {{qertaf|ku|ber|bac}}.
==== Werger ====
{{werger-ser}}
* {{Z|en}}: {{W+|en|taxable}}
{{werger-bin}}
{{kontrol}}
hnjzsfo4jhulabx5krj41v8w3liy2s1
auf Teufel komm raus
0
618180
6292096
4898570
2026-07-29T22:00:25Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292096
wikitext
text/x-wiki
== {{ziman|de}} ==
=== Bilêvkirin ===
* {{deng|de|De-auf Teufel komm raus.ogg|Deng}}
=== Hoker ===
{{hoker|de}}
# {{f|de|biwêjî}} bi çi şiklî dibe bila be, bi her hawî
ixbojsfa38aqgdmvv3wn5vnwccz92oj
6292097
6292096
2026-07-29T22:01:01Z
Wikihez
7344
/* Hoker */
6292097
wikitext
text/x-wiki
== {{ziman|de}} ==
=== Bilêvkirin ===
* {{deng|de|De-auf Teufel komm raus.ogg|Deng}}
=== Hoker ===
{{hoker|de}}
# {{f|de|biwêjî}} [[bi çi şiklî]] [[bûn|dibe]] [[bila be]], bi her [[hawî|hawî]]
j0rie78no8fkg45w17yanip4jf4lxva
isim tamlaması
0
633109
6292095
4541853
2026-07-29T21:59:58Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292095
wikitext
text/x-wiki
== {{ziman|tr}} ==
=== Navdêr ===
{{navdêr|tr}}
# raveka navî
51gd26g2cicu0dx6xbpv2rgync3e79b
acetous
0
636864
6292155
4898484
2026-07-30T08:24:59Z
Wikihez
7344
/* {{ziman|en}} */ [[Bikarhêner:Wikihez/templateScript2.js|TS]]: Ji [[en:acetous|en.wikt]]
6292155
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Bilêvkirin ===
* {{IPA|en|/ˈæ.sɪ.təs/|/əˈsiː.təs/}}
* {{deng|en|en-us-acetous-1.ogg|dever=DYA|IPA=/ˈæ.sɪ.təs/}}
* {{deng|en|en-us-acetous-2.ogg|dever=DYA|IPA=/əˈsiː.təs/}}
=== Rengdêr ===
{{en-rengdêr}}
# Ya/yê [[tam|tamekî]] [[tirş|tirş]] e.
==== Etîmolojî ====
Ji {{ji|la|en|acētum||sirke}} + {{qertaf|en|-ous}}, ya ewil ji {{qal|la|aceō||tirş bûn}}.
ktpan6p89w9q4ohwxt2r4e7hjy5vfv9
canbiderd
0
647702
6292104
4562976
2026-07-29T22:08:12Z
Wikihez
7344
6292104
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Rengdêr ===
{{rengdêr|ku}}
# [[kes|kesê]] ku di [[can|canê]] wî de [[derd|derd]] [[hebûn|heye]], kesê [[pir]] [[derdedar]] yê ku [[derd|derdekî]] pir [[giran|giran]] lê [[peyda bûn|peyda bûye]] û ew derd [[ketin|ketîye]] canê wî, di canê wî de [[kar|kar]] [[kirin|kirîye]] û bi wî [[awa|awayî]] ew [[nehêsa|nehêsa]] kirîye
==== Etîmolojî ====
{{bêetîmolojî}}
==== Werger ====
{{werger-ser}}
{{werger-bin}}
5ke3eh9mqoybdqbq3vldh188u4saboc
6292105
6292104
2026-07-29T22:08:28Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292105
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Rengdêr ===
{{rengdêr|ku}}
# [[kes|Kesê]] ku di [[can|canê]] wî de [[derd|derd]] [[hebûn|heye]], kesê [[pir]] [[derdedar]] yê ku [[derd|derdekî]] pir [[giran|giran]] lê [[peyda bûn|peyda bûye]] û ew derd [[ketin|ketîye]] canê wî, di canê wî de [[kar|kar]] [[kirin|kirîye]] û bi wî [[awa|awayî]] ew [[nehêsa|nehêsa]] kirîye.
==== Etîmolojî ====
{{bêetîmolojî}}
==== Werger ====
{{werger-ser}}
{{werger-bin}}
9czpq5hmxw4qafia9jsvbo4eofouu5m
behîvtark
0
649554
6292035
2962315
2026-07-29T17:10:22Z
Wikihez
7344
([[Mediawiki:Gadget-start.js|WF:NÛ]] v.2.0) +ku:navdêr:{{guharto|ku|behîvterk}}
6292035
wikitext
text/x-wiki
== {{ziman|ku}} ==
=== Bilêvkirin ===
* {{ku-kîte}}
=== Navdêr ===
{{navdêr|ku|c=?}}
# {{guharto|ku|behîvterk}}
#* {{nimûne?|ku}}
r4ymrieikj1u55i1prj144myicmh47u
wissentlich
0
670488
6292149
6071966
2026-07-30T08:19:51Z
Wikihez
7344
[[Bikarhêner:Wikihez/templateScript2.js|TS]]: sererastkirin, [[Bikarhêner:Wikihez/templateScript2.js|TS]]: sererastkirin
6292149
wikitext
text/x-wiki
== {{ziman|de}} ==
=== Bilêvkirin ===
* {{IPA|de|[ˈvɪsn̩tlɪç]}}
* {{deng|de|De-wissentlich.ogg|Deng}}
* {{kîte|de|wis|sent|lich}}
=== Rengdêr ===
{{rengdêr|en}}
# bi [[mebest|mebest]] û [[alaz|alaz]], [[bi qest]]
#: {{hevmane|de|absichtlich|bewusst|gewollt|willentlich}}
#: {{dijmane|ku|aus [[Versehen]]|unabsichtlich|ungewollt|versehentlich}}
sbpk4irk4728w964d4ltymoez2gztq1
6292150
6292149
2026-07-30T08:19:57Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292150
wikitext
text/x-wiki
== {{ziman|de}} ==
=== Bilêvkirin ===
* {{IPA|de|[ˈvɪsn̩tlɪç]}}
* {{deng|de|De-wissentlich.ogg|Deng}}
* {{kîte|de|wis|sent|lich}}
=== Rengdêr ===
{{rengdêr|en}}
# bi [[mebest|mebest]] û [[alaz|alaz]], [[bi qest]]
#: {{hevmane|de|absichtlich|bewusst|gewollt|willentlich}}
#: {{dijmane|de|aus [[Versehen]]|unabsichtlich|ungewollt|versehentlich}}
t1t2mvyotlql08t79thm7cq6abxs9em
6292151
6292150
2026-07-30T08:20:10Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292151
wikitext
text/x-wiki
== {{ziman|de}} ==
=== Bilêvkirin ===
* {{IPA|de|[ˈvɪsn̩tlɪç]}}
* {{deng|de|De-wissentlich.ogg|Deng}}
* {{kîte|de|wis|sent|lich}}
=== Rengdêr ===
{{rengdêr|de}}
# bi [[mebest|mebest]] û [[alaz|alaz]], [[bi qest]]
#: {{hevmane|de|absichtlich|bewusst|gewollt|willentlich}}
#: {{dijmane|de|aus [[Versehen]]|unabsichtlich|ungewollt|versehentlich}}
flkzckfpn715yi5muwycx5aiqb7vse0
Gotûbêja şablonê:ku-tewîn-nav
11
672434
6292157
6034928
2026-07-30T08:57:11Z
Wikihez
7344
/* Hevedudanî */ beşeke nû
6292157
wikitext
text/x-wiki
Gelo mirov dikare tabloyekê ji bo peyvên tenê yekjimar in, amade bike? --[[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 15:15, 27 tîrmeh 2019 (UTC)
* Rewşa bangkirinê/gazîkirinê (vokatîv) kêm e. --[[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 05:37, 25 tebax 2019 (UTC)
== Rengê girêdanan ==
Silav {{r|Wikihez|Bikarhêner}} Min rengê girêdanan (yên ku nehatine çêkirin) di nav tabloyên tewandinan de reş kir (pêşta sor bûn wekî talboya lêkera {{g|ku|rûniştin}}ê); bi vî awayî çêtir e? Bnr. {{g|ku|kurmancî}}. Tabloya lêkerê jî wisa bikim? [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 18:06, 7 sibat 2025 (UTC)
:Reş ji bo lînkan nebaş e. Wek berê baştir bû. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:50, 7 sibat 2025 (UTC)
::Ji bo lihevkirina şablonan erê. Hazir em behsa vê şablonê dikin lazim e ku bibêjim gereg şablon karibe were veşartin. Xisûsen ji bo mobîlê ev muhîm e. Ji ber ku tablo mezin e, meriv karibe şablonê veşêre da ku gotarê hêsantir bixwîne. Tê de "class"a Tewandin gereg hebe ji bo ku bi qutiya "Veşartin"ê ya kêlekê meriv karibe vê şablonê li her derê veşêre an jî nîşan bide. (Min niha ferq kir ev qutî di mobîlê de xuya dike lê li kompûterê xuya nake. Çima?) [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 18:50, 7 sibat 2025 (UTC)
:::[https://ku.wiktionary.org/wiki/kurmanc%C3%AE#Navd%C3%AAr] Bnr. [[mw:Manual:Collapsible elements]]. Sernav: <small>[[MediaWiki:Collapsible-expand]] / [[MediaWiki:Collapsible-collapse]]</small> [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:56, 7 sibat 2025 (UTC)
::::[[Alîkarî:NavFrame]] hewce ye [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:42, 7 sibat 2025 (UTC)
:::::@[[Bikarhêner:Ghybu|Ghybu] bnr. [[WF:C]] [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:04, 7 sibat 2025 (UTC)
::::::@Ghybu [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:04, 7 sibat 2025 (UTC)
:::::::Erê, feqet lê bi vê metodê tablo di hindirî tabloyeke din de xuya dike. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 23:11, 7 sibat 2025 (UTC)
::::::::PS: Min daxwaza te pirr rind fêm nekir {{=)}} [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 23:32, 7 sibat 2025 (UTC)
::::::::[[Wêne:Navframe test ss.jpg|thumb]]
::::::::[[MediaWiki:Gadget-VisibilityToggles.js]] destûr dide ku meriv di carekê de li hemû sayfeyan tabloyan tewandinê veşêre. Ji bo vê jî Yan navframe+class=inflection-table hewce ye yan jî bikaranîna inflection-table bi awayekî din ku ez vîya nizanim :/ [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:41, 7 sibat 2025 (UTC)
:::::::::Temam, feqet bi min pêşta vekirî bimîne. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 00:11, 8 sibat 2025 (UTC)
::::::::::PS: Li ser Dîwanê: [https://ku.wiktionary.org/w/index.php?title=W%C3%AEk%C3%AEferheng:D%C3%AEwan/2023&oldid=5922877#Tabloya_tewandina_navd%C3%AAran_(format) Tabloya tewandina navdêran (format)] [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 00:16, 8 sibat 2025 (UTC)
:::::::::::Erê, jixwe pêşta vekirî ye, bide ber [[:MediaWiki:Gadget-VisibilityToggles.js#L-33]] û [[:en:MediaWiki:Gadget-VisibilityToggles.js#L-31]] [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 11:21, 8 sibat 2025 (UTC)
== Hevedudanî ==
@[[Bikarhêner:Ghybu|Ghybu]] Di agahdariyê de dibêje: "peyvên hevedudanî" feqat bi min vana ne "hevedudanî" ne. Hevedudanî=compound. Hemû kelîmeyên hevedudanî bi vî şiklî nayên tewandin. Lazim e bibêje "îsîm tamlamasi û sifat tamlamasi" kurmanciya wê çi ye? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 08:57, 30 tîrmeh 2026 (UTC)
ncyf4zrpwzyddqrjgmb7yc69rhekcb6
6292159
6292157
2026-07-30T10:47:47Z
Ghybu
1393
/* Hevedudanî */ Bersiv
6292159
wikitext
text/x-wiki
Gelo mirov dikare tabloyekê ji bo peyvên tenê yekjimar in, amade bike? --[[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 15:15, 27 tîrmeh 2019 (UTC)
* Rewşa bangkirinê/gazîkirinê (vokatîv) kêm e. --[[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 05:37, 25 tebax 2019 (UTC)
== Rengê girêdanan ==
Silav {{r|Wikihez|Bikarhêner}} Min rengê girêdanan (yên ku nehatine çêkirin) di nav tabloyên tewandinan de reş kir (pêşta sor bûn wekî talboya lêkera {{g|ku|rûniştin}}ê); bi vî awayî çêtir e? Bnr. {{g|ku|kurmancî}}. Tabloya lêkerê jî wisa bikim? [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 18:06, 7 sibat 2025 (UTC)
:Reş ji bo lînkan nebaş e. Wek berê baştir bû. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:50, 7 sibat 2025 (UTC)
::Ji bo lihevkirina şablonan erê. Hazir em behsa vê şablonê dikin lazim e ku bibêjim gereg şablon karibe were veşartin. Xisûsen ji bo mobîlê ev muhîm e. Ji ber ku tablo mezin e, meriv karibe şablonê veşêre da ku gotarê hêsantir bixwîne. Tê de "class"a Tewandin gereg hebe ji bo ku bi qutiya "Veşartin"ê ya kêlekê meriv karibe vê şablonê li her derê veşêre an jî nîşan bide. (Min niha ferq kir ev qutî di mobîlê de xuya dike lê li kompûterê xuya nake. Çima?) [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 18:50, 7 sibat 2025 (UTC)
:::[https://ku.wiktionary.org/wiki/kurmanc%C3%AE#Navd%C3%AAr] Bnr. [[mw:Manual:Collapsible elements]]. Sernav: <small>[[MediaWiki:Collapsible-expand]] / [[MediaWiki:Collapsible-collapse]]</small> [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:56, 7 sibat 2025 (UTC)
::::[[Alîkarî:NavFrame]] hewce ye [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:42, 7 sibat 2025 (UTC)
:::::@[[Bikarhêner:Ghybu|Ghybu] bnr. [[WF:C]] [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:04, 7 sibat 2025 (UTC)
::::::@Ghybu [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:04, 7 sibat 2025 (UTC)
:::::::Erê, feqet lê bi vê metodê tablo di hindirî tabloyeke din de xuya dike. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 23:11, 7 sibat 2025 (UTC)
::::::::PS: Min daxwaza te pirr rind fêm nekir {{=)}} [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 23:32, 7 sibat 2025 (UTC)
::::::::[[Wêne:Navframe test ss.jpg|thumb]]
::::::::[[MediaWiki:Gadget-VisibilityToggles.js]] destûr dide ku meriv di carekê de li hemû sayfeyan tabloyan tewandinê veşêre. Ji bo vê jî Yan navframe+class=inflection-table hewce ye yan jî bikaranîna inflection-table bi awayekî din ku ez vîya nizanim :/ [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:41, 7 sibat 2025 (UTC)
:::::::::Temam, feqet bi min pêşta vekirî bimîne. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 00:11, 8 sibat 2025 (UTC)
::::::::::PS: Li ser Dîwanê: [https://ku.wiktionary.org/w/index.php?title=W%C3%AEk%C3%AEferheng:D%C3%AEwan/2023&oldid=5922877#Tabloya_tewandina_navd%C3%AAran_(format) Tabloya tewandina navdêran (format)] [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 00:16, 8 sibat 2025 (UTC)
:::::::::::Erê, jixwe pêşta vekirî ye, bide ber [[:MediaWiki:Gadget-VisibilityToggles.js#L-33]] û [[:en:MediaWiki:Gadget-VisibilityToggles.js#L-31]] [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 11:21, 8 sibat 2025 (UTC)
== Hevedudanî ==
@[[Bikarhêner:Ghybu|Ghybu]] Di agahdariyê de dibêje: "peyvên hevedudanî" feqat bi min vana ne "hevedudanî" ne. Hevedudanî=compound. Hemû kelîmeyên hevedudanî bi vî şiklî nayên tewandin. Lazim e bibêje "îsîm tamlamasi û sifat tamlamasi" kurmanciya wê çi ye? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 08:57, 30 tîrmeh 2026 (UTC)
:Erê şas tê fêm kirin. Hevedudanî ne feqet peyvên hevededanî yên wekî "navdêr + rengdêr" (îzafe + rengdêr) û "navdêr + navdêr" (îzafe + çemandî) ne. Di nav zimanan de şikilên "navdêr + navdêr", "rengdêr + navdêr", "rengdêr + rengdêr", "lêker + navdêr", "hoker/daçek + navdêr", ... jî hene.
:Bi min 1) Hemû şiklên navdêran werin nivîsandin 2) Kategoriyên wan jî werin çêkirin. Ji bo navdayînê jî di nav parantezê de wekî hevdudanî (navdêr + rengdêr) û hevdudanî (navdêr + navdêr) were nivîsandin.
:Li vira {{g|ckb|سێو#Tewandin}} bi soranî ji bo çêkirina navdêran min "rengdêr + navdêr" nivîsandibû...
:Herwiha peyva {{q|ku|sikil}} wekî "şikl" tê tewandin [//ku.wiktionary.org/w/index.php?title=Got%C3%BBb%C3%AAja_modul%C3%AA:ku-tew%C3%AEn-nav&oldid=6291551#ne%C5%9Fir,_he%C5%9Fir] :) [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 10:47, 30 tîrmeh 2026 (UTC)
eblhiuwyddvzq897phkrr8h286dp8h2
6292160
6292159
2026-07-30T10:49:07Z
Ghybu
1393
/* Hevedudanî */
6292160
wikitext
text/x-wiki
Gelo mirov dikare tabloyekê ji bo peyvên tenê yekjimar in, amade bike? --[[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 15:15, 27 tîrmeh 2019 (UTC)
* Rewşa bangkirinê/gazîkirinê (vokatîv) kêm e. --[[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 05:37, 25 tebax 2019 (UTC)
== Rengê girêdanan ==
Silav {{r|Wikihez|Bikarhêner}} Min rengê girêdanan (yên ku nehatine çêkirin) di nav tabloyên tewandinan de reş kir (pêşta sor bûn wekî talboya lêkera {{g|ku|rûniştin}}ê); bi vî awayî çêtir e? Bnr. {{g|ku|kurmancî}}. Tabloya lêkerê jî wisa bikim? [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 18:06, 7 sibat 2025 (UTC)
:Reş ji bo lînkan nebaş e. Wek berê baştir bû. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:50, 7 sibat 2025 (UTC)
::Ji bo lihevkirina şablonan erê. Hazir em behsa vê şablonê dikin lazim e ku bibêjim gereg şablon karibe were veşartin. Xisûsen ji bo mobîlê ev muhîm e. Ji ber ku tablo mezin e, meriv karibe şablonê veşêre da ku gotarê hêsantir bixwîne. Tê de "class"a Tewandin gereg hebe ji bo ku bi qutiya "Veşartin"ê ya kêlekê meriv karibe vê şablonê li her derê veşêre an jî nîşan bide. (Min niha ferq kir ev qutî di mobîlê de xuya dike lê li kompûterê xuya nake. Çima?) [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 18:50, 7 sibat 2025 (UTC)
:::[https://ku.wiktionary.org/wiki/kurmanc%C3%AE#Navd%C3%AAr] Bnr. [[mw:Manual:Collapsible elements]]. Sernav: <small>[[MediaWiki:Collapsible-expand]] / [[MediaWiki:Collapsible-collapse]]</small> [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:56, 7 sibat 2025 (UTC)
::::[[Alîkarî:NavFrame]] hewce ye [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:42, 7 sibat 2025 (UTC)
:::::@[[Bikarhêner:Ghybu|Ghybu] bnr. [[WF:C]] [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:04, 7 sibat 2025 (UTC)
::::::@Ghybu [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:04, 7 sibat 2025 (UTC)
:::::::Erê, feqet lê bi vê metodê tablo di hindirî tabloyeke din de xuya dike. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 23:11, 7 sibat 2025 (UTC)
::::::::PS: Min daxwaza te pirr rind fêm nekir {{=)}} [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 23:32, 7 sibat 2025 (UTC)
::::::::[[Wêne:Navframe test ss.jpg|thumb]]
::::::::[[MediaWiki:Gadget-VisibilityToggles.js]] destûr dide ku meriv di carekê de li hemû sayfeyan tabloyan tewandinê veşêre. Ji bo vê jî Yan navframe+class=inflection-table hewce ye yan jî bikaranîna inflection-table bi awayekî din ku ez vîya nizanim :/ [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:41, 7 sibat 2025 (UTC)
:::::::::Temam, feqet bi min pêşta vekirî bimîne. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 00:11, 8 sibat 2025 (UTC)
::::::::::PS: Li ser Dîwanê: [https://ku.wiktionary.org/w/index.php?title=W%C3%AEk%C3%AEferheng:D%C3%AEwan/2023&oldid=5922877#Tabloya_tewandina_navd%C3%AAran_(format) Tabloya tewandina navdêran (format)] [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 00:16, 8 sibat 2025 (UTC)
:::::::::::Erê, jixwe pêşta vekirî ye, bide ber [[:MediaWiki:Gadget-VisibilityToggles.js#L-33]] û [[:en:MediaWiki:Gadget-VisibilityToggles.js#L-31]] [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 11:21, 8 sibat 2025 (UTC)
== Hevedudanî ==
@[[Bikarhêner:Ghybu|Ghybu]] Di agahdariyê de dibêje: "peyvên hevedudanî" feqat bi min vana ne "hevedudanî" ne. Hevedudanî=compound. Hemû kelîmeyên hevedudanî bi vî şiklî nayên tewandin. Lazim e bibêje "îsîm tamlamasi û sifat tamlamasi" kurmanciya wê çi ye? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 08:57, 30 tîrmeh 2026 (UTC)
:Erê şas tê fêm kirin. Hevedudanî ne feqet peyvên hevedudanî yên wekî "navdêr + rengdêr" (îzafe + rengdêr) û "navdêr + navdêr" (îzafe + çemandî) ne. Di nav zimanan de şikilên "navdêr + navdêr", "rengdêr + navdêr", "rengdêr + rengdêr", "lêker + navdêr", "hoker/daçek + navdêr", ... jî hene.
:Bi min 1) Hemû şiklên navdêran werin nivîsandin 2) Kategoriyên wan jî werin çêkirin. Ji bo navdayînê jî di nav parantezê de wekî hevdudanî (navdêr + rengdêr) û hevdudanî (navdêr + navdêr) were nivîsandin.
:Li vira {{g|ckb|سێو#Tewandin}} bi soranî ji bo çêkirina navdêran min "rengdêr + navdêr" nivîsandibû...
:Herwiha peyva {{q|ku|sikil}} wekî "şikl" tê tewandin [//ku.wiktionary.org/w/index.php?title=Got%C3%BBb%C3%AAja_modul%C3%AA:ku-tew%C3%AEn-nav&oldid=6291551#ne%C5%9Fir,_he%C5%9Fir] :) [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 10:47, 30 tîrmeh 2026 (UTC)
7o93y6nmdmngvpxro2274cza77z79br
6292161
6292160
2026-07-30T10:49:31Z
Ghybu
1393
/* Hevedudanî */
6292161
wikitext
text/x-wiki
Gelo mirov dikare tabloyekê ji bo peyvên tenê yekjimar in, amade bike? --[[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 15:15, 27 tîrmeh 2019 (UTC)
* Rewşa bangkirinê/gazîkirinê (vokatîv) kêm e. --[[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 05:37, 25 tebax 2019 (UTC)
== Rengê girêdanan ==
Silav {{r|Wikihez|Bikarhêner}} Min rengê girêdanan (yên ku nehatine çêkirin) di nav tabloyên tewandinan de reş kir (pêşta sor bûn wekî talboya lêkera {{g|ku|rûniştin}}ê); bi vî awayî çêtir e? Bnr. {{g|ku|kurmancî}}. Tabloya lêkerê jî wisa bikim? [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 18:06, 7 sibat 2025 (UTC)
:Reş ji bo lînkan nebaş e. Wek berê baştir bû. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:50, 7 sibat 2025 (UTC)
::Ji bo lihevkirina şablonan erê. Hazir em behsa vê şablonê dikin lazim e ku bibêjim gereg şablon karibe were veşartin. Xisûsen ji bo mobîlê ev muhîm e. Ji ber ku tablo mezin e, meriv karibe şablonê veşêre da ku gotarê hêsantir bixwîne. Tê de "class"a Tewandin gereg hebe ji bo ku bi qutiya "Veşartin"ê ya kêlekê meriv karibe vê şablonê li her derê veşêre an jî nîşan bide. (Min niha ferq kir ev qutî di mobîlê de xuya dike lê li kompûterê xuya nake. Çima?) [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 18:50, 7 sibat 2025 (UTC)
:::[https://ku.wiktionary.org/wiki/kurmanc%C3%AE#Navd%C3%AAr] Bnr. [[mw:Manual:Collapsible elements]]. Sernav: <small>[[MediaWiki:Collapsible-expand]] / [[MediaWiki:Collapsible-collapse]]</small> [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:56, 7 sibat 2025 (UTC)
::::[[Alîkarî:NavFrame]] hewce ye [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:42, 7 sibat 2025 (UTC)
:::::@[[Bikarhêner:Ghybu|Ghybu] bnr. [[WF:C]] [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:04, 7 sibat 2025 (UTC)
::::::@Ghybu [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:04, 7 sibat 2025 (UTC)
:::::::Erê, feqet lê bi vê metodê tablo di hindirî tabloyeke din de xuya dike. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 23:11, 7 sibat 2025 (UTC)
::::::::PS: Min daxwaza te pirr rind fêm nekir {{=)}} [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 23:32, 7 sibat 2025 (UTC)
::::::::[[Wêne:Navframe test ss.jpg|thumb]]
::::::::[[MediaWiki:Gadget-VisibilityToggles.js]] destûr dide ku meriv di carekê de li hemû sayfeyan tabloyan tewandinê veşêre. Ji bo vê jî Yan navframe+class=inflection-table hewce ye yan jî bikaranîna inflection-table bi awayekî din ku ez vîya nizanim :/ [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:41, 7 sibat 2025 (UTC)
:::::::::Temam, feqet bi min pêşta vekirî bimîne. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 00:11, 8 sibat 2025 (UTC)
::::::::::PS: Li ser Dîwanê: [https://ku.wiktionary.org/w/index.php?title=W%C3%AEk%C3%AEferheng:D%C3%AEwan/2023&oldid=5922877#Tabloya_tewandina_navd%C3%AAran_(format) Tabloya tewandina navdêran (format)] [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 00:16, 8 sibat 2025 (UTC)
:::::::::::Erê, jixwe pêşta vekirî ye, bide ber [[:MediaWiki:Gadget-VisibilityToggles.js#L-33]] û [[:en:MediaWiki:Gadget-VisibilityToggles.js#L-31]] [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 11:21, 8 sibat 2025 (UTC)
== Hevedudanî ==
@[[Bikarhêner:Ghybu|Ghybu]] Di agahdariyê de dibêje: "peyvên hevedudanî" feqat bi min vana ne "hevedudanî" ne. Hevedudanî=compound. Hemû kelîmeyên hevedudanî bi vî şiklî nayên tewandin. Lazim e bibêje "îsîm tamlamasi û sifat tamlamasi" kurmanciya wê çi ye? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 08:57, 30 tîrmeh 2026 (UTC)
:Erê şas tê fêm kirin. Hevedudanî ne feqet peyvên hevedudanî yên wekî "navdêr + rengdêr" (îzafe + rengdêr) û "navdêr + navdêr" (îzafe + çemandî) ne. Di nav zimanan de şikilên "navdêr + navdêr", "rengdêr + navdêr", "rengdêr + rengdêr", "lêker + navdêr", "hoker/daçek + navdêr", ... jî hene.
:Bi min 1) Hemû şiklên navdêran werin nivîsandin 2) Kategoriyên wan jî werin çêkirin. Ji bo navdayînê jî di nav parantezê de wekî hevdudanî (navdêr + rengdêr) û hevdudanî (navdêr + navdêr) were nivîsandin.
:Li vira {{g|ckb|سێو#Tewandin}} bi soranî ji bo çêkirina navdêran min "rengdêr + navdêr" nivîsandibû...
:Herwiha peyva {{q|ku|şikil}} wekî "şikl" tê tewandin [//ku.wiktionary.org/w/index.php?title=Got%C3%BBb%C3%AAja_modul%C3%AA:ku-tew%C3%AEn-nav&oldid=6291551#ne%C5%9Fir,_he%C5%9Fir] :) [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 10:47, 30 tîrmeh 2026 (UTC)
r4yl67aerc7u7wg2axndkfow9o7f222
6292162
6292161
2026-07-30T10:51:46Z
Ghybu
1393
/* Hevedudanî */
6292162
wikitext
text/x-wiki
Gelo mirov dikare tabloyekê ji bo peyvên tenê yekjimar in, amade bike? --[[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 15:15, 27 tîrmeh 2019 (UTC)
* Rewşa bangkirinê/gazîkirinê (vokatîv) kêm e. --[[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 05:37, 25 tebax 2019 (UTC)
== Rengê girêdanan ==
Silav {{r|Wikihez|Bikarhêner}} Min rengê girêdanan (yên ku nehatine çêkirin) di nav tabloyên tewandinan de reş kir (pêşta sor bûn wekî talboya lêkera {{g|ku|rûniştin}}ê); bi vî awayî çêtir e? Bnr. {{g|ku|kurmancî}}. Tabloya lêkerê jî wisa bikim? [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 18:06, 7 sibat 2025 (UTC)
:Reş ji bo lînkan nebaş e. Wek berê baştir bû. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:50, 7 sibat 2025 (UTC)
::Ji bo lihevkirina şablonan erê. Hazir em behsa vê şablonê dikin lazim e ku bibêjim gereg şablon karibe were veşartin. Xisûsen ji bo mobîlê ev muhîm e. Ji ber ku tablo mezin e, meriv karibe şablonê veşêre da ku gotarê hêsantir bixwîne. Tê de "class"a Tewandin gereg hebe ji bo ku bi qutiya "Veşartin"ê ya kêlekê meriv karibe vê şablonê li her derê veşêre an jî nîşan bide. (Min niha ferq kir ev qutî di mobîlê de xuya dike lê li kompûterê xuya nake. Çima?) [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 18:50, 7 sibat 2025 (UTC)
:::[https://ku.wiktionary.org/wiki/kurmanc%C3%AE#Navd%C3%AAr] Bnr. [[mw:Manual:Collapsible elements]]. Sernav: <small>[[MediaWiki:Collapsible-expand]] / [[MediaWiki:Collapsible-collapse]]</small> [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:56, 7 sibat 2025 (UTC)
::::[[Alîkarî:NavFrame]] hewce ye [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:42, 7 sibat 2025 (UTC)
:::::@[[Bikarhêner:Ghybu|Ghybu] bnr. [[WF:C]] [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:04, 7 sibat 2025 (UTC)
::::::@Ghybu [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:04, 7 sibat 2025 (UTC)
:::::::Erê, feqet lê bi vê metodê tablo di hindirî tabloyeke din de xuya dike. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 23:11, 7 sibat 2025 (UTC)
::::::::PS: Min daxwaza te pirr rind fêm nekir {{=)}} [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 23:32, 7 sibat 2025 (UTC)
::::::::[[Wêne:Navframe test ss.jpg|thumb]]
::::::::[[MediaWiki:Gadget-VisibilityToggles.js]] destûr dide ku meriv di carekê de li hemû sayfeyan tabloyan tewandinê veşêre. Ji bo vê jî Yan navframe+class=inflection-table hewce ye yan jî bikaranîna inflection-table bi awayekî din ku ez vîya nizanim :/ [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:41, 7 sibat 2025 (UTC)
:::::::::Temam, feqet bi min pêşta vekirî bimîne. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 00:11, 8 sibat 2025 (UTC)
::::::::::PS: Li ser Dîwanê: [https://ku.wiktionary.org/w/index.php?title=W%C3%AEk%C3%AEferheng:D%C3%AEwan/2023&oldid=5922877#Tabloya_tewandina_navd%C3%AAran_(format) Tabloya tewandina navdêran (format)] [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 00:16, 8 sibat 2025 (UTC)
:::::::::::Erê, jixwe pêşta vekirî ye, bide ber [[:MediaWiki:Gadget-VisibilityToggles.js#L-33]] û [[:en:MediaWiki:Gadget-VisibilityToggles.js#L-31]] [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 11:21, 8 sibat 2025 (UTC)
== Hevedudanî ==
@[[Bikarhêner:Ghybu|Ghybu]] Di agahdariyê de dibêje: "peyvên hevedudanî" feqat bi min vana ne "hevedudanî" ne. Hevedudanî=compound. Hemû kelîmeyên hevedudanî bi vî şiklî nayên tewandin. Lazim e bibêje "îsîm tamlamasi û sifat tamlamasi" kurmanciya wê çi ye? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 08:57, 30 tîrmeh 2026 (UTC)
:Erê şas tê fêm kirin. Hevedudanî ne feqet peyvên hevedudanî yên wekî "navdêr + rengdêr" (îzafe + rengdêr) û "navdêr + navdêr" (îzafe + çemandî) ne. Di nav zimanan de şikilên "navdêr + navdêr", "rengdêr + navdêr", "rengdêr + rengdêr", "lêker + navdêr", "hoker/daçek + navdêr", ... jî hene.
:Bi min 1) Hemû şiklên navdêran werin nivîsandin 2) Kategoriyên wan jî werin çêkirin. Ji bo navdayînê jî di nav parantezê de wekî hevdudanî (navdêr + rengdêr) û hevdudanî (navdêr + navdêr) werin nivîsandin.
:Li vira {{g|ckb|سێو#Tewandin}} bi soranî ji bo çêkirina navdêran min "rengdêr + navdêr" nivîsandibû...
:Herwiha peyva {{q|ku|şikil}} wekî "şikl" tê tewandin [//ku.wiktionary.org/w/index.php?title=Got%C3%BBb%C3%AAja_modul%C3%AA:ku-tew%C3%AEn-nav&oldid=6291551#ne%C5%9Fir,_he%C5%9Fir] :) [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 10:47, 30 tîrmeh 2026 (UTC)
6o04z8yy1x9hpmtiuo5y8evctpkx4tj
6292163
6292162
2026-07-30T10:57:02Z
Ghybu
1393
/* Hevedudanî */
6292163
wikitext
text/x-wiki
Gelo mirov dikare tabloyekê ji bo peyvên tenê yekjimar in, amade bike? --[[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 15:15, 27 tîrmeh 2019 (UTC)
* Rewşa bangkirinê/gazîkirinê (vokatîv) kêm e. --[[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 05:37, 25 tebax 2019 (UTC)
== Rengê girêdanan ==
Silav {{r|Wikihez|Bikarhêner}} Min rengê girêdanan (yên ku nehatine çêkirin) di nav tabloyên tewandinan de reş kir (pêşta sor bûn wekî talboya lêkera {{g|ku|rûniştin}}ê); bi vî awayî çêtir e? Bnr. {{g|ku|kurmancî}}. Tabloya lêkerê jî wisa bikim? [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 18:06, 7 sibat 2025 (UTC)
:Reş ji bo lînkan nebaş e. Wek berê baştir bû. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:50, 7 sibat 2025 (UTC)
::Ji bo lihevkirina şablonan erê. Hazir em behsa vê şablonê dikin lazim e ku bibêjim gereg şablon karibe were veşartin. Xisûsen ji bo mobîlê ev muhîm e. Ji ber ku tablo mezin e, meriv karibe şablonê veşêre da ku gotarê hêsantir bixwîne. Tê de "class"a Tewandin gereg hebe ji bo ku bi qutiya "Veşartin"ê ya kêlekê meriv karibe vê şablonê li her derê veşêre an jî nîşan bide. (Min niha ferq kir ev qutî di mobîlê de xuya dike lê li kompûterê xuya nake. Çima?) [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 18:50, 7 sibat 2025 (UTC)
:::[https://ku.wiktionary.org/wiki/kurmanc%C3%AE#Navd%C3%AAr] Bnr. [[mw:Manual:Collapsible elements]]. Sernav: <small>[[MediaWiki:Collapsible-expand]] / [[MediaWiki:Collapsible-collapse]]</small> [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:56, 7 sibat 2025 (UTC)
::::[[Alîkarî:NavFrame]] hewce ye [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:42, 7 sibat 2025 (UTC)
:::::@[[Bikarhêner:Ghybu|Ghybu] bnr. [[WF:C]] [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:04, 7 sibat 2025 (UTC)
::::::@Ghybu [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:04, 7 sibat 2025 (UTC)
:::::::Erê, feqet lê bi vê metodê tablo di hindirî tabloyeke din de xuya dike. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 23:11, 7 sibat 2025 (UTC)
::::::::PS: Min daxwaza te pirr rind fêm nekir {{=)}} [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 23:32, 7 sibat 2025 (UTC)
::::::::[[Wêne:Navframe test ss.jpg|thumb]]
::::::::[[MediaWiki:Gadget-VisibilityToggles.js]] destûr dide ku meriv di carekê de li hemû sayfeyan tabloyan tewandinê veşêre. Ji bo vê jî Yan navframe+class=inflection-table hewce ye yan jî bikaranîna inflection-table bi awayekî din ku ez vîya nizanim :/ [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:41, 7 sibat 2025 (UTC)
:::::::::Temam, feqet bi min pêşta vekirî bimîne. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 00:11, 8 sibat 2025 (UTC)
::::::::::PS: Li ser Dîwanê: [https://ku.wiktionary.org/w/index.php?title=W%C3%AEk%C3%AEferheng:D%C3%AEwan/2023&oldid=5922877#Tabloya_tewandina_navd%C3%AAran_(format) Tabloya tewandina navdêran (format)] [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 00:16, 8 sibat 2025 (UTC)
:::::::::::Erê, jixwe pêşta vekirî ye, bide ber [[:MediaWiki:Gadget-VisibilityToggles.js#L-33]] û [[:en:MediaWiki:Gadget-VisibilityToggles.js#L-31]] [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 11:21, 8 sibat 2025 (UTC)
== Hevedudanî ==
@[[Bikarhêner:Ghybu|Ghybu]] Di agahdariyê de dibêje: "peyvên hevedudanî" feqat bi min vana ne "hevedudanî" ne. Hevedudanî=compound. Hemû kelîmeyên hevedudanî bi vî şiklî nayên tewandin. Lazim e bibêje "îsîm tamlamasi û sifat tamlamasi" kurmanciya wê çi ye? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 08:57, 30 tîrmeh 2026 (UTC)
:Erê şas tê fêm kirin. Hevedudanî ne feqet peyvên hevedudanî yên wekî "navdêr + navdêr" (îzafe + çemandî) ne. Di nav zimanan de şikilên "navdêr + navdêr", "rengdêr + navdêr", "rengdêr + rengdêr", "lêker + navdêr", "hoker/daçek + navdêr", ... jî hene.
:Bi min 1) Hemû şiklên navdêran werin nivîsandin 2) Kategoriyên wan jî werin çêkirin. Ji bo navdayînê jî di nav parantezê de wekî hevdudanî (navdêr + rengdêr) û hevdudanî (navdêr + navdêr) werin nivîsandin.
:Li vira {{g|ckb|سێو#Tewandin}} bi soranî ji bo çêkirina navdêran min "rengdêr + navdêr" nivîsandibû...
:Herwiha peyva {{q|ku|şikil}} wekî "şikl" tê tewandin [//ku.wiktionary.org/w/index.php?title=Got%C3%BBb%C3%AAja_modul%C3%AA:ku-tew%C3%AEn-nav&oldid=6291551#ne%C5%9Fir,_he%C5%9Fir] :) [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 10:47, 30 tîrmeh 2026 (UTC)
eda654umlk7h68pq39cvxjmi4re71np
grey matter
0
826566
6292129
6248508
2026-07-29T22:28:02Z
Wikihez
7344
[[Bikarhêner:Wikihez/templateScript2.js|TS]]: sererastkirin
6292129
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Navdêr ===
{{navdêr|en}}
# [[hiş]], [[mejî]], [[aqil]]
==== Formên alternatîv ====
* {{g|en|gray matter}}
8duc4wo55y6n023wckishoapyioib5f
Bikarhêner:Wikihez/common.js
2
873671
6292084
6291973
2026-07-29T20:55:32Z
Wikihez
7344
6292084
javascript
text/javascript
/*---------Gadget-morebits.js-------------
[[Bikarhêner:Wikihez/skrîpt/Gadget/Gadget-morebits.js]]
[[Bikarhêner:Wikihez/skrîpt/Gadget/Gadget-morebits.css]]*/
mw.loader.load(mw.util.wikiScript() + '?title=Bikarhêner:Wikihez/skrîpt/Gadget/Gadget-morebits.css&action=raw&ctype=text/css', 'text/css');
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/Gadget/Gadget-morebits.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/skrîpt/js/templateParamRenamer.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/js/templateParamRenamer.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/skrîpt/js/citeKurdifier.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/js/citeKurdifier.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/Gadget-defaultVisibilityToggles.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/Gadget-defaultVisibilityToggles.js&action=raw&ctype=text/javascript');
/*---------QQ.js-------------
[[Bikarhêner:Wikihez/Gadget-QQ.js]]
[[Bikarhêner:Wikihez/Gadget-QQ.css]]*/
mw.loader.load(mw.util.wikiScript() + '?title=Bikarhêner:Wikihez/Gadget-QQ.css&action=raw&ctype=text/css', 'text/css');
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/Gadget-QQ.js&action=raw&ctype=text/javascript');
/*---------start.js-------------
[[Bikarhêner:Wikihez/Gadget-start.js]]
[[Bikarhêner:Wikihez/Gadget-start.css]]*/
mw.loader.load(mw.util.wikiScript() + '?title=Bikarhêner:Wikihez/Gadget-start.css&action=raw&ctype=text/css', 'text/css');
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/Gadget-start.js&action=raw&ctype=text/javascript');
/*---------aWa.js-------------
[[Bikarhêner:Wikihez/Gadget-aWa.js]]
[[Bikarhêner:Wikihez/Gadget-aWa.css]]
mw.loader.load(mw.util.wikiScript() + '?title=Bikarhêner:Wikihez/Gadget-aWa.css&action=raw&ctype=text/css', 'text/css');
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/Gadget-aWa.js&action=raw&ctype=text/javascript');
/*
/*---------add-examples.js-------------
[[Bikarhêner:Wikihez/Gadget-wikt.add-examples.js]]
[[Bikarhêner:Wikihez/Gadget-wikt.add-examples.css]]*/
mw.loader.load(mw.util.wikiScript() + '?title=Bikarhêner:Wikihez/Gadget-wikt.add-examples.css&action=raw&ctype=text/css', 'text/css');
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/Gadget-wikt.add-examples.js&action=raw&ctype=text/javascript');
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/js/loader.js&action=raw&ctype=text/javascript')
//importScript( 'Bikarhêner:Wikihez/skrîpt/js/Gadget-citoid-helper.js' ); // Backlink: [[Bikarhêner:Wikihez/skrîpt/js/Gadget-citoid-helper.js]]
//importScript( 'Bikarhêner:Wikihez/Gadget-linkify.js' ); // Backlink: [[Bikarhêner:Wikihez/Gadget-linkify.js]]
importScript( 'Bikarhêner:Wikihez/skrîpt/js/copyTitle.js' ); // Backlink: [[Bikarhêner:Wikihez/skrîpt/js/copyTitle.js]]
// [[Bikarhêner:Wikihez/addAutoCat.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/js/addAutoCat.js&action=raw&ctype=text/javascript');
importScript( 'Bikarhêner:Wikihez/newentrywiz.js' ); // Backlink: [[Bikarhêner:Wikihez/newentrywiz.js]]
//[[Bikarhêner:Wikihez/skrîpt/js/VisibilityToggles.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/js/VisibilityToggles.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/CreateTranslation.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/CreateTranslation.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/skrîpt/js/defaultVisibilityToggles.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/js/defaultVisibilityToggles.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/skrîpt/js/Gadget-catfix.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/js/Gadget-catfix.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/wergerîne.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/wergerîne.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/skrîpt/js/getinflections.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/js/getinflections.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/templateScript2.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/templateScript2.js&action=raw&ctype=text/javascript');
// [[Bikarhêner:Wikihez/şablon-lêke.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/şablon-lêke.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/skrîpt/js/editor.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/js/editor.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/skrîpt/js/UpdateLanguageNameAndCode.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/js/UpdateLanguageNameAndCode.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/skrîpt/js/TranslationAdder-Data.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/js/TranslationAdder-Data.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/LanguageUtils.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/LanguageUtils.js&action=raw&ctype=text/javascript');
//[[:w:Bikarhêner:Wikihez/skrîpt/js/OngletPurge.js]]
mw.loader.load('//ku.wikipedia.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/js/OngletPurge.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/test.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/test.js&action=raw&ctype=text/javascript');
// This array of dependencies comes from [[MediaWiki:Gadgets-definition]].
// If the list of dependencies changes, copy the text after dependencies=
// for TranslationAdder and run console.log(JSON.stringify("paste dependencies here".split(/, ?/)))
// in your browser's JavaScript console. Put the resulting array as the first argument to mw.loader.using.
//[[User:Wikihez/skrîpt/js/TranslationAdder.js]]
//mw.loader.using(["ext.gadget.LegacyScriptsNewNode","mediawiki.cookie","mediawiki.util"],
//function() {
// importScript('User:Wikihez/skrîpt/js/TranslationAdder.js');
//});
mw.loader.load('https://en.wikipedia.org/w/index.php?title=User:BrandonXLF/TodoList.js&action=raw&ctype=text/javascript');
/*
// [[:w:en:MediaWiki:Gadget-edittop.js]]
mw.loader.load('//en.wikipedia.org/w/index.php?title=MediaWiki:Gadget-edittop.js&action=raw&ctype=text/javascript');
// [[Bikarhêner:Wikihez/addAutoCat.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/addAutoCat.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Balyozbot/Gadget-CommonWikt.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Balyozbot/Gadget-CommonWikt.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/hw-ceke.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/hw-ceke.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/sort-langheaders.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/sort-langheaders.js&action=raw&ctype=text/javascript');
//[[:en:User:Conrad.Irwin/Api.js]]
mw.loader.load('//en.wiktionary.org/w/index.php?title=User:Conrad.Irwin/Api.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/etîket-çêke.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/etîket-çêke.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/tagger.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/tagger.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/Gadget-CatMaker.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/Gadget-CatMaker.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/VisibilityToggles.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/VisibilityToggles.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/Gadget-WiktAccFormCreation.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/Gadget-WiktAccFormCreation.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/XMLize.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/XMLize.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/RhymesAdder.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/RhymesAdder.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/Editor.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/Editor.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/FilterTranslations.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/FilterTranslations.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/custom.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/custom.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/reformat.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/reformat.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/templateScript.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/templateScript.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/translateWiki.js]] ji aliyê [[Bikarhêner:Guherto]], [[Taybet:PermanentLink/4854098#Translatewiki.net]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/translateWiki.js&action=raw&ctype=text/javascript');
// Various fixes for the trees generated by [[Module:family tree]].
$(function () {
// Show the top toggle.
$('.familytree-toptoggle').css('display', '');
// Initialize the text of the toggles.
$('.familytree').get().forEach(function (tree) {
var isCollapsed = tree.classList.contains('mw-collapsed');
var toggles = $(tree).find('.familytree-toggle');
if (toggles[0]) {
var customToggleClass = Array.prototype.filter.call(toggles[0].classList, function (className) {
return className.indexOf('mw-customtoggle-familytree') === 0;
})[0];
if (customToggleClass) {
var toggledElement = $('#' + customToggleClass.replace('mw-customtoggle', 'mw-customcollapsible'));
if (toggledElement) {
toggles.html(toggledElement.data(isCollapsed ? 'expandtext' : 'collapsetext'));
}
}
}
});
// Change the text in the custom toggles generated by [[Module:family tree]]
// when they are clicked.
$('.mw-collapsible').on('beforeExpand.mw-collapsible beforeCollapse.mw-collapsible',
function (event) {
if (this.id.indexOf('mw-customcollapsible-familytree') === 0) {
var toggle = $('.' + this.id.replace('mw-customcollapsible', 'mw-customtoggle'));
if (event.type === 'beforeExpand') {
toggle.html(this.dataset.collapsetext);
} else { // beforeCollapse
toggle.html(this.dataset.expandtext);
}
event.stopPropagation();
}
});
});
*/
mw.util.addPortletLink( mw.config.get('skin') === 'vector' ? 'p-views' : 'p-cactions', '/w/index.php?title=' + mw.config.get('wgPageName') + '&action=edit&editintro=User:Wikihez/usenec', 'nec', 'id', 'use the New Entry Creator to create a new entry', 'a', 'nextnode');
04t8c7l8crbwlqi2oanld6gu3vg02na
6292085
6292084
2026-07-29T21:00:30Z
Wikihez
7344
6292085
javascript
text/javascript
/*---------Gadget-morebits.js-------------
[[Bikarhêner:Wikihez/skrîpt/Gadget/Gadget-morebits.js]]
[[Bikarhêner:Wikihez/skrîpt/Gadget/Gadget-morebits.css]]*/
mw.loader.load(mw.util.wikiScript() + '?title=Bikarhêner:Wikihez/skrîpt/Gadget/Gadget-morebits.css&action=raw&ctype=text/css', 'text/css');
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/Gadget/Gadget-morebits.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/skrîpt/js/templateParamRenamer.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/js/templateParamRenamer.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/skrîpt/js/citeKurdifier.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/js/citeKurdifier.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/Gadget-defaultVisibilityToggles.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/Gadget-defaultVisibilityToggles.js&action=raw&ctype=text/javascript');
/*---------QQ.js-------------
[[Bikarhêner:Wikihez/Gadget-QQ.js]]
[[Bikarhêner:Wikihez/Gadget-QQ.css]]*/
mw.loader.load(mw.util.wikiScript() + '?title=Bikarhêner:Wikihez/Gadget-QQ.css&action=raw&ctype=text/css', 'text/css');
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/Gadget-QQ.js&action=raw&ctype=text/javascript');
/*---------start.js-------------
[[Bikarhêner:Wikihez/Gadget-start.js]]
[[Bikarhêner:Wikihez/Gadget-start.css]]*/
mw.loader.load(mw.util.wikiScript() + '?title=Bikarhêner:Wikihez/Gadget-start.css&action=raw&ctype=text/css', 'text/css');
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/Gadget-start.js&action=raw&ctype=text/javascript');
/*---------add-examples.js-------------
[[Bikarhêner:Wikihez/Gadget-wikt.add-examples.js]]
[[Bikarhêner:Wikihez/Gadget-wikt.add-examples.css]]*/
mw.loader.load(mw.util.wikiScript() + '?title=Bikarhêner:Wikihez/Gadget-wikt.add-examples.css&action=raw&ctype=text/css', 'text/css');
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/Gadget-wikt.add-examples.js&action=raw&ctype=text/javascript');
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/js/loader.js&action=raw&ctype=text/javascript')
importScript( 'Bikarhêner:Wikihez/skrîpt/js/copyTitle.js' ); // Backlink: [[Bikarhêner:Wikihez/skrîpt/js/copyTitle.js]]
// [[Bikarhêner:Wikihez/addAutoCat.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/js/addAutoCat.js&action=raw&ctype=text/javascript');
importScript( 'Bikarhêner:Wikihez/newentrywiz.js' ); // Backlink: [[Bikarhêner:Wikihez/newentrywiz.js]]
//[[Bikarhêner:Wikihez/CreateTranslation.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/CreateTranslation.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/wergerîne.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/wergerîne.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/skrîpt/js/getinflections.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/js/getinflections.js&action=raw&ctype=text/javascript');
//[[:w:Bikarhêner:Wikihez/skrîpt/js/OngletPurge.js]]
mw.loader.load('//ku.wikipedia.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/js/OngletPurge.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/templateScript2.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/templateScript2.js&action=raw&ctype=text/javascript');
// [[Bikarhêner:Wikihez/şablon-lêke.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/şablon-lêke.js&action=raw&ctype=text/javascript');
mw.loader.load('https://en.wikipedia.org/w/index.php?title=User:BrandonXLF/TodoList.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/test.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/test.js&action=raw&ctype=text/javascript');
//================================================================================================================================
//importScript( 'Bikarhêner:Wikihez/skrîpt/js/Gadget-citoid-helper.js' ); // Backlink: [[Bikarhêner:Wikihez/skrîpt/js/Gadget-citoid-helper.js]]
//importScript( 'Bikarhêner:Wikihez/Gadget-linkify.js' ); // Backlink: [[Bikarhêner:Wikihez/Gadget-linkify.js]]
//[[Bikarhêner:Wikihez/skrîpt/js/Gadget-catfix.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/js/Gadget-catfix.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/skrîpt/js/editor.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/js/editor.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/skrîpt/js/UpdateLanguageNameAndCode.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/js/UpdateLanguageNameAndCode.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/skrîpt/js/TranslationAdder-Data.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/skrîpt/js/TranslationAdder-Data.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/LanguageUtils.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/LanguageUtils.js&action=raw&ctype=text/javascript');
/*---------aWa.js-------------
[[Bikarhêner:Wikihez/Gadget-aWa.js]]
[[Bikarhêner:Wikihez/Gadget-aWa.css]]
mw.loader.load(mw.util.wikiScript() + '?title=Bikarhêner:Wikihez/Gadget-aWa.css&action=raw&ctype=text/css', 'text/css');
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/Gadget-aWa.js&action=raw&ctype=text/javascript');
*/
// This array of dependencies comes from [[MediaWiki:Gadgets-definition]].
// If the list of dependencies changes, copy the text after dependencies=
// for TranslationAdder and run console.log(JSON.stringify("paste dependencies here".split(/, ?/)))
// in your browser's JavaScript console. Put the resulting array as the first argument to mw.loader.using.
//[[User:Wikihez/skrîpt/js/TranslationAdder.js]]
//mw.loader.using(["ext.gadget.LegacyScriptsNewNode","mediawiki.cookie","mediawiki.util"],
//function() {
// importScript('User:Wikihez/skrîpt/js/TranslationAdder.js');
//});
/*
// [[:w:en:MediaWiki:Gadget-edittop.js]]
mw.loader.load('//en.wikipedia.org/w/index.php?title=MediaWiki:Gadget-edittop.js&action=raw&ctype=text/javascript');
// [[Bikarhêner:Wikihez/addAutoCat.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/addAutoCat.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Balyozbot/Gadget-CommonWikt.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Balyozbot/Gadget-CommonWikt.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/hw-ceke.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/hw-ceke.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/sort-langheaders.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/sort-langheaders.js&action=raw&ctype=text/javascript');
//[[:en:User:Conrad.Irwin/Api.js]]
mw.loader.load('//en.wiktionary.org/w/index.php?title=User:Conrad.Irwin/Api.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/etîket-çêke.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/etîket-çêke.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/tagger.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/tagger.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/Gadget-CatMaker.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/Gadget-CatMaker.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/VisibilityToggles.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/VisibilityToggles.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/Gadget-WiktAccFormCreation.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/Gadget-WiktAccFormCreation.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/XMLize.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/XMLize.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/RhymesAdder.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/RhymesAdder.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/Editor.js]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/Editor.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/FilterTranslations.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/FilterTranslations.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/custom.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/custom.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/reformat.js]]
//mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/reformat.js&action=raw&ctype=text/javascript');
//[[Bikarhêner:Wikihez/translateWiki.js]] ji aliyê [[Bikarhêner:Guherto]], [[Taybet:PermanentLink/4854098#Translatewiki.net]]
mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/translateWiki.js&action=raw&ctype=text/javascript');
// Various fixes for the trees generated by [[Module:family tree]].
$(function () {
// Show the top toggle.
$('.familytree-toptoggle').css('display', '');
// Initialize the text of the toggles.
$('.familytree').get().forEach(function (tree) {
var isCollapsed = tree.classList.contains('mw-collapsed');
var toggles = $(tree).find('.familytree-toggle');
if (toggles[0]) {
var customToggleClass = Array.prototype.filter.call(toggles[0].classList, function (className) {
return className.indexOf('mw-customtoggle-familytree') === 0;
})[0];
if (customToggleClass) {
var toggledElement = $('#' + customToggleClass.replace('mw-customtoggle', 'mw-customcollapsible'));
if (toggledElement) {
toggles.html(toggledElement.data(isCollapsed ? 'expandtext' : 'collapsetext'));
}
}
}
});
// Change the text in the custom toggles generated by [[Module:family tree]]
// when they are clicked.
$('.mw-collapsible').on('beforeExpand.mw-collapsible beforeCollapse.mw-collapsible',
function (event) {
if (this.id.indexOf('mw-customcollapsible-familytree') === 0) {
var toggle = $('.' + this.id.replace('mw-customcollapsible', 'mw-customtoggle'));
if (event.type === 'beforeExpand') {
toggle.html(this.dataset.collapsetext);
} else { // beforeCollapse
toggle.html(this.dataset.expandtext);
}
event.stopPropagation();
}
});
});
*/
mw.util.addPortletLink( mw.config.get('skin') === 'vector' ? 'p-views' : 'p-cactions', '/w/index.php?title=' + mw.config.get('wgPageName') + '&action=edit&editintro=User:Wikihez/usenec', 'nec', 'id', 'use the New Entry Creator to create a new entry', 'a', 'nextnode');
a379hcdmofiscldrsx16ocxj0u3fq1f
Modul:dara kategoriyan/ferhengokkatbike/dane/daxwaz
828
879732
6292118
6117797
2026-07-29T22:18:55Z
Wikihez
7344
6292118
Scribunto
text/plain
local labels = {}
labels["gotarên bi şaşî û kêmasî"] = {
description = "Madeyên bi zimanê {{{langname}}} yên ku tê de xetayên ku divê bên sererastkirin hene",
umbrella = true,
parents = {{sort = "!", template = "zimankatbike"}},
}
labels["madeyên zimanekî xelet bi kar tînin"] = {
description = "Madeyên ku tê de sinifa rêzimanî bi {{{langname}}} hatiye bikaranîn feqat di beşeke zimanekî din de.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="!xelet"}},
isHidden = true,
}
labels["daxwazên jêgirtinan"] = {
description = "Daxwazên ji bo lêzêdekirina jêgirtinan bi zimanê {{{langname}}}.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="jêgirtin"}},
isHidden = true,
}
labels["daxwazên etîmolojiyê"] = {
description = "Madeyên {{{langname}}} yên ku etîmolojiya wê kêm e.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="etîmolojî"}, {name="etîmolojî", sort="!"}},
}
labels["daxwazên berfirehkirina etîmolojiyê"] = {
description = "Madeyên {{{langname}}} yên ku etîmolojiya wê zêde kurt e û divê were berfirehkirin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="etîmolojî"}, {name="etîmolojî", sort="!"}},
}
labels["lînkên bi parametreyên hedefê yên nehewce"] = {
description = "Lînkên bi parametreyên hedefê yên nehewce bi zimanê {{{langname}}}.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="lînk"}},
isHidden = true,
}
labels["lînkên ku parametreya cuda nehewce ye"] = {
description = "Lînkên {{{langname}}} yên ku parametreya {{param|cuda}} bi kar tînin lê ev parametre ne hewce ye.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="lînk"}},
isHidden = true,
}
labels["lînkên bi wîkîlînkên nehewce"] = {
description = "Lînkên {{{langname}}} yên ku tê de wîkîlînk hene lê ev ne hewce ye.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="lînk"}},
isHidden = true,
}
labels["madeyên bê beşa mane"] = {
description = "Madeyên bi {{{langname}}} yên ku tê de mane nehatiye nivîsin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="mane"}},
}
labels["gotarên bê kategoriya rêzimanî"] = {
description = "Madeyên bi {{{langname}}} yên ku tê de cureyê rêzimanî nehatiye nivîsin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="rêziman"}},
}
labels["daxwazên cinsê navdêran"] = {
description = "Madeyên {{{langname}}} yên ku tê de cinsê kelîmeyê nehatiye nivîsin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="cins"}, {name="navdêr", sort="cins"}},
}
labels["daxwazên cureyê lêkeran"] = {
description = "Madeyên {{{langname}}} yên ku tê de cureyê lêkerê nehatiye nivîsin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="cure"}, {name="lêker", sort="cure"}},
}
labels["daxwazên peyvan"] = {
description = "Peyvên {{{langname}}} yên ku hatine behskirin û tên xwestin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="peyv"}},
isHidden = true,
}
labels["daxwazên wergera jêgirtinan"] = {
description = "Gotarên {{{langname}}} yên ku tê de jêgirtin heye lê belê wergera kurdiya kurmancî tine ye.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="werger"}},
isHidden = true,
}
labels["daxwazên wergerandina nimûneyan"] = {
description = "Madeyên {{{langname}}} yên ku tê de nimûneya bikaranînê heye lê belê wergera kurmancî tine ye.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="wergerandin"}},
isHidden = true,
}
labels["daxwazên kontrolkirina rûpela wergerê"] = {
description = "Madeyên {{{langname}}} yên ku ji wergerekê hatine çêkirin û divê werin kontrolkirin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="kontrolkirin"}},
isHidden = true,
}
labels["daxwazên skrîpta peyvê"] = {
description = "Peyvên {{{langname}}} yên ku hatine behskirin lê belê têne transkrîptsiyona wan hene.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="skrîpt"}},
isHidden = true,
}
labels["transliterasyona nepêwîst"] = {
description = "Peyvên {{{langname}}} yên ku hatine transliterekirin lê belê ev transliterasyon ne pêwîst e, divê transliterasyon were jêbirin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="transliterasyon"}},
isHidden = true,
}
labels["transliterasyona zarûrî û manûel"] = {
description = "Peyvên {{{langname}}} yên ku manûel hatine transliterekirin û zarûrî ne, nikarin bi otomatîkî werin çêkirin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="transliterasyon"}},
isHidden = true,
}
labels["skrîpta nestandard"] = {
description = "Peyvên {{{langname}}} yên ku skrîpteke nestandard bi kar tînin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="skrîpt"}},
isHidden = true,
}
labels["koda skrîptê ya nehewce"] = {
description = "Lînkên {{{langname}}} yên ku parametreya {{param|sc}} bi kar tînin lê nehewce ne.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="lînk"}},
isHidden = true,
}
labels["koda skrîptê ya zarûrî û manûel"] = {
description = "Lînkên {{{langname}}} yên ku parametreya {{param|sc}} manûel bi kar tînin û zarûrî ne.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="lînk"}},
isHidden = true,
}
labels["jêgirtinên kitêban"] = {
description = "",
parents = {{name="jêgirtin", sort="kitêban"}},
isHidden = true,
}
labels["jêgirtinên malperan"] = {
description = "",
parents = {{name="jêgirtin", sort="malper"}},
isHidden = true,
}
labels["jêgirtinên kovaran"] = {
description = "",
parents = {{name="jêgirtin", sort="kovaran"}},
isHidden = true,
}
return {LABELS = labels, HANDLERS = handlers}
em71d6bj2o3jkfm11lhgkmau6wnnhim
6292121
6292118
2026-07-29T22:23:24Z
Wikihez
7344
6292121
Scribunto
text/plain
local labels = {}
labels["gotarên bi şaşî û kêmasî"] = {
description = "Madeyên bi zimanê {{{langname}}} yên ku tê de xetayên ku divê bên sererastkirin hene",
umbrella = true,
parents = {{sort = "!", template = "zimankatbike"}},
}
labels["madeyên zimanekî xelet bi kar tînin"] = {
description = "Madeyên ku tê de sinifa rêzimanî bi {{{langname}}} hatiye bikaranîn feqat di beşeke zimanekî din de.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="!xelet"}},
--isHidden = fals, bila her daîm vekirî be da ku em bi hêsanî bibînin
}
labels["daxwazên jêgirtinan"] = {
description = "Daxwazên ji bo lêzêdekirina jêgirtinan bi zimanê {{{langname}}}.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="jêgirtin"}},
isHidden = true,
}
labels["daxwazên etîmolojiyê"] = {
description = "Madeyên {{{langname}}} yên ku etîmolojiya wê kêm e.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="etîmolojî"}, {name="etîmolojî", sort="!"}},
}
labels["daxwazên berfirehkirina etîmolojiyê"] = {
description = "Madeyên {{{langname}}} yên ku etîmolojiya wê zêde kurt e û divê were berfirehkirin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="etîmolojî"}, {name="etîmolojî", sort="!"}},
}
labels["lînkên bi parametreyên hedefê yên nehewce"] = {
description = "Lînkên bi parametreyên hedefê yên nehewce bi zimanê {{{langname}}}.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="lînk"}},
isHidden = true,
}
labels["lînkên ku parametreya cuda nehewce ye"] = {
description = "Lînkên {{{langname}}} yên ku parametreya {{param|cuda}} bi kar tînin lê ev parametre ne hewce ye.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="lînk"}},
isHidden = true,
}
labels["lînkên bi wîkîlînkên nehewce"] = {
description = "Lînkên {{{langname}}} yên ku tê de wîkîlînk hene lê ev ne hewce ye.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="lînk"}},
isHidden = true,
}
labels["madeyên bê beşa mane"] = {
description = "Madeyên bi {{{langname}}} yên ku tê de mane nehatiye nivîsin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="mane"}},
}
labels["gotarên bê kategoriya rêzimanî"] = {
description = "Madeyên bi {{{langname}}} yên ku tê de cureyê rêzimanî nehatiye nivîsin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="rêziman"}},
}
labels["daxwazên cinsê navdêran"] = {
description = "Madeyên {{{langname}}} yên ku tê de cinsê kelîmeyê nehatiye nivîsin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="cins"}, {name="navdêr", sort="cins"}},
}
labels["daxwazên cureyê lêkeran"] = {
description = "Madeyên {{{langname}}} yên ku tê de cureyê lêkerê nehatiye nivîsin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="cure"}, {name="lêker", sort="cure"}},
}
labels["daxwazên peyvan"] = {
description = "Peyvên {{{langname}}} yên ku hatine behskirin û tên xwestin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="peyv"}},
isHidden = true,
}
labels["daxwazên wergera jêgirtinan"] = {
description = "Gotarên {{{langname}}} yên ku tê de jêgirtin heye lê belê wergera kurdiya kurmancî tine ye.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="werger"}},
isHidden = true,
}
labels["daxwazên wergerandina nimûneyan"] = {
description = "Madeyên {{{langname}}} yên ku tê de nimûneya bikaranînê heye lê belê wergera kurmancî tine ye.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="wergerandin"}},
isHidden = true,
}
labels["daxwazên kontrolkirina rûpela wergerê"] = {
description = "Madeyên {{{langname}}} yên ku ji wergerekê hatine çêkirin û divê werin kontrolkirin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="kontrolkirin"}},
isHidden = true,
}
labels["daxwazên skrîpta peyvê"] = {
description = "Peyvên {{{langname}}} yên ku hatine behskirin lê belê têne transkrîptsiyona wan hene.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="skrîpt"}},
isHidden = true,
}
labels["transliterasyona nepêwîst"] = {
description = "Peyvên {{{langname}}} yên ku hatine transliterekirin lê belê ev transliterasyon ne pêwîst e, divê transliterasyon were jêbirin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="transliterasyon"}},
isHidden = true,
}
labels["transliterasyona zarûrî û manûel"] = {
description = "Peyvên {{{langname}}} yên ku manûel hatine transliterekirin û zarûrî ne, nikarin bi otomatîkî werin çêkirin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="transliterasyon"}},
isHidden = true,
}
labels["skrîpta nestandard"] = {
description = "Peyvên {{{langname}}} yên ku skrîpteke nestandard bi kar tînin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="skrîpt"}},
isHidden = true,
}
labels["koda skrîptê ya nehewce"] = {
description = "Lînkên {{{langname}}} yên ku parametreya {{param|sc}} bi kar tînin lê nehewce ne.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="lînk"}},
isHidden = true,
}
labels["koda skrîptê ya zarûrî û manûel"] = {
description = "Lînkên {{{langname}}} yên ku parametreya {{param|sc}} manûel bi kar tînin û zarûrî ne.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="lînk"}},
isHidden = true,
}
labels["jêgirtinên kitêban"] = {
description = "",
parents = {{name="jêgirtin", sort="kitêban"}},
isHidden = true,
}
labels["jêgirtinên malperan"] = {
description = "",
parents = {{name="jêgirtin", sort="malper"}},
isHidden = true,
}
labels["jêgirtinên kovaran"] = {
description = "",
parents = {{name="jêgirtin", sort="kovaran"}},
isHidden = true,
}
return {LABELS = labels, HANDLERS = handlers}
pkwqnuf816ife0e4vcf752lumwfmmg7
6292142
6292121
2026-07-30T07:55:31Z
Wikihez
7344
6292142
Scribunto
text/plain
local labels = {}
labels["gotarên bi şaşî û kêmasî"] = {
description = "Madeyên bi zimanê {{{langname}}} yên ku tê de xetayên ku divê bên sererastkirin hene",
umbrella = true,
parents = {{sort = "!", template = "zimankatbike"}},
}
labels["madeyên zimanekî xelet bi kar tînin"] = {
description = "Madeyên ku tê de sinifa rêzimanî bi {{{langname}}} hatiye bikaranîn feqat di beşa zimanekî din de.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="!xelet"}},
--isHidden = fals, bila her daîm vekirî be da ku em bi hêsanî bibînin
}
labels["daxwazên jêgirtinan"] = {
description = "Daxwazên ji bo lêzêdekirina jêgirtinan bi zimanê {{{langname}}}.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="jêgirtin"}},
isHidden = true,
}
labels["daxwazên etîmolojiyê"] = {
description = "Madeyên {{{langname}}} yên ku etîmolojiya wê kêm e.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="etîmolojî"}, {name="etîmolojî", sort="!"}},
}
labels["daxwazên berfirehkirina etîmolojiyê"] = {
description = "Madeyên {{{langname}}} yên ku etîmolojiya wê zêde kurt e û divê were berfirehkirin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="etîmolojî"}, {name="etîmolojî", sort="!"}},
}
labels["lînkên bi parametreyên hedefê yên nehewce"] = {
description = "Lînkên bi parametreyên hedefê yên nehewce bi zimanê {{{langname}}}.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="lînk"}},
isHidden = true,
}
labels["lînkên ku parametreya cuda nehewce ye"] = {
description = "Lînkên {{{langname}}} yên ku parametreya {{param|cuda}} bi kar tînin lê ev parametre ne hewce ye.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="lînk"}},
isHidden = true,
}
labels["lînkên bi wîkîlînkên nehewce"] = {
description = "Lînkên {{{langname}}} yên ku tê de wîkîlînk hene lê ev ne hewce ye.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="lînk"}},
isHidden = true,
}
labels["madeyên bê beşa mane"] = {
description = "Madeyên bi {{{langname}}} yên ku tê de mane nehatiye nivîsin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="mane"}},
}
labels["gotarên bê kategoriya rêzimanî"] = {
description = "Madeyên bi {{{langname}}} yên ku tê de cureyê rêzimanî nehatiye nivîsin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="rêziman"}},
}
labels["daxwazên cinsê navdêran"] = {
description = "Madeyên {{{langname}}} yên ku tê de cinsê kelîmeyê nehatiye nivîsin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="cins"}, {name="navdêr", sort="cins"}},
}
labels["daxwazên cureyê lêkeran"] = {
description = "Madeyên {{{langname}}} yên ku tê de cureyê lêkerê nehatiye nivîsin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="cure"}, {name="lêker", sort="cure"}},
}
labels["daxwazên peyvan"] = {
description = "Peyvên {{{langname}}} yên ku hatine behskirin û tên xwestin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="peyv"}},
isHidden = true,
}
labels["daxwazên wergera jêgirtinan"] = {
description = "Gotarên {{{langname}}} yên ku tê de jêgirtin heye lê belê wergera kurdiya kurmancî tine ye.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="werger"}},
isHidden = true,
}
labels["daxwazên wergerandina nimûneyan"] = {
description = "Madeyên {{{langname}}} yên ku tê de nimûneya bikaranînê heye lê belê wergera kurmancî tine ye.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="wergerandin"}},
isHidden = true,
}
labels["daxwazên kontrolkirina rûpela wergerê"] = {
description = "Madeyên {{{langname}}} yên ku ji wergerekê hatine çêkirin û divê werin kontrolkirin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="kontrolkirin"}},
isHidden = true,
}
labels["daxwazên skrîpta peyvê"] = {
description = "Peyvên {{{langname}}} yên ku hatine behskirin lê belê têne transkrîptsiyona wan hene.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="skrîpt"}},
isHidden = true,
}
labels["transliterasyona nepêwîst"] = {
description = "Peyvên {{{langname}}} yên ku hatine transliterekirin lê belê ev transliterasyon ne pêwîst e, divê transliterasyon were jêbirin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="transliterasyon"}},
isHidden = true,
}
labels["transliterasyona zarûrî û manûel"] = {
description = "Peyvên {{{langname}}} yên ku manûel hatine transliterekirin û zarûrî ne, nikarin bi otomatîkî werin çêkirin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="transliterasyon"}},
isHidden = true,
}
labels["skrîpta nestandard"] = {
description = "Peyvên {{{langname}}} yên ku skrîpteke nestandard bi kar tînin.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="skrîpt"}},
isHidden = true,
}
labels["koda skrîptê ya nehewce"] = {
description = "Lînkên {{{langname}}} yên ku parametreya {{param|sc}} bi kar tînin lê nehewce ne.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="lînk"}},
isHidden = true,
}
labels["koda skrîptê ya zarûrî û manûel"] = {
description = "Lînkên {{{langname}}} yên ku parametreya {{param|sc}} manûel bi kar tînin û zarûrî ne.",
parents = {{name="gotarên bi şaşî û kêmasî", sort="lînk"}},
isHidden = true,
}
labels["jêgirtinên kitêban"] = {
description = "",
parents = {{name="jêgirtin", sort="kitêban"}},
isHidden = true,
}
labels["jêgirtinên malperan"] = {
description = "",
parents = {{name="jêgirtin", sort="malper"}},
isHidden = true,
}
labels["jêgirtinên kovaran"] = {
description = "",
parents = {{name="jêgirtin", sort="kovaran"}},
isHidden = true,
}
return {LABELS = labels, HANDLERS = handlers}
4kht17b0l0hmtxdir0wve192oipi1bb
flip
0
933646
6292115
6094972
2026-07-29T22:14:26Z
Wikihez
7344
6292115
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Bilêvkirin ===
* {{IPA|en|/flɪp/}}
* {{deng|en|en-us-flip.ogg|dever=DYA}}
=== Lêker ===
{{lêker|en}}
# [[hilavêtin]]
#: {{nm|en|Let's '''flip''' the coin to see who starts.|Werin em dînarê '''hilavêjin''' ka kî dê dest pê bike.}}
# [[tûre bûn]]
==== Jê ====
{{stûn|
* {{g|en|backflip}}
* {{g|en|flip phone}}
* {{g|en|flipper}}
* {{g|en|flip off}}
* {{g|en|flip out}}
* {{g|en|flip over}}
* {{g|en|flip-screen}}
* {{g|en|flipside}}
}}
498yatrc4dfsgu913tlsfs7l81e70rf
6292116
6292115
2026-07-29T22:14:44Z
Wikihez
7344
/* Jê */
6292116
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Bilêvkirin ===
* {{IPA|en|/flɪp/}}
* {{deng|en|en-us-flip.ogg|dever=DYA}}
=== Lêker ===
{{lêker|en}}
# [[hilavêtin]]
#: {{nm|en|Let's '''flip''' the coin to see who starts.|Werin em dînarê '''hilavêjin''' ka kî dê dest pê bike.}}
# [[tûre bûn]]
==== Jê ====
{{kol3|en|cure=Jê
|backflip
|flip phone
|flipper
|flip off
|flip out
|flip over
|flip-screen
|flipside
}}
dfw1l9k16l8z4v8bxkrngsm6pzr3cfx
variolas
0
933793
6292147
4845697
2026-07-30T08:18:18Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292147
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Formeke navdêrê ===
{{navdêr|en|form=erê}}
# {{pirjimar|en|variola}}.
oulzyti1q6741efej2tiddp0u376qqz
6292148
6292147
2026-07-30T08:18:23Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292148
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Formeke navdêrê ===
{{navdêr|en|form=erê}}
# {{pirjimar|en|variola}}
iuxyj7ubdmckuo11wtqu7o6m2hxyxl5
Şablon:zza-tewîn-rd/tablo
10
935615
6292164
6242343
2026-07-30T11:47:34Z
Ghybu
1393
6292164
wikitext
text/x-wiki
{{tabloya-tewandinê-ser|title=Tewandina ''{{SUBPAGENAME}}''|palette=purple|tall=yes}}
! Pozîtîv
| colspan="3" | {{{pozîtîv}}}
|-
! Komparatîv
| colspan="3" | {{{komparatîv}}}
|-
! Sûperlatîv
| colspan="3" | {{{sûperlatîv}}}
|-
| colspan="999" class="separator" |
|-
! class="outer" | Rewş
! colspan="2" class="outer" | Yekjimar
! class="outer" |Pirjimar
|-
! rowspan="2" | Navkî
! Nêr
| {{{casusRectusNêr}}}
| rowspan="2" | {{{casusRectusPirjimar}}}
|-
! Mê
| {{{casusRectusMê}}}
|-
! rowspan="2" | Çemandî
! Nêr
| {{{casusRectusPirjimar}}}
| rowspan="2" | {{{casusObliquusPirjimar}}}
|-
! Mê
| {{{casusRectusMê}}}
{{tabloya-tewandinê-bin}}<noinclude>
{{belgekirin}}
</noinclude>
kmmqa5lmxtdc8y7pck0dk2yhme3sq2g
6292166
6292164
2026-07-30T11:53:59Z
Ghybu
1393
6292166
wikitext
text/x-wiki
{{tabloya-tewandinê-ser|title=Tewandina ''{{SUBPAGENAME}}''|palette=purple|tall=yes}}
! Pozîtîv
| colspan="3" | {{{pozîtîv}}}
|-
! Komparatîv
| colspan="3" | {{{komparatîv}}}
|-
! Sûperlatîv
| colspan="3" | {{{sûperlatîv}}}
|-
| colspan="999" class="separator" |
|-
! class="outer" | Rewş
! colspan="2" class="outer" | Yekjimar
! class="outer" |Pirjimar
|-
! rowspan="2" | Navkî
! ''Nêr''
| {{{casusRectusNêr}}}
| rowspan="2" | {{{casusRectusPirjimar}}}
|-
! ''Mê''
| {{{casusRectusMê}}}
|-
! rowspan="2" | Çemandî
! ''Nêr''
| {{{casusRectusPirjimar}}}
| rowspan="2" | {{{casusObliquusPirjimar}}}
|-
! ''Mê''
| {{{casusRectusMê}}}
{{tabloya-tewandinê-bin}}<noinclude>
{{belgekirin}}
</noinclude>
c20t2h46ua6v6br05jbrp0tw4sr4ndt
Austronesian
0
935922
6292098
4865575
2026-07-29T22:03:30Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292098
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Navdêr ===
{{navdêr|en|p=Austronesians}}
# [[awistralasyayî]]
==== Jê ====
* [[Austronesia]]
=== Rengdêr ===
[[Wêne:Austroneske jazyky.jpg|thumb|{{zim|en|'''Austronesian''' languages map.}}]]
{{rengdêr|en}}
# {{f|en|ziman}} [[awistralasyayî]]
# Her tişta/ê herêma [[Awistralasya]]yê.
==== Jê ====
* [[Austronesianist]]
93o60jfvl2sukiflcwtji5t5eda081p
6292099
6292098
2026-07-29T22:04:01Z
Wikihez
7344
[[Bikarhêner:Wikihez/templateScript2.js|TS]]: sererastkirin
6292099
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Navdêr ===
{{navdêr|en|p=Austronesians}}
# [[awistralasyayî]]
==== Jê ====
* {{g|en|Austronesia}}
=== Rengdêr ===
[[Wêne:Austroneske jazyky.jpg|thumb|{{zim|en|'''Austronesian''' languages map.}}]]
{{rengdêr|en}}
# {{f|en|ziman}} [[awistralasyayî]]
# Her tişta/ê [[herêm|herêma]] [[Awistralasya]]yê.
==== Jê ====
* {{g|en|Austronesianist}}
s9mjrjcxpe2rbpy0h5b1s79cabpvmiw
Chinas
0
956157
6292106
4897775
2026-07-29T22:08:47Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292106
wikitext
text/x-wiki
{{bnr-h|chinas}}
== {{ziman|de}} ==
=== Bilêvkirin ===
* {{audio|de|De-Chinas.ogg|Deng}}
=== Formeke serenavê ===
{{serenav|de|form=erê}}
# ''Genîtîva yekjimar ya'' {{g|de|China}}.
edbgaq1vdvy0f3l8qj23n4t8c7nyic2
6292107
6292106
2026-07-29T22:10:12Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292107
wikitext
text/x-wiki
{{bnr-h|chinas}}
== {{ziman|de}} ==
=== Bilêvkirin ===
* {{audio|de|De-Chinas.ogg|Deng}}
=== Formeke serenavê ===
{{serenav|de|form=erê}}
# {{formeke peyvê|de|China||Genîtîva|yekjimar}}
lenv934gnrjeckc3nan83m221xjr96q
6292109
6292107
2026-07-29T22:11:28Z
Wikihez
7344
6292109
wikitext
text/x-wiki
{{bnr-h|chinas}}
== {{ziman|de}} ==
=== Bilêvkirin ===
* {{audio|de|De-Chinas.ogg|Deng}}
=== Formeke serenavê ===
{{serenav|de|form=erê}}
# {{formeke peyvê|de|China||Genîtîva|yekjimar}}
== {{ziman|en}} ==
=== Formeke serenavê ===
{{serenav|en|form=erê}}
# {{pirjimar|en|China}}
93q95byn4ji5sxh4axxcbmc2kge1ssf
Bikarhêner:Wikihez/minerva.js
2
970182
6292039
6291803
2026-07-29T18:07:26Z
Wikihez
7344
6292039
javascript
text/javascript
"use strict";
/*** [ForceWikiEditor] Force action=submit on redlinks/edit links so WikiEditor loads on mobile ***/
// <nowiki>
( function () {
var api = new mw.Api();
var sectionMapPromise = null;
function getSectionMap() {
if ( !sectionMapPromise ) {
sectionMapPromise = api.get( {
action: 'parse',
page: mw.config.get( 'wgPageName' ),
prop: 'sections',
formatversion: 2
} ).then( function ( result ) {
return result.parse.sections.filter( function ( s ) {
return s.level === '2';
} ).map( function ( s ) {
return s.index;
} );
}, function () {
return [];
} );
}
return sectionMapPromise;
}
var EDIT_SELECTOR = [
'a.new',
'.mw-editsection a',
'#ca-edit a',
'#ca-ve-edit a',
'.edit-page',
'.mw-ui-icon-edit',
'.oo-ui-icon-edit',
'a[href*="action=edit"]'
].join( ',' );
function findHrefAncestor( el ) {
while ( el && el.tagName !== 'A' ) {
el = el.parentElement;
}
return el;
}
function toSubmitUrl( href ) {
try {
var url = new URL( href, window.location.origin );
var action = url.searchParams.get( 'action' );
if ( action === 'edit' || !action ) {
url.searchParams.set( 'action', 'submit' );
}
return url.toString();
} catch ( e ) {
return href;
}
}
function buildSubmitUrl( section ) {
var params = { title: mw.config.get( 'wgPageName' ), action: 'submit' };
if ( section !== null && section !== undefined ) {
params.section = section;
}
return mw.util.getUrl( null, params );
}
function rewriteLinks( $context ) {
$context.find( EDIT_SELECTOR ).addBack( EDIT_SELECTOR ).each( function () {
var anchor = findHrefAncestor( this );
if ( !anchor ) {
return;
}
var href = anchor.getAttribute( 'href' );
if ( !href || href.indexOf( 'javascript:' ) === 0 ) {
return;
}
if ( anchor.classList.contains( 'new' ) || /[?&]action=edit\b/.test( href ) ) {
anchor.setAttribute( 'href', toSubmitUrl( href ) );
}
} );
}
mw.hook( 'wikipage.content' ).add( function ( $content ) {
rewriteLinks( $content );
} );
$( function () {
rewriteLinks( $( document.body ) );
var observer = new MutationObserver( function ( mutations ) {
mutations.forEach( function ( m ) {
m.addedNodes.forEach( function ( node ) {
if ( node.nodeType === 1 ) {
rewriteLinks( $( node ) );
}
} );
} );
} );
observer.observe( document.body, { childList: true, subtree: true } );
} );
document.addEventListener( 'click', function ( e ) {
var matched = e.target.closest ? e.target.closest( EDIT_SELECTOR ) : null;
if ( !matched ) {
return;
}
var anchor = findHrefAncestor( matched );
var href = anchor ? anchor.getAttribute( 'href' ) : null;
if ( href && href.indexOf( 'javascript:' ) === 0 ) {
return;
}
if ( href && ( matched.classList.contains( 'new' ) || /[?&]action=edit\b/.test( href ) ) ) {
e.preventDefault();
e.stopImmediatePropagation();
window.location.href = toSubmitUrl( href );
return;
}
if ( !href && (
matched.classList.contains( 'edit-page' ) ||
matched.classList.contains( 'mw-ui-icon-edit' ) ||
matched.classList.contains( 'oo-ui-icon-edit' ) ||
matched.closest( '.mw-editsection' )
) ) {
e.preventDefault();
e.stopImmediatePropagation();
var headingWrap = matched.closest( '.mw-heading' );
if ( !headingWrap ) {
window.location.href = buildSubmitUrl();
return;
}
var allTopHeadings = Array.prototype.slice.call(
document.querySelectorAll( '.mw-heading2' )
);
var order = allTopHeadings.indexOf( headingWrap );
if ( order === -1 ) {
window.location.href = buildSubmitUrl();
return;
}
getSectionMap().then( function ( sectionMap ) {
var sectionIndex = sectionMap[ order ];
window.location.href = buildSubmitUrl( sectionIndex !== undefined ? sectionIndex : null );
} );
}
}, true );
}() );
// </nowiki>
4837q7c1h8ktvtaxkhti330wmswiana
6292040
6292039
2026-07-29T18:10:30Z
Wikihez
7344
6292040
javascript
text/javascript
"use strict";
/*** [ForceWikiEditor] Force action=submit on redlinks/edit links so WikiEditor loads on mobile ***/
// <nowiki>
( function () {
var api = new mw.Api();
var sectionMapPromise = null;
function getSectionMap() {
if ( !sectionMapPromise ) {
sectionMapPromise = api.get( {
action: 'parse',
page: mw.config.get( 'wgPageName' ),
prop: 'sections',
formatversion: 2
} ).then( function ( result ) {
return result.parse.sections.filter( function ( s ) {
return s.level === '2';
} ).map( function ( s ) {
return s.index;
} );
}, function () {
return [];
} );
}
return sectionMapPromise;
}
var EDIT_SELECTOR = [
'a.new', // redlinks
'.mw-editsection a', // [edit] section links (desktop-style)
'#ca-edit a', // desktop edit tab
'#ca-ve-edit a', // VE tab if present
'.edit-page', // Minerva page-level edit button
'.mw-ui-icon-edit', // Minerva pencil icons
'.oo-ui-icon-edit', // OOUI edit icon buttons
'a[href*="action=edit"]', // catch-all by href
'a[href^="#/editor/"]' // Minerva hash-routed section editor links
].join( ',' );
function findHrefAncestor( el ) {
while ( el && el.tagName !== 'A' ) {
el = el.parentElement;
}
return el;
}
function toSubmitUrl( href ) {
try {
var url = new URL( href, window.location.origin );
var action = url.searchParams.get( 'action' );
if ( action === 'edit' || !action ) {
url.searchParams.set( 'action', 'submit' );
}
return url.toString();
} catch ( e ) {
return href;
}
}
function buildSubmitUrl( section ) {
var params = { title: mw.config.get( 'wgPageName' ), action: 'submit' };
if ( section !== null && section !== undefined ) {
params.section = section;
}
return mw.util.getUrl( null, params );
}
// Minerva's mobile editor routes via hashes like "#/editor/0" (whole page)
// or "#/editor/2" (section 2). The number IS the real MediaWiki section
// index, so we can build the submit URL directly without the API.
function editorHashSection( href ) {
var m = /^#\/editor\/(\d+)/.exec( href || '' );
return m ? parseInt( m[ 1 ], 10 ) : null;
}
// --- 1. Rewrite real hrefs (helps long-press previews / non-JS fallback) ---
function rewriteLinks( $context ) {
$context.find( EDIT_SELECTOR ).addBack( EDIT_SELECTOR ).each( function () {
var anchor = findHrefAncestor( this );
if ( !anchor ) {
return;
}
var href = anchor.getAttribute( 'href' );
if ( !href || href.indexOf( 'javascript:' ) === 0 ) {
return; // leave synthetic links (e.g. other gadgets' controls) untouched
}
var hashSection = editorHashSection( href );
if ( hashSection !== null ) {
anchor.setAttribute( 'href', buildSubmitUrl( hashSection ) );
return;
}
if ( anchor.classList.contains( 'new' ) || /[?&]action=edit\b/.test( href ) ) {
anchor.setAttribute( 'href', toSubmitUrl( href ) );
}
} );
}
mw.hook( 'wikipage.content' ).add( function ( $content ) {
rewriteLinks( $content );
} );
$( function () {
rewriteLinks( $( document.body ) );
var observer = new MutationObserver( function ( mutations ) {
mutations.forEach( function ( m ) {
m.addedNodes.forEach( function ( node ) {
if ( node.nodeType === 1 ) {
rewriteLinks( $( node ) );
}
} );
} );
} );
observer.observe( document.body, { childList: true, subtree: true } );
} );
// --- 2. Intercept clicks in the capture phase (before MobileFrontend's overlay handler) ---
document.addEventListener( 'click', function ( e ) {
var matched = e.target.closest ? e.target.closest( EDIT_SELECTOR ) : null;
if ( !matched ) {
return;
}
var anchor = findHrefAncestor( matched );
var href = anchor ? anchor.getAttribute( 'href' ) : null;
// Synthetic link from another gadget: ignore.
if ( href && href.indexOf( 'javascript:' ) === 0 ) {
return;
}
// Minerva hash-routed editor link (e.g. "#/editor/2") — this is the
// case that was previously falling through and doing nothing.
var hashSection = editorHashSection( href );
if ( hashSection !== null ) {
e.preventDefault();
e.stopImmediatePropagation();
window.location.href = buildSubmitUrl( hashSection );
return;
}
// Real href pointing at an edit action or a redlink.
if ( href && ( matched.classList.contains( 'new' ) || /[?&]action=edit\b/.test( href ) ) ) {
e.preventDefault();
e.stopImmediatePropagation();
window.location.href = toSubmitUrl( href );
return;
}
// No usable href at all — typical of Minerva's per-section pencil
// or floating page-edit button, which exist purely to trigger the
// JS overlay. Resolve the target ourselves.
if ( !href && (
matched.classList.contains( 'edit-page' ) ||
matched.classList.contains( 'mw-ui-icon-edit' ) ||
matched.classList.contains( 'oo-ui-icon-edit' ) ||
matched.closest( '.mw-editsection' )
) ) {
e.preventDefault();
e.stopImmediatePropagation();
var headingWrap = matched.closest( '.mw-heading' );
if ( !headingWrap ) {
// Not tied to any heading → whole-page edit button.
window.location.href = buildSubmitUrl();
return;
}
var allTopHeadings = Array.prototype.slice.call(
document.querySelectorAll( '.mw-heading2' )
);
var order = allTopHeadings.indexOf( headingWrap );
if ( order === -1 ) {
window.location.href = buildSubmitUrl();
return;
}
getSectionMap().then( function ( sectionMap ) {
var sectionIndex = sectionMap[ order ];
window.location.href = buildSubmitUrl( sectionIndex !== undefined ? sectionIndex : null );
} );
}
}, true ); // capture phase
}() );
// </nowiki>
3dkq7t28heo4cfvty7pfmbf6wjasowf
6292041
6292040
2026-07-29T18:13:20Z
Wikihez
7344
6292041
javascript
text/javascript
"use strict";
/*** [ForceWikiEditor] Force action=submit on redlinks/edit links so WikiEditor loads on mobile ***/
// <nowiki>
( function () {
var api = new mw.Api();
var sectionMapPromise = null;
function getSectionMap() {
if ( !sectionMapPromise ) {
sectionMapPromise = api.get( {
action: 'parse',
page: mw.config.get( 'wgPageName' ),
prop: 'sections',
formatversion: 2
} ).then( function ( result ) {
return result.parse.sections.filter( function ( s ) {
return s.level === '2';
} ).map( function ( s ) {
return s.index;
} );
}, function () {
return [];
} );
}
return sectionMapPromise;
}
var EDIT_SELECTOR = [
'a.new', // redlinks
'.mw-editsection a', // [edit] section links (desktop-style)
'#ca-edit a', // desktop edit tab
'#ca-ve-edit a', // VE tab if present
'.edit-page', // Minerva page-level edit button
'.mw-ui-icon-edit', // Minerva pencil icons
'.oo-ui-icon-edit', // OOUI edit icon buttons
'a[href*="action=edit"]', // catch-all by href
'a[href^="#/editor/"]' // Minerva hash-routed section editor links
].join( ',' );
function findHrefAncestor( el ) {
while ( el && el.tagName !== 'A' ) {
el = el.parentElement;
}
return el;
}
function toSubmitUrl( href ) {
try {
var url = new URL( href, window.location.origin );
var action = url.searchParams.get( 'action' );
if ( action === 'edit' || !action ) {
url.searchParams.set( 'action', 'submit' );
}
return url.toString();
} catch ( e ) {
return href;
}
}
function buildSubmitUrl( section ) {
var params = { title: mw.config.get( 'wgPageName' ), action: 'submit' };
if ( section !== null && section !== undefined ) {
params.section = section;
}
return mw.util.getUrl( null, params );
}
// Minerva's mobile editor routes via hashes like "#/editor/2" (section 2)
// or "#/editor/all" (whole-page edit button). The number IS the real
// MediaWiki section index, so we can build the submit URL directly
// without the API. "all" means no section param at all.
function editorHashSection( href ) {
var m = /^#\/editor\/(all|\d+)/.exec( href || '' );
if ( !m ) {
return null;
}
return m[ 1 ] === 'all' ? null : parseInt( m[ 1 ], 10 );
}
// Distinguish "no editor hash present" from "editor hash present, means
// whole page" — both can resolve to a null section, so track a flag too.
function isEditorHash( href ) {
return /^#\/editor\/(all|\d+)/.test( href || '' );
}
// --- 1. Rewrite real hrefs (helps long-press previews / non-JS fallback) ---
function rewriteLinks( $context ) {
$context.find( EDIT_SELECTOR ).addBack( EDIT_SELECTOR ).each( function () {
var anchor = findHrefAncestor( this );
if ( !anchor ) {
return;
}
var href = anchor.getAttribute( 'href' );
if ( !href || href.indexOf( 'javascript:' ) === 0 ) {
return; // leave synthetic links (e.g. other gadgets' controls) untouched
}
if ( isEditorHash( href ) ) {
anchor.setAttribute( 'href', buildSubmitUrl( editorHashSection( href ) ) );
return;
}
if ( anchor.classList.contains( 'new' ) || /[?&]action=edit\b/.test( href ) ) {
anchor.setAttribute( 'href', toSubmitUrl( href ) );
}
} );
}
mw.hook( 'wikipage.content' ).add( function ( $content ) {
rewriteLinks( $content );
} );
$( function () {
rewriteLinks( $( document.body ) );
var observer = new MutationObserver( function ( mutations ) {
mutations.forEach( function ( m ) {
m.addedNodes.forEach( function ( node ) {
if ( node.nodeType === 1 ) {
rewriteLinks( $( node ) );
}
} );
} );
} );
observer.observe( document.body, { childList: true, subtree: true } );
} );
// --- 2. Intercept clicks in the capture phase (before MobileFrontend's overlay handler) ---
document.addEventListener( 'click', function ( e ) {
var matched = e.target.closest ? e.target.closest( EDIT_SELECTOR ) : null;
if ( !matched ) {
return;
}
var anchor = findHrefAncestor( matched );
var href = anchor ? anchor.getAttribute( 'href' ) : null;
// Synthetic link from another gadget: ignore.
if ( href && href.indexOf( 'javascript:' ) === 0 ) {
return;
}
// Minerva hash-routed editor link (e.g. "#/editor/2" or "#/editor/all")
// — this is the case that was previously falling through and doing
// nothing, since "all" wasn't matched by the old numeric-only regex.
if ( isEditorHash( href ) ) {
e.preventDefault();
e.stopImmediatePropagation();
window.location.href = buildSubmitUrl( editorHashSection( href ) );
return;
}
// Real href pointing at an edit action or a redlink.
if ( href && ( matched.classList.contains( 'new' ) || /[?&]action=edit\b/.test( href ) ) ) {
e.preventDefault();
e.stopImmediatePropagation();
window.location.href = toSubmitUrl( href );
return;
}
// No usable href at all — typical of Minerva's per-section pencil
// or floating page-edit button, which exist purely to trigger the
// JS overlay. Resolve the target ourselves.
if ( !href && (
matched.classList.contains( 'edit-page' ) ||
matched.classList.contains( 'mw-ui-icon-edit' ) ||
matched.classList.contains( 'oo-ui-icon-edit' ) ||
matched.closest( '.mw-editsection' )
) ) {
e.preventDefault();
e.stopImmediatePropagation();
var headingWrap = matched.closest( '.mw-heading' );
if ( !headingWrap ) {
// Not tied to any heading → whole-page edit button.
window.location.href = buildSubmitUrl();
return;
}
var allTopHeadings = Array.prototype.slice.call(
document.querySelectorAll( '.mw-heading2' )
);
var order = allTopHeadings.indexOf( headingWrap );
if ( order === -1 ) {
window.location.href = buildSubmitUrl();
return;
}
getSectionMap().then( function ( sectionMap ) {
var sectionIndex = sectionMap[ order ];
window.location.href = buildSubmitUrl( sectionIndex !== undefined ? sectionIndex : null );
} );
}
}, true ); // capture phase
}() );
// </nowiki>
o35gbd387xeee8fkxzowyl1tsuq1jht
6292042
6292041
2026-07-29T18:16:41Z
Wikihez
7344
6292042
javascript
text/javascript
"use strict";
/*** [ForceWikiEditor] Force action=submit on redlinks/edit links so WikiEditor loads on mobile ***/
// <nowiki>
( function () {
var api = new mw.Api();
var sectionMapPromise = null;
function getSectionMap() {
if ( !sectionMapPromise ) {
sectionMapPromise = api.get( {
action: 'parse',
page: mw.config.get( 'wgPageName' ),
prop: 'sections',
formatversion: 2
} ).then( function ( result ) {
return result.parse.sections.filter( function ( s ) {
return s.level === '2';
} ).map( function ( s ) {
return s.index;
} );
}, function () {
return [];
} );
}
return sectionMapPromise;
}
var EDIT_SELECTOR = [
'a.new', // redlinks
'.mw-editsection a', // [edit] section links (desktop-style)
'#ca-edit a', // desktop edit tab
'#ca-ve-edit a', // VE tab if present
'.edit-page', // Minerva page-level edit button
'.mw-ui-icon-edit', // Minerva pencil icons
'.oo-ui-icon-edit', // OOUI edit icon buttons
'a[href*="action=edit"]', // catch-all by href
'a[href^="#/editor/"]' // Minerva hash-routed section editor links
].join( ',' );
function findHrefAncestor( el ) {
while ( el && el.tagName !== 'A' ) {
el = el.parentElement;
}
return el;
}
function toSubmitUrl( href ) {
try {
var url = new URL( href, window.location.origin );
var action = url.searchParams.get( 'action' );
if ( action === 'edit' || !action ) {
url.searchParams.set( 'action', 'submit' );
}
return url.toString();
} catch ( e ) {
return href;
}
}
function buildSubmitUrl( section ) {
var params = { title: mw.config.get( 'wgPageName' ), action: 'submit' };
if ( section !== null && section !== undefined ) {
params.section = section;
}
return mw.util.getUrl( null, params );
}
// Minerva's mobile editor routes via hashes like "#/editor/2" (section 2)
// or "#/editor/all" (whole-page edit button). The number IS the real
// MediaWiki section index, so we can build the submit URL directly
// without the API. "all" means no section param at all.
function editorHashSection( href ) {
var m = /^#\/editor\/(all|\d+)/.exec( href || '' );
if ( !m ) {
return null;
}
return m[ 1 ] === 'all' ? null : parseInt( m[ 1 ], 10 );
}
// Distinguish "no editor hash present" from "editor hash present, means
// whole page" — both can resolve to a null section, so track a flag too.
function isEditorHash( href ) {
return /^#\/editor\/(all|\d+)/.test( href || '' );
}
// --- 0. Hash-based interception (the reliable mechanism) ---
// Minerva's own editor-opening code is very likely bound to document
// in the capture phase too, and loads before user scripts do, so it can
// win the race against our click handler below. Instead of trying to
// beat it to the click, just watch for the resulting hash and bail out
// to the submit URL the moment it appears — this works regardless of
// which click handler "wins", and also catches the case where the page
// loads with an editor hash already in the URL.
function checkHashRoute() {
var hash = window.location.hash;
if ( isEditorHash( hash ) ) {
window.location.href = buildSubmitUrl( editorHashSection( hash ) );
}
}
window.addEventListener( 'hashchange', checkHashRoute );
checkHashRoute(); // handle a page loaded directly with an editor hash present
// --- 1. Rewrite real hrefs (helps long-press previews / non-JS fallback) ---
function rewriteLinks( $context ) {
$context.find( EDIT_SELECTOR ).addBack( EDIT_SELECTOR ).each( function () {
var anchor = findHrefAncestor( this );
if ( !anchor ) {
return;
}
var href = anchor.getAttribute( 'href' );
if ( !href || href.indexOf( 'javascript:' ) === 0 ) {
return; // leave synthetic links (e.g. other gadgets' controls) untouched
}
if ( isEditorHash( href ) ) {
anchor.setAttribute( 'href', buildSubmitUrl( editorHashSection( href ) ) );
return;
}
if ( anchor.classList.contains( 'new' ) || /[?&]action=edit\b/.test( href ) ) {
anchor.setAttribute( 'href', toSubmitUrl( href ) );
}
} );
}
mw.hook( 'wikipage.content' ).add( function ( $content ) {
rewriteLinks( $content );
} );
$( function () {
rewriteLinks( $( document.body ) );
var observer = new MutationObserver( function ( mutations ) {
mutations.forEach( function ( m ) {
m.addedNodes.forEach( function ( node ) {
if ( node.nodeType === 1 ) {
rewriteLinks( $( node ) );
}
} );
} );
} );
observer.observe( document.body, { childList: true, subtree: true } );
} );
// --- 2. Intercept clicks in the capture phase (before MobileFrontend's overlay handler) ---
document.addEventListener( 'click', function ( e ) {
var matched = e.target.closest ? e.target.closest( EDIT_SELECTOR ) : null;
if ( !matched ) {
return;
}
var anchor = findHrefAncestor( matched );
var href = anchor ? anchor.getAttribute( 'href' ) : null;
// Synthetic link from another gadget: ignore.
if ( href && href.indexOf( 'javascript:' ) === 0 ) {
return;
}
// Minerva hash-routed editor link (e.g. "#/editor/2" or "#/editor/all")
// — this is the case that was previously falling through and doing
// nothing, since "all" wasn't matched by the old numeric-only regex.
if ( isEditorHash( href ) ) {
e.preventDefault();
e.stopImmediatePropagation();
window.location.href = buildSubmitUrl( editorHashSection( href ) );
return;
}
// Real href pointing at an edit action or a redlink.
if ( href && ( matched.classList.contains( 'new' ) || /[?&]action=edit\b/.test( href ) ) ) {
e.preventDefault();
e.stopImmediatePropagation();
window.location.href = toSubmitUrl( href );
return;
}
// No usable href at all — typical of Minerva's per-section pencil
// or floating page-edit button, which exist purely to trigger the
// JS overlay. Resolve the target ourselves.
if ( !href && (
matched.classList.contains( 'edit-page' ) ||
matched.classList.contains( 'mw-ui-icon-edit' ) ||
matched.classList.contains( 'oo-ui-icon-edit' ) ||
matched.closest( '.mw-editsection' )
) ) {
e.preventDefault();
e.stopImmediatePropagation();
var headingWrap = matched.closest( '.mw-heading' );
if ( !headingWrap ) {
// Not tied to any heading → whole-page edit button.
window.location.href = buildSubmitUrl();
return;
}
var allTopHeadings = Array.prototype.slice.call(
document.querySelectorAll( '.mw-heading2' )
);
var order = allTopHeadings.indexOf( headingWrap );
if ( order === -1 ) {
window.location.href = buildSubmitUrl();
return;
}
getSectionMap().then( function ( sectionMap ) {
var sectionIndex = sectionMap[ order ];
window.location.href = buildSubmitUrl( sectionIndex !== undefined ? sectionIndex : null );
} );
}
}, true ); // capture phase
}() );
// </nowiki>
tju8jphzncm01bp87eo7j9i1c6nca1n
6292043
6292042
2026-07-29T18:28:13Z
Wikihez
7344
Restored revision 6291723 by [[Special:Contributions/Wikihez|Wikihez]] ([[User talk:Wikihez|talk]]) ([[:m:User:Xiplus/TwinkleGlobal|TwinkleGlobal]])
6292043
javascript
text/javascript
/**
* Skripta Wîkîferhengê: Lînkên sor û bişkoka guhartinê ya mobîl
* Kar: Hemû lînkên sor û bişkoka guhartinê ya mobîl bi 'action=submit' vedike.
*/
(function () {
function fixLinks() {
// 1. Hemû lînkên sor (redlinks) diguherîne
$('a.new').each(function () {
var href = $(this).attr('href');
if (href) {
// 'action=edit' diguherîne 'action=submit'
$(this).attr('href', href.replace('action=edit', 'action=submit'));
}
});
// 2. Tenê ji bo mobîlê (Skin: MinervaNeue)
if (mw.config.get('skin') === 'minerva' || $('body').hasClass('skin-minerva')) {
// Li ser mobîlê bişkoka guhartinê ya sereke û ya beşan diguherîne
$('#ca-edit, .edit-page, .mw-editsection a').each(function () {
var href = $(this).attr('href');
if (href && href.indexOf('action=') !== -1) {
$(this).attr('href', href.replace(/action=[^&]+/, 'action=submit'));
} else if (href) {
// Heke action tune be (mînak lînka sereke), lê zêde dike
var connector = href.indexOf('?') !== -1 ? '&' : '?';
$(this).attr('href', href + connector + 'action=submit');
}
});
}
}
// Gava rûpel bar kir yan naverok hat guhartin (ji bo popups/live previews)
$(document).ready(fixLinks);
mw.hook('wikipage.content').add(fixLinks);
})();
ddu09gr3apl6uj4nsia2be3yb0ttpcv
Bikarhêner:Wikihez/Gadget-start.js
2
974484
6292062
6291969
2026-07-29T19:42:57Z
Wikihez
7344
6292062
javascript
text/javascript
// Li ser [[vi:MediaWiki:Gadget-start.js]] hatiye refaktorkirin.
// implicit dependencies: StorageUtils (ObjectStorage)
//<nowiki>
$(function () {
if (window.location.href.includes("editintro=User:Wikihez/creation/intro")) {
return; // Do not run the script wextê WF:Bilez dişuxile
}
var ns = mw.config.get("wgNamespaceNumber");
if (ns &&
!(ns === 2 && mw.config.get("wgPageName").match(/\/ceribandin$|\/test$/))) {
return;
}
var action = mw.config.get("wgAction");
var pageExists = !!mw.config.get("wgArticleId");
var addLangMode = pageExists && mw.util.getParamValue("wiktkuaddlang") === "1";
if (action === "view" && pageExists) {
var targetContainer;
var skin = mw.config.get('skin');
if (skin === 'vector-2022') {
targetContainer = 'p-cactions';
} else if (skin === 'vector') {
targetContainer = 'p-tb';
} else {
targetContainer = 'p-views';
}
mw.util.addPortletLink(targetContainer,
mw.util.getUrl(mw.config.get("wgPageName"), { action: "submit", wiktkuaddlang: "1" }),
"+Ziman/beşeke din", "ca-wiktku-addlang",
"Ji vê rûpelê re ziman an jî beşeke nû zêde bike");
return;
}
if (!(action === "edit" || action === "submit")) {
return;
}
if (!addLangMode && !$(".mw-newarticletext, .mw-newarticletextanon").length) {
return;
}
mw.notify(
"Amûr dest pê dike, hinek bisekinin.\nNot: jkx Sentaks (Syntax highlighting) neaktîv bikin",
{ type: "info", tag: "wiktku-start-notice", autoHide: true, autoHideSeconds: 10 }
);
var dataJsonPromise, zimanJsonPromise;
var metaApiPromise = mw.loader.using("mediawiki.api").then(function () {
var metaApi = new mw.Api();
dataJsonPromise = metaApi.get({
action: "query",
prop: "revisions",
titles: "MediaWiki:Gadget-start.js/data.json",
rvprop: "content",
rvslots: "main",
formatversion: 2
});
zimanJsonPromise = metaApi.get({
action: "query",
prop: "revisions",
titles: "Bikarhêner:Wikihez/test.json",
rvprop: "content",
rvslots: "main",
formatversion: 2
});
return dataJsonPromise;
});
function capitalize(str) {
if (!str) return str;
return str[0].toUpperCase() + str.substr(1);
}
function decapitalize(str) {
if (!str) return str;
return str[0].toLowerCase() + str.substr(1);
}
function escapeRegExp(str) {
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
function langHeaderSource(codePattern) {
return "\n?==\\s*\\{\\{\\s*ziman\\s*\\|\\s*(" + codePattern + ")\\s*\\}\\}\\s*==";
}
function findLangHeader(text, code) {
var m = new RegExp(langHeaderSource(escapeRegExp(code))).exec(text);
return m ? { index: m.index, match: m[0] } : null;
}
function stripWikilinks(str) {
return str.replace(/\[\[([^\]|]+)(?:\|([^\]]+))?\]\]/g, function (m, target, display) {
return display || target;
});
}
function splitTercimeIzah(mane) {
var m = /^([\s\S]*?)\s*\{\{îzah\|([\s\S]*)\}\}\s*$/.exec(mane || "");
return m ? { tercime: m[1], izah: m[2] } : null;
}
function insertAtCursor(el, text) {
var start = el.selectionStart;
var end = el.selectionEnd;
var val = el.value;
el.value = val.slice(0, start) + text + val.slice(end);
var pos = start + text.length;
el.selectionStart = el.selectionEnd = pos;
}
var catSrcTemplates = null;
var catSrcTemplatesPromise = null;
function fetchCatSrcTemplates() {
if (catSrcTemplatesPromise) return catSrcTemplatesPromise;
catSrcTemplatesPromise = new mw.Api().get({
action: "query",
list: "categorymembers",
cmtitle: "Kategorî:Çavkanî",
cmnamespace: 10,
cmlimit: "max",
formatversion: 2
}).then(function (data) {
var members = (data.query && data.query.categorymembers) || [];
catSrcTemplates = $.map(members, function (m) {
// Pêşgira navî ya "Şablon:" rake.
return m.title.replace(/^[^:]+:/, "");
});
catSrcTemplates.sort(function (a, b) { return a.localeCompare(b, userLang); });
return catSrcTemplates;
}, function () {
catSrcTemplates = [];
return catSrcTemplates;
});
return catSrcTemplatesPromise;
}
var pageName = mw.config.get("wgPageName").replaceAll(/_/g, " ");
if (ns) pageName = pageName.replace(/.*\//, "");
var pageNameRe = escapeRegExp(pageName);
var userLang = mw.config.get("wgUserLanguage");
var formCache = new ObjectStorage("wiktku_start_draft_" + mw.config.get("wgPageName"), 1);
var isMobile = !!mw.config.get("wgMFMode") || window.matchMedia("(pointer: coarse)").matches;
var FOLD_EXTRA = {
"ı": "i", // dotless i
"ø": "o", // o with stroke
"đ": "d", // d with stroke
"ð": "d", // eth
"ə": "e", // schwa
"ħ": "h", // h with stroke
"ł": "l", // l with stroke
"ŋ": "n", // eng
"ʉ": "u", // u bar
"ɨ": "i", // i bar
"ʒ": "z", // ezh
"ɛ": "e", // open e
"ɔ": "o", // open o
"æ": "ae",
"œ": "oe",
"ß": "ss",
"þ": "th" };
function foldDiacritics(str) {
if (str === null || str === undefined) return "";
var s = String(str).toLowerCase();
if (typeof s.normalize === "function") {
// Split "î" into "i" + combining circumflex, then drop the accent.
s = s.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
}
return s.replace(/[^\u0000-\u007f]/g, function (ch) {
return Object.prototype.hasOwnProperty.call(FOLD_EXTRA, ch) ? FOLD_EXTRA[ch] : ch;
});
}
var WIKTKU_RESIZE_STORAGE_PREFIX = "wiktku_resize_height_";
/** Textareas of the same "kind" (e.g. every Nimûne box, every Tercime
* box) share a class list even though each individual box is a fresh
* DOM node built on the fly (new sense blocks, quote fields, …) with
* no stable id of its own. That class list is what we key the cached
* height on, so a size chosen for one Nimûne box is reused for every
* Nimûne box, on this page and on the next one. */
function wiktkuResizeStorageKey(textarea) {
var cls = (textarea.attr("class") || "").trim().replace(/\s+/g, "_");
return WIKTKU_RESIZE_STORAGE_PREFIX + cls;
}
function wiktkuSaveResizeHeight(textarea, height) {
if (!(window.mw && mw.storage)) return;
try {
mw.storage.set(wiktkuResizeStorageKey(textarea), String(Math.round(height)));
} catch (e) { /* localStorage unavailable (private mode, quota, …) — skip caching */ }
}
function wiktkuLoadResizeHeight(textarea) {
if (!(window.mw && mw.storage)) return null;
try {
var v = mw.storage.get(wiktkuResizeStorageKey(textarea));
return v ? parseFloat(v) : null;
} catch (e) {
return null;
}
}
/** Replaces a textarea's native corner resize grip with a small custom
* drag handle (see the "Manual drag-to-resize handle" comment and
* .wiktku-resize-wrap / .wiktku-resize-grip in styles.css). Needed
* because iOS Safari never implements the native grip at all and
* desktop Safari's own version is inconsistent, so we replace it
* everywhere for uniform behaviour. One-line fields (.wiktku-start-narrow)
* are meant to stay a fixed height and are left untouched. Safe to call
* more than once on the same textarea. */
function wiktkuMakeManualResizable(textarea) {
textarea = $(textarea);
if (!textarea.is("textarea") || textarea.hasClass("wiktku-start-narrow")) return;
if (textarea.data("wiktkuResizableDone")) return;
textarea.data("wiktkuResizableDone", true);
textarea.wrap("<div class='wiktku-resize-wrap'></div>");
var grip = $("<div class='wiktku-resize-grip'></div>");
textarea.after(grip);
// Restore a previously chosen height for this kind of field, if any.
var cachedHeight = wiktkuLoadResizeHeight(textarea);
if (cachedHeight) {
var minHeightInit = parseFloat(textarea.css("min-height")) || 0;
textarea.css("height", Math.max(cachedHeight, minHeightInit) + "px");
}
var dragging = false, startY = 0, startHeight = 0;
function onPointerMove(e) {
if (!dragging) return;
var oe = e.originalEvent || e;
var minHeight = parseFloat(textarea.css("min-height")) || 0;
var newHeight = startHeight + (oe.clientY - startY);
textarea.css("height", Math.max(newHeight, minHeight) + "px");
}
function onPointerUp(e) {
if (!dragging) return;
dragging = false;
var oe = e.originalEvent || e;
try { grip[0].releasePointerCapture(oe.pointerId); } catch (err) { /* ignore */ }
$(document).off("pointermove", onPointerMove);
$(document).off("pointerup pointercancel", onPointerUp);
wiktkuSaveResizeHeight(textarea, textarea.outerHeight());
}
grip.on("pointerdown", function (e) {
var oe = e.originalEvent || e;
if (oe.button !== undefined && oe.button !== 0) return; // primary contact only
e.preventDefault();
dragging = true;
startY = oe.clientY;
startHeight = textarea.outerHeight();
try { grip[0].setPointerCapture(oe.pointerId); } catch (err) { /* ignore */ }
$(document).on("pointermove", onPointerMove);
$(document).on("pointerup pointercancel", onPointerUp);
});
}
/** Applies wiktkuMakeManualResizable to every eligible textarea already
* inside `context` (context itself, if it is a textarea, or any of its
* descendants). Used both for the initial form render and, via the
* MutationObserver set up in build(), for textareas added later on
* (new sense blocks, quote-source fields, nimûne rows, …). */
function wiktkuInitManualResize(context) {
var $context = $(context);
var $textareas = $context.is("textarea") ? $context : $context.find("textarea");
$textareas.each(function () {
wiktkuMakeManualResizable(this);
});
}
function wrapNativeSelect(select) {
var wrapper = $("<span class='wiktku-native-select-wrap'></span>");
if (select.prop("multiple")) {
return wrapper.append(select);
}
var placeholder = select.attr("data-placeholder") || "Lê bigere...";
select.hide();
var textInput = $("<input type='search' autocomplete='off'>")
.attr("placeholder", placeholder)
.attr("role", "combobox")
.attr("aria-autocomplete", "list")
.attr("aria-expanded", "false")
.addClass("wiktku-start-narrow wiktku-ac-input");
var resultsList = $("<ul class='wiktku-ac-results' role='listbox'></ul>").hide();
var allOptions = [];
var shown = [];
var activeIndex = -1;
function cacheOptions() {
allOptions = [];
select.find("option").each(function () {
var v = $(this).val();
var text = $(this).text();
// A blank value with no label (most selects' placeholder) is
// never a real choice, so skip it. But a blank value WITH a
// label -- e.g. tplSelect's "— yan jî şablonek hilbijêre —" --
// is a meaningful "clear the selection" choice, so keep it
// searchable/selectable like any other option.
if (!v && !text) return;
// Language options read "Name (code)" -- score the name on its own
// so the trailing code doesn't also count as a name match.
var name = text.replace(/\s*\([^()]*\)\s*$/, "");
allOptions.push({
value: v,
text: text,
disabled: $(this).prop("disabled"),
foldCode: foldDiacritics(v),
foldName: foldDiacritics(name),
foldText: foldDiacritics(text)
});
});
}
cacheOptions();
// True if `q` starts a word inside `name` ("kevn" in "ingiliziya kevn").
function startsWord(name, q) {
var from = 0, at;
while ((at = name.indexOf(q, from)) !== -1) {
if (at === 0 || /[\s\-\u2013\u2014(/,.]/.test(name.charAt(at - 1))) return true;
from = at + 1;
}
return false;
}
// Lower rank = better match.
// a code that *is* the query, or begins with it, always outranks a name
// that merely contains it -- so "ang" lists "Îngilîziya kevn (ang)"
// first instead of burying it among every name containing "ang".
var RANK_NONE = 99;
function rankOption(o, q) {
var code = o.foldCode, name = o.foldName;
if (code === q) return 0; // exact code
if (code.indexOf(q) === 0) return 1; // code prefix
if (name === q) return 2; // exact name
if (name.indexOf(q) === 0) return 3; // name prefix
if (startsWord(name, q)) return 4; // starts a word in the name
if (name.indexOf(q) !== -1) return 5; // name substring
if (code.indexOf(q) !== -1) return 6; // code substring
if (o.foldText.indexOf(q) !== -1) return 7; // anywhere else in the label
return RANK_NONE;
}
function positionList() {
// Position the list above or below depending on viewport space.
var inputRect = textInput[0].getBoundingClientRect();
var viewportH = window.innerHeight;
var spaceBelow = viewportH - inputRect.bottom - 8;
var spaceAbove = inputRect.top - 8;
var maxH = Math.min(224, Math.max(spaceBelow, spaceAbove)); // 224px = 14em
resultsList.css({
"max-height": maxH + "px",
"top": spaceBelow >= spaceAbove ? "100%" : "auto",
"bottom": spaceBelow >= spaceAbove ? "auto" : "100%"
});
}
function closeList() {
resultsList.hide();
textInput.attr("aria-expanded", "false");
activeIndex = -1;
}
function showResults(query) {
var q = foldDiacritics($.trim(query || ""));
resultsList.empty();
activeIndex = -1;
var matched = [];
if (q) {
$.each(allOptions, function (i, o) {
if (o.disabled) return;
var rank = rankOption(o, q);
if (rank !== RANK_NONE) matched.push({ opt: o, rank: rank, i: i });
});
if (!matched.length && q.indexOf(" ") !== -1) {
var tokens = q.split(/\s+/);
$.each(allOptions, function (i, o) {
if (o.disabled) return;
var all = true;
$.each(tokens, function (_, t) {
if (o.foldText.indexOf(t) === -1) { all = false; return false; }
});
if (all) matched.push({ opt: o, rank: 8, i: i });
});
}
matched.sort(function (a, b) {
if (a.rank !== b.rank) return a.rank - b.rank;
// Inside the code tiers the shorter code is the better hit:
// "an" -> "an" before "ang" before "ang-x-...".
if (a.rank <= 1 && a.opt.foldCode.length !== b.opt.foldCode.length) {
return a.opt.foldCode.length - b.opt.foldCode.length;
}
// Otherwise keep the menu's own order (pinned languages first).
return a.i - b.i;
});
} else {
$.each(allOptions, function (i, o) {
if (!o.disabled) matched.push({ opt: o, rank: 0, i: i });
});
}
shown = $.map(matched.slice(0, 50), function (m) { return m.opt; });
if (!shown.length) {
closeList();
return;
}
$.each(shown, function (idx, opt) {
var li = $("<li role='option'></li>")
.text(opt.text)
.attr("data-value", opt.value)
.attr("aria-selected", "false");
// touchend (not touchstart) so a scroll doesn't trigger a select.
var touchMoved = false;
li.on("touchstart", function () {
touchMoved = false;
});
li.on("touchmove", function () {
touchMoved = true;
});
li.on("touchend", function (e) {
if (touchMoved) return; // was a scroll, not a tap
e.preventDefault();
selectOption(opt.value, opt.text);
});
// mousedown (not click) so it beats the input's blur handler.
li.on("mousedown", function (e) {
e.preventDefault();
selectOption(opt.value, opt.text);
});
li.on("mouseenter", function () {
// Hovered items are already in view -- don't scroll the list
// under the mouse, or the shift can trigger the next item's
// mouseenter and cascade into a runaway scroll.
setActive(idx, /* scrollIntoView */ false);
});
resultsList.append(li);
});
positionList();
resultsList.show();
resultsList[0].scrollTop = 0;
textInput.attr("aria-expanded", "true");
}
function setActive(idx, scrollIntoView) {
var items = resultsList.children("li");
if (!items.length) return;
if (idx < 0) idx = items.length - 1;
if (idx >= items.length) idx = 0;
activeIndex = idx;
items.removeClass("wiktku-ac-active").attr("aria-selected", "false");
var li = items.eq(idx).addClass("wiktku-ac-active").attr("aria-selected", "true");
if (scrollIntoView === false) return;
// Keep the cursor visible inside the scrollable list -- only for
// keyboard navigation. A mouse-hovered item is already visible, so
// scrolling here would shift the list under a stationary pointer
// and cascade into further mouseenter events.
var ul = resultsList[0], el = li[0];
if (el.offsetTop < ul.scrollTop) {
ul.scrollTop = el.offsetTop;
} else if (el.offsetTop + el.offsetHeight > ul.scrollTop + ul.clientHeight) {
ul.scrollTop = el.offsetTop + el.offsetHeight - ul.clientHeight;
}
}
/** Puts the currently selected option's label back in the text box. */
function syncInputToSelect() {
var cur = select.val();
var match = null;
if (cur) {
$.each(allOptions, function (_, o) {
if (o.value === cur) { match = o; return false; }
});
}
textInput.val(match ? match.text : "");
}
function selectOption(value, text) {
textInput.val(text);
select.val(value);
closeList();
select.trigger("change");
}
textInput.on("input", function () {
showResults($(this).val());
});
textInput.on("focus", function () {
// Select the current label so typing replaces it, and open the full list
this.select();
showResults("");
});
textInput.on("click", function () {
if (!resultsList.is(":visible")) showResults($(this).val());
});
textInput.on("keydown", function (e) {
var open = resultsList.is(":visible");
switch (e.which) {
case 40: // Down
e.preventDefault();
if (!open) { showResults($(this).val()); setActive(0); }
else setActive(activeIndex + 1);
break;
case 38: // Up
e.preventDefault();
if (!open) { showResults($(this).val()); setActive(-1); }
else setActive(activeIndex - 1);
break;
case 13: // Enter -- must never submit the form while the list is open
if (open) {
e.preventDefault();
if (activeIndex >= 0 && shown[activeIndex]) {
selectOption(shown[activeIndex].value, shown[activeIndex].text);
} else if (shown.length === 1) {
selectOption(shown[0].value, shown[0].text);
}
}
break;
case 27: // Esc -- abandon the search, restore the real value
if (open) {
e.preventDefault();
closeList();
syncInputToSelect();
}
break;
case 9: // Tab -- commit the highlighted row on the way out
if (open && activeIndex >= 0 && shown[activeIndex]) {
selectOption(shown[activeIndex].value, shown[activeIndex].text);
}
closeList();
break;
}
});
textInput.on("blur", function () {
// Short delay so a touchstart/mousedown on a result fires first.
setTimeout(function () {
closeList();
// Half-typed text that never became a selection would otherwise sit
// in the box looking like a choice -- put the real value back.
syncInputToSelect();
}, 200);
});
// Re-caches the option list. Fired after ziman.json loads, after
// options are enabled/disabled, and after programmatic .val() changes.
select.on("wiktku:refresh", function () {
cacheOptions();
syncInputToSelect();
if (resultsList.is(":visible")) showResults(textInput.val());
});
wrapper.append(textInput).append(resultsList).append(select);
return wrapper;
}
/**
* Gives every plain <select> under `root` the searchable picker. Selects
* marked .wiktku-plain-select opt out, and the call is idempotent, so it is
* safe to re-run after new rows or sense blocks are inserted.
*/
function initSelects(root) {
$(root).find("select").addBack("select").not(".wiktku-plain-select").each(function () {
var sel = $(this);
if (sel.prop("multiple")) return;
if (sel.closest(".wiktku-native-select-wrap").length) return; // already wrapped
var marker = $("<span></span>").insertBefore(sel);
marker.replaceWith(wrapNativeSelect(sel));
});
}
var langsByCode = {};
// Populated from [[MediaWiki:Gadget-start.js/data.json]] at runtime.
var metadata = {};
var ZARAVA_LANG_CODES = ["ckb", "sdh", "lki", "hac", "zza"];
// Converts a {code: label} object (langChoices/posChoices in data.json)
// into the {code, label[, sortKey]} array the rest of the script uses.
// isLang: true adds a sortKey and shows "(code)" after the label —
// language choices only.
function choicesFromObject(obj, isLang) {
var result = [];
$.each(obj || {}, function (code, label) {
var choice = { code: code, label: label };
if (isLang) choice.sortKey = label;
result.push(choice);
});
return result;
}
function getZaravaKeys(choices) {
var byCode = {};
$.each(choices || [], function (_, c) { byCode[c.code] = c; });
var result = [];
$.each(ZARAVA_LANG_CODES, function (_, code) {
if (byCode[code]) result.push(byCode[code]);
});
return result;
}
function needsTransliteration(langCode) {
var meta = metadata[langCode];
if (!meta || !meta.sc) return false;
var scripts = Array.isArray(meta.sc) ? meta.sc : [meta.sc];
return scripts.length > 0 && scripts[0] !== "Latn";
}
// Kodên cinsiyetê yên di metadata.g de — ji data.json tê dagirtin
var GENDER_BASE_LABELS = {};
// Sub-lists that only make sense for a plain (non-şablon) sense — hidden
// when a şablon (e.g. {{guharto|…}}) is chosen for that sense
var HIDDEN_ON_TPL_GROUPS = [
"wiktku-dfn-alternativ",
"wiktku-dfn-hevmane",
"wiktku-dfn-dijmane",
"wiktku-dfn-koordine",
"wiktku-dfn-jornav",
"wiktku-dfn-jernav"
];
function genderLabel(code) {
if (code === "p") return "Pirjimar";
var pluralMatch = code.match(/^(.+)-p$/);
if (pluralMatch && GENDER_BASE_LABELS[pluralMatch[1]]) {
return GENDER_BASE_LABELS[pluralMatch[1]] + " (pirjimar)";
}
return GENDER_BASE_LABELS[code] || code;
}
// True if a sense has content beyond mane worth keeping (etîket, word
// lists, nimûne, jêder) — so it's still emitted with {{mane?}} if empty.
function senseHasExtraContent(s) {
if (s.etiket && $.grep(s.etiket, function (e) { return $.trim(e) !== ""; }).length) return true;
if (s.kategori && $.grep(s.kategori, function (k) { return $.trim(k) !== ""; }).length) return true;
if (s.alternativ.length || s.hevmane.length || s.dijmane.length ||
s.koordine.length || s.jornav.length || s.jernav.length) return true;
if (s.nimune && $.grep(s.nimune, function (n) {
return (typeof n === "object" ? n.text : n) !== "";
}).length > 0) return true;
if (senseHasJeder(s)) return true;
return false;
}
// Bolds the *first* occurrence of the page name (plus any letters
// glued directly onto it, e.g. a plural "s") inside nimûne/jêgirtin
// text — "apple"/"Apple"/"apples"/"Apples" all match (case-insensitive),
// but only the first hit is wrapped, not every one in the text.
function boldPageNameOnce(text) {
if (!text || !pageNameRe) return text;
var re = new RegExp("(" + pageNameRe + "([^( |,|;|\\?|\\.|\\!)]+)?)", "i");
return text.replace(re, "'''$1'''");
}
// Converts literal line breaks typed into a nimûne/jêgirtin box into
// wikitext <br> tags, so a pasted/typed newline doesn't break the
// surrounding "#:"/"#*" wikitext list syntax on output.
function nlToBr(text) {
return text ? text.replace(/\r\n|\r|\n/g, "<br>") : text;
}
function escapeHtmlForBackdrop(str) {
return String(str)
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">");
}
// Mirrors a textarea's text, with a small highlighted marker placed
// right after each line that's followed by an actual typed/pasted
// linebreak. Rendered into a transparent backdrop layer behind the
// textarea (see ensureLinebreakBackdrop()), so only the point of the
// break is marked instead of the whole box.
function buildLinebreakBackdropHtml(text) {
var lines = text.split(/\r\n|\r|\n/);
return $.map(lines, function (line, i) {
var isLast = i === lines.length - 1;
return escapeHtmlForBackdrop(line) +
(isLast ? "" : "<mark class='wiktku-linebreak-mark'>↵</mark>\n");
}).join("");
}
// Copies the metrics that affect where text wraps/lands (font, line
// height, padding, border) from the real textarea onto its backdrop,
// via computed style rather than shared CSS classes — most of the
// box's own rules are written as "textarea.foo", which a <div> with
// the same class wouldn't match. Re-run on every update in case a
// responsive breakpoint changed the textarea's own font-size.
function syncLinebreakBackdropMetrics(textarea, backdrop) {
var cs = window.getComputedStyle(textarea[0]);
backdrop.css({
"box-sizing": cs.boxSizing,
"padding-top": cs.paddingTop,
"padding-right": cs.paddingRight,
"padding-bottom": cs.paddingBottom,
"padding-left": cs.paddingLeft,
"border-width": cs.borderWidth,
"border-style": "solid",
"font-family": cs.fontFamily,
"font-size": cs.fontSize,
"font-weight": cs.fontWeight,
"line-height": cs.lineHeight,
"letter-spacing": cs.letterSpacing
});
}
// Lazily wraps a textarea in its own positioning anchor (independent
// of .wiktku-resize-wrap, so this doesn't depend on load order versus
// wiktkuMakeManualResizable) and inserts the transparent backdrop
// layer used to mark the exact point of a linebreak. Safe to call
// more than once on the same textarea — the backdrop is cached.
function ensureLinebreakBackdrop(textarea) {
var existing = textarea.data("wiktkuLinebreakBackdrop");
if (existing) return existing;
textarea.wrap("<div class='wiktku-linebreak-wrap'></div>");
var backdrop = $("<div aria-hidden='true'></div>").addClass("wiktku-linebreak-backdrop");
textarea.before(backdrop);
textarea.data("wiktkuLinebreakBackdrop", backdrop);
textarea.on("scroll.wiktkuLinebreak", function () {
backdrop.scrollTop(textarea.scrollTop()).scrollLeft(textarea.scrollLeft());
});
return backdrop;
}
// Flags a nimûne/jêgirtin textarea (via CSS class, for the border
// tint + tooltip) while it contains a typed/pasted linebreak, so the
// user notices before it's silently turned into <br> on output.
// Marks only the exact point of the break via a mirrored backdrop,
// rather than tinting the whole box.
function highlightLinebreak(el) {
var textarea = $(el);
var text = textarea.val();
var hasBreak = /\r|\n/.test(text);
textarea
.toggleClass("wiktku-has-linebreak", hasBreak)
.attr("title", hasBreak ? "Xeta nû dê wek <br> bê nivîsandin" : "");
if (!hasBreak) {
var cached = textarea.data("wiktkuLinebreakBackdrop");
if (cached) cached.hide();
textarea.removeClass("wiktku-has-linebreak-source");
return;
}
var backdrop = ensureLinebreakBackdrop(textarea);
textarea.addClass("wiktku-has-linebreak-source");
syncLinebreakBackdropMetrics(textarea, backdrop);
backdrop.html(buildLinebreakBackdropHtml(text)).show();
backdrop.scrollTop(textarea.scrollTop()).scrollLeft(textarea.scrollLeft());
}
// Each nimûne item can be { text, tr, t }: text, transliteration, translation.
function formatNimune(nimunes, lang, hasJeder) {
var hasNimune = nimunes && $.grep(nimunes, function (n) {
return (typeof n === "object" ? n.text : n) !== "";
}).length > 0;
if (!hasNimune) {
return hasJeder ? "" : "\n#* {{nimûne?|" + lang + "}}";
}
return $.map(nimunes, function (n) {
var text = typeof n === "object" ? n.text : n;
if (!text) return undefined;
var bolded = nlToBr(boldPageNameOnce(text));
var tpl = "\n#: {{nm|" + lang + "|" + bolded;
if (typeof n === "object") {
if (n.tr) tpl += "|tr=" + nlToBr(n.tr);
// Translation as third positional param (no key needed).
if (n.t) tpl += "|" + nlToBr(n.t);
}
// Short examples fit on one line together with their translation.
// rêz=1 is not used for ku — definitions are shown on separate lines there.
if (text.length < 60 && lang !== "ku") tpl += "|rêz=1";
tpl += "}}";
return tpl;
}).join("");
}
// Formats jêder (citation) entries into "#* {{jêder…|…}}" lines; skips
// entries with no quote text. Falls back to the generic {{jêder}}
// template when no specific template was chosen.
function formatJeder(jederList, lang) {
if (!jederList || !jederList.length) return "";
return $.map(jederList, function (jeder) {
if (!jeder || !jeder.quote) return undefined;
var quote = nlToBr(boldPageNameOnce(jeder.quote));
var quoteTr = nlToBr(jeder.quoteTr);
var quoteT = nlToBr(jeder.quoteT);
if (jeder.jederTpl) {
var cite = "\n#* {{" + jeder.jederTpl + "|" + lang;
cite += "|jêgirtin=" + quote;
if (quoteTr) cite += "|tr=" + quoteTr;
if (quoteT) cite += "|tercime=" + quoteT;
$.each(jeder.jêderFields || {}, function (key, val) {
if (val) cite += "|" + key + "=" + val;
});
cite += "}}";
return cite;
}
var out = "\n#* {{jêder|" + lang + "|jêgirtin=" + quote;
if (quoteTr) out += "|tr=" + quoteTr;
if (quoteT) out += "|tercime=" + quoteT;
// A şablon picked from Kategorî:Çavkanî is transcluded as the
// source param (e.g. |{{Kovara X}}); manual text is used as-is.
var srcParam = jeder.jederCatTpl ? ("{{" + jeder.jederCatTpl + "}}") :
(jeder.jederManual ? jeder.jederManual : "çavkanî?");
// A positional param containing "=" gets parsed as its own key=value
// pair by MediaWiki and breaks the template, so force it to be
// explicitly named (|2=) whenever that's the case.
out += (srcParam.indexOf("=") !== -1 ? "|2=" : "|") + srcParam;
out += "}}";
return out;
}).join("");
}
// True if a sense has at least one jêder entry with quote text.
function senseHasJeder(sense) {
return !!(sense.jeder && $.grep(sense.jeder, function (j) {
return j && j.quote;
}).length > 0);
}
// Builds "{{tplName|lang|part1|part2|…}}" from a sense field (kategori,
// etiket), wrapped inline (" {{…}} ") or on its own line ("\n#: {{…}}").
function buildSenseTpl(sense, field, lang, tplName) {
if (!sense[field] || !sense[field].length) return "";
var parts = sense[field].map(function (p) { return $.trim(p); })
.filter(function (p) { return p !== ""; });
if (!parts.length) return "";
var call = "{{" + tplName + "|" + lang + "|" + parts.join("|") + "}}";
return call
}
/**
* Assembles the nimûne + jêder wikitext block for a sense. Shared by
* both the template-sense and normal-mane-sense branches below.
*/
function buildCite(sense, lang) {
return formatNimune(sense.nimune, lang, senseHasJeder(sense)) +
formatJeder(sense.jeder, lang);
}
function makeWordListStep(id, name, question_fmt) {
return {
id: id,
name: name,
question_fmt: question_fmt,
multiple: true,
narrow: true,
placeholder: "Kelîme…",
visible: function (values) {
return values.lang && values.pos;
},
output: function (values) {
var words = $.grep(values[id] || [], function (w) { return !!w; });
var header = capitalize(name);
if (!words.length) return "";
var lang = values.lang;
var section = "\n==== " + header + " ====\n";
var params = "cure=" + header + "\n" +
$.map(words, function (w) {
return "|" + w;
}).join("\n");
return section +
"{{kol3|" + lang + "|" + params + "\n}}\n";
} };
}
var steps = {
lang: {
id: "lang",
required: true,
name: "ziman",
question_fmt: '"' + pageName + '" bi çi zimanî ye?',
question_br: true,
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (langChoices).
choices: [],
output: function (values) {
if (addLangMode){
return "\n== {{ziman|" + values.lang + "}} ==\n";
}else {
return "== {{ziman|" + values.lang + "}} ==\n";
}
} },
pron: {
id: "pron",
name: "bilêvkirin",
question_fmt: '"' + pageName + '" çawa tê telafûzkirin?',
// pronTpls populated from data.json
pronTpls: {},
visible: function (values) {
if (!values.lang) return false;
// addLangMode: skip pron only if this lang already has a section.
if (addLangMode) {
// Clearing the page makes existing content irrelevant.
var clearPageCheck = $("#wiktku-clear-page-check");
if (clearPageCheck.length && clearPageCheck.prop("checked")) {
return true;
}
var existing = $("#wpTextbox1").val() || "";
return !findLangHeader(existing, values.lang);
}
return true;
},
// Fills the insert-dropdown from pronTpls, filtered by language.
refreshTplSelect: function () {
var sel = $("#wiktku-start-pron .wiktku-tpl-insert-select");
if (!sel.length) return;
var lang = getValues().lang || "";
sel.find("option[value!='']").remove();
$.each(steps.pron.pronTpls, function (name, tpl) {
// Filter: if tpl.langs exists, only show if lang is in that list; otherwise show always
var allowed = !tpl.langs || tpl.langs.indexOf(lang) !== -1;
if (allowed) {
sel.append($("<option></option>")
.val(tpl.snippet)
.text(name + " — " + tpl.desc)
.attr("data-nolang", tpl.noLang ? "1" : ""));
}
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-pron-wrap").length) return null;
var wrap = $("<div class='wiktku-pron-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-pron-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-pron-text")
.attr("rows", 4)
.attr("placeholder", "Nimûne: {{IPA|ku|/pɛɪ̯n/}} yan {{kîte|ku|he|ce|ki|rin}}");
// Template insert dropdown — filtered by language.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike ");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
var lang = getValues().lang || "";
$.each(steps.pron.pronTpls, function (name, tpl) {
// Filter: if tpl.langs exists, only show if lang is in that list; otherwise show always
var allowed = !tpl.langs || tpl.langs.indexOf(lang) !== -1;
if (allowed) {
sel.append($("<option></option>")
.val(tpl.snippet)
.text(name + " — " + tpl.desc)
.attr("data-nolang", tpl.noLang ? "1" : ""));
}
});
sel.on("change", function () {
var snippet = $(this).val();
if (!snippet) return;
var lang = getValues().lang || "";
// Check if the selected option has noLang flag
var selectedOption = sel.find("option:selected");
var hasNoLang = selectedOption.attr("data-nolang") === "1";
if (!hasNoLang) {
snippet = snippet.replace(/CODE/g, lang).replace(/SOURCELANG/g, "?");
}
insertAtCursor(ta[0], snippet);
$(this).val("");
// Clear the picker's search box
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel).append(ta);
stepDiv.append(wrap);
initSelects(wrap);
return ta;
},
output: function () {
var text = $.trim($("#wiktku-start-pron .wiktku-pron-text").val());
if (!text) return "";
var lines = text.split("\n");
var out = $.map(lines, function (line) {
line = $.trim(line);
if (!line) return undefined;
return line;
}).join("\n");
return "\n=== Bilêvkirin ===\n" + out + "\n";
} },
pos: {
id: "pos",
required: true,
name: "Cureyê rêzimanî",
question_fmt: 'Cureyê rêzimanî yê "' + pageName + '" çi ye?',
visible: function (values) {
return values.lang;
},
question_br: true,
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (posChoices).
choices: [],
output: function (values) {
var pos = values.pos || "";
var cinsiyet = values.cinsiyet || ""; // from the cinsiyet step
var lekTur = values.lektur || ""; // from the lêker transitivity step
var capitalizedPos = capitalize(pos);
var outputString = "\n=== " + capitalizedPos + " ===\n";
// Add ku-tewîn-nav for single-word navdêr/serenav with known gender.
if (!pageName.includes(" ") && cinsiyet && GENDER_BASE_LABELS[cinsiyet] &&
(pos === "navdêr" || pos === "serenav") && values.lang === "ku") {
outputString += "{{ku-tewîn-nav|" + pageName + "|" + GENDER_BASE_LABELS[cinsiyet];
if (pos === "serenav") outputString += "|y";
outputString += "}}\n";
}
outputString += "{{" + pos + "|" + values.lang;
if (pos === "navdêr" || pos === "serenav") {
if (cinsiyet) {
outputString += "|c=" + cinsiyet;
} else if (values.lang === "ku") {
outputString += "|c=?";
}
} else if (/^lêker/.test(pos) && lekTur) {
outputString += "|c=" + lekTur;
}
if (values.tr) {
outputString += "|tr=" + values.tr;
}
outputString += "}}\n";
return outputString;
}
},
// cinsiyet (gender) — shown for navdêr/serenav only, with choices built
// from metadata[lang].g since not every language has grammatical gender.
cinsiyet: {
id: "cinsiyet",
name: "cinsiyet",
question_fmt: 'Cinsiyeta "' + pageName + '" çi ye?',
question_br: true,
visible: function (values) {
var meta = metadata[values.lang];
return !!(values.lang && (values.pos === "navdêr" || values.pos === "serenav") &&
meta && meta.g && meta.g.length);
},
build: function (stepDiv, values) {
var select = stepDiv.find("select.wiktku-start-step-field");
if (!select.length) {
select = $(mw.html.element("select", {
"class": "wiktku-start-step-field wiktku-plain-select",
id: "wiktku-start-cinsiyet-field" }));
stepDiv.append(select);
}
if (!values) return select;
var meta = metadata[values.lang];
var codes = (meta && meta.g) || [];
var prevVal = select.val();
var choices = $.map(codes, function (code) {
return [{ code: code, label: genderLabel(code) }];
});
populateMenus(select, choices, null, "Cinsiyetê hilbijêre");
if ($.grep(choices, function (c) { return c.code === prevVal; }).length) {
select.val(prevVal);
}
return select;
},
output: function () { return ""; } // consumed by pos.output
},
// Lêker transitivity
lektur: {
id: "lektur",
name: "Cureyê lêkerê (fiîlê)",
question_fmt: "Cureyê lêkerê (fiîlê) çi ye?",
question_br: true,
visible: function (values) {
return values.lang && values.pos && /^lêker/.test(values.pos);
},
choices: [
{ code: "gh", label: "gerguhêz" },
{ code: "x-gh", label: "xwerû-gerguhêz" },
{ code: "p-gh", label: "pêkhatî-gerguhêz" },
{ code: "h-gh", label: "hevedudanî-gerguhêz" },
{ code: "b-gh", label: "biwêjî-gerguhêz" },
{ code: "ngh", label: "negerguhêz" },
{ code: "x-ngh", label: "xwerû-negerguhêz" },
{ code: "p-ngh", label: "pêkhatî-negerguhêz" },
{ code: "h-ngh", label: "hevedudanî-negerguhêz" },
{ code: "b-ngh", label: "biwêjî-negerguhêz" } ],
output: function () { return ""; } // consumed by pos.output
},
tr: {
id: "tr",
name: "transliterasyon",
question_fmt: "Transliterasyona vê kelîmeyê",
multiple: false,
narrow: true,
visible: function (values) {
return values.lang && values.pos && needsTransliteration(values.lang);
} },
dfn: {
id: "dfn",
name: "Mane",
question_fmt: function (values) {
var base = "Maneya kelîmeyê binivîse. Mane otomatîk tê lînkkirin!";
if (values.lang === "ku") {
return base + " Ji bo tercimeyan beşa 'Werger' bi kar bîne!";
}
return base;
},
multiple: true,
ordered: true,
rows: 3,
visible: function (values) {
return values.lang && values.pos;
},
example: function (values) {
// posExamples loaded from [[MediaWiki:Gadget-start.js/data.json]].
var examples = steps.dfn.posExamples || {};
var full = values.pos || "";
return examples[full] || "";
},
// Builds one sense block (<li>): mane textarea, nimûne list, and
// sub-lists for alternatîv/hevmane/dijmane/etc.
buildSenseBlock: function (stepDiv) {
var block = $("<li class='wiktku-dfn-sense'></li>");
// — Mane textarea (declared first so the template handler can reference it) —
var dfnArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-mane-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-start-step-field wiktku-dfn-mane")
.attr("rows", 6)
.attr("placeholder", "Mane…");
dfnArea.on("input", function () {
steps.dfn.onDfnInput(stepDiv, block, this);
});
// — Tercime + Îzah boxes (non-ku alternative to the plain mane box) —
// Non-ku entries get a direct translation plus a {{îzah|…}}-wrapped
// gloss instead of a Kurdish-style gloss. Rather than teach every
// consumer (getSenses/getOutput/linkify) a second data shape, these
// boxes just write their combined text into dfnArea and re-fire its
// "input" event, so dfnArea stays the single source of truth.
var tercimeArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-tercime-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-dfn-subfield wiktku-dfn-tercime")
.attr("rows", 2)
.attr("placeholder", "Tercimeyên rasterast ên kurmancî… Ji bo school-a îngilîzî li vir 'mekteb, medrese' binivîse");
var izahArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-izah-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-dfn-subfield wiktku-dfn-izah")
.attr("rows", 3)
.attr("placeholder", "Îzaha kurmancî… Ji bo school-a îngilîzî li vir 'cihê tehsîlgirtinê' binivîse");
var nonKuWrap = $("<div class='wiktku-dfn-nonku-wrap'></div>")
.append(tercimeArea).append(izahArea)
.hide();
function syncNonKuToMane() {
var t = $.trim(tercimeArea.val());
var iz = $.trim(izahArea.val());
// if tercime is blank, use îzah as definition
var combined = t ? (iz ? t + " {{îzah|" + iz + "}}" : t) : iz;
dfnArea.val(combined);
// Re-fires onDfnInput so the sense list still grows and
// refresh() still runs, exactly as if this were typed
// directly into the mane textarea.
dfnArea.trigger("input");
}
tercimeArea.on("input", syncNonKuToMane);
izahArea.on("input", syncNonKuToMane);
// Switches between the plain mane box and the tercime+îzah pair —
// only for non-ku entries with no tplSelect selected.
function updateManeMode() {
var lang = getValues().lang || "";
var isTpl = !!tplSelect.val();
if (lang && lang !== "ku" && !isTpl) {
dfnArea.hide();
nonKuWrap.show();
} else {
nonKuWrap.hide();
if (!isTpl) dfnArea.show();
}
}
// Store on the block so refresh() can re-sync every block when
// lang changes, and restoreDfn() can re-sync after restoring.
block.data("updateManeMode", updateManeMode);
// — Template selector (optional — replaces mane when chosen) —
// Template definitions loaded from [[MediaWiki:Gadget-start.js/data.json]].
var tplDefs = steps.dfn.tplDefs || {};
// Cache of all non-placeholder option elements, so updateTplOptions
// can detach/re-attach them without losing the full list.
var _allTplOptions = [];
var tplSelect = $(mw.html.element("select", { "class": "wiktku-dfn-tpl-select" }));
tplSelect.attr("data-placeholder", "Li şablonekê bigere");
tplSelect.append($("<option value=''>— yan jî şablonek hilbijêre —</option>"));
$.each(tplDefs, function (name, tpl) {
var opt = $("<option></option>")
.val(name)
.text(name)
.attr("data-langs", tpl.langs ? tpl.langs.join(",") : "")
.attr("data-nolang", tpl.noLang ? "1" : "");
tplSelect.append(opt);
_allTplOptions.push(opt[0]);
});
function updateTplOptions() {
var lang = getValues().lang || "";
var currentVal = tplSelect.val();
var currentStillValid = false;
// Detach all non-placeholder options, then re-attach only the visible
// ones — native <select> won't reliably hide options any other way.
tplSelect.find("option[value!='']").detach();
$.each(_allTplOptions, function (_, opt) {
var allowed = $(opt).attr("data-langs");
var visible = !allowed || allowed.split(",").indexOf(lang) !== -1;
if (visible) {
tplSelect.append(opt);
if ($(opt).val() === currentVal) currentStillValid = true;
}
});
tplSelect.trigger("wiktku:refresh");
if (currentVal && !currentStillValid) {
tplSelect.val("");
tplTitleInput.hide().val("");
updateManeMode();
}
}
// Store updater on the element so refresh() can call it for all blocks.
tplSelect.data("updateOptions", updateTplOptions);
var tplTitleInput = $("<input type='text'>")
.addClass("wiktku-dfn-tpl-title wiktku-start-narrow")
.attr("placeholder", "Navê rûpela hedefê…")
.hide();
// Grow the sense list when the title field of the last block gets content,
// mirroring what onDfnInput does for the plain mane textarea.
tplTitleInput.on("input", function () {
steps.dfn.onDfnInput(stepDiv, block, this);
});
// Şablon senses have no plain gloss, so hide alternatîv/hevmane/
// dijmane/etc. Etîket, Nimûne and Jêgirtin stay visible either way.
function updateFieldVisibility() {
var isTpl = !!tplSelect.val();
$.each(HIDDEN_ON_TPL_GROUPS, function (_, cls) {
block.find("." + cls + "-group").toggle(!isTpl);
});
}
// Store on the block so restoreDfn() can re-sync visibility
// after setting tplSelect's value.
block.data("updateFieldVisibility", updateFieldVisibility);
tplSelect.on("change", function () {
var chosen = $(this).val();
if (chosen) {
dfnArea.hide();
nonKuWrap.hide();
tplTitleInput.show().focus();
} else {
tplTitleInput.hide().val("");
updateManeMode();
}
updateFieldVisibility();
// Re-run refresh so the Werger step visibility updates.
refresh();
});
var tplRow = $("<div></div>").addClass("wiktku-dfn-tpl-row")
.append(tplSelect).append(" ").append(tplTitleInput);
block.append(tplRow);
block.append(dfnArea);
block.append(nonKuWrap);
// Apply lang filter on initial build.
updateTplOptions();
updateManeMode();
// — Sub-field groups are always visible with a placeholder textarea.
var allGroups = [
{ cls: "wiktku-dfn-etiket", label: "Etîket", rows: 1, narrow: true, izah: "xisûsen, Mêrdîn, anatomî, Badînî" },
{ cls: "wiktku-dfn-kategori", label: "Kategorî", rows: 1, narrow: true, izah: "wekî etîket lê xuya nabe tenê kategorîze dike" },
{ cls: "wiktku-dfn-alternativ", label: "Formên alternatîv", rows: 1, narrow: true, izah: "Varyantên vê kelîmeyê" },
{ cls: "wiktku-dfn-hevmane", label: "Hevmane", rows: 1, narrow: true, izah: "Spehî hevmaneya Bedew e." },
{ cls: "wiktku-dfn-dijmane", label: "Dijmane", rows: 1, narrow: true, izah: "Zengîn dijmaneya feqîr e." },
{ cls: "wiktku-dfn-koordine", label: "Termên koordîne", rows: 1, narrow: true, izah: "Pisîk û kûçik termên koordîne ne çunkî Jornavên wan gelek in" },
{ cls: "wiktku-dfn-jornav", label: "Jornav", rows: 1, narrow: true, izah: "Heywan jornavê guhandar e" },
{ cls: "wiktku-dfn-jernav", label: "Jêrnav", rows: 1, narrow: true, izah: "Guhandar jêrnavê heywan e" },
{ cls: "wiktku-dfn-nimune", label: "Nimûne", rows: 2, narrow: false }
];
$.each(allGroups, function (_, g) {
var groupDiv = $("<div></div>").addClass("wiktku-dfn-subgroup " + g.cls + "-group");
function buildNimuneLi() {
var lang = getValues().lang || "";
var li = $("<li></li>").addClass("wiktku-dfn-nimune-li");
var mainTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-text-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", g.rows)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-text")
.attr("placeholder", "Nimûneya emilandina kelîmeyê tu bi xwe binivîse…");
mainTa.on("input", function () {
highlightLinebreak(this);
var val = $.trim($(this).val());
var isLast = li.is(list.children("li:last-child"));
if (val && isLast) {
list.append(buildNimuneLi());
}
});
li.append(mainTa);
var subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
if (needsTransliteration(lang)) {
subWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-tr")
.attr("placeholder", "Transliterasyona bi alfabeya latînî")
);
}
if (lang && lang !== "ku") {
subWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-t")
.attr("placeholder", "Tercimeya nimûneyê bi kurmancî")
);
}
if (subWrap.children().length) li.append(subWrap);
return li;
}
if (g.cls === "wiktku-dfn-nimune") {
// Nimûne — compound widget with tr/t sub-fields.
var lbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text(g.label))
.append(": ");
var list = $("<ol></ol>").addClass("wiktku-dfn-sublist " + g.cls + "-list");
groupDiv.data("buildNimuneLi", buildNimuneLi);
list.append(buildNimuneLi());
groupDiv.append(lbl).append(list);
block.append(groupDiv);
} else {
// Regular always-visible group — label + growing textarea list.
var lbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text(g.label))
.append(": ")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-hint").text(g.izah));
var list = $("<ol></ol>").addClass("wiktku-dfn-sublist " + g.cls + "-list");
var firstInput = $("<textarea></textarea>")
.attr("name", g.cls + "-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", g.rows)
.attr("class", "wiktku-dfn-subfield" + (g.narrow ? " wiktku-start-narrow" : ""))
.attr("placeholder", g.label + "…");
firstInput.on("input", function () {
steps.dfn.onSubInput(list, this, g.rows, g.narrow);
});
list.append($("<li></li>").append(firstInput));
groupDiv.append(lbl).append(list);
block.append(groupDiv);
}
});
// — Jêder group — growing list, same structure as Nimûne. —
(function () {
var jederGroupDiv = $("<div></div>").addClass("wiktku-dfn-subgroup wiktku-dfn-jeder-group");
var jederLbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text("Jêgirtin"))
.append(": ");
var jederList = $("<ol></ol>").addClass("wiktku-dfn-sublist wiktku-dfn-jeder-list");
function buildJederLi() {
var lang = getValues().lang || "";
var li = $("<li></li>").addClass("wiktku-dfn-jeder-li");
// Quote text textarea
var quoteTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote")
.attr("placeholder", "Nimûneya emilandinê ji kitêb an çavkaniyeke din binivîse");
quoteTa.on("input", function () {
highlightLinebreak(this);
var val = $.trim($(this).val());
var isLast = li.is(jederList.children("li:last-child"));
if (val && isLast) {
jederList.append(buildJederLi());
}
});
li.append(quoteTa);
// tr/t sub-fields for the quote — shown as needed for the language.
var quoteSubWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
if (needsTransliteration(lang)) {
quoteSubWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-tr")
.attr("placeholder", "Transliterasyona jêgirtinê…")
);
}
if (lang && lang !== "ku") {
quoteSubWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-t")
.attr("placeholder", "Tercimeya jêgirtinê bi kurmancî")
);
}
if (quoteSubWrap.children().length) li.append(quoteSubWrap);
// Citoid auto-fill: fetch citation data from a URL, DOI or ISBN and
// prefill the source şablon + fields below (see Gadget-citoid-helper.js).
var citoidWrap = $("<div></div>").addClass("wiktku-dfn-quote-citoid");
var citoidInput = $("<textarea></textarea>")
.addClass("wiktku-dfn-subfield wiktku-dfn-quote-citoid-input")
.attr("rows", 1)
.attr("placeholder", "URL, DOI an ISBN binivîse ku otomatîk were tijekirin…");
var citoidBtn = new OO.ui.ButtonWidget({
label: "Bi Citoidê bîne",
classes: [ "wiktku-dfn-quote-citoid-btn" ]
});
var citoidStatus = $("<span></span>").addClass("wiktku-dfn-quote-citoid-status");
// Fetches citation data from Citoid and fills this citation's
// şablon + fields — only rebuilds fields on template change,
// and never overwrites values the user already typed.
function runCitoidFetch() {
var query = $.trim(citoidInput.val());
if (!query) {
mw.notify("Ji kerema xwe re pêşî URL, DOI an ISBNyekê binivîse.");
return;
}
citoidBtn.setDisabled(true);
citoidStatus.text("Tê anîn…");
wikt.citoidHelper.ensure().then(function () {
return wikt.citoid.fetchJederFields(query);
}).then(function (result) {
var jederKey = result.jederKey;
var hasTpl = !!jederKey && srcSel.find("option[value='" + jederKey + "']").length > 0;
var targetVal = hasTpl ? jederKey : "__manual__";
// Only rebuild if switching şablon, so a repeat fetch
// doesn't clear fields already filled in by hand.
if (srcSel.val() !== targetVal) {
srcSel.val(targetVal).trigger("change");
}
if (hasTpl) {
// Tenê qadên vala tijî bike.
$.each(result.fields, function (key, val) {
var input = srcFields.find("[data-field-key='" + key + "']");
if (input.length && !$.trim(input.val())) {
input.val(val);
}
});
} else {
// Şablonek nehat naskirin ji bo vê itemType — rêzikeke
// çavkaniyê ya bi destan a ji qadên Citoid tê çêkirin,
// lê tenê ger qada destan vala be.
var manualField = srcFields.find(".wiktku-dfn-quote-src-manual");
if (!$.trim(manualField.val())) {
var parts = [];
$.each(["nivîskar", "sernav", "websîte", "kovar", "weşanxane", "sal", "url"], function (_, k) {
if (result.fields[k]) parts.push(result.fields[k]);
});
manualField.val(parts.join(", "));
}
}
citoidStatus.text("");
}, function (errorMsg) {
citoidStatus.text(typeof errorMsg === "string" ? errorMsg : "Nehat dîtin. Kontrol bike ka URL/DOI/ISBN rast e.");
}).always(function () {
citoidBtn.setDisabled(false);
});
}
citoidBtn.on("click", runCitoidFetch);
citoidInput.on("keydown", function (e) {
if (e.which === 13) { // Enter
e.preventDefault();
runCitoidFetch();
}
});
citoidWrap.append(citoidInput).append(citoidBtn.$element).append(citoidStatus);
// Source template selector, specific to this citation.
var srcSel = $("<select></select>").addClass("wiktku-dfn-quote-src-sel wiktku-plain-select");
srcSel.append($("<option value=''>— Çavkaniyê hilbijêre —</option>"));
srcSel.append($("<option></option>").val("__manual__").text("Bi destê xwe binivîsim"));
srcSel.append($("<option></option>").val("__category__").text("Ji Kategorî:Çavkanî şablonekê hilbijêre"));
var jederDefs = steps.dfn.jederDefs || {};
$.each(jederDefs, function (tplName, def) {
srcSel.append($("<option></option>").val(tplName).text(def.label));
});
// Dynamic source fields container.
var srcFields = $("<div></div>").addClass("wiktku-dfn-quote-src-fields");
srcSel.on("change", function () {
srcFields.empty();
var chosen = $(this).val();
if (!chosen) return;
if (chosen === "__manual__") {
// Freeform source, written by the user — becomes the 2nd
// positional param of {{jêder|lang|…}} instead of çavkanî?.
srcFields.append(
$("<textarea></textarea>")
.attr("rows", 4)
.addClass("wiktku-dfn-subfield wiktku-dfn-quote-src-manual")
.attr("placeholder", "Çavkaniyê bi destê xwe binivîse…")
);
return;
}
if (chosen === "__category__") {
// Search widget over the members of [[Kategorî:Çavkanî]].
// Picking a şablon here immediately switches the row to
// "Bi destê xwe binivîsim" mode with {{Şablon}} pre-filled,
var catWrap = $("<span></span>").addClass("wiktku-native-select-wrap wiktku-dfn-quote-src-cat");
var catInput = $("<input type='search' autocomplete='off'>")
.addClass("wiktku-start-narrow wiktku-dfn-quote-src-cat-input")
.attr("placeholder", "Li navê şablonê bigere…");
var catResults = $("<ul></ul>").addClass("wiktku-ac-results wiktku-dfn-quote-src-cat-results").hide();
var catStatus = $("<span></span>").addClass("wiktku-dfn-quote-src-cat-status").text("Şablon tên barkirin…");
var showCatResults = function (query) {
var q = $.trim(query).toLowerCase();
catResults.empty();
var list = catSrcTemplates || [];
var matched = q ?
$.grep(list, function (name) { return name.toLowerCase().indexOf(q) !== -1; }) :
list;
if (!matched.length) {
catResults.hide();
return;
}
$.each(matched.slice(0, 50), function (_, name) {
var li = $("<li></li>").text(name).attr("data-value", name);
var touchMoved = false;
li.on("touchstart", function () { touchMoved = false; });
li.on("touchmove", function () { touchMoved = true; });
li.on("touchend", function (e) {
if (touchMoved) return;
e.preventDefault();
selectCatTpl(name);
});
li.on("mousedown", function (e) {
e.preventDefault();
selectCatTpl(name);
});
catResults.append(li);
});
catResults.show();
};
// Wraps the chosen şablon as {{Name}}, drops it into the
// manual textarea, and switches the row into manual mode
// so the user can keep editing it (add params, etc.).
var selectCatTpl = function (name) {
catResults.hide();
srcSel.val("__manual__");
srcSel.trigger("change");
srcFields.find(".wiktku-dfn-quote-src-manual")
.val("{{" + name + "}}")
.trigger("focus");
};
catInput.on("input", function () {
showCatResults($(this).val());
});
catInput.on("focus", function () {
showCatResults($(this).val());
});
catInput.on("blur", function () {
setTimeout(function () { catResults.hide(); }, 200);
});
catWrap.append(catInput).append(catResults).append(catStatus);
srcFields.append(catWrap);
fetchCatSrcTemplates().then(function () {
catStatus.text("");
}, function () {
catStatus.text("Şablon nehatin barkirin.");
});
return;
}
var def = (steps.dfn.jederDefs || {})[chosen];
if (!def) return;
$.each(def.fields, function (key, label) {
var row = $("<div></div>").addClass("wiktku-dfn-quote-src-row");
var fieldLbl = $("<label></label>").text(label + ": ");
var inp = $("<textarea></textarea>")
.attr("rows", 2)
.addClass("wiktku-dfn-quote-src-input wiktku-start-narrow")
.attr("data-field-key", key)
.attr("placeholder", label + "…");
// "Sernav" / "Sernavê orjînal" (title fields, e.g. for
// kitêb/kovar/malper) get a taller, draggable box; every
// other field in the template stays as-is. Field labels
// come from the on-wiki jederDefs data, so match on the
// (diacritic-folded) label text rather than a fixed key.
var foldedLabel = foldDiacritics(label);
if (/^sernav$/.test(foldedLabel) || /orjin/.test(foldedLabel)) {
inp.addClass("wiktku-dfn-quote-src-input--title");
}
row.append(fieldLbl).append(inp);
srcFields.append(row);
});
});
li.append(citoidWrap).append(srcSel).append(srcFields);
return li;
}
jederGroupDiv.data("buildJederLi", buildJederLi);
jederList.append(buildJederLi());
jederGroupDiv.append(jederLbl).append(jederList);
block.append(jederGroupDiv);
}());
// Apply the initial hide/show state for the sub-groups (matches
// tplSelect's starting value, which is normally empty).
updateFieldVisibility();
return block;
},
/** Grows the sense list when the last mane textarea gets content. */
onDfnInput: function (stepDiv, block, textarea) {
var val = $.trim($(textarea).val());
var list = stepDiv.find("ol.wiktku-dfn-list");
var isLast = block.is(list.children("li:last-child"));
if (val && isLast) {
var newBlock = steps.dfn.buildSenseBlock(stepDiv);
list.append(newBlock);
// Give the new block's template selector the searchable picker.
initSelects(newBlock);
}
refresh();
},
/** Grows a sub-list (nimûne/formên alternatîv/hevmane/dijmane/termên koordîne) on input. */
onSubInput: function (list, input, rows, narrow) {
var val = $.trim($(input).val());
var item = $(input).parent();
var isLast = item.is(list.children("li:last-child"));
if (val && isLast) {
var next = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-sub-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", rows)
.attr("class", "wiktku-dfn-subfield" + (narrow ? " wiktku-start-narrow" : ""));
next.on("input", function () {
steps.dfn.onSubInput(list, this, rows, narrow);
});
list.append($("<li></li>").append(next));
}
},
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (tplDefs, posExamples, jederDefs).
tplDefs: {},
posExamples: {},
jederDefs: {},
build: function (stepDiv) {
if (stepDiv.find("ol.wiktku-dfn-list").length) return null;
var list = $("<ol class='wiktku-dfn-list'></ol>");
list.append(steps.dfn.buildSenseBlock(stepDiv));
stepDiv.append(list);
return null;
},
/** Reads all sense blocks from the DOM and returns an array of sense objects. */
getSenses: function (stepDiv) {
var senses = [];
stepDiv.find("li.wiktku-dfn-sense").each(function () {
var block = $(this);
var tplSel = block.find("select.wiktku-dfn-tpl-select");
var tpl = tplSel.val() || "";
// noLang: template already encodes the language — don't add |lang| param.
var tplNoLang = tpl
? tplSel.find("option[value='" + tpl + "']").attr("data-nolang") === "1"
: false;
var tplTitle = $.trim(block.find("input.wiktku-dfn-tpl-title").val());
var mane = $.trim(block.find("textarea.wiktku-dfn-mane").val());
function readList(cls) {
var vals = [];
block.find("." + cls + "-list textarea").each(function () {
var v = $.trim($(this).val());
if (v) vals.push(v);
});
return vals;
}
// Nimûne items are compound: { text, tr?, t? }
function readNimuneList() {
var items = [];
block.find(".wiktku-dfn-nimune-list li.wiktku-dfn-nimune-li").each(function () {
var text = $.trim($(this).find(".wiktku-dfn-nimune-text").val());
if (!text) return;
var obj = { text: text };
var tr = $.trim($(this).find(".wiktku-dfn-nimune-tr").val());
var t = $.trim($(this).find(".wiktku-dfn-nimune-t").val());
if (tr) obj.tr = tr;
if (t) obj.t = t;
items.push(obj);
});
return items;
}
// Jêder is a growing list of citations, one per li — mirrors readNimuneList().
function readJederList() {
var items = [];
block.find(".wiktku-dfn-jeder-list li.wiktku-dfn-jeder-li").each(function () {
var li = $(this);
var quote = $.trim(li.find(".wiktku-dfn-nimune-quote").val());
if (!quote) return;
var obj = { quote: quote };
var qtr = $.trim(li.find(".wiktku-dfn-nimune-quote-tr").val());
var qt = $.trim(li.find(".wiktku-dfn-nimune-quote-t").val());
if (qtr) obj.quoteTr = qtr;
if (qt) obj.quoteT = qt;
var tplName = li.find(".wiktku-dfn-quote-src-sel").val();
if (tplName === "__manual__") {
var manual = $.trim(li.find(".wiktku-dfn-quote-src-manual").val());
if (manual) obj.jederManual = manual;
} else if (tplName === "__category__") {
// Reachable only if the user opened the category search but
// never picked a şablon — picking one switches the row to
// __manual__ (see selectCatTpl above), so there's nothing
// meaningful to save here.
} else if (tplName) {
obj.jederTpl = tplName;
var fields = {};
li.find(".wiktku-dfn-quote-src-input").each(function () {
var k = $(this).attr("data-field-key");
var v = $.trim($(this).val());
if (k && v) fields[k] = v;
});
obj.jêderFields = fields;
}
items.push(obj);
});
return items;
}
senses.push({
tpl: tpl,
tplNoLang: tplNoLang,
tplTitle: tplTitle,
mane: mane,
etiket: readList("wiktku-dfn-etiket"),
kategori: readList("wiktku-dfn-kategori"),
nimune: readNimuneList(),
jeder: readJederList(),
alternativ: readList("wiktku-dfn-alternativ"),
hevmane: readList("wiktku-dfn-hevmane"),
dijmane: readList("wiktku-dfn-dijmane"),
koordine: readList("wiktku-dfn-koordine"),
jornav: readList("wiktku-dfn-jornav"),
jernav: readList("wiktku-dfn-jernav")
});
});
return senses;
},
getOutput: function (values, callback) {
var stepDiv = $("#wiktku-start-dfn");
var senses = steps.dfn.getSenses(stepDiv);
var lang = values.lang;
// A sense counts as "filled" if it has a mane, a chosen template + title,
// or any other content (etîket/hevmane/nimûne/jêder…) worth keeping.
var hasMane = senses.some(function (s) {
return s.mane !== "" || (s.tpl && s.tplTitle) || senseHasExtraContent(s);
});
var defLines = []; // one entry per kept sense (goes to linkify)
var citeLines = []; // parallel — nimûne+jêder for that same sense
var izahLines = []; // parallel — raw îzah gloss for that same sense
// True only once some sense's *actual* dfn text (post tercime/îzah
// split) is non-empty.
var hasLinkableMane = false;
$.each(senses, function (_, sense) {
// — Template sense (e.g. {{guharto|ku|somepage}}) —
if (sense.tpl) {
if (!sense.tplTitle) return; // skip empty template senses
var tplKatTpl = buildSenseTpl(sense, "kategori", lang, "K");
var tplLabelTpl = buildSenseTpl(sense, "etiket", lang, "e");
var tplCall = sense.tplNoLang
? "{{" + sense.tpl + "|" + sense.tplTitle + "}}"
: "{{" + sense.tpl + "|" + lang + "|" + sense.tplTitle + "}}";
var idx = defLines.length;
var cite = buildCite(sense, lang);
defLines.push("# " + (tplKatTpl ? tplKatTpl + " " : "") + (tplLabelTpl ? tplLabelTpl + " " : "") + tplCall +
(cite ? "{{wiktku-cite-" + idx + "}}" : ""));
citeLines.push(cite);
izahLines.push(""); // template senses have no îzah
return;
}
// — Normal mane sense —
var dfn = sense.mane;
if (!dfn && !senseHasExtraContent(sense)) return; // truly empty
// Pull the îzah gloss (if any) out of the combined tercime+îzah
// string — it's spliced back in separately below, after its
// own linkify pass (see izahLines / the second linkifyText call).
var izahRaw = null;
var tercimeIzah = splitTercimeIzah(dfn);
if (tercimeIzah) {
dfn = tercimeIzah.tercime;
izahRaw = stripWikilinks(tercimeIzah.izah);
}
if (dfn) {
dfn = stripWikilinks(dfn);
// Sentence-case + trailing period are for ku definitions,
// which are written as full glosses.
if (lang === "ku") {
if (dfn[0] !== dfn[0].toUpperCase()) dfn = capitalize(dfn);
if (!dfn.match(/[.…?!)\]]$/)) dfn += ".";
}
} else if (izahRaw === null) {
dfn = lang === "ku" ? "{{mane?|" + lang + "}}" : "";
}
if (dfn) hasLinkableMane = true;
var katTpl = buildSenseTpl(sense, "kategori", lang, "K");
var labelTpl = buildSenseTpl(sense, "etiket", lang, "e");
var out = "# " + (katTpl ? katTpl + " " : "") + (labelTpl ? labelTpl + " " : "") + dfn;
var idx = defLines.length;
var hasThisIzah = izahRaw !== null && $.trim(izahRaw) !== "";
// Bare {{...}} token — like {{wiktku-cite-N}}, this survives
// linkify's first pass untouched (it treats template calls as
// opaque), then gets swapped for {{îzah|…}} once the actual
// gloss text has been linkified in its own separate pass.
if (hasThisIzah) {
out += (dfn ? " " : "") + "{{wiktku-izah-" + idx + "}}";
}
function wordLine(tpl, words) {
if (!words.length) return "";
return "\n#: {{" + tpl + "|" + lang + "|" + words.join("|") + "}}";
}
out += wordLine("alt-r", sense.alternativ);
out += wordLine("hevmane", sense.hevmane);
out += wordLine("dijmane", sense.dijmane);
out += wordLine("koordîne", sense.koordine);
out += wordLine("jornav", sense.jornav);
out += wordLine("jêrnav", sense.jernav);
var cite = buildCite(sense, lang);
defLines.push(out + (cite ? "{{wiktku-cite-" + idx + "}}" : ""));
citeLines.push(cite);
izahLines.push(hasThisIzah ? izahRaw : "");
});
// Splice citeLines back into a linkified string, replacing each
// {{wiktku-cite-N}} token with its stored nimûne/jêder block.
function restoreCites(t) {
return t.replace(/\{\{wiktku-cite-(\d+)\}\}/g, function (_, n) {
return citeLines[parseInt(n, 10)] || "";
});
}
// Runs text through the linkify gadget if it's loaded, otherwise
// just passes it through unchanged. Shared by both linkify passes
// below (main mane text, and — separately — îzah glosses).
function linkifyText(t, cb) {
if (typeof $.kuLinkify === "function") {
$.kuLinkify(t, cb);
} else {
cb(t);
}
}
var hasIzah = izahLines.some(function (t) { return t && $.trim(t) !== ""; });
var text = defLines.join("\n") + "\n";
if (!hasMane) {
// No definitions entered — emit {{mane?}} with nimûne?.
text = "# {{mane?|" + lang + "}}\n#* {{nimûne?|" + lang + "}}\n";
callback(text);
return;
}
// Runs the îzah-only linkify pass against `base` (either the raw
// text, when there's no linkable mane to run the main pass on
// first, or the already-linkified main text). Shared by both
// branches below so the token-splice logic only lives once.
function runIzahPass(base) {
var izahJoined = $.map(izahLines, function (raw, idx) {
if (!raw) return undefined;
return "{{wiktku-izah-open-" + idx + "}}" + raw + "{{wiktku-izah-close-" + idx + "}}";
}).join("\n");
linkifyText(izahJoined, function (izahLinked) {
var izahByIdx = {};
var re = /\{\{wiktku-izah-open-(\d+)\}\}([\s\S]*?)\{\{wiktku-izah-close-\1\}\}/g;
var m;
while ((m = re.exec(izahLinked)) !== null) {
izahByIdx[parseInt(m[1], 10)] = m[2];
}
var withIzah = base.replace(/\{\{wiktku-izah-(\d+)\}\}/g, function (_, n) {
var linked = izahByIdx[parseInt(n, 10)];
return linked !== undefined ? "{{îzah|" + linked + "}}" : "";
});
callback(restoreCites(withIzah));
});
}
if (!hasLinkableMane) {
if (!hasIzah) {
// All filled senses are template senses (or otherwise have
// no plain text at all) — nothing here needs linkify.
callback(restoreCites(text));
return;
}
// There's no plain mane text anywhere (e.g. tercime left blank
// with only îzah filled in), so every defLine is just a bare
// template call with nothing to word-link. Sending a line
// like "# {{wiktku-izah-0}}" through the main linkify pass
// gives it no plain words to work with, makes the linkify
// gadget hang — so skip that pass entirely and run only
// the îzah pass, splicing straight into the unlinkified text.
var loadIzahOnly = function () { runIzahPass(text); };
mw.loader.using("ext.gadget.linkify", loadIzahOnly, loadIzahOnly);
return;
}
var didTryToLoad = function () {
// First pass: the main definition text (mane), same as before.
linkifyText(text, function (mainLinked) {
if (!hasIzah) {
callback(restoreCites(mainLinked));
return;
}
// Second pass: îzah glosses, linkified via their own
// separate call. Each gloss is wrapped in its own
// {{wiktku-izah-open/close-N}} pair; like the existing
// {{wiktku-cite-N}} tokens, these sit inside double
// braces so linkify leaves the tokens themselves alone —
// only the raw gloss text between each pair gets linked.
runIzahPass(mainLinked);
});
};
mw.loader.using("ext.gadget.linkify", didTryToLoad, didTryToLoad);
}
},
je: makeWordListStep("je", "jê", "Kelîmeyên jê çêbûyî binivîse"),
tekildar: makeWordListStep("tekildar", "têkildar", "Kelîmeyên ji aliyê etîmolojiyê ve têkildarî vê kelîmeyê binivîse"),
binereherwiha: makeWordListStep("binereherwiha", "binêre herwiha", "Kelîmeyên din ên eleqedar binivîse"),
etym: {
id: "etym",
name: "etîmolojî",
question_fmt: "Etîmolojiya kelîmeyê binivîse",
// etymTpls populated from data.json
etymTpls: {},
visible: function (values) {
return values.lang && values.pos;
},
// Fills the insert-dropdown from the current etymTpls object.
refreshTplSelect: function () {
var sel = $("#wiktku-start-etym .wiktku-tpl-insert-select");
if (!sel.length) return;
sel.find("option[value!='']").remove();
$.each(steps.etym.etymTpls, function (name, tpl) {
sel.append($("<option></option>").val(tpl.snippet).text(name + " — " + tpl.desc));
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-etym-wrap").length) return null;
var wrap = $("<div class='wiktku-etym-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-etym-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-etym-text")
.attr("rows", 4)
.attr("placeholder", "Ji {{ji|en|ku|apple}}. yan rasterast binivîse…");
// Template insert dropdown — options also refreshed after data.json loads.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike…");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
$.each(steps.etym.etymTpls, function (name, tpl) {
sel.append($("<option></option>").val(tpl.snippet).text(name + " — " + tpl.desc));
});
sel.on("change", function () {
var snippet = $(this).val();
if (!snippet) return;
var lang = getValues().lang || "";
snippet = snippet.replace(/CODE/g, lang).replace(/SOURCELANG/g, "?");
insertAtCursor(ta[0], snippet);
$(this).val("");
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel);
wrap.append(ta);
stepDiv.append(wrap);
initSelects(wrap);
return ta;
},
output: function (values) {
var text = $.trim($("#wiktku-start-etym .wiktku-etym-text").val());
if (text) {
return "\n==== Etîmolojî ====\n" + text + "\n";
}
// No etymology entered — emit {{ji?|lang}} as a placeholder.
// Skip it only when every filled sense is a şablon sense
// a completely empty entry with no şablon chosen still gets the placeholder
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasFilledTplSense = dfnSenses.some(function (s) {
return !!s.tpl && !!s.tplTitle;
});
var hasRegularMane = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
if (hasFilledTplSense && !hasRegularMane) return "";
return "\n==== Etîmolojî ====\n{{ji?|" + values.lang + "}}\n";
} },
dunde: {
id: "dunde",
name: "dûnde",
question_fmt: "Eger ev kelîme ji vî zimanî ketibe zimanekî din, vî zimanî û kelîmeya wî binivîse",
visible: function (values) {
return !!values.pos;
},
disabledKeys: function (values) {
return {"navz": true, [values.lang]: true}
},
// Language dropdown + growing word-input list; a new row appends
// when the dropdown gets a value. Mirrors steps.trans, but flat.
buildRow: function (stepDiv) {
var row = $("<li class='wiktku-dunde-row wiktku-lang-row'></li>");
// Language selector — the searchable picker is applied after insertion into DOM.
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zimanekî bigere");
populateMenus(langSel, steps.dunde.keys || [], steps.dunde.disabledKeys);
// When a language is chosen, ensure a next empty row exists.
langSel.on("change", function () {
steps.dunde.onLangChange(stepDiv, row);
});
// Word list for this language.
var wordList = $("<ul class='wiktku-dunde-words wiktku-lang-row-words'></ul>");
var firstWord = steps.dunde.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
// The searchable picker is attached by initSelects() once the row
// is in the DOM (see onLangChange/build below).
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-dunde-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Kelîme…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-dunde-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.dunde.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (stepDiv, row) {
var list = stepDiv.find("ul.wiktku-dunde-list");
var isLast = row.is(list.children("li.wiktku-dunde-row:last-child"));
if (isLast) {
var newRow = steps.dunde.buildRow(stepDiv);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
// Keep disabled keys in sync across all lang selectors.
steps.dunde.syncDisabledKeys(stepDiv);
},
/** Disables already-selected languages in all other dropdowns. */
syncDisabledKeys: function (stepDiv) {
var taken = $.extend({}, steps.dunde.disabledKeys);
stepDiv.find("li.wiktku-dunde-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
stepDiv.find("li.wiktku-dunde-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
build: function (stepDiv) {
if (stepDiv.find("ul.wiktku-dunde-list").length) return null;
var list = $("<ul class='wiktku-dunde-list wiktku-lang-row-list'></ul>");
list.append(steps.dunde.buildRow(stepDiv));
stepDiv.append(list);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return null;
},
/** Reads all [langcode, words[]] rows from the DOM. */
getRows: function (stepDiv) {
var result = [];
stepDiv.find("li.wiktku-dunde-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-dunde-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
output: function () {
var stepDiv = $("#wiktku-start-dunde");
var rows = steps.dunde.getRows(stepDiv);
if (!rows.length) return "";
var lines = $.map(rows, function (row) {
var lang = row[0], words = row[1];
return "* {{dû|" + lang + "|" + words.join("|") + "}}";
});
return "\n==== Dûnde ====\n" + lines.join("\n") + "\n";
}
},
zarava: {
id: "zarava",
name: "bi zaravayên din",
question_fmt: "'"+ pageName + "' di zaravayên din de çawa tê gotin?",
visible: function (values) {
return steps.trans.visible(values);
},
disabledKeys: {},
buildRow: function (group) {
var row = $("<li class='wiktku-zarava-row wiktku-lang-row'></li>");
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zaravayekî bigere");
populateMenus(langSel, steps.zarava.keys || [], steps.zarava.disabledKeys);
langSel.on("change", function () {
steps.zarava.onLangChange(group, row);
});
var wordList = $("<ul class='wiktku-zarava-words wiktku-lang-row-words'></ul>");
var firstWord = steps.zarava.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-zarava-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Tercime…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-zarava-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.zarava.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (group, row) {
var list = group.find("ul.wiktku-zarava-list");
var isLast = row.is(list.children("li.wiktku-zarava-row:last-child"));
if (isLast) {
var newRow = steps.zarava.buildRow(group);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
steps.zarava.syncDisabledKeys(group);
},
/** Disables already-selected dialects in all other dropdowns within one group. */
syncDisabledKeys: function (group) {
var taken = $.extend({}, steps.zarava.disabledKeys);
group.find("li.wiktku-zarava-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
group.find("li.wiktku-zarava-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
/** Builds (or fetches) the .wiktku-zarava-group for one gloss. */
buildGroup: function (stepDiv, gi) {
var group = $("<div class='wiktku-zarava-group'></div>").attr("data-gloss-pos", gi);
var list = $("<ul class='wiktku-zarava-list wiktku-lang-row-list'></ul>");
list.append(steps.zarava.buildRow(group));
group.append(list);
stepDiv.append(group);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return group;
},
/** Syncs one .wiktku-zarava-group per current gloss (same logic as steps.trans.build). */
build: function (stepDiv) {
var glosses = steps.trans.glossList();
if (!glosses.length) {
stepDiv.find(".wiktku-zarava-group").remove();
return null;
}
var existingGroups = stepDiv.find(".wiktku-zarava-group");
if (existingGroups.length > glosses.length) {
existingGroups.slice(glosses.length).remove();
}
$.each(glosses, function (gi, gloss) {
var group = stepDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
if (!group.length) group = steps.zarava.buildGroup(stepDiv, gi);
var label = group.find(".wiktku-zarava-group-label");
if (glosses.length > 1) {
if (!label.length) {
label = $("<div class='wiktku-zarava-group-label'></div>");
group.prepend(label);
}
label.text(gloss.index + " " + gloss.text);
} else if (label.length) {
label.remove();
}
});
return null;
},
/** Reads the dialect rows for a single gloss group. */
getGroupTranslations: function (group) {
var result = [];
group.find("li.wiktku-zarava-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-zarava-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
/** Reads all rows from the DOM, grouped by gloss position. */
getTranslations: function (stepDiv) {
var result = [];
stepDiv.find(".wiktku-zarava-group").each(function () {
result.push(steps.zarava.getGroupTranslations($(this)));
});
return result;
},
output: function (values) {
if (values.lang !== "ku") return "";
var stepDiv = $("#wiktku-start-zarava");
var glosses = steps.trans.glossList();
if (!glosses.length) return "";
var blocks = $.map(glosses, function (gloss, gi) {
var group = stepDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
var rows = group.length ? steps.zarava.getGroupTranslations(group) : [];
if (!gloss.text && !rows.length) return undefined;
if (rows.length) {
rows.sort(function (a, b) {
var aLang = langsByCode[a[0]] || {};
var bLang = langsByCode[b[0]] || {};
return (aLang.sortKey || "").localeCompare(bLang.sortKey || "", "ku");
});
}
var wordLines = $.map(rows, function (row) {
var lang = row[0];
var words = row[1];
var wikiWords = words.map(function (w) {
return "{{W|" + lang + "|" + w + "}}";
}).join(", ");
return "* {{Z|" + lang + "}}: " + wikiWords;
}).join("\n");
if (!wordLines) return undefined;
var block = "{{werger-ser|" + (gloss.text || "?") + "|" + gloss.index + "}}";
block += "\n" + wordLines;
block += "\n{{werger-bin}}";
return block;
});
if (!blocks.length) return "";
return "\n==== Bi zaravayên din ====\n" + blocks.join("\n") + "\n";
}
},
trans: {
id: "trans",
name: "werger",
question_fmt: "Tercimeyên vê maneyê bi zimanên din binivîse",
visible: function (values) {
if (!(values.lang === "ku" && values.pos)) return false;
// Hide only when every sense is a filled template sense (no plain
// gloss to attach translations to). A mix, or nothing filled in
// yet, still shows Werger.
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasRealSense = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
var hasFilledTplSense = dfnSenses.some(function (s) {
return s.tpl && s.tplTitle;
});
return hasRealSense || !hasFilledTplSense;
},
disabledKeys: {
"navz": true,
"ku": true,
"ckb": true,
"sdh": true,
"lki": true,
"hac": true,
"zza": true },
// Language dropdown + growing word-input list, scoped to one gloss's
// group (each gloss has its own group and row list).
buildRow: function (group) {
var row = $("<li class='wiktku-trans-row wiktku-lang-row'></li>");
// Language selector — the searchable picker is applied after insertion into DOM.
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zimanekî bigere");
populateMenus(langSel, steps.trans.keys || [], steps.trans.disabledKeys);
// When a language is chosen, ensure a next empty row exists.
langSel.on("change", function () {
steps.trans.onLangChange(group, row);
});
// Word list for this language.
var wordList = $("<ul class='wiktku-trans-words wiktku-lang-row-words'></ul>");
var firstWord = steps.trans.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
// The searchable picker is attached by initSelects() once the row
// is in the DOM (see onLangChange/buildGroup below).
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-trans-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Tercime…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-trans-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.trans.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (group, row) {
var list = group.find("ul.wiktku-trans-list");
var isLast = row.is(list.children("li.wiktku-trans-row:last-child"));
if (isLast) {
var newRow = steps.trans.buildRow(group);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
// Keep disabled keys in sync across this gloss's lang selectors
// only — the same language can be used for different senses.
steps.trans.syncDisabledKeys(group);
},
/** Disables already-selected languages in all other dropdowns within one group. */
syncDisabledKeys: function (group) {
var taken = $.extend({}, steps.trans.disabledKeys);
group.find("li.wiktku-trans-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
group.find("li.wiktku-trans-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
// Builds (or fetches) the .wiktku-trans-group for one gloss.
buildGroup: function (stepDiv, gi) {
var group = $("<div class='wiktku-trans-group'></div>").attr("data-gloss-pos", gi);
var list = $("<ul class='wiktku-trans-list wiktku-lang-row-list'></ul>");
list.append(steps.trans.buildRow(group));
group.append(list);
stepDiv.append(group);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return group;
},
// Syncs one .wiktku-trans-group per current gloss, keyed by
// data-gloss-pos so groups stay matched across rebuilds.
build: function (stepDiv) {
var glosses = steps.trans.glossList();
if (!glosses.length) {
stepDiv.find(".wiktku-trans-group").remove();
return null;
}
// Drop groups for glosses that no longer exist (always from the
// tail — groups are only ever appended in gloss order below).
var existingGroups = stepDiv.find(".wiktku-trans-group");
if (existingGroups.length > glosses.length) {
existingGroups.slice(glosses.length).remove();
}
$.each(glosses, function (gi, gloss) {
var group = stepDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
if (!group.length) group = steps.trans.buildGroup(stepDiv, gi);
// Only label groups when there's more than one gloss to
// distinguish between — a single gloss needs no caption.
var label = group.find(".wiktku-trans-group-label");
if (glosses.length > 1) {
if (!label.length) {
label = $("<div class='wiktku-trans-group-label'></div>");
group.prepend(label);
}
label.text(gloss.index + " " + gloss.text);
} else if (label.length) {
label.remove();
}
});
return null;
},
/** Reads the translation rows for a single gloss group. */
getGroupTranslations: function (group) {
var result = [];
group.find("li.wiktku-trans-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-trans-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
// Reads all translation rows, grouped by gloss position.
getTranslations: function (stepDiv) {
var result = [];
stepDiv.find(".wiktku-trans-group").each(function () {
result.push(steps.trans.getGroupTranslations($(this)));
});
return result;
},
// Builds the numbered "{ index, gloss }" list, one per dfn sense
// with a real mane (skips template senses). index is 1-based and
// matches the sense's position in the "#" definition list.
// When nothing's filled in, returns one placeholder entry so
// Werger still has a group to attach to; when every sense is a
// filled template sense, stays empty (matches trans.visible()).
glossList: function () {
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var glosses = [];
var hasFilledTplSense = false;
$.each(dfnSenses, function (i, s) {
if (s.tpl) {
if (s.tplTitle) hasFilledTplSense = true;
return; // template sense — no gloss to caption with
}
var dfn = s.mane;
if (!dfn) {
// No mane, but other fields are filled — still gets a
// gloss group since dfn.getOutput() emits {{mane?}} for it.
if (senseHasExtraContent(s)) glosses.push({ index: i + 1, text: "" });
return;
}
if (dfn[0] !== dfn[0].toLowerCase()) dfn = decapitalize(dfn);
dfn = stripWikilinks(dfn).replace(/[.…?!)\]،؟]+$/, "");
glosses.push({ index: i + 1, text: dfn });
});
if (!glosses.length && !hasFilledTplSense) {
glosses.push({ index: 1, text: "" });
}
return glosses;
},
output: function (values) {
if (values.lang !== "ku") return "";
var stepDiv = $("#wiktku-start-trans");
var glosses = steps.trans.glossList();
// Every sense is a template sense — there's no real gloss
// anywhere and no group in the DOM either (glossList() only
// returns empty in that case), so skip the section entirely.
if (!glosses.length) return "";
// A completely empty entry (nothing filled in dfn at all, no
// şablon chosen either) still gets a placeholder Werger section
// to fill in later. Only
// skip an individual placeholder gloss below when some other
// sense actually has real content, making that particular
// placeholder redundant.
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasRegularMane = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
// Each gloss now has its own group of translation rows —
// attach every gloss's own words under its own werger-ser/-bin
// pair instead of dumping everything under the first one.
var blocks = $.map(glosses, function (gloss, gi) {
var group = stepDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
var rows = group.length ? steps.trans.getGroupTranslations(group) : [];
// Placeholder gloss (no real mane entered yet) with nothing
// translated into it. If some other sense already has real
// content, this placeholder is redundant — skip it. If the
// whole entry is empty, keep it so Werger still gets a
// section to fill in.
if (!gloss.text && !rows.length && hasRegularMane) return undefined;
if (rows.length) {
// Sort by Kurdish sort key.
rows.sort(function (a, b) {
var aLang = langsByCode[a[0]] || {};
var bLang = langsByCode[b[0]] || {};
return (aLang.sortKey || "").localeCompare(bLang.sortKey || "", "ku");
});
}
var wordLines = $.map(rows, function (row) {
var lang = row[0];
var words = row[1];
var wikiWords = words.map(function (w) {
return "{{W|" + lang + "|" + w + "}}";
}).join(", ");
return "* {{Z|" + lang + "}}: " + wikiWords;
}).join("\n");
var block = "{{werger-ser|" + (gloss.text || "?") + "|" + gloss.index + "}}";
if (wordLines) block += "\n" + wordLines;
block += "\n{{werger-bin}}";
return block;
});
if (!blocks.length) return "";
return "\n==== Werger ====\n" + blocks.join("\n") + "\n";
}
},
cavkani: {
id: "cavkani",
name: "çavkanî",
question_fmt: "Çavkaniyên din (ne jêgirtin) lê zêde bike",
visible: function (values) {
return !!values.pos;
},
// Fills the insert-dropdown from the members of [[Kategorî:Çavkanî]].
refreshTplSelect: function () {
var sel = $("#wiktku-start-cavkani .wiktku-tpl-insert-select");
if (!sel.length) return;
sel.find("option[value!='']").remove();
$.each(catSrcTemplates || [], function (_, name) {
sel.append($("<option></option>").val(name).text(name));
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-cavkani-wrap").length) return null;
var wrap = $("<div class='wiktku-cavkani-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-cavkani-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-cavkani-text")
.attr("rows", 4)
.attr("placeholder", "Şablonekî ji jêrê hilbijêre an rasterast binivîse…");
// Template insert dropdown, populated from [[Kategorî:Çavkanî]] —
// options refreshed once the category members are fetched.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike…");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
var status = $("<span class='wiktku-cavkani-status'></span>");
sel.on("change", function () {
var name = $(this).val();
if (!name) return;
insertAtCursor(ta[0], "\n* {{" + name + "}}");
$(this).val("");
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel);
wrap.append(status).append(ta);
stepDiv.append(wrap);
// build() runs again for every new beş (see the "+ Beş zêde bike"
// handler), after the initial page-wide pass — so this select needs
// its own init or it stays a plain, unsearchable native <select>.
initSelects(wrap);
// Populate only now: refreshTplSelect() looks the select up by id
// under #wiktku-start-cavkani, so running it before the wrap was
// appended found nothing and bailed out — which left the dropdown
// empty on every beş after the first, once the category members
// were already cached.
if (catSrcTemplates) {
steps.cavkani.refreshTplSelect();
} else {
status.text("Şablon tên barkirin…");
fetchCatSrcTemplates().then(function () {
steps.cavkani.refreshTplSelect();
status.text("");
}, function () {
status.text("Şablon nehatin barkirin.");
});
}
return ta;
},
output: function () {
var text = $.trim($("#wiktku-start-cavkani .wiktku-cavkani-text").val());
if (!text) return "";
return "\n==== Çavkanî ====\n" + text + "\n";
}
},
};
steps.trans.keys = steps.lang.choices;
steps.dunde.keys = steps.lang.choices;
steps.zarava.keys = getZaravaKeys(steps.lang.choices);
var ordered_steps = [
steps.lang, steps.pron, steps.pos, steps.cinsiyet, steps.lektur, steps.tr,
steps.dfn, steps.je, steps.tekildar,
steps.etym, steps.dunde, steps.binereherwiha, steps.zarava, steps.trans, steps.cavkani];
// Step ids that belong to each section (not shared across sections).
var PER_SECTION_STEP_IDS = [
"pos", "cinsiyet", "lektur", "tr",
"dfn", "je", "tekildar", "etym", "dunde", "binereherwiha", "zarava", "trans", "cavkani"
];
// ── Multi-section state ──────────────────────────────────────────────────
// Each entry is a plain snapshot: { pos, cinsiyet, lektur, tr, dfn (senses[]),
// je, tekildar, binereherwiha, trans (rows[]) }.
var sections = [{}]; // section 0 starts empty (DOM is the truth)
var activeSection = 0;
function snapshotDfn() {
return steps.dfn.getSenses($("#wiktku-start-dfn"));
}
// Rebuilds the dfn DOM from a previously snapshotted senses array.
function restoreDfn(senses) {
var stepDiv = $("#wiktku-start-dfn");
// Tear down the existing list so build() recreates it cleanly.
stepDiv.find("ol.wiktku-dfn-list").remove();
steps.dfn.build(stepDiv);
var list = stepDiv.find("ol.wiktku-dfn-list");
$.each(senses, function (i, sense) {
// Ensure enough blocks exist (build() seeds one).
var blocks = list.find("li.wiktku-dfn-sense");
var block = blocks.eq(i);
if (!block.length) {
var nb = steps.dfn.buildSenseBlock(stepDiv);
list.append(nb);
block = list.find("li.wiktku-dfn-sense").last();
}
// Template selector.
block.find("select.wiktku-dfn-tpl-select").val(sense.tpl || "");
if (sense.tpl) {
block.find("textarea.wiktku-dfn-mane").hide();
block.find("input.wiktku-dfn-tpl-title").val(sense.tplTitle || "").show();
} else {
block.find("textarea.wiktku-dfn-mane").val(sense.mane || "").show();
block.find("input.wiktku-dfn-tpl-title").hide().val("");
}
// dfnArea is the only thing actually saved, so split it back into
// tercime/îzah for editing (mirrors syncNonKuToMane's join format).
var maneParts = splitTercimeIzah(sense.mane);
block.find(".wiktku-dfn-tercime").val(maneParts ? maneParts.tercime : (sense.mane || ""));
block.find(".wiktku-dfn-izah").val(maneParts ? maneParts.izah : "");
// Re-sync the formên alternatîv/hevmane/… hide state now that
// tplSelect's value was set (its own "change"
// handler doesn't fire from .val(), so this doesn't happen otherwise).
var updateVis = block.data("updateFieldVisibility");
if (updateVis) updateVis();
// Same for the mane-box mode (plain vs tercime+îzah), since this
// also depends on tplSelect's (and lang's) value.
var updateMane = block.data("updateManeMode");
if (updateMane) updateMane();
// Restore a sub-list (etiket, formên alternatîv, hevmane …) from a values array.
function restoreSubList(cls, values) {
if (!values || !values.length) return;
var groupDiv = block.find("." + cls + "-group");
var subList = groupDiv.find("ol, ul").first();
if (!subList.length) return; // group not found
// Fill existing items, append new ones as needed.
$.each(values, function (j, val) {
var items = subList.find("li");
if (j < items.length) {
items.eq(j).find("textarea").val(val);
} else {
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-restore-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.val(val);
ta.on("input", function () {
steps.dfn.onSubInput(subList, this, 1, true);
});
subList.append($("<li></li>").append(ta));
}
});
}
// Reveal and populate lazy groups that have data.
var lazyMap = {
"wiktku-dfn-etiket": sense.etiket,
"wiktku-dfn-kategori": sense.kategori,
"wiktku-dfn-alternativ": sense.alternativ,
"wiktku-dfn-hevmane": sense.hevmane,
"wiktku-dfn-dijmane": sense.dijmane,
"wiktku-dfn-koordine": sense.koordine,
"wiktku-dfn-jornav": sense.jornav,
"wiktku-dfn-jernav": sense.jernav
};
$.each(lazyMap, function (cls, vals) {
if (vals && vals.length) restoreSubList(cls, vals);
});
// Nimûne items are objects { text, tr?, t? } — restore using the builder.
if (sense.nimune && sense.nimune.length) {
var nimuneGroupDiv = block.find(".wiktku-dfn-nimune-group");
var nimuneList = nimuneGroupDiv.find("ol.wiktku-dfn-nimune-list");
var buildFn = nimuneGroupDiv.data("buildNimuneLi");
nimuneList.empty();
$.each(sense.nimune, function (_, n) {
var text = typeof n === "object" ? (n.text || "") : n;
if (!text) return;
var li = buildFn ? buildFn() : $("<li class='wiktku-dfn-nimune-li'></li>");
li.find(".wiktku-dfn-nimune-text").val(text).each(function () { highlightLinebreak(this); });
if (n.tr) li.find(".wiktku-dfn-nimune-tr").val(n.tr);
if (n.t) li.find(".wiktku-dfn-nimune-t").val(n.t);
nimuneList.append(li);
});
// Always leave a blank trailing item.
if (buildFn) nimuneList.append(buildFn());
}
// Restore jêder entries — accepts current array shape or a legacy
// single object (older saved sections) for backwards compat.
var jederArr = $.isArray(sense.jeder) ? sense.jeder : (sense.jeder ? [sense.jeder] : []);
if (jederArr.length) {
var jederGroupDiv = block.find(".wiktku-dfn-jeder-group");
var jederList = jederGroupDiv.find("ol.wiktku-dfn-jeder-list");
var buildJederFn = jederGroupDiv.data("buildJederLi");
jederList.empty();
$.each(jederArr, function (_, j) {
if (!j || !j.quote) return;
var li = buildJederFn ? buildJederFn() : $("<li class='wiktku-dfn-jeder-li'></li>");
li.find(".wiktku-dfn-nimune-quote").val(j.quote).each(function () { highlightLinebreak(this); });
if (j.quoteTr) li.find(".wiktku-dfn-nimune-quote-tr").val(j.quoteTr);
if (j.quoteT) li.find(".wiktku-dfn-nimune-quote-t").val(j.quoteT);
if (j.jederManual) {
var manualSel = li.find(".wiktku-dfn-quote-src-sel");
manualSel.val("__manual__").trigger("change");
li.find(".wiktku-dfn-quote-src-manual").val(j.jederManual);
} else if (j.jederCatTpl) {
// Legacy format from before the şablon search switched rows to
// manual mode directly — convert it the same way now, so it's
// editable like any other free-form source.
var catSelEl = li.find(".wiktku-dfn-quote-src-sel");
catSelEl.val("__manual__").trigger("change");
li.find(".wiktku-dfn-quote-src-manual").val("{{" + j.jederCatTpl + "}}");
} else if (j.jederTpl) {
var srcSel = li.find(".wiktku-dfn-quote-src-sel");
srcSel.val(j.jederTpl).trigger("change");
if (j.jêderFields) {
$.each(j.jêderFields, function (key, val) {
li.find(".wiktku-dfn-quote-src-input[data-field-key='" + key + "']").val(val);
});
}
}
jederList.append(li);
});
// Always leave a blank trailing item, same as Nimûne.
if (buildJederFn) jederList.append(buildJederFn());
}
});
}
// Snapshots simple (non-dfn) per-section steps from the DOM into obj.
function saveCurrentSection() {
var snap = {};
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
snap.dfn = snapshotDfn();
return;
}
if (id === "etym") {
snap.etym = $.trim($("#wiktku-start-etym .wiktku-etym-text").val());
return;
}
if (id === "cavkani") {
snap.cavkani = $.trim($("#wiktku-start-cavkani .wiktku-cavkani-text").val());
return;
}
var step = steps[id];
if (!step) return;
var stepDiv = $("#wiktku-start-" + id);
if (id === "trans") {
snap.trans = steps.trans.getTranslations(stepDiv);
return;
}
if (id === "zarava") {
snap.zarava = steps.zarava.getTranslations(stepDiv);
return;
}
if (id === "dunde") {
snap.dunde = steps.dunde.getRows(stepDiv);
return;
}
// Generic: read all step fields.
var fields = stepDiv.find(".wiktku-start-step-field");
if (step.multiple) {
snap[id] = fields.map(function () { return $(this).val(); }).get();
} else {
snap[id] = fields.val();
}
});
sections[activeSection] = snap;
}
// Restores a previously saved snapshot into the form DOM.
function restoreSection(snap) {
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
restoreDfn(snap.dfn || []);
return;
}
if (id === "etym") {
$("#wiktku-start-etym .wiktku-etym-wrap").remove();
steps.etym.build($("#wiktku-start-etym"));
$("#wiktku-start-etym .wiktku-etym-text").val(snap.etym || "");
return;
}
if (id === "cavkani") {
$("#wiktku-start-cavkani .wiktku-cavkani-wrap").remove();
steps.cavkani.build($("#wiktku-start-cavkani"));
$("#wiktku-start-cavkani .wiktku-cavkani-text").val(snap.cavkani || "");
return;
}
if (id === "trans") {
// Rebuild trans groups (dfn must already be restored by this
// point in the $.each loop, so glossList() reflects it).
var transDiv = $("#wiktku-start-trans");
transDiv.find(".wiktku-trans-group").remove();
steps.trans.build(transDiv);
var groupsSnap = snap.trans || [];
$.each(groupsSnap, function (gi, rows) {
var group = transDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
if (!group.length) return; // gloss no longer exists — drop its rows
var list = group.find("ul.wiktku-trans-list");
$.each(rows, function (j, row) {
var lang = row[0], words = row[1];
var lastRow = list.find("li.wiktku-trans-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-trans-words");
$.each(words, function (k, word) {
var wordItems = wordList.find("li");
if (k < wordItems.length) {
wordItems.eq(k).find("textarea").val(word);
} else {
// .val() below doesn't fire "input", so the normal
// auto-grow never runs — append a matching item
// ourselves instead of silently dropping the word.
var extraInput = steps.trans.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
// Leave one trailing empty field so the row can still grow
// when the user types, matching a freshly-built row.
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.trans.makeWordInput()));
}
});
});
return;
}
if (id === "zarava") {
// Rebuild zarava groups (dfn must already be restored by this
// point in the $.each loop, so glossList() reflects it).
var zaravaDiv = $("#wiktku-start-zarava");
zaravaDiv.find(".wiktku-zarava-group").remove();
steps.zarava.build(zaravaDiv);
var zaravaGroupsSnap = snap.zarava || [];
$.each(zaravaGroupsSnap, function (gi, rows) {
var group = zaravaDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
if (!group.length) return; // gloss no longer exists — drop its rows
var list = group.find("ul.wiktku-zarava-list");
$.each(rows, function (j, row) {
var lang = row[0], words = row[1];
var lastRow = list.find("li.wiktku-zarava-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-zarava-words");
$.each(words, function (k, word) {
var wordItems = wordList.find("li");
if (k < wordItems.length) {
wordItems.eq(k).find("textarea").val(word);
} else {
var extraInput = steps.zarava.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.zarava.makeWordInput()));
}
});
});
return;
}
if (id === "dunde") {
// Rebuild dunde rows.
var dundeDiv = $("#wiktku-start-dunde");
dundeDiv.find("ul.wiktku-dunde-list").remove();
steps.dunde.build(dundeDiv);
var dundeRows = snap.dunde || [];
$.each(dundeRows, function (i, row) {
var lang = row[0], words = row[1];
var list = dundeDiv.find("ul.wiktku-dunde-list");
var lastRow = list.find("li.wiktku-dunde-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-dunde-words");
$.each(words, function (j, word) {
var wordItems = wordList.find("li");
if (j < wordItems.length) {
wordItems.eq(j).find("textarea").val(word);
} else {
// .val() below doesn't fire "input", so the normal
// auto-grow never runs — append a matching item
// ourselves instead of silently dropping the word.
var extraInput = steps.dunde.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
// Leave one trailing empty field so the row can still grow
// when the user types, matching a freshly-built row.
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.dunde.makeWordInput()));
}
});
return;
}
var step = steps[id];
if (!step) return;
var stepDiv = $("#wiktku-start-" + id);
var fields = stepDiv.find(".wiktku-start-step-field");
var val = snap[id];
if (val === undefined || val === null) return;
if (step.multiple) {
var arr = val;
fields.each(function (i) {
if (i < arr.length) $(this).val(arr[i]);
});
} else {
fields.val(val);
}
// Tell the pickers about the programmatic value change.
fields.filter("select").trigger("wiktku:refresh");
});
}
function getWikitextForCurrentSection(callback) {
var values = getValues();
var entry = steps.pos.output(values);
steps.dfn.getOutput(values, function (output) {
entry += output;
entry += steps.je.output(values);
entry += steps.tekildar.output(values);
entry += steps.etym.output(values);
entry += steps.dunde.output(values);
entry += steps.binereherwiha.output(values);
entry += steps.zarava.output(values);
entry += steps.trans.output(values);
entry += steps.cavkani.output(values);
callback(entry, values);
});
}
function getWikitextAllSections(callback) {
saveCurrentSection();
var results = new Array(sections.length);
var sharedValues = getValues(); // lang/pron are shared
function processSection(i) {
if (i >= sections.length) {
// All done — restore original active section.
restoreSection(sections[activeSection]);
refresh();
callback(results, sharedValues);
return;
}
restoreSection(sections[i]);
refresh();
getWikitextForCurrentSection(function (sectionText) {
results[i] = sectionText;
processSection(i + 1);
});
}
processSection(0);
}
// Assembles wikitext for all sections plus the shared lang/pron header.
function getWikitext(callback) {
getWikitextAllSections(function (sectionTexts, sharedValues) {
var entry = steps.lang.output(sharedValues);
entry += steps.pron.output(sharedValues);
entry += sectionTexts.join("\n");
// Edit summary uses section 0's values. Read from the saved snapshot
// (not the live DOM) so it doesn't mix section 0's pos with whichever
// section happens to be active/restored at this point.
var dfnSenses = (sections[0] && sections[0].dfn) || [];
var dfnSummary = dfnSenses.map(function (s) {
if (s.mane) return s.mane;
// Template sense (e.g. {{guharto|ku|somepage}}) — same
// construction as the tplCall built in getOutput, so the
// summary shows what actually gets written to the entry
// instead of going blank.
if (s.tpl && s.tplTitle) {
return s.tplNoLang
? "{{" + s.tpl + "|" + s.tplTitle + "}}"
: "{{" + s.tpl + "|" + sharedValues.lang + "|" + s.tplTitle + "}}";
}
return "";
}).filter(Boolean).join("; ");
var summary = "([[Mediawiki:Gadget-start.js|WF:NÛ]] v.2.0) +" +
sharedValues.lang + ":" + sections[0].pos + ":" + dfnSummary;
var summaryField = document.getElementById("wpSummary");
if (addLangMode && summaryField.value) {
summary = summaryField.value + " " + summary;
}
summaryField.value = summary;
callback(entry);
});
}
var continueBtn;
function getValuesForStep(stepId) {
var fields = $("#wiktku-start-" + stepId + " .wiktku-start-step-field");
var step = steps[stepId];
if (step.keys) {
var values = {};
fields.each(function (i, field) {
var key = $(field).prevAll(".wiktku-start-step-keyfield").val();
if (key) values[key] = $(field).val();
});
return values;
}
else if (step.multiple) {
return fields.map(function () {
return $(this).val();
}).get();
}
return fields.val();
}
function getValues() {
var values = {};
$.each(steps, function (stepId) {
values[stepId] = getValuesForStep(stepId);
});
return values;
}
function populateMenus(inputs, choices, disabledValues, placeholderText) {
if (!disabledValues) disabledValues = {};
var vals = inputs.map(function (i, input) {
return $(input).val();
});
inputs.empty();
inputs.append($("<option></option>").text(placeholderText || ""));
$.each(choices, function (j, choice) {
// Append the language code in parentheses so that typing a code
// (e.g. "ku") in the search box still finds the language name.
var displayText = capitalize(choice.label);
if (choice.sortKey !== undefined) {
// This is a language choice {code, label, sortKey} — show code.
displayText = capitalize(choice.label) + " (" + choice.code + ")";
}
var option = $(mw.html.element("option", {
value: choice.code }, displayText));
if (disabledValues[choice.code]) option.prop("disabled", true);
inputs.append(option);
});
inputs.val(function (i) {
return vals[i];
});
}
// Keys to disable for a key menu: already-taken or explicitly disabled.
function getDisabledKeys(step) {
var occupiedKeys = {};
$("#wiktku-start-" + step.id + " .wiktku-start-step-keyfield").each(function () {
occupiedKeys[$(this).val()] = true;
});
if (step.disabledKeys) $.extend(occupiedKeys, step.disabledKeys);
return occupiedKeys;
}
function buildKeyInput(step) {
if (!step.keys) return undefined;
var input = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
input.attr("data-placeholder", "Hilbijêre " + step.keyName);
populateMenus(input, step.keys, getDisabledKeys(step));
// Keep the key menus mutually exclusive: whatever one row selects is
// disabled in every other row. Recomputed from the DOM on each change.
input.on("change", function () {
var all = $("#wiktku-start-" + step.id + " .wiktku-start-step-keyfield");
var taken = {};
all.each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
all.not(this).each(function () {
var self = $(this), own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (code) $(this).prop("disabled", !!taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
});
// Return the wrapper; the select lives inside it and still fires change.
return wrapNativeSelect(input);
}
// Adds another text field to the list if the last one now has text.
function refreshForTextField(currentInput, step) {
currentInput = $(currentInput);
var value = currentInput.val();
var item = currentInput.parent();
if (value && !item.next("li").length) {
var nextInput = $("<textarea></textarea>")
.attr("name", "wiktku-field-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", currentInput.attr("class"))
.attr("rows", currentInput.attr("rows") || 1);
if (step.placeholder) nextInput.attr("placeholder", step.placeholder);
nextInput.on("input", function (evt) {
refreshForTextField(evt.target, step);
});
var nextKeyInput = buildKeyInput(step);
var nextItem = $("<li></li>").append(nextKeyInput).append(nextInput);
item.parent().append(nextItem);
if (nextKeyInput) initSelects(nextItem);
}
var canContinue = !continueBtn.isDisabled();
if ((value && !canContinue) || (!value && canContinue)) {
refresh(step);
}
}
function prepareInput(input, step) {
if (!input) return;
if (step.required) input.prop('required', true);
input.change(step, refresh);
}
// Shows/hides steps based on whether their prerequisites are met, and
// updates placeholders where applicable.
function refresh(evt) {
var values = getValues();
var changedStep = evt && evt.data;
var didFocus = false;
var canContinue = true;
// Re-filter template options in every sense block whenever lang changes.
$("#wiktku-start-dfn .wiktku-dfn-tpl-select").each(function () {
var fn = $(this).data("updateOptions");
if (typeof fn === "function") fn();
});
// Re-filter pronunciation and etymology template dropdowns when language changes.
steps.pron.refreshTplSelect();
steps.etym.refreshTplSelect();
steps.cavkani.refreshTplSelect();
// Re-render any step's question label that depends on current values
// (e.g. dfn's Werger-section reminder, which only applies to ku).
$.each(steps, function (stepId, step) {
if (typeof step.question_fmt === "function") {
$("#wiktku-start-" + stepId + " .wiktku-start-step-question")
.text(step.question_fmt(values));
}
});
// Sync every sense block's mane-box mode (plain mane vs tercime+îzah)
// to the current language, in case lang changes after blocks exist.
$("#wiktku-start-dfn li.wiktku-dfn-sense").each(function () {
var updateMane = $(this).data("updateManeMode");
if (updateMane) updateMane();
});
// Sync tr/t sub-fields in every nimûne item to the current language.
// tr shown when language needs transliteration; t shown when lang !== "ku".
(function () {
var lang = values.lang || "";
var showTr = needsTransliteration(lang);
var showT = lang && lang !== "ku";
$("#wiktku-start-dfn .wiktku-dfn-nimune-list li.wiktku-dfn-nimune-li").each(function () {
var li = $(this);
// Ensure the sub-wrapper exists when we need it.
var subWrap = li.find(".wiktku-dfn-nimune-sub");
// tr field
var trTa = li.find(".wiktku-dfn-nimune-tr");
if (showTr && !trTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
li.append(subWrap);
}
trTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-tr")
.attr("placeholder", "Transliterasyon…");
subWrap.prepend(trTa);
} else if (!showTr && trTa.length) {
trTa.remove();
}
// t field
var tTa = li.find(".wiktku-dfn-nimune-t");
if (showT && !tTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
li.append(subWrap);
}
tTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-t")
.attr("placeholder", "Tercimeya nimûneyê bi kurmancî…");
subWrap.append(tTa);
} else if (!showT && tTa.length) {
tTa.remove();
}
// Remove the wrapper if it ended up empty.
subWrap = li.find(".wiktku-dfn-nimune-sub");
if (subWrap.length && !subWrap.children().length) subWrap.remove();
});
}());
// Sync tr/t sub-fields in every jêder citation to the current language.
// tr shown when language needs transliteration; t shown when lang !== "ku".
(function () {
var lang = values.lang || "";
var showTr = needsTransliteration(lang);
var showT = lang && lang !== "ku";
$("#wiktku-start-dfn .wiktku-dfn-jeder-list li.wiktku-dfn-jeder-li").each(function () {
var li = $(this);
// Ensure the sub-wrapper exists when we need it. It must sit right
// after the quote textarea and before the source selector.
var subWrap = li.find(".wiktku-dfn-quote-sub");
// tr field
var trTa = li.find(".wiktku-dfn-nimune-quote-tr");
if (showTr && !trTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
// Insert after the quote textarea's resize-wrap (if the manual
// resize handle has already been attached to it), not after the
// bare textarea -- otherwise this lands *inside* that wrap,
// between the textarea and its own grip, breaking jêgirtin's
// handle and nesting the tr/t boxes inside it.
var quoteTa = li.find(".wiktku-dfn-nimune-quote");
var quoteResizeWrap = quoteTa.closest(".wiktku-resize-wrap");
(quoteResizeWrap.length ? quoteResizeWrap : quoteTa).after(subWrap);
}
trTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-tr")
.attr("placeholder", "Transliterasyona jêgirtinê…");
subWrap.prepend(trTa);
} else if (!showTr && trTa.length) {
trTa.remove();
}
// t field
var tTa = li.find(".wiktku-dfn-nimune-quote-t");
if (showT && !tTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
// See the tr-field branch above for why this targets the
// resize-wrap instead of the bare textarea.
var quoteTa2 = li.find(".wiktku-dfn-nimune-quote");
var quoteResizeWrap2 = quoteTa2.closest(".wiktku-resize-wrap");
(quoteResizeWrap2.length ? quoteResizeWrap2 : quoteTa2).after(subWrap);
}
tTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-t")
.attr("placeholder", "Tercimeya jêgirtinê bi kurmancî…");
subWrap.append(tTa);
} else if (!showT && tTa.length) {
tTa.remove();
}
// Remove the wrapper if it ended up empty.
subWrap = li.find(".wiktku-dfn-quote-sub");
if (subWrap.length && !subWrap.children().length) subWrap.remove();
});
}());
$.each(steps, function (stepId, step) {
if (typeof(step.visible) === "function" && !step.visible(values)) {
$("#wiktku-start-" + stepId).slideUp();
}
else {
var stepDiv = $("#wiktku-start-" + stepId);
if (changedStep !== step && typeof(step.build) === "function") {
prepareInput(step.build(stepDiv, values), step);
}
var input = stepDiv.find(".wiktku-start-step-field");
if (typeof(step.example) === "function") {
// .find() above already reaches nested fields (e.g. the dfn
// step's mane textareas inside each sense block), so one
// assignment covers every step; dfn keeps its own fallback.
var exampleText = step.example(values) || (step.id === "dfn" ? "Mane…" : "");
input.attr("placeholder", exampleText);
}
var didSlideDown;
if (!didFocus && stepDiv.css("display") === "none" && step.required) {
didSlideDown = function (evt) {
// Just scroll the newly-revealed step into view -- no
// auto-focus. Focusing here used to yank the cursor
// into the step on desktop (annoying, and not needed
// there), and on mobile it popped the on-screen
// keyboard mid-scroll, shrinking the viewport so the
// step never fully showed. A plain scroll gets the
// whole step on screen either way and lets the
// person tap into it themselves when they're ready.
var stepEl = stepDiv.get(0);
if (stepEl && typeof stepEl.scrollIntoView === "function") {
stepEl.scrollIntoView({ behavior: "smooth", block: "start" });
}
};
didFocus = true;
}
stepDiv.slideDown(didSlideDown);
}
if (step.required &&
(values[stepId] === "" ||
(step.multiple && values[stepId].join("") === ""))) {
canContinue = false;
}
});
continueBtn.setDisabled(!canContinue);
}
function destroy() {
$("#wiktku-start-form, .noafterwizard").slideUp(function () {
$(this).remove();
});
$(".noarticletext .nowizard, #editform").slideDown();
$("#ca-edit").removeClass("selected");
$("#ca-wiktku-nowizard").addClass("selected");
}
// Priority order for Kurdish dialects and navz.
// Codes listed here come before all other languages; unlisted codes
// are sorted alphabetically by their display name via localeCompare.
var LANG_PRIORITY = ["navz", "ku", "hac", "sdh", "lki", "ckb", "zza"];
// Inserts a new "== {{ziman|code}} ==" section at the correct sorted
// position: navz, then ku/hac/sdh/lki/ckb/zza, then alphabetical by name.
function insertNewLangSection(existing, wikitext) {
var newCodeMatch = wikitext.match(new RegExp("^" + langHeaderSource("[^}]+")));
var newCode = newCodeMatch ? newCodeMatch[1] : "";
var sections = [];
var preamble = "";
var anyHeaderSrc = langHeaderSource("[^}]+");
var firstMatch = new RegExp("^" + anyHeaderSrc, "m").exec(existing);
if (!firstMatch) {
// No existing lang sections at all — just append.
var sep = existing && !/\n\s*$/.test(existing) ? "\n\n" : "";
return existing + sep + wikitext;
}
// Everything before the first == {{ziman|...}} == is the preamble.
var firstSectionStart = firstMatch.index;
// Walk back to the start of that line.
var lineStart = existing.lastIndexOf("\n", firstSectionStart - 1);
var preambleEnd = lineStart !== -1 ? lineStart + 1 : 0;
preamble = existing.slice(0, preambleEnd);
// Parse each language section: header line + everything until the next header.
var body = existing.slice(preambleEnd);
// (?![\s\S]) matches only true end-of-string, since a bare "$" with
// /m would stop at the section's first line break instead.
var langSectionRe = new RegExp(
"^(" + anyHeaderSrc + "\\n?)([\\s\\S]*?)(?=\\n" + anyHeaderSrc + "|(?![\\s\\S]))",
"gm"
);
var m;
while ((m = langSectionRe.exec(body)) !== null) {
sections.push({
code: m[2],
content: m[0] // full text of this section including header
});
}
// Determine sort rank: priority list first (by index), then alphabetical.
function getLangName(code) {
var entry = langsByCode[code];
return entry ? entry.label : code;
}
function sortRank(code) {
var idx = LANG_PRIORITY.indexOf(code);
return idx !== -1 ? idx : LANG_PRIORITY.length;
}
function compareLangs(a, b) {
var ra = sortRank(a), rb = sortRank(b);
if (ra !== rb) return ra - rb;
// Both are outside priority list — sort by display name.
return getLangName(a).localeCompare(getLangName(b), userLang);
}
// Insert the new section into the sorted list.
var newSection = { code: newCode, content: wikitext };
var inserted = false;
for (var i = 0; i < sections.length; i++) {
if (compareLangs(newCode, sections[i].code) < 0) {
sections.splice(i, 0, newSection);
inserted = true;
break;
}
}
if (!inserted) sections.push(newSection);
// Re-join: preamble + sections separated by newlines.
var joined = sections.map(function (s) {
// Ensure each section ends with exactly one newline before the next.
return s.content.replace(/\n+$/, "");
}).join("\n");
return preamble + joined + "\n";
}
function build() {
$(".nowizard, .nowizard .noafterwizard").hide();
var callToAction = $("#wiktku-calltoaction");
var origCallToActionText = callToAction.text();
$(mw.util.addPortletLink("p-views", "#", "Edîtora çavkaniyê veke",
"ca-wiktku-nowizard", "Vê rûpelê bi edîtora çavkaniyê çêke",
undefined, "#ca-watch")).click(function (evt) {
evt.preventDefault();
callToAction.text(origCallToActionText);
destroy();
});
if (callToAction.length) {
callToAction.text(origCallToActionText +
" Forma li jêr ji bo çêkirina madeyeke nû bi kar bîne.");
}
var startForm = $("<form id='wiktku-start-form'></form>");
var clearPageCheck = null;
if (addLangMode) {
startForm.append($("<p class='wiktku-addlang-notice'></p>").html(
"Bi vê formê tu yê zimanekî nû li rûpelê îlawe bikî. Eger ev ziman jixwe hebe, beşa nû li dawiya vî zimanî dê were îlawekirin. " +
"Ji kerema xwe netîceya dawî kontrol bike, eger problemek derkeve, li <a href='" +
mw.util.getUrl('Mediawiki talk:Gadget-start.js') +
"'>nîqaşa vê amûrê</a> problemê ragihîne."
));
clearPageCheck = $("<input type='checkbox' id='wiktku-clear-page-check'>");
var clearPageLabel = $("<label for='wiktku-clear-page-check'></label>")
.text(" Muhtewaya rûpelê paqij bike (her tiştî jê bibe û rûpelê ji nû ve binivîse)");
startForm.append(
$("<p class='wiktku-addlang-notice'></p>")
.append(clearPageCheck)
.append(clearPageLabel)
);
// Re-evaluate step visibility (e.g. the pron step) whenever this
// is toggled, since it changes what counts as "existing content".
clearPageCheck.on("change", function () {
refresh();
});
}
var spinner;
// Tab bar for switching between POS sections.
var sectionTabsDiv = $("<div id='wiktku-section-tabs'></div>");
startForm.submit(function (evt) {
evt.preventDefault();
continueBtn.setDisabled(true);
continueBtn.$element.addClass("wiktku-btn-sending");
spinner.show();
getWikitext(function (wikitext) {
if (addLangMode && clearPageCheck && clearPageCheck.prop("checked")) {
// User asked to wipe the page and start fresh — just
// write the newly generated wikitext as the full content.
$("#wpTextbox1").val(wikitext);
} else if (addLangMode) {
var textbox = $("#wpTextbox1");
var existing = textbox.val() || "";
// If this language's section already exists (whitespace
// differences aside), merge into it; otherwise insert new.
var langHeaderMatch = wikitext.match(new RegExp("^(" + langHeaderSource("[^}]+") + "\\n)"));
if (langHeaderMatch) {
var langHeader = langHeaderMatch[1]; // e.g. "== {{ziman|ku}} ==\n"
var newCode = langHeaderMatch[2];
var existingHeader = findLangHeader(existing, newCode);
if (existingHeader) {
// Strip the header from the new output.
var newContent = wikitext.slice(langHeader.length);
// Find the insertion point: end of the existing lang section.
// A new L2 heading marks the start of the next language block.
var searchFrom = existingHeader.index + existingHeader.match.length;
// Find the next == … == heading after this section's start.
var nextL2 = existing.indexOf("\n== ", searchFrom);
var insertAt = nextL2 !== -1 ? nextL2 : existing.length;
// Ensure there's a blank line before the inserted block.
var before = existing.slice(0, insertAt);
var after = existing.slice(insertAt);
var sep = /\n\s*$/.test(before) ? "" : "\n";
textbox.val(before + sep + newContent + after);
} else {
// New language — insert at the correct sorted position.
textbox.val(insertNewLangSection(existing, wikitext));
}
} else {
// Unexpected format — insert at sorted position anyway.
textbox.val(insertNewLangSection(existing, wikitext));
}
} else {
$("#wpTextbox1").val(wikitext);
}
$("html, body").animate({scrollTop: 0});
callToAction.text("Hindik ma!");
$("#wiktku-preview-container").remove();
destroy();
});
});
$.each(ordered_steps, function (i, step) {
var stepDiv = $(mw.html.element("div", {
"class": "wiktku-start-step",
id: "wiktku-start-" + step.id }));
var name = capitalize(step.name);
stepDiv.append($(mw.html.element("h3", {
"class": "wiktku-start-step-name" }, new mw.html.Raw(mw.html.element("label", {
"for": "wiktku-start-" + step.id + "-field" }, name)))));
if (step.question_fmt) {
// question_fmt can be a plain string, or a function of the
// current values (used by steps whose question text depends
// on e.g. the chosen language) — refresh() keeps it in sync
// afterwards via the .wiktku-start-step-question class.
var questionText = typeof step.question_fmt === "function"
? step.question_fmt(getValues())
: step.question_fmt;
stepDiv.append($(mw.html.element("label", {
"class": "wiktku-start-step-question",
"for": "wiktku-start-" + step.id + "-field" }, questionText)));
if (step.question_br) stepDiv.append($("<br>"));
}
var input;
if (step.choices) {
input = $(mw.html.element("select", {
"class": "wiktku-start-step-field",
id: "wiktku-start-" + step.id + "-field" }));
input.attr("data-placeholder",
capitalize(step.name) + " hilbijêre ");
populateMenus(input, step.choices);
if (step.multiple) input.attr("multiple", true);
// initSelects() runs over the whole form once it is in the DOM.
stepDiv.append(input);
} else if (typeof(step.build) === "function") {
input = step.build(stepDiv);
} else {
input = $("<textarea></textarea>")
.attr("class", "wiktku-start-step-field")
.attr("id", "wiktku-start-" + step.id + "-field")
.attr("rows", step.rows || 2);
if (step.narrow) input.addClass("wiktku-start-narrow");
if (step.placeholder) input.attr("placeholder", step.placeholder);
if (step.multiple) {
input.on("input", function (evt) {
refreshForTextField(evt.target, step);
});
var keyInput = buildKeyInput(step);
var list = $(step.ordered ? "<ol></ol>" : "<ul></ul>")
.append($("<li></li>").append(keyInput).append(input));
stepDiv.append(list);
}
else stepDiv.append(input);
}
prepareInput(input, step);
stepDiv.hide();
// Insert tab bar just before the first per-section step.
if (step.id === "pos") startForm.append(sectionTabsDiv);
startForm.append(stepDiv);
});
// ── Section tab helpers ──────────────────────────────────────────────
// ── Add-section button — lives in the tab bar, disabled until pos chosen ──
var addSectionBtn = new OO.ui.ButtonWidget({
label: "+ Beş zêde bike",
disabled: true
});
addSectionBtn.on("click", function () {
saveCurrentSection();
sections.push({});
activeSection = sections.length - 1;
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
var stepDiv = $("#wiktku-start-dfn");
stepDiv.find("ol.wiktku-dfn-list").remove();
steps.dfn.build(stepDiv);
return;
}
if (id === "etym") {
$("#wiktku-start-etym .wiktku-etym-wrap").remove();
steps.etym.build($("#wiktku-start-etym"));
return;
}
if (id === "cavkani") {
$("#wiktku-start-cavkani .wiktku-cavkani-wrap").remove();
steps.cavkani.build($("#wiktku-start-cavkani"));
return;
}
if (id === "trans") {
var transDiv = $("#wiktku-start-trans");
transDiv.find(".wiktku-trans-group").remove();
return;
}
if (id === "zarava") {
var zaravaDiv = $("#wiktku-start-zarava");
zaravaDiv.find(".wiktku-zarava-group").remove();
return;
}
if (id === "dunde") {
var dundeDiv = $("#wiktku-start-dunde");
dundeDiv.find("ul.wiktku-dunde-list").remove();
return;
}
var stepDiv = $("#wiktku-start-" + id);
stepDiv.find(".wiktku-start-step-field").val("");
stepDiv.find("select.wiktku-start-step-field").trigger("wiktku:refresh");
});
renderSectionTabs();
refresh();
$("html, body").animate({ scrollTop: sectionTabsDiv.offset().top - 20 }, 300);
});
/** Re-render the tab bar to reflect current sections[] and activeSection. */
function renderSectionTabs() {
// Detach (not remove) the button first: .empty() strips bound
// event data from any children left inside it, which would
// silently kill addSectionBtn's click handler on every re-render.
addSectionBtn.$element.detach();
sectionTabsDiv.empty();
var lang = getValues().lang || "";
if (!lang) {
sectionTabsDiv.hide();
return;
}
sectionTabsDiv.show();
$.each(sections, function (i) {
var posVal = sections[i].pos || "";
var tabLabel = posVal ? capitalize(posVal) : ("Beş " + (i + 1));
var tab = $("<span></span>")
.addClass("wiktku-section-tab")
.text(tabLabel)
.toggleClass("wiktku-tab-active", i === activeSection);
(function (idx) {
tab.on("click", function () {
if (idx === activeSection) return;
saveCurrentSection();
activeSection = idx;
restoreSection(sections[activeSection]);
refresh();
renderSectionTabs();
});
}(i));
sectionTabsDiv.append(tab);
});
// Enable "Beş zêde bike" only when the active section has a pos chosen.
var activePos = sections[activeSection] && sections[activeSection].pos
? sections[activeSection].pos
: getValues().pos;
addSectionBtn.setDisabled(!activePos);
sectionTabsDiv.append(addSectionBtn.$element);
}
renderSectionTabs();
/**
* Restores a full cached draft: shared lang/pron fields, then every
* section (via the same restoreSection()/refresh()/renderSectionTabs()
* sequence already used when switching tabs).
* @param cached {{lang: string, pron: string, sections: Array, activeSection: number}}
*/
function restoreFromCache(cached) {
if (cached.lang) {
$("#wiktku-start-lang-field").val(cached.lang);
$("#wiktku-start-lang-field").trigger("wiktku:refresh");
}
// Rebuild dependent steps (pos, pron wrap, etc.) now that lang is set.
refresh();
if (cached.pron !== undefined) {
$("#wiktku-start-pron .wiktku-pron-text").val(cached.pron);
}
sections = (cached.sections && cached.sections.length) ? cached.sections : [{}];
activeSection = (typeof cached.activeSection === "number" &&
cached.activeSection >= 0 && cached.activeSection < sections.length)
? cached.activeSection : 0;
restoreSection(sections[activeSection]);
refresh();
renderSectionTabs();
mw.notify("Danûstandina berê ya qeydkirî ji cache hate barkirin.",
{ type: "info", tag: "wiktku-cache-restore" });
}
// Update the active tab's label whenever pos changes.
startForm.on("change", "#wiktku-start-pos-field", function () {
renderSectionTabs();
});
// Show the tab bar as soon as a language is selected.
startForm.on("change", "#wiktku-start-lang-field", function () {
renderSectionTabs();
});
var footer = $("<div id='wiktku-start-footer'></div>");
spinner = $(mw.html.element("img", {
id: "wiktku-start-spinner",
src: "//upload.wikimedia.org/wikipedia/commons/d/de/Ajax-loader.gif",
alt: "Tê barkirin…",
title: "Tê barkirin…" }));
footer.append(spinner.hide());
continueBtn = new OO.ui.ButtonWidget({
id: "wiktku-unhide-editform",
label: "Bişîne",
flags: [ "primary", "progressive" ]
});
continueBtn.on("click", function () {
// Immediate feedback that the click registered
continueBtn.$element.addClass("wiktku-btn-flash");
setTimeout(function () {
continueBtn.$element.removeClass("wiktku-btn-flash");
}, 500);
mw.notify("Tê şandin…", { type: "info", tag: "wiktku-submit" });
startForm.trigger("submit");
});
footer.append(continueBtn.$element);
// "Edîtora çavkaniyê veke" button — inline fallback for the portlet link
var sourceEditorBtn = new OO.ui.ButtonWidget({
label: "Edîtora çavkaniyê veke"
});
sourceEditorBtn.on("click", function () {
destroy();
});
footer.append(sourceEditorBtn.$element);
// ── Cache save/clear buttons ─────────────────────────────────────────
// Manual, page-scoped save of the entire wizard (all sections, not
// just the active one) via [[MediaWiki:Gadget-StorageUtils.js]]'s
// ObjectStorage. Restoring happens silently on load (see the
// ziman.json .then() callback below), once the full language list
// is available.
var saveCacheBtn = new OO.ui.ButtonWidget({
label: "Li cache qeyd bike",
title: "Halê vê formê yê niha (ziman, bilêvkirin û hemû beş) li cache (localStorage) qeyd bike, da ku eger rûpel bêyî xwestin were girtin an ji nû ve were barkirin, tu karibî berdewam bikî."
});
saveCacheBtn.on("click", function () {
saveCurrentSection();
var snapshot = {
lang: getValues().lang || "",
pron: $("#wiktku-start-pron .wiktku-pron-text").val() || "",
sections: sections,
activeSection: activeSection
};
// ObjectStorage.Set() doesn't return a success/failure value, so
// the only way to detect a real failure (storage blocked, quota
// exceeded, JSON.stringify choking on something unexpected) is to
// catch it here rather than inspect a (nonexistent) return value.
try {
formCache.Set(snapshot);
mw.notify("Halê formê li cache hate qeydkirin.", { type: "success", tag: "wiktku-cache-save" });
} catch (e) {
mw.notify("Qeydkirina li cache bi ser neket.", { type: "error", tag: "wiktku-cache-save" });
}
});
footer.append(saveCacheBtn.$element);
var clearCacheBtn = new OO.ui.ButtonWidget({
label: "Cache paqij bike",
flags: [ "destructive" ],
title: "Datayên qeydkirî yên vê rûpelê ji cache jê bibe (forma ku niha xuya dike naguherîne)."
});
clearCacheBtn.on("click", function () {
formCache.Set({});
mw.notify("Cache hate paqijkirin.", { type: "success", tag: "wiktku-cache-clear" });
});
footer.append(clearCacheBtn.$element);
// ── Preview checkboxes ───────────────────────────────────────────────
// Wikitext preview (raw text panel)
var previewCheck = $("<input type='checkbox' id='wiktku-preview-toggle'>");
var previewLabel = $("<label for='wiktku-preview-toggle'></label>")
.text(" Pêşdîtina wîkîtekstê");
var previewPanel = $("<pre id='wiktku-preview-panel'></pre>").hide();
// Live rendered preview (parsed HTML panel, same logic as AjaxEdit).
// Not available on mobile — API polling causes too many problems on small screens.
var livePreviewCheck = null;
var livePreviewPanel = null;
if (!isMobile) {
livePreviewCheck = $("<input type='checkbox' id='wiktku-live-preview-toggle'>");
livePreviewPanel = $("<div id='wiktku-live-preview-panel'></div>").hide();
}
// Container that holds both panels and switches between stacked / side-by-side.
var previewContainer = $("<div id='wiktku-preview-container'></div>");
previewContainer.append(previewPanel);
if (!isMobile) previewContainer.append(livePreviewPanel);
var previewTimer = null;
var livePreviewIntervalId = -1;
var livePreviewActive = false; // guards in-flight fetches after uncheck
/** Rebuilds wikitext preview if its checkbox is checked. */
function schedulePreview() {
if (!previewCheck.prop("checked")) return;
clearTimeout(previewTimer);
// Debounce: wait 400 ms after the last keystroke before rebuilding.
previewTimer = setTimeout(function () {
getWikitext(function (wikitext) {
previewPanel.text(wikitext).show();
updatePanelLayout();
});
}, 400);
}
/** Fetches parsed HTML and populates the live preview panel. */
function loadLivePreview() {
getWikitext(function (wikitext) {
new mw.Api().parse(wikitext, { title: mw.config.get("wgPageName") }).done(function (html) {
// Discard result if the user unchecked while the fetch was in flight.
if (!livePreviewActive) return;
livePreviewPanel.html(html).show();
updatePanelLayout();
});
});
}
/** Adjusts panel widths depending on which previews are visible. */
function updatePanelLayout() {
var wikitextVisible = previewCheck.prop("checked");
var liveVisible = livePreviewCheck && livePreviewCheck.prop("checked");
if (wikitextVisible && liveVisible) {
// Side by side — each panel takes roughly half the available width.
previewPanel.css({ "flex": "1 1 45%", "min-width": "280px" });
livePreviewPanel.css({ "flex": "1 1 45%", "min-width": "280px" });
} else {
// Full width for whichever is visible — only touch panels that are
// actually shown so that setting flex doesn't override display:none.
if (wikitextVisible) previewPanel.css({ "flex": "1 1 100%", "min-width": "" });
if (liveVisible && livePreviewPanel) livePreviewPanel.css({ "flex": "1 1 100%", "min-width": "" });
}
}
previewCheck.on("change", function () {
if ($(this).prop("checked")) {
schedulePreview();
} else {
clearTimeout(previewTimer);
previewPanel.hide();
updatePanelLayout();
}
});
if (!isMobile) {
livePreviewCheck.on("change", function () {
if ($(this).prop("checked")) {
livePreviewActive = true;
livePreviewPanel.show();
loadLivePreview();
livePreviewIntervalId = setInterval(loadLivePreview, 500);
} else {
livePreviewActive = false;
clearInterval(livePreviewIntervalId);
livePreviewIntervalId = -1;
livePreviewPanel.hide().empty();
updatePanelLayout();
}
});
}
// Listen on all input/change events on the form and update both previews.
startForm.on("input change", function () {
schedulePreview();
});
footer.append($("<span style='margin-left:1em'></span>")
.append(previewCheck).append(previewLabel));
if (!isMobile) {
var livePreviewLabel = $("<label for='wiktku-live-preview-toggle'></label>")
.text(" Pêşdîtina zindî");
footer.append($("<span style='margin-left:1em'></span>")
.append(livePreviewCheck).append(livePreviewLabel));
}
startForm.append(footer);
$("#editform").hide().before(startForm);
// Insert preview container (holds both panels) after the form.
startForm.after(previewContainer);
// One pass over the whole form: every select that hasn't already been
// initialised, and isn't opted out with .wiktku-plain-select, gets
// the searchable picker.
initSelects(startForm);
refresh();
// Give every draggable textarea a custom resize grip (works
// consistently on Safari/iOS, unlike the native corner grip — see
// the "Manual drag-to-resize handle" comment in styles.css), and
// keep applying it to textareas added later on (new sense blocks,
// quote-source fields, nimûne rows, …).
wiktkuInitManualResize(startForm);
new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
$(mutation.addedNodes).each(function () {
if (this.nodeType !== 1) return;
wiktkuInitManualResize(this);
});
});
}).observe(startForm[0], { childList: true, subtree: true });
// Zimanan ji MediaWiki:Gadget-translation_editor.js/ziman.json bar bike.
// Kodên ku bi "-pro" diqedin û navên ku "zimanê destan" tê de heye
// tên derxistin.
// Pinned choices come from MediaWiki:Gadget-start.js/data.json (langChoices),
// already loaded into steps.lang.choices before build() runs.
var pinnedChoices = steps.lang.choices.slice();
var pinnedCodes = $.map(pinnedChoices, function (choice) { return choice.code; });
zimanJsonPromise.then(function (data) {
var page = data.query.pages[0];
var content = page &&
page.revisions &&
page.revisions[0].slots.main.content;
var zimanData;
try { zimanData = JSON.parse(content); } catch (e) { zimanData = {}; }
var extraChoices = [];
$.each(zimanData, function (code, name) {
// Filter: skip proto-language codes and reconstructed langs.
if (/-pro$/i.test(code)) return;
if (/ziman[eê]\s+destan/i.test(name)) return;
// Skip codes already in the pinned list (they are handled above).
if (pinnedCodes.indexOf(code) !== -1) return;
var choice = { code: code, label: name, sortKey: name };
extraChoices.push(choice);
langsByCode[code] = choice;
});
// Populate langsByCode for pinned choices too.
$.each(pinnedChoices, function (i, choice) {
// Ensure pinned choices have a sortKey.
if (choice.sortKey === undefined) choice.sortKey = choice.label;
langsByCode[choice.code] = choice;
});
// Sort the extra choices alphabetically by sort key.
extraChoices.sort(function (a, b) {
return a.sortKey.localeCompare(b.sortKey, userLang);
});
// Final list: pinned first, then the rest.
var allChoices = pinnedChoices.concat(extraChoices);
steps.lang.choices = allChoices;
steps.trans.keys = allChoices;
steps.dunde.keys = allChoices;
steps.zarava.keys = getZaravaKeys(allChoices);
// Replacing the option list only needs a wiktku:refresh so each
// picker re-reads its <option>s.
var langMenu = $("#wiktku-start-lang-field");
populateMenus(langMenu, steps.lang.choices);
langMenu.trigger("wiktku:refresh");
var transMenus = $("#wiktku-start-trans .wiktku-start-step-keyfield");
populateMenus(transMenus, steps.trans.keys, getDisabledKeys(steps.trans));
transMenus.trigger("wiktku:refresh");
var dundeMenus = $("#wiktku-start-dunde .wiktku-start-step-keyfield");
populateMenus(dundeMenus, steps.dunde.keys, getDisabledKeys(steps.dunde));
dundeMenus.trigger("wiktku:refresh");
var zaravaMenus = $("#wiktku-start-zarava .wiktku-start-step-keyfield");
populateMenus(zaravaMenus, steps.zarava.keys, getDisabledKeys(steps.zarava));
zaravaMenus.trigger("wiktku:refresh");
// Now that the full language list is loaded, silently restore any
// draft the editor previously saved for this page
var cachedDraft = formCache.Get();
if (cachedDraft && cachedDraft.sections && cachedDraft.sections.length) {
restoreFromCache(cachedDraft);
}
});
}
mw.loader.using(["oojs-ui-core"], function () {
// Load metadata, langChoices, posChoices and tplDefs from the companion
// data page so they can be updated without touching this script.
// (Request was already fired via metaApiPromise above, in parallel
// with this module load — we're just picking up the result here.)
metaApiPromise.then(function (data) {
var page = data.query.pages[0];
var content = page &&
page.revisions &&
page.revisions[0].slots.main.content;
var d;
try { d = JSON.parse(content); } catch (e) { d = {}; }
// Populate metadata.
if (d.metadata) $.extend(metadata, d.metadata);
// Populate gender labels.
if (d.genderLabels) $.extend(GENDER_BASE_LABELS, d.genderLabels);
// Populate lang choices (pinned list used by build() → ziman.json loader).
// data.json stores these as a plain {code: label} object.
if (d.langChoices) steps.lang.choices = choicesFromObject(d.langChoices, true);
// Populate POS choices — also a plain {code: label} object in data.json.
if (d.posChoices) steps.pos.choices = choicesFromObject(d.posChoices, false);
// Populate template definitions for the dfn sense-block builder.
if (d.tplDefs) steps.dfn.tplDefs = d.tplDefs;
// Populate pos placeholder examples.
if (d.posExamples) steps.dfn.posExamples = d.posExamples;
// Populate citation template definitions for the quote widget.
if (d.jederDefs) steps.dfn.jederDefs = d.jederDefs;
// Populate pronunciation and etymology template insert lists.
if (d.pronTpls) {
steps.pron.pronTpls = d.pronTpls;
steps.pron.refreshTplSelect();
}
if (d.etymTpls) {
steps.etym.etymTpls = d.etymTpls;
steps.etym.refreshTplSelect();
}
// Sync trans/dunde/zarava keys with the (now populated) lang choices.
steps.trans.keys = steps.lang.choices;
steps.dunde.keys = steps.lang.choices;
steps.zarava.keys = getZaravaKeys(steps.lang.choices);
}).always(build);
});
});
//</nowiki>
9jsjfap2dq3ti92xxzpuyz78ze4zx5c
6292074
6292062
2026-07-29T20:19:51Z
Wikihez
7344
6292074
javascript
text/javascript
// Li ser [[vi:MediaWiki:Gadget-start.js]] hatiye refaktorkirin.
// implicit dependencies: StorageUtils (ObjectStorage)
//<nowiki>
$(function () {
if (window.location.href.includes("editintro=User:Wikihez/creation/intro")) {
return; // Do not run the script wextê WF:Bilez dişuxile
}
var ns = mw.config.get("wgNamespaceNumber");
if (ns &&
!(ns === 2 && mw.config.get("wgPageName").match(/\/ceribandin$|\/test$/))) {
return;
}
var action = mw.config.get("wgAction");
var pageExists = !!mw.config.get("wgArticleId");
var addLangMode = pageExists && mw.util.getParamValue("wiktkuaddlang") === "1";
if (action === "view" && pageExists) {
var targetContainer;
var skin = mw.config.get('skin');
if (skin === 'vector-2022') {
targetContainer = 'p-cactions';
} else if (skin === 'vector') {
targetContainer = 'p-tb';
} else {
targetContainer = 'p-views';
}
mw.util.addPortletLink(targetContainer,
mw.util.getUrl(mw.config.get("wgPageName"), { action: "submit", wiktkuaddlang: "1" }),
"+Ziman/beşeke din", "ca-wiktku-addlang",
"Ji vê rûpelê re ziman an jî beşeke nû zêde bike");
return;
}
if (!(action === "edit" || action === "submit")) {
return;
}
if (!addLangMode && !$(".mw-newarticletext, .mw-newarticletextanon").length) {
return;
}
mw.notify(
"Amûr dest pê dike, hinek bisekinin.\nNot: jkx Sentaks (Syntax highlighting) neaktîv bikin",
{ type: "info", tag: "wiktku-start-notice", autoHide: true, autoHideSeconds: 10 }
);
var dataJsonPromise, zimanJsonPromise;
var metaApiPromise = mw.loader.using("mediawiki.api").then(function () {
var metaApi = new mw.Api();
dataJsonPromise = metaApi.get({
action: "query",
prop: "revisions",
titles: "MediaWiki:Gadget-start.js/data.json",
rvprop: "content",
rvslots: "main",
formatversion: 2
});
zimanJsonPromise = metaApi.get({
action: "query",
prop: "revisions",
titles: "Bikarhêner:Wikihez/test.json",
rvprop: "content",
rvslots: "main",
formatversion: 2
});
return dataJsonPromise;
});
function capitalize(str) {
if (!str) return str;
return str[0].toUpperCase() + str.substr(1);
}
function decapitalize(str) {
if (!str) return str;
return str[0].toLowerCase() + str.substr(1);
}
function escapeRegExp(str) {
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
function langHeaderSource(codePattern) {
return "\n?==\\s*\\{\\{\\s*ziman\\s*\\|\\s*(" + codePattern + ")\\s*\\}\\}\\s*==";
}
function findLangHeader(text, code) {
var m = new RegExp(langHeaderSource(escapeRegExp(code))).exec(text);
return m ? { index: m.index, match: m[0] } : null;
}
function stripWikilinks(str) {
return str.replace(/\[\[([^\]|]+)(?:\|([^\]]+))?\]\]/g, function (m, target, display) {
return display || target;
});
}
function splitTercimeIzah(mane) {
var m = /^([\s\S]*?)\s*\{\{îzah\|([\s\S]*)\}\}\s*$/.exec(mane || "");
return m ? { tercime: m[1], izah: m[2] } : null;
}
function insertAtCursor(el, text) {
var start = el.selectionStart;
var end = el.selectionEnd;
var val = el.value;
el.value = val.slice(0, start) + text + val.slice(end);
var pos = start + text.length;
el.selectionStart = el.selectionEnd = pos;
}
var catSrcTemplates = null;
var catSrcTemplatesPromise = null;
function fetchCatSrcTemplates() {
if (catSrcTemplatesPromise) return catSrcTemplatesPromise;
catSrcTemplatesPromise = new mw.Api().get({
action: "query",
list: "categorymembers",
cmtitle: "Kategorî:Çavkanî",
cmnamespace: 10,
cmlimit: "max",
formatversion: 2
}).then(function (data) {
var members = (data.query && data.query.categorymembers) || [];
catSrcTemplates = $.map(members, function (m) {
// Pêşgira navî ya "Şablon:" rake.
return m.title.replace(/^[^:]+:/, "");
});
catSrcTemplates.sort(function (a, b) { return a.localeCompare(b, userLang); });
return catSrcTemplates;
}, function () {
catSrcTemplates = [];
return catSrcTemplates;
});
return catSrcTemplatesPromise;
}
var pageName = mw.config.get("wgPageName").replaceAll(/_/g, " ");
if (ns) pageName = pageName.replace(/.*\//, "");
var pageNameRe = escapeRegExp(pageName);
var userLang = mw.config.get("wgUserLanguage");
var formCache = new ObjectStorage("wiktku_start_draft_" + mw.config.get("wgPageName"), 1);
var isMobile = !!mw.config.get("wgMFMode") || window.matchMedia("(pointer: coarse)").matches;
var FOLD_EXTRA = {
"ı": "i", // dotless i
"ø": "o", // o with stroke
"đ": "d", // d with stroke
"ð": "d", // eth
"ə": "e", // schwa
"ħ": "h", // h with stroke
"ł": "l", // l with stroke
"ŋ": "n", // eng
"ʉ": "u", // u bar
"ɨ": "i", // i bar
"ʒ": "z", // ezh
"ɛ": "e", // open e
"ɔ": "o", // open o
"æ": "ae",
"œ": "oe",
"ß": "ss",
"þ": "th" };
function foldDiacritics(str) {
if (str === null || str === undefined) return "";
var s = String(str).toLowerCase();
if (typeof s.normalize === "function") {
// Split "î" into "i" + combining circumflex, then drop the accent.
s = s.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
}
return s.replace(/[^\u0000-\u007f]/g, function (ch) {
return Object.prototype.hasOwnProperty.call(FOLD_EXTRA, ch) ? FOLD_EXTRA[ch] : ch;
});
}
var WIKTKU_RESIZE_STORAGE_PREFIX = "wiktku_resize_height_";
/** Textareas of the same "kind" (e.g. every Nimûne box, every Tercime
* box) share a class list even though each individual box is a fresh
* DOM node built on the fly (new sense blocks, quote fields, …) with
* no stable id of its own. That class list is what we key the cached
* height on, so a size chosen for one Nimûne box is reused for every
* Nimûne box, on this page and on the next one. */
function wiktkuResizeStorageKey(textarea) {
var cls = (textarea.attr("class") || "").trim().replace(/\s+/g, "_");
return WIKTKU_RESIZE_STORAGE_PREFIX + cls;
}
function wiktkuSaveResizeHeight(textarea, height) {
if (!(window.mw && mw.storage)) return;
try {
mw.storage.set(wiktkuResizeStorageKey(textarea), String(Math.round(height)));
} catch (e) { /* localStorage unavailable (private mode, quota, …) — skip caching */ }
}
function wiktkuLoadResizeHeight(textarea) {
if (!(window.mw && mw.storage)) return null;
try {
var v = mw.storage.get(wiktkuResizeStorageKey(textarea));
return v ? parseFloat(v) : null;
} catch (e) {
return null;
}
}
/** Replaces a textarea's native corner resize grip with a small custom
* drag handle (see the "Manual drag-to-resize handle" comment and
* .wiktku-resize-wrap / .wiktku-resize-grip in styles.css). Needed
* because iOS Safari never implements the native grip at all and
* desktop Safari's own version is inconsistent, so we replace it
* everywhere for uniform behaviour. One-line fields (.wiktku-start-narrow)
* are meant to stay a fixed height and are left untouched. Safe to call
* more than once on the same textarea. */
function wiktkuMakeManualResizable(textarea) {
textarea = $(textarea);
if (!textarea.is("textarea") || textarea.hasClass("wiktku-start-narrow")) return;
if (textarea.data("wiktkuResizableDone")) return;
textarea.data("wiktkuResizableDone", true);
textarea.wrap("<div class='wiktku-resize-wrap'></div>");
var grip = $("<div class='wiktku-resize-grip'></div>");
textarea.after(grip);
// Restore a previously chosen height for this kind of field, if any.
var cachedHeight = wiktkuLoadResizeHeight(textarea);
if (cachedHeight) {
var minHeightInit = parseFloat(textarea.css("min-height")) || 0;
textarea.css("height", Math.max(cachedHeight, minHeightInit) + "px");
}
var dragging = false, startY = 0, startHeight = 0;
function onPointerMove(e) {
if (!dragging) return;
var oe = e.originalEvent || e;
var minHeight = parseFloat(textarea.css("min-height")) || 0;
var newHeight = startHeight + (oe.clientY - startY);
textarea.css("height", Math.max(newHeight, minHeight) + "px");
}
function onPointerUp(e) {
if (!dragging) return;
dragging = false;
var oe = e.originalEvent || e;
try { grip[0].releasePointerCapture(oe.pointerId); } catch (err) { /* ignore */ }
$(document).off("pointermove", onPointerMove);
$(document).off("pointerup pointercancel", onPointerUp);
wiktkuSaveResizeHeight(textarea, textarea.outerHeight());
}
grip.on("pointerdown", function (e) {
var oe = e.originalEvent || e;
if (oe.button !== undefined && oe.button !== 0) return; // primary contact only
e.preventDefault();
dragging = true;
startY = oe.clientY;
startHeight = textarea.outerHeight();
try { grip[0].setPointerCapture(oe.pointerId); } catch (err) { /* ignore */ }
$(document).on("pointermove", onPointerMove);
$(document).on("pointerup pointercancel", onPointerUp);
});
}
/** Applies wiktkuMakeManualResizable to every eligible textarea already
* inside `context` (context itself, if it is a textarea, or any of its
* descendants). Used both for the initial form render and, via the
* MutationObserver set up in build(), for textareas added later on
* (new sense blocks, quote-source fields, nimûne rows, …). */
function wiktkuInitManualResize(context) {
var $context = $(context);
var $textareas = $context.is("textarea") ? $context : $context.find("textarea");
$textareas.each(function () {
wiktkuMakeManualResizable(this);
});
}
function wrapNativeSelect(select) {
var wrapper = $("<span class='wiktku-native-select-wrap'></span>");
if (select.prop("multiple")) {
return wrapper.append(select);
}
var placeholder = select.attr("data-placeholder") || "Lê bigere...";
select.hide();
var textInput = $("<input type='search' autocomplete='off'>")
.attr("placeholder", placeholder)
.attr("role", "combobox")
.attr("aria-autocomplete", "list")
.attr("aria-expanded", "false")
.addClass("wiktku-start-narrow wiktku-ac-input");
var resultsList = $("<ul class='wiktku-ac-results' role='listbox'></ul>").hide();
var allOptions = [];
var shown = [];
var activeIndex = -1;
function cacheOptions() {
allOptions = [];
select.find("option").each(function () {
var v = $(this).val();
var text = $(this).text();
// A blank value with no label (most selects' placeholder) is
// never a real choice, so skip it. But a blank value WITH a
// label -- e.g. tplSelect's "— yan jî şablonek hilbijêre —" --
// is a meaningful "clear the selection" choice, so keep it
// searchable/selectable like any other option.
if (!v && !text) return;
// Language options read "Name (code)" -- score the name on its own
// so the trailing code doesn't also count as a name match.
var name = text.replace(/\s*\([^()]*\)\s*$/, "");
allOptions.push({
value: v,
text: text,
disabled: $(this).prop("disabled"),
foldCode: foldDiacritics(v),
foldName: foldDiacritics(name),
foldText: foldDiacritics(text)
});
});
}
cacheOptions();
// True if `q` starts a word inside `name` ("kevn" in "ingiliziya kevn").
function startsWord(name, q) {
var from = 0, at;
while ((at = name.indexOf(q, from)) !== -1) {
if (at === 0 || /[\s\-\u2013\u2014(/,.]/.test(name.charAt(at - 1))) return true;
from = at + 1;
}
return false;
}
// Lower rank = better match.
// a code that *is* the query, or begins with it, always outranks a name
// that merely contains it -- so "ang" lists "Îngilîziya kevn (ang)"
// first instead of burying it among every name containing "ang".
var RANK_NONE = 99;
function rankOption(o, q) {
var code = o.foldCode, name = o.foldName;
if (code === q) return 0; // exact code
if (code.indexOf(q) === 0) return 1; // code prefix
if (name === q) return 2; // exact name
if (name.indexOf(q) === 0) return 3; // name prefix
if (startsWord(name, q)) return 4; // starts a word in the name
if (name.indexOf(q) !== -1) return 5; // name substring
if (code.indexOf(q) !== -1) return 6; // code substring
if (o.foldText.indexOf(q) !== -1) return 7; // anywhere else in the label
return RANK_NONE;
}
function positionList() {
// Position the list above or below depending on viewport space.
var inputRect = textInput[0].getBoundingClientRect();
var viewportH = window.innerHeight;
var spaceBelow = viewportH - inputRect.bottom - 8;
var spaceAbove = inputRect.top - 8;
var maxH = Math.min(224, Math.max(spaceBelow, spaceAbove)); // 224px = 14em
resultsList.css({
"max-height": maxH + "px",
"top": spaceBelow >= spaceAbove ? "100%" : "auto",
"bottom": spaceBelow >= spaceAbove ? "auto" : "100%"
});
}
function closeList() {
resultsList.hide();
textInput.attr("aria-expanded", "false");
activeIndex = -1;
}
function showResults(query) {
var q = foldDiacritics($.trim(query || ""));
resultsList.empty();
activeIndex = -1;
var matched = [];
if (q) {
$.each(allOptions, function (i, o) {
if (o.disabled) return;
var rank = rankOption(o, q);
if (rank !== RANK_NONE) matched.push({ opt: o, rank: rank, i: i });
});
if (!matched.length && q.indexOf(" ") !== -1) {
var tokens = q.split(/\s+/);
$.each(allOptions, function (i, o) {
if (o.disabled) return;
var all = true;
$.each(tokens, function (_, t) {
if (o.foldText.indexOf(t) === -1) { all = false; return false; }
});
if (all) matched.push({ opt: o, rank: 8, i: i });
});
}
matched.sort(function (a, b) {
if (a.rank !== b.rank) return a.rank - b.rank;
// Inside the code tiers the shorter code is the better hit:
// "an" -> "an" before "ang" before "ang-x-...".
if (a.rank <= 1 && a.opt.foldCode.length !== b.opt.foldCode.length) {
return a.opt.foldCode.length - b.opt.foldCode.length;
}
// Otherwise keep the menu's own order (pinned languages first).
return a.i - b.i;
});
} else {
$.each(allOptions, function (i, o) {
if (!o.disabled) matched.push({ opt: o, rank: 0, i: i });
});
}
shown = $.map(matched.slice(0, 50), function (m) { return m.opt; });
if (!shown.length) {
closeList();
return;
}
$.each(shown, function (idx, opt) {
var li = $("<li role='option'></li>")
.text(opt.text)
.attr("data-value", opt.value)
.attr("aria-selected", "false");
// touchend (not touchstart) so a scroll doesn't trigger a select.
var touchMoved = false;
li.on("touchstart", function () {
touchMoved = false;
});
li.on("touchmove", function () {
touchMoved = true;
});
li.on("touchend", function (e) {
if (touchMoved) return; // was a scroll, not a tap
e.preventDefault();
selectOption(opt.value, opt.text);
});
// mousedown (not click) so it beats the input's blur handler.
li.on("mousedown", function (e) {
e.preventDefault();
selectOption(opt.value, opt.text);
});
li.on("mouseenter", function () {
// Hovered items are already in view -- don't scroll the list
// under the mouse, or the shift can trigger the next item's
// mouseenter and cascade into a runaway scroll.
setActive(idx, /* scrollIntoView */ false);
});
resultsList.append(li);
});
positionList();
resultsList.show();
resultsList[0].scrollTop = 0;
textInput.attr("aria-expanded", "true");
}
function setActive(idx, scrollIntoView) {
var items = resultsList.children("li");
if (!items.length) return;
if (idx < 0) idx = items.length - 1;
if (idx >= items.length) idx = 0;
activeIndex = idx;
items.removeClass("wiktku-ac-active").attr("aria-selected", "false");
var li = items.eq(idx).addClass("wiktku-ac-active").attr("aria-selected", "true");
if (scrollIntoView === false) return;
// Keep the cursor visible inside the scrollable list -- only for
// keyboard navigation. A mouse-hovered item is already visible, so
// scrolling here would shift the list under a stationary pointer
// and cascade into further mouseenter events.
var ul = resultsList[0], el = li[0];
if (el.offsetTop < ul.scrollTop) {
ul.scrollTop = el.offsetTop;
} else if (el.offsetTop + el.offsetHeight > ul.scrollTop + ul.clientHeight) {
ul.scrollTop = el.offsetTop + el.offsetHeight - ul.clientHeight;
}
}
/** Puts the currently selected option's label back in the text box. */
function syncInputToSelect() {
var cur = select.val();
var match = null;
if (cur) {
$.each(allOptions, function (_, o) {
if (o.value === cur) { match = o; return false; }
});
}
textInput.val(match ? match.text : "");
}
function selectOption(value, text) {
textInput.val(text);
select.val(value);
closeList();
select.trigger("change");
}
textInput.on("input", function () {
showResults($(this).val());
});
textInput.on("focus", function () {
// Select the current label so typing replaces it, and open the full list
this.select();
showResults("");
});
textInput.on("click", function () {
if (!resultsList.is(":visible")) showResults($(this).val());
});
textInput.on("keydown", function (e) {
var open = resultsList.is(":visible");
switch (e.which) {
case 40: // Down
e.preventDefault();
if (!open) { showResults($(this).val()); setActive(0); }
else setActive(activeIndex + 1);
break;
case 38: // Up
e.preventDefault();
if (!open) { showResults($(this).val()); setActive(-1); }
else setActive(activeIndex - 1);
break;
case 13: // Enter -- must never submit the form while the list is open
if (open) {
e.preventDefault();
if (activeIndex >= 0 && shown[activeIndex]) {
selectOption(shown[activeIndex].value, shown[activeIndex].text);
} else if (shown.length === 1) {
selectOption(shown[0].value, shown[0].text);
}
}
break;
case 27: // Esc -- abandon the search, restore the real value
if (open) {
e.preventDefault();
closeList();
syncInputToSelect();
}
break;
case 9: // Tab -- commit the highlighted row on the way out
if (open && activeIndex >= 0 && shown[activeIndex]) {
selectOption(shown[activeIndex].value, shown[activeIndex].text);
}
closeList();
break;
}
});
textInput.on("blur", function () {
// Short delay so a touchstart/mousedown on a result fires first.
setTimeout(function () {
closeList();
// Half-typed text that never became a selection would otherwise sit
// in the box looking like a choice -- put the real value back.
syncInputToSelect();
}, 200);
});
// Re-caches the option list. Fired after ziman.json loads, after
// options are enabled/disabled, and after programmatic .val() changes.
select.on("wiktku:refresh", function () {
cacheOptions();
syncInputToSelect();
if (resultsList.is(":visible")) showResults(textInput.val());
});
wrapper.append(textInput).append(resultsList).append(select);
return wrapper;
}
/**
* Gives every plain <select> under `root` the searchable picker. Selects
* marked .wiktku-plain-select opt out, and the call is idempotent, so it is
* safe to re-run after new rows or sense blocks are inserted.
*/
function initSelects(root) {
$(root).find("select").addBack("select").not(".wiktku-plain-select").each(function () {
var sel = $(this);
if (sel.prop("multiple")) return;
if (sel.closest(".wiktku-native-select-wrap").length) return; // already wrapped
var marker = $("<span></span>").insertBefore(sel);
marker.replaceWith(wrapNativeSelect(sel));
});
}
var langsByCode = {};
// Populated from [[MediaWiki:Gadget-start.js/data.json]] at runtime.
var metadata = {};
var ZARAVA_LANG_CODES = ["ckb", "sdh", "lki", "hac", "zza"];
// Converts a {code: label} object (langChoices/posChoices in data.json)
// into the {code, label[, sortKey]} array the rest of the script uses.
// isLang: true adds a sortKey and shows "(code)" after the label —
// language choices only.
function choicesFromObject(obj, isLang) {
var result = [];
$.each(obj || {}, function (code, label) {
var choice = { code: code, label: label };
if (isLang) choice.sortKey = label;
result.push(choice);
});
return result;
}
function getZaravaKeys(choices) {
var byCode = {};
$.each(choices || [], function (_, c) { byCode[c.code] = c; });
var result = [];
$.each(ZARAVA_LANG_CODES, function (_, code) {
if (byCode[code]) result.push(byCode[code]);
});
return result;
}
function needsTransliteration(langCode) {
var meta = metadata[langCode];
if (!meta || !meta.sc) return false;
var scripts = Array.isArray(meta.sc) ? meta.sc : [meta.sc];
return scripts.length > 0 && scripts[0] !== "Latn";
}
// Kodên cinsiyetê yên di metadata.g de — ji data.json tê dagirtin
var GENDER_BASE_LABELS = {};
// Sub-lists that only make sense for a plain (non-şablon) sense — hidden
// when a şablon (e.g. {{guharto|…}}) is chosen for that sense
var HIDDEN_ON_TPL_GROUPS = [
"wiktku-dfn-alternativ",
"wiktku-dfn-hevmane",
"wiktku-dfn-dijmane",
"wiktku-dfn-koordine",
"wiktku-dfn-jornav",
"wiktku-dfn-jernav"
];
function genderLabel(code) {
if (code === "p") return "Pirjimar";
var pluralMatch = code.match(/^(.+)-p$/);
if (pluralMatch && GENDER_BASE_LABELS[pluralMatch[1]]) {
return GENDER_BASE_LABELS[pluralMatch[1]] + " (pirjimar)";
}
return GENDER_BASE_LABELS[code] || code;
}
// True if a sense has content beyond mane worth keeping (etîket, word
// lists, nimûne, jêder) — so it's still emitted with {{mane?}} if empty.
function senseHasExtraContent(s) {
if (s.etiket && $.grep(s.etiket, function (e) { return $.trim(e) !== ""; }).length) return true;
if (s.kategori && $.grep(s.kategori, function (k) { return $.trim(k) !== ""; }).length) return true;
if (s.alternativ.length || s.hevmane.length || s.dijmane.length ||
s.koordine.length || s.jornav.length || s.jernav.length) return true;
if (s.nimune && $.grep(s.nimune, function (n) {
return (typeof n === "object" ? n.text : n) !== "";
}).length > 0) return true;
if (senseHasJeder(s)) return true;
return false;
}
// Bolds the *first* occurrence of the page name (plus any letters
// glued directly onto it, e.g. a plural "s") inside nimûne/jêgirtin
// text — "apple"/"Apple"/"apples"/"Apples" all match (case-insensitive),
// but only the first hit is wrapped, not every one in the text.
function boldPageNameOnce(text) {
if (!text || !pageNameRe) return text;
var re = new RegExp("(" + pageNameRe + "([^( |,|;|\\?|\\.|\\!)]+)?)", "i");
return text.replace(re, "'''$1'''");
}
// Converts literal line breaks typed into a nimûne/jêgirtin box into
// wikitext <br> tags, so a pasted/typed newline doesn't break the
// surrounding "#:"/"#*" wikitext list syntax on output.
function nlToBr(text) {
return text ? text.replace(/\r\n|\r|\n/g, "<br>") : text;
}
function escapeHtmlForBackdrop(str) {
return String(str)
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">");
}
// Mirrors a textarea's text, with a small highlighted marker placed
// right after each line that's followed by an actual typed/pasted
// linebreak. Rendered into a transparent backdrop layer behind the
// textarea (see ensureLinebreakBackdrop()), so only the point of the
// break is marked instead of the whole box.
function buildLinebreakBackdropHtml(text) {
var lines = text.split(/\r\n|\r|\n/);
return $.map(lines, function (line, i) {
var isLast = i === lines.length - 1;
return escapeHtmlForBackdrop(line) +
(isLast ? "" : "<mark class='wiktku-linebreak-mark'>↵</mark>\n");
}).join("");
}
// Copies the metrics that affect where text wraps/lands (font, line
// height, padding, border) from the real textarea onto its backdrop,
// via computed style rather than shared CSS classes — most of the
// box's own rules are written as "textarea.foo", which a <div> with
// the same class wouldn't match. Re-run on every update in case a
// responsive breakpoint changed the textarea's own font-size.
function syncLinebreakBackdropMetrics(textarea, backdrop) {
var cs = window.getComputedStyle(textarea[0]);
backdrop.css({
"box-sizing": cs.boxSizing,
"padding-top": cs.paddingTop,
"padding-right": cs.paddingRight,
"padding-bottom": cs.paddingBottom,
"padding-left": cs.paddingLeft,
"border-width": cs.borderWidth,
"border-style": "solid",
"font-family": cs.fontFamily,
"font-size": cs.fontSize,
"font-weight": cs.fontWeight,
"line-height": cs.lineHeight,
"letter-spacing": cs.letterSpacing
});
}
// Lazily wraps a textarea in its own positioning anchor (independent
// of .wiktku-resize-wrap, so this doesn't depend on load order versus
// wiktkuMakeManualResizable) and inserts the transparent backdrop
// layer used to mark the exact point of a linebreak. Safe to call
// more than once on the same textarea — the backdrop is cached.
function ensureLinebreakBackdrop(textarea) {
var existing = textarea.data("wiktkuLinebreakBackdrop");
if (existing) return existing;
textarea.wrap("<div class='wiktku-linebreak-wrap'></div>");
var backdrop = $("<div aria-hidden='true'></div>").addClass("wiktku-linebreak-backdrop");
textarea.before(backdrop);
textarea.data("wiktkuLinebreakBackdrop", backdrop);
textarea.on("scroll.wiktkuLinebreak", function () {
backdrop.scrollTop(textarea.scrollTop()).scrollLeft(textarea.scrollLeft());
});
return backdrop;
}
// Flags a nimûne/jêgirtin textarea (via CSS class, for the border
// tint + tooltip) while it contains a typed/pasted linebreak, so the
// user notices before it's silently turned into <br> on output.
// Marks only the exact point of the break via a mirrored backdrop,
// rather than tinting the whole box.
function highlightLinebreak(el) {
var textarea = $(el);
var text = textarea.val();
var hasBreak = /\r|\n/.test(text);
textarea
.toggleClass("wiktku-has-linebreak", hasBreak)
.attr("title", hasBreak ? "Xeta nû dê wek <br> bê nivîsandin" : "");
if (!hasBreak) {
var cached = textarea.data("wiktkuLinebreakBackdrop");
if (cached) cached.hide();
textarea.removeClass("wiktku-has-linebreak-source");
return;
}
var backdrop = ensureLinebreakBackdrop(textarea);
textarea.addClass("wiktku-has-linebreak-source");
syncLinebreakBackdropMetrics(textarea, backdrop);
backdrop.html(buildLinebreakBackdropHtml(text)).show();
backdrop.scrollTop(textarea.scrollTop()).scrollLeft(textarea.scrollLeft());
}
// Each nimûne item can be { text, tr, t }: text, transliteration, translation.
function formatNimune(nimunes, lang, hasJeder) {
var hasNimune = nimunes && $.grep(nimunes, function (n) {
return (typeof n === "object" ? n.text : n) !== "";
}).length > 0;
if (!hasNimune) {
return hasJeder ? "" : "\n#* {{nimûne?|" + lang + "}}";
}
return $.map(nimunes, function (n) {
var text = typeof n === "object" ? n.text : n;
if (!text) return undefined;
var bolded = nlToBr(boldPageNameOnce(text));
var tpl = "\n#: {{nm|" + lang + "|" + bolded;
if (typeof n === "object") {
if (n.tr) tpl += "|tr=" + nlToBr(n.tr);
// Translation as third positional param (no key needed).
if (n.t) tpl += "|" + nlToBr(n.t);
}
// Short examples fit on one line together with their translation.
// rêz=1 is not used for ku — definitions are shown on separate lines there.
if (text.length < 60 && lang !== "ku") tpl += "|rêz=1";
tpl += "}}";
return tpl;
}).join("");
}
// Formats jêder (citation) entries into "#* {{jêder…|…}}" lines; skips
// entries with no quote text. Falls back to the generic {{jêder}}
// template when no specific template was chosen.
function formatJeder(jederList, lang) {
if (!jederList || !jederList.length) return "";
return $.map(jederList, function (jeder) {
if (!jeder || !jeder.quote) return undefined;
var quote = nlToBr(boldPageNameOnce(jeder.quote));
var quoteTr = nlToBr(jeder.quoteTr);
var quoteT = nlToBr(jeder.quoteT);
if (jeder.jederTpl) {
var cite = "\n#* {{" + jeder.jederTpl + "|" + lang;
cite += "|jêgirtin=" + quote;
if (quoteTr) cite += "|tr=" + quoteTr;
if (quoteT) cite += "|tercime=" + quoteT;
$.each(jeder.jêderFields || {}, function (key, val) {
if (val) cite += "|" + key + "=" + val;
});
cite += "}}";
return cite;
}
var out = "\n#* {{jêder|" + lang + "|jêgirtin=" + quote;
if (quoteTr) out += "|tr=" + quoteTr;
if (quoteT) out += "|tercime=" + quoteT;
// A şablon picked from Kategorî:Çavkanî is transcluded as the
// source param (e.g. |{{Kovara X}}); manual text is used as-is.
var srcParam = jeder.jederCatTpl ? ("{{" + jeder.jederCatTpl + "}}") :
(jeder.jederManual ? jeder.jederManual : "çavkanî?");
// A positional param containing "=" gets parsed as its own key=value
// pair by MediaWiki and breaks the template, so force it to be
// explicitly named (|2=) whenever that's the case.
out += (srcParam.indexOf("=") !== -1 ? "|2=" : "|") + srcParam;
out += "}}";
return out;
}).join("");
}
// True if a sense has at least one jêder entry with quote text.
function senseHasJeder(sense) {
return !!(sense.jeder && $.grep(sense.jeder, function (j) {
return j && j.quote;
}).length > 0);
}
// Builds "{{tplName|lang|part1|part2|…}}" from a sense field (kategori,
// etiket), wrapped inline (" {{…}} ") or on its own line ("\n#: {{…}}").
function buildSenseTpl(sense, field, lang, tplName) {
if (!sense[field] || !sense[field].length) return "";
var parts = sense[field].map(function (p) { return $.trim(p); })
.filter(function (p) { return p !== ""; });
if (!parts.length) return "";
var call = "{{" + tplName + "|" + lang + "|" + parts.join("|") + "}}";
return call
}
/**
* Assembles the nimûne + jêder wikitext block for a sense. Shared by
* both the template-sense and normal-mane-sense branches below.
*/
function buildCite(sense, lang) {
return formatNimune(sense.nimune, lang, senseHasJeder(sense)) +
formatJeder(sense.jeder, lang);
}
function makeWordListStep(id, name, question_fmt) {
return {
id: id,
name: name,
question_fmt: question_fmt,
multiple: true,
narrow: true,
placeholder: "Kelîme…",
visible: function (values) {
return values.lang && values.pos;
},
output: function (values) {
var words = $.grep(values[id] || [], function (w) { return !!w; });
var header = capitalize(name);
if (!words.length) return "";
var lang = values.lang;
var section = "\n==== " + header + " ====\n";
var params = "cure=" + header + "\n" +
$.map(words, function (w) {
return "|" + w;
}).join("\n");
return section +
"{{kol3|" + lang + "|" + params + "\n}}\n";
} };
}
var steps = {
lang: {
id: "lang",
required: true,
name: "ziman",
question_fmt: '"' + pageName + '" bi çi zimanî ye?',
question_br: true,
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (langChoices).
choices: [],
output: function (values) {
if (addLangMode){
return "\n== {{ziman|" + values.lang + "}} ==\n";
}else {
return "== {{ziman|" + values.lang + "}} ==\n";
}
} },
pron: {
id: "pron",
name: "bilêvkirin",
question_fmt: '"' + pageName + '" çawa tê telafûzkirin?',
// pronTpls populated from data.json
pronTpls: {},
visible: function (values) {
if (!values.lang) return false;
// addLangMode: skip pron only if this lang already has a section.
if (addLangMode) {
// Clearing the page makes existing content irrelevant.
var clearPageCheck = $("#wiktku-clear-page-check");
if (clearPageCheck.length && clearPageCheck.prop("checked")) {
return true;
}
var existing = $("#wpTextbox1").val() || "";
return !findLangHeader(existing, values.lang);
}
return true;
},
// Fills the insert-dropdown from pronTpls, filtered by language.
refreshTplSelect: function () {
var sel = $("#wiktku-start-pron .wiktku-tpl-insert-select");
if (!sel.length) return;
var lang = getValues().lang || "";
sel.find("option[value!='']").remove();
$.each(steps.pron.pronTpls, function (name, tpl) {
// Filter: if tpl.langs exists, only show if lang is in that list; otherwise show always
var allowed = !tpl.langs || tpl.langs.indexOf(lang) !== -1;
if (allowed) {
sel.append($("<option></option>")
.val(tpl.snippet)
.text(name + " — " + tpl.desc)
.attr("data-nolang", tpl.noLang ? "1" : ""));
}
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-pron-wrap").length) return null;
var wrap = $("<div class='wiktku-pron-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-pron-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-pron-text")
.attr("rows", 4)
.attr("placeholder", "Nimûne: {{IPA|ku|/pɛɪ̯n/}} yan {{kîte|ku|he|ce|ki|rin}}");
// Template insert dropdown — filtered by language.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike ");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
var lang = getValues().lang || "";
$.each(steps.pron.pronTpls, function (name, tpl) {
// Filter: if tpl.langs exists, only show if lang is in that list; otherwise show always
var allowed = !tpl.langs || tpl.langs.indexOf(lang) !== -1;
if (allowed) {
sel.append($("<option></option>")
.val(tpl.snippet)
.text(name + " — " + tpl.desc)
.attr("data-nolang", tpl.noLang ? "1" : ""));
}
});
sel.on("change", function () {
var snippet = $(this).val();
if (!snippet) return;
var lang = getValues().lang || "";
// Check if the selected option has noLang flag
var selectedOption = sel.find("option:selected");
var hasNoLang = selectedOption.attr("data-nolang") === "1";
if (!hasNoLang) {
snippet = snippet.replace(/CODE/g, lang).replace(/SOURCELANG/g, "?");
}
insertAtCursor(ta[0], snippet);
$(this).val("");
// Clear the picker's search box
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel).append(ta);
stepDiv.append(wrap);
initSelects(wrap);
return ta;
},
output: function () {
var text = $.trim($("#wiktku-start-pron .wiktku-pron-text").val());
if (!text) return "";
var lines = text.split("\n");
var out = $.map(lines, function (line) {
line = $.trim(line);
if (!line) return undefined;
return line;
}).join("\n");
return "\n=== Bilêvkirin ===\n" + out + "\n";
} },
pos: {
id: "pos",
required: true,
name: "Cureyê rêzimanî",
question_fmt: 'Cureyê rêzimanî yê "' + pageName + '" çi ye?',
visible: function (values) {
return values.lang;
},
question_br: true,
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (posChoices).
choices: [],
output: function (values) {
var pos = values.pos || "";
var cinsiyet = values.cinsiyet || ""; // from the cinsiyet step
var lekTur = values.lektur || ""; // from the lêker transitivity step
var capitalizedPos = capitalize(pos);
var outputString = "\n=== " + capitalizedPos + " ===\n";
// Add ku-tewîn-nav for single-word navdêr/serenav with known gender.
if (!pageName.includes(" ") && cinsiyet && GENDER_BASE_LABELS[cinsiyet] &&
(pos === "navdêr" || pos === "serenav") && values.lang === "ku") {
outputString += "{{ku-tewîn-nav|" + pageName + "|" + GENDER_BASE_LABELS[cinsiyet];
if (pos === "serenav") outputString += "|y";
outputString += "}}\n";
}
outputString += "{{" + pos + "|" + values.lang;
if (pos === "navdêr" || pos === "serenav") {
if (cinsiyet) {
outputString += "|c=" + cinsiyet;
} else if (values.lang === "ku") {
outputString += "|c=?";
}
} else if (/^lêker/.test(pos) && lekTur) {
outputString += "|c=" + lekTur;
}
if (values.tr) {
outputString += "|tr=" + values.tr;
}
outputString += "}}\n";
return outputString;
}
},
// cinsiyet (gender) — shown for navdêr/serenav only, with choices built
// from metadata[lang].g since not every language has grammatical gender.
cinsiyet: {
id: "cinsiyet",
name: "cinsiyet",
question_fmt: 'Cinsiyeta "' + pageName + '" çi ye?',
question_br: true,
visible: function (values) {
var meta = metadata[values.lang];
return !!(values.lang && (values.pos === "navdêr" || values.pos === "serenav") &&
meta && meta.g && meta.g.length);
},
build: function (stepDiv, values) {
var select = stepDiv.find("select.wiktku-start-step-field");
if (!select.length) {
select = $(mw.html.element("select", {
"class": "wiktku-start-step-field wiktku-plain-select",
id: "wiktku-start-cinsiyet-field" }));
stepDiv.append(select);
}
if (!values) return select;
var meta = metadata[values.lang];
var codes = (meta && meta.g) || [];
var prevVal = select.val();
var choices = $.map(codes, function (code) {
return [{ code: code, label: genderLabel(code) }];
});
populateMenus(select, choices, null, "Cinsiyetê hilbijêre");
if ($.grep(choices, function (c) { return c.code === prevVal; }).length) {
select.val(prevVal);
}
return select;
},
output: function () { return ""; } // consumed by pos.output
},
// Lêker transitivity
lektur: {
id: "lektur",
name: "Cureyê lêkerê (fiîlê)",
question_fmt: "Cureyê lêkerê (fiîlê) çi ye?",
question_br: true,
visible: function (values) {
return values.lang && values.pos && /^lêker/.test(values.pos);
},
choices: [
{ code: "gh", label: "gerguhêz" },
{ code: "x-gh", label: "xwerû-gerguhêz" },
{ code: "p-gh", label: "pêkhatî-gerguhêz" },
{ code: "h-gh", label: "hevedudanî-gerguhêz" },
{ code: "b-gh", label: "biwêjî-gerguhêz" },
{ code: "ngh", label: "negerguhêz" },
{ code: "x-ngh", label: "xwerû-negerguhêz" },
{ code: "p-ngh", label: "pêkhatî-negerguhêz" },
{ code: "h-ngh", label: "hevedudanî-negerguhêz" },
{ code: "b-ngh", label: "biwêjî-negerguhêz" } ],
output: function () { return ""; } // consumed by pos.output
},
tr: {
id: "tr",
name: "transliterasyon",
question_fmt: "Transliterasyona vê kelîmeyê",
multiple: false,
narrow: true,
visible: function (values) {
return values.lang && values.pos && needsTransliteration(values.lang);
} },
dfn: {
id: "dfn",
name: "Mane",
question_fmt: function (values) {
var base = "Maneya kelîmeyê binivîse. Mane otomatîk tê lînkkirin!";
if (values.lang === "ku") {
return base + " Ji bo tercimeyan beşa 'Werger' bi kar bîne!";
}
return base;
},
multiple: true,
ordered: true,
rows: 3,
visible: function (values) {
return values.lang && values.pos;
},
example: function (values) {
// posExamples loaded from [[MediaWiki:Gadget-start.js/data.json]].
var examples = steps.dfn.posExamples || {};
var full = values.pos || "";
return examples[full] || "";
},
// Builds one sense block (<li>): mane textarea, nimûne list, and
// sub-lists for alternatîv/hevmane/dijmane/etc.
buildSenseBlock: function (stepDiv) {
var block = $("<li class='wiktku-dfn-sense'></li>");
// — Mane textarea (declared first so the template handler can reference it) —
var dfnArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-mane-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-start-step-field wiktku-dfn-mane")
.attr("rows", 6)
.attr("placeholder", "Mane…");
dfnArea.on("input", function () {
steps.dfn.onDfnInput(stepDiv, block, this);
});
// — Tercime + Îzah boxes (non-ku alternative to the plain mane box) —
// Non-ku entries get a direct translation plus a {{îzah|…}}-wrapped
// gloss instead of a Kurdish-style gloss. Rather than teach every
// consumer (getSenses/getOutput/linkify) a second data shape, these
// boxes just write their combined text into dfnArea and re-fire its
// "input" event, so dfnArea stays the single source of truth.
var tercimeArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-tercime-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-dfn-subfield wiktku-dfn-tercime")
.attr("rows", 2)
.attr("placeholder", "Tercimeyên rasterast ên kurmancî… Ji bo school-a îngilîzî li vir 'mekteb, medrese' binivîse");
var izahArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-izah-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-dfn-subfield wiktku-dfn-izah")
.attr("rows", 3)
.attr("placeholder", "Îzaha kurmancî… Ji bo school-a îngilîzî li vir 'cihê tehsîlgirtinê' binivîse");
var nonKuWrap = $("<div class='wiktku-dfn-nonku-wrap'></div>")
.append(tercimeArea).append(izahArea)
.hide();
function syncNonKuToMane() {
var t = $.trim(tercimeArea.val());
var iz = $.trim(izahArea.val());
// if tercime is blank, use îzah as definition
var combined = t ? (iz ? t + " {{îzah|" + iz + "}}" : t) : iz;
dfnArea.val(combined);
// Re-fires onDfnInput so the sense list still grows and
// refresh() still runs, exactly as if this were typed
// directly into the mane textarea.
dfnArea.trigger("input");
}
tercimeArea.on("input", syncNonKuToMane);
izahArea.on("input", syncNonKuToMane);
// Switches between the plain mane box and the tercime+îzah pair —
// only for non-ku entries with no tplSelect selected.
function updateManeMode() {
var lang = getValues().lang || "";
var isTpl = !!tplSelect.val();
if (lang && lang !== "ku" && !isTpl) {
dfnArea.hide();
nonKuWrap.show();
} else {
nonKuWrap.hide();
if (!isTpl) dfnArea.show();
}
}
// Store on the block so refresh() can re-sync every block when
// lang changes, and restoreDfn() can re-sync after restoring.
block.data("updateManeMode", updateManeMode);
// — Template selector (optional — replaces mane when chosen) —
// Template definitions loaded from [[MediaWiki:Gadget-start.js/data.json]].
var tplDefs = steps.dfn.tplDefs || {};
// Cache of all non-placeholder option elements, so updateTplOptions
// can detach/re-attach them without losing the full list.
var _allTplOptions = [];
var tplSelect = $(mw.html.element("select", { "class": "wiktku-dfn-tpl-select" }));
tplSelect.attr("data-placeholder", "Li şablonekê bigere");
tplSelect.append($("<option value=''>— yan jî şablonek hilbijêre —</option>"));
$.each(tplDefs, function (name, tpl) {
var opt = $("<option></option>")
.val(name)
.text(name)
.attr("data-langs", tpl.langs ? tpl.langs.join(",") : "")
.attr("data-nolang", tpl.noLang ? "1" : "");
tplSelect.append(opt);
_allTplOptions.push(opt[0]);
});
function updateTplOptions() {
var lang = getValues().lang || "";
var currentVal = tplSelect.val();
var currentStillValid = false;
// Detach all non-placeholder options, then re-attach only the visible
// ones — native <select> won't reliably hide options any other way.
tplSelect.find("option[value!='']").detach();
$.each(_allTplOptions, function (_, opt) {
var allowed = $(opt).attr("data-langs");
var visible = !allowed || allowed.split(",").indexOf(lang) !== -1;
if (visible) {
tplSelect.append(opt);
if ($(opt).val() === currentVal) currentStillValid = true;
}
});
tplSelect.trigger("wiktku:refresh");
if (currentVal && !currentStillValid) {
tplSelect.val("");
tplTitleInput.hide().val("");
updateManeMode();
}
}
// Store updater on the element so refresh() can call it for all blocks.
tplSelect.data("updateOptions", updateTplOptions);
var tplTitleInput = $("<input type='text'>")
.addClass("wiktku-dfn-tpl-title wiktku-start-narrow")
.attr("placeholder", "Navê rûpela hedefê…")
.hide();
// Grow the sense list when the title field of the last block gets content,
// mirroring what onDfnInput does for the plain mane textarea.
tplTitleInput.on("input", function () {
steps.dfn.onDfnInput(stepDiv, block, this);
});
// Şablon senses have no plain gloss, so hide alternatîv/hevmane/
// dijmane/etc. Etîket, Nimûne and Jêgirtin stay visible either way.
function updateFieldVisibility() {
var isTpl = !!tplSelect.val();
$.each(HIDDEN_ON_TPL_GROUPS, function (_, cls) {
block.find("." + cls + "-group").toggle(!isTpl);
});
}
// Store on the block so restoreDfn() can re-sync visibility
// after setting tplSelect's value.
block.data("updateFieldVisibility", updateFieldVisibility);
tplSelect.on("change", function () {
var chosen = $(this).val();
if (chosen) {
dfnArea.hide();
nonKuWrap.hide();
tplTitleInput.show().focus();
} else {
tplTitleInput.hide().val("");
updateManeMode();
}
updateFieldVisibility();
// Re-run refresh so the Werger step visibility updates.
refresh();
});
var tplRow = $("<div></div>").addClass("wiktku-dfn-tpl-row")
.append(tplSelect).append(" ").append(tplTitleInput);
block.append(tplRow);
block.append(dfnArea);
block.append(nonKuWrap);
// Apply lang filter on initial build.
updateTplOptions();
updateManeMode();
// — Sub-field groups are always visible with a placeholder textarea.
var allGroups = [
{ cls: "wiktku-dfn-etiket", label: "Etîket", rows: 1, narrow: true, izah: "xisûsen, Mêrdîn, anatomî, Badînî" },
{ cls: "wiktku-dfn-kategori", label: "Kategorî", rows: 1, narrow: true, izah: "wekî etîket lê xuya nabe tenê kategorîze dike" },
{ cls: "wiktku-dfn-alternativ", label: "Formên alternatîv", rows: 1, narrow: true, izah: "Varyantên vê kelîmeyê" },
{ cls: "wiktku-dfn-hevmane", label: "Hevmane", rows: 1, narrow: true, izah: "Spehî hevmaneya Bedew e." },
{ cls: "wiktku-dfn-dijmane", label: "Dijmane", rows: 1, narrow: true, izah: "Zengîn dijmaneya feqîr e." },
{ cls: "wiktku-dfn-koordine", label: "Termên koordîne", rows: 1, narrow: true, izah: "Pisîk û kûçik termên koordîne ne çunkî Jornavên wan gelek in" },
{ cls: "wiktku-dfn-jornav", label: "Jornav", rows: 1, narrow: true, izah: "Heywan jornavê guhandar e" },
{ cls: "wiktku-dfn-jernav", label: "Jêrnav", rows: 1, narrow: true, izah: "Guhandar jêrnavê heywan e" },
{ cls: "wiktku-dfn-nimune", label: "Nimûne", rows: 2, narrow: false }
];
$.each(allGroups, function (_, g) {
var groupDiv = $("<div></div>").addClass("wiktku-dfn-subgroup " + g.cls + "-group");
function buildNimuneLi() {
var lang = getValues().lang || "";
var li = $("<li></li>").addClass("wiktku-dfn-nimune-li");
var mainTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-text-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", g.rows)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-text")
.attr("placeholder", "Nimûneya emilandina kelîmeyê tu bi xwe binivîse…");
mainTa.on("input", function () {
highlightLinebreak(this);
var val = $.trim($(this).val());
var isLast = li.is(list.children("li:last-child"));
if (val && isLast) {
list.append(buildNimuneLi());
}
});
li.append(mainTa);
var subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
if (needsTransliteration(lang)) {
subWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-tr")
.attr("placeholder", "Transliterasyona bi alfabeya latînî")
);
}
if (lang && lang !== "ku") {
subWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-t")
.attr("placeholder", "Tercimeya nimûneyê bi kurmancî")
);
}
if (subWrap.children().length) li.append(subWrap);
return li;
}
if (g.cls === "wiktku-dfn-nimune") {
// Nimûne — compound widget with tr/t sub-fields.
var lbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text(g.label))
.append(": ");
var list = $("<ol></ol>").addClass("wiktku-dfn-sublist " + g.cls + "-list");
groupDiv.data("buildNimuneLi", buildNimuneLi);
list.append(buildNimuneLi());
groupDiv.append(lbl).append(list);
block.append(groupDiv);
} else {
// Regular always-visible group — label + growing textarea list.
var lbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text(g.label))
.append(": ")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-hint").text(g.izah));
var list = $("<ol></ol>").addClass("wiktku-dfn-sublist " + g.cls + "-list");
var firstInput = $("<textarea></textarea>")
.attr("name", g.cls + "-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", g.rows)
.attr("class", "wiktku-dfn-subfield" + (g.narrow ? " wiktku-start-narrow" : ""))
.attr("placeholder", g.label + "…");
firstInput.on("input", function () {
steps.dfn.onSubInput(list, this, g.rows, g.narrow);
});
list.append($("<li></li>").append(firstInput));
groupDiv.append(lbl).append(list);
block.append(groupDiv);
}
});
// — Jêder group — growing list, same structure as Nimûne. —
(function () {
var jederGroupDiv = $("<div></div>").addClass("wiktku-dfn-subgroup wiktku-dfn-jeder-group");
var jederLbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text("Jêgirtin"))
.append(": ");
var jederList = $("<ol></ol>").addClass("wiktku-dfn-sublist wiktku-dfn-jeder-list");
function buildJederLi() {
var lang = getValues().lang || "";
var li = $("<li></li>").addClass("wiktku-dfn-jeder-li");
// Quote text textarea
var quoteTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote")
.attr("placeholder", "Nimûneya emilandinê ji kitêb an çavkaniyeke din binivîse");
quoteTa.on("input", function () {
highlightLinebreak(this);
var val = $.trim($(this).val());
var isLast = li.is(jederList.children("li:last-child"));
if (val && isLast) {
jederList.append(buildJederLi());
}
});
li.append(quoteTa);
// tr/t sub-fields for the quote — shown as needed for the language.
var quoteSubWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
if (needsTransliteration(lang)) {
quoteSubWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-tr")
.attr("placeholder", "Transliterasyona jêgirtinê…")
);
}
if (lang && lang !== "ku") {
quoteSubWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-t")
.attr("placeholder", "Tercimeya jêgirtinê bi kurmancî")
);
}
if (quoteSubWrap.children().length) li.append(quoteSubWrap);
// Citoid auto-fill: fetch citation data from a URL, DOI or ISBN and
// prefill the source şablon + fields below (see Gadget-citoid-helper.js).
var citoidWrap = $("<div></div>").addClass("wiktku-dfn-quote-citoid");
var citoidInput = $("<textarea></textarea>")
.addClass("wiktku-dfn-subfield wiktku-dfn-quote-citoid-input")
.attr("rows", 1)
.attr("placeholder", "URL, DOI an ISBN binivîse ku otomatîk were tijekirin…");
var citoidBtn = new OO.ui.ButtonWidget({
label: "Bi Citoidê bîne",
classes: [ "wiktku-dfn-quote-citoid-btn" ]
});
var citoidStatus = $("<span></span>").addClass("wiktku-dfn-quote-citoid-status");
// Fetches citation data from Citoid and fills this citation's
// şablon + fields — only rebuilds fields on template change,
// and never overwrites values the user already typed.
function runCitoidFetch() {
var query = $.trim(citoidInput.val());
if (!query) {
mw.notify("Ji kerema xwe re pêşî URL, DOI an ISBNyekê binivîse.");
return;
}
citoidBtn.setDisabled(true);
citoidStatus.text("Tê anîn…");
wikt.citoidHelper.ensure().then(function () {
return wikt.citoid.fetchJederFields(query);
}).then(function (result) {
var jederKey = result.jederKey;
var hasTpl = !!jederKey && srcSel.find("option[value='" + jederKey + "']").length > 0;
var targetVal = hasTpl ? jederKey : "__manual__";
// Only rebuild if switching şablon, so a repeat fetch
// doesn't clear fields already filled in by hand.
if (srcSel.val() !== targetVal) {
srcSel.val(targetVal).trigger("change");
}
if (hasTpl) {
// Tenê qadên vala tijî bike.
$.each(result.fields, function (key, val) {
var input = srcFields.find("[data-field-key='" + key + "']");
if (input.length && !$.trim(input.val())) {
input.val(val);
}
});
} else {
// Şablonek nehat naskirin ji bo vê itemType — rêzikeke
// çavkaniyê ya bi destan a ji qadên Citoid tê çêkirin,
// lê tenê ger qada destan vala be.
var manualField = srcFields.find(".wiktku-dfn-quote-src-manual");
if (!$.trim(manualField.val())) {
var parts = [];
$.each(["nivîskar", "sernav", "websîte", "kovar", "weşanxane", "sal", "url"], function (_, k) {
if (result.fields[k]) parts.push(result.fields[k]);
});
manualField.val(parts.join(", "));
}
}
citoidStatus.text("");
}, function (errorMsg) {
citoidStatus.text(typeof errorMsg === "string" ? errorMsg : "Nehat dîtin. Kontrol bike ka URL/DOI/ISBN rast e.");
}).always(function () {
citoidBtn.setDisabled(false);
});
}
citoidBtn.on("click", runCitoidFetch);
citoidInput.on("keydown", function (e) {
if (e.which === 13) { // Enter
e.preventDefault();
runCitoidFetch();
}
});
citoidWrap.append(citoidInput).append(citoidBtn.$element).append(citoidStatus);
// Source template selector, specific to this citation.
var srcSel = $("<select></select>").addClass("wiktku-dfn-quote-src-sel wiktku-plain-select");
srcSel.append($("<option value=''>— Çavkaniyê hilbijêre —</option>"));
srcSel.append($("<option></option>").val("__manual__").text("Bi destê xwe binivîsim"));
srcSel.append($("<option></option>").val("__category__").text("Ji Kategorî:Çavkanî şablonekê hilbijêre"));
var jederDefs = steps.dfn.jederDefs || {};
$.each(jederDefs, function (tplName, def) {
srcSel.append($("<option></option>").val(tplName).text(def.label));
});
// Dynamic source fields container.
var srcFields = $("<div></div>").addClass("wiktku-dfn-quote-src-fields");
srcSel.on("change", function () {
srcFields.empty();
var chosen = $(this).val();
if (!chosen) return;
if (chosen === "__manual__") {
// Freeform source, written by the user — becomes the 2nd
// positional param of {{jêder|lang|…}} instead of çavkanî?.
srcFields.append(
$("<textarea></textarea>")
.attr("rows", 4)
.addClass("wiktku-dfn-subfield wiktku-dfn-quote-src-manual")
.attr("placeholder", "Çavkaniyê bi destê xwe binivîse…")
);
return;
}
if (chosen === "__category__") {
// Search widget over the members of [[Kategorî:Çavkanî]].
// Picking a şablon here immediately switches the row to
// "Bi destê xwe binivîsim" mode with {{Şablon}} pre-filled,
var catWrap = $("<span></span>").addClass("wiktku-native-select-wrap wiktku-dfn-quote-src-cat");
var catInput = $("<input type='search' autocomplete='off'>")
.addClass("wiktku-start-narrow wiktku-dfn-quote-src-cat-input")
.attr("placeholder", "Li navê şablonê bigere…");
var catResults = $("<ul></ul>").addClass("wiktku-ac-results wiktku-dfn-quote-src-cat-results").hide();
var catStatus = $("<span></span>").addClass("wiktku-dfn-quote-src-cat-status").text("Şablon tên barkirin…");
var showCatResults = function (query) {
var q = $.trim(query).toLowerCase();
catResults.empty();
var list = catSrcTemplates || [];
var matched = q ?
$.grep(list, function (name) { return name.toLowerCase().indexOf(q) !== -1; }) :
list;
if (!matched.length) {
catResults.hide();
return;
}
$.each(matched.slice(0, 50), function (_, name) {
var li = $("<li></li>").text(name).attr("data-value", name);
var touchMoved = false;
li.on("touchstart", function () { touchMoved = false; });
li.on("touchmove", function () { touchMoved = true; });
li.on("touchend", function (e) {
if (touchMoved) return;
e.preventDefault();
selectCatTpl(name);
});
li.on("mousedown", function (e) {
e.preventDefault();
selectCatTpl(name);
});
catResults.append(li);
});
catResults.show();
};
// Wraps the chosen şablon as {{Name}}, drops it into the
// manual textarea, and switches the row into manual mode
// so the user can keep editing it (add params, etc.).
var selectCatTpl = function (name) {
catResults.hide();
srcSel.val("__manual__");
srcSel.trigger("change");
srcFields.find(".wiktku-dfn-quote-src-manual")
.val("{{" + name + "}}")
.trigger("focus");
};
catInput.on("input", function () {
showCatResults($(this).val());
});
catInput.on("focus", function () {
showCatResults($(this).val());
});
catInput.on("blur", function () {
setTimeout(function () { catResults.hide(); }, 200);
});
catWrap.append(catInput).append(catResults).append(catStatus);
srcFields.append(catWrap);
fetchCatSrcTemplates().then(function () {
catStatus.text("");
}, function () {
catStatus.text("Şablon nehatin barkirin.");
});
return;
}
var def = (steps.dfn.jederDefs || {})[chosen];
if (!def) return;
$.each(def.fields, function (key, label) {
var row = $("<div></div>").addClass("wiktku-dfn-quote-src-row");
var fieldLbl = $("<label></label>").text(label + ": ");
var inp = $("<textarea></textarea>")
.attr("rows", 2)
.addClass("wiktku-dfn-quote-src-input wiktku-start-narrow")
.attr("data-field-key", key)
.attr("placeholder", label + "…");
// "Sernav" / "Sernavê orjînal" (title fields, e.g. for
// kitêb/kovar/malper) get a taller, draggable box; every
// other field in the template stays as-is. Field labels
// come from the on-wiki jederDefs data, so match on the
// (diacritic-folded) label text rather than a fixed key.
var foldedLabel = foldDiacritics(label);
if (/^sernav$/.test(foldedLabel) || /orjin/.test(foldedLabel)) {
inp.addClass("wiktku-dfn-quote-src-input--title");
}
row.append(fieldLbl).append(inp);
srcFields.append(row);
});
});
li.append(citoidWrap).append(srcSel).append(srcFields);
return li;
}
jederGroupDiv.data("buildJederLi", buildJederLi);
jederList.append(buildJederLi());
jederGroupDiv.append(jederLbl).append(jederList);
block.append(jederGroupDiv);
}());
// Apply the initial hide/show state for the sub-groups (matches
// tplSelect's starting value, which is normally empty).
updateFieldVisibility();
return block;
},
/** Grows the sense list when the last mane textarea gets content. */
onDfnInput: function (stepDiv, block, textarea) {
var val = $.trim($(textarea).val());
var list = stepDiv.find("ol.wiktku-dfn-list");
var isLast = block.is(list.children("li:last-child"));
if (val && isLast) {
var newBlock = steps.dfn.buildSenseBlock(stepDiv);
list.append(newBlock);
// Give the new block's template selector the searchable picker.
initSelects(newBlock);
}
refresh();
},
/** Grows a sub-list (nimûne/formên alternatîv/hevmane/dijmane/termên koordîne) on input. */
onSubInput: function (list, input, rows, narrow) {
var val = $.trim($(input).val());
var item = $(input).parent();
var isLast = item.is(list.children("li:last-child"));
if (val && isLast) {
var next = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-sub-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", rows)
.attr("class", "wiktku-dfn-subfield" + (narrow ? " wiktku-start-narrow" : ""));
next.on("input", function () {
steps.dfn.onSubInput(list, this, rows, narrow);
});
list.append($("<li></li>").append(next));
}
},
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (tplDefs, posExamples, jederDefs).
tplDefs: {},
posExamples: {},
jederDefs: {},
build: function (stepDiv) {
if (stepDiv.find("ol.wiktku-dfn-list").length) return null;
var list = $("<ol class='wiktku-dfn-list'></ol>");
list.append(steps.dfn.buildSenseBlock(stepDiv));
stepDiv.append(list);
return null;
},
/** Reads all sense blocks from the DOM and returns an array of sense objects. */
getSenses: function (stepDiv) {
var senses = [];
stepDiv.find("li.wiktku-dfn-sense").each(function () {
var block = $(this);
var tplSel = block.find("select.wiktku-dfn-tpl-select");
var tpl = tplSel.val() || "";
// noLang: template already encodes the language — don't add |lang| param.
var tplNoLang = tpl
? tplSel.find("option[value='" + tpl + "']").attr("data-nolang") === "1"
: false;
var tplTitle = $.trim(block.find("input.wiktku-dfn-tpl-title").val());
var mane = $.trim(block.find("textarea.wiktku-dfn-mane").val());
function readList(cls) {
var vals = [];
block.find("." + cls + "-list textarea").each(function () {
var v = $.trim($(this).val());
if (v) vals.push(v);
});
return vals;
}
// Nimûne items are compound: { text, tr?, t? }
function readNimuneList() {
var items = [];
block.find(".wiktku-dfn-nimune-list li.wiktku-dfn-nimune-li").each(function () {
var text = $.trim($(this).find(".wiktku-dfn-nimune-text").val());
if (!text) return;
var obj = { text: text };
var tr = $.trim($(this).find(".wiktku-dfn-nimune-tr").val());
var t = $.trim($(this).find(".wiktku-dfn-nimune-t").val());
if (tr) obj.tr = tr;
if (t) obj.t = t;
items.push(obj);
});
return items;
}
// Jêder is a growing list of citations, one per li — mirrors readNimuneList().
function readJederList() {
var items = [];
block.find(".wiktku-dfn-jeder-list li.wiktku-dfn-jeder-li").each(function () {
var li = $(this);
var quote = $.trim(li.find(".wiktku-dfn-nimune-quote").val());
if (!quote) return;
var obj = { quote: quote };
var qtr = $.trim(li.find(".wiktku-dfn-nimune-quote-tr").val());
var qt = $.trim(li.find(".wiktku-dfn-nimune-quote-t").val());
if (qtr) obj.quoteTr = qtr;
if (qt) obj.quoteT = qt;
var tplName = li.find(".wiktku-dfn-quote-src-sel").val();
if (tplName === "__manual__") {
var manual = $.trim(li.find(".wiktku-dfn-quote-src-manual").val());
if (manual) obj.jederManual = manual;
} else if (tplName === "__category__") {
// Reachable only if the user opened the category search but
// never picked a şablon — picking one switches the row to
// __manual__ (see selectCatTpl above), so there's nothing
// meaningful to save here.
} else if (tplName) {
obj.jederTpl = tplName;
var fields = {};
li.find(".wiktku-dfn-quote-src-input").each(function () {
var k = $(this).attr("data-field-key");
var v = $.trim($(this).val());
if (k && v) fields[k] = v;
});
obj.jêderFields = fields;
}
items.push(obj);
});
return items;
}
senses.push({
tpl: tpl,
tplNoLang: tplNoLang,
tplTitle: tplTitle,
mane: mane,
etiket: readList("wiktku-dfn-etiket"),
kategori: readList("wiktku-dfn-kategori"),
nimune: readNimuneList(),
jeder: readJederList(),
alternativ: readList("wiktku-dfn-alternativ"),
hevmane: readList("wiktku-dfn-hevmane"),
dijmane: readList("wiktku-dfn-dijmane"),
koordine: readList("wiktku-dfn-koordine"),
jornav: readList("wiktku-dfn-jornav"),
jernav: readList("wiktku-dfn-jernav")
});
});
return senses;
},
getOutput: function (values, callback) {
var stepDiv = $("#wiktku-start-dfn");
var senses = steps.dfn.getSenses(stepDiv);
var lang = values.lang;
// A sense counts as "filled" if it has a mane, a chosen template + title,
// or any other content (etîket/hevmane/nimûne/jêder…) worth keeping.
var hasMane = senses.some(function (s) {
return s.mane !== "" || (s.tpl && s.tplTitle) || senseHasExtraContent(s);
});
var defLines = []; // one entry per kept sense (goes to linkify)
var citeLines = []; // parallel — nimûne+jêder for that same sense
var izahLines = []; // parallel — raw îzah gloss for that same sense
// True only once some sense's *actual* dfn text (post tercime/îzah
// split) is non-empty.
var hasLinkableMane = false;
$.each(senses, function (_, sense) {
// — Template sense (e.g. {{guharto|ku|somepage}}) —
if (sense.tpl) {
if (!sense.tplTitle) return; // skip empty template senses
var tplKatTpl = buildSenseTpl(sense, "kategori", lang, "K");
var tplLabelTpl = buildSenseTpl(sense, "etiket", lang, "e");
var tplCall = sense.tplNoLang
? "{{" + sense.tpl + "|" + sense.tplTitle + "}}"
: "{{" + sense.tpl + "|" + lang + "|" + sense.tplTitle + "}}";
var idx = defLines.length;
var cite = buildCite(sense, lang);
defLines.push("# " + (tplKatTpl ? tplKatTpl + " " : "") + (tplLabelTpl ? tplLabelTpl + " " : "") + tplCall +
(cite ? "{{wiktku-cite-" + idx + "}}" : ""));
citeLines.push(cite);
izahLines.push(""); // template senses have no îzah
return;
}
// — Normal mane sense —
var dfn = sense.mane;
if (!dfn && !senseHasExtraContent(sense)) return; // truly empty
// Pull the îzah gloss (if any) out of the combined tercime+îzah
// string — it's spliced back in separately below, after its
// own linkify pass (see izahLines / the second linkifyText call).
var izahRaw = null;
var tercimeIzah = splitTercimeIzah(dfn);
if (tercimeIzah) {
dfn = tercimeIzah.tercime;
izahRaw = stripWikilinks(tercimeIzah.izah);
}
if (dfn) {
dfn = stripWikilinks(dfn);
// Sentence-case + trailing period are for ku definitions,
// which are written as full glosses.
if (lang === "ku") {
if (dfn[0] !== dfn[0].toUpperCase()) dfn = capitalize(dfn);
if (!dfn.match(/[.…?!)\]]$/)) dfn += ".";
}
} else if (izahRaw === null) {
dfn = lang === "ku" ? "{{mane?|" + lang + "}}" : "";
}
if (dfn) hasLinkableMane = true;
var katTpl = buildSenseTpl(sense, "kategori", lang, "K");
var labelTpl = buildSenseTpl(sense, "etiket", lang, "e");
var out = "# " + (katTpl ? katTpl + " " : "") + (labelTpl ? labelTpl + " " : "") + dfn;
var idx = defLines.length;
var hasThisIzah = izahRaw !== null && $.trim(izahRaw) !== "";
// Bare {{...}} token — like {{wiktku-cite-N}}, this survives
// linkify's first pass untouched (it treats template calls as
// opaque), then gets swapped for {{îzah|…}} once the actual
// gloss text has been linkified in its own separate pass.
if (hasThisIzah) {
out += (dfn ? " " : "") + "{{wiktku-izah-" + idx + "}}";
}
function wordLine(tpl, words) {
if (!words.length) return "";
return "\n#: {{" + tpl + "|" + lang + "|" + words.join("|") + "}}";
}
out += wordLine("alt-r", sense.alternativ);
out += wordLine("hevmane", sense.hevmane);
out += wordLine("dijmane", sense.dijmane);
out += wordLine("koordîne", sense.koordine);
out += wordLine("jornav", sense.jornav);
out += wordLine("jêrnav", sense.jernav);
var cite = buildCite(sense, lang);
defLines.push(out + (cite ? "{{wiktku-cite-" + idx + "}}" : ""));
citeLines.push(cite);
izahLines.push(hasThisIzah ? izahRaw : "");
});
// Splice citeLines back into a linkified string, replacing each
// {{wiktku-cite-N}} token with its stored nimûne/jêder block.
function restoreCites(t) {
return t.replace(/\{\{wiktku-cite-(\d+)\}\}/g, function (_, n) {
return citeLines[parseInt(n, 10)] || "";
});
}
// Runs text through the linkify gadget if it's loaded, otherwise
// just passes it through unchanged. Shared by both linkify passes
// below (main mane text, and — separately — îzah glosses).
function linkifyText(t, cb) {
if (typeof $.kuLinkify === "function") {
$.kuLinkify(t, cb);
} else {
cb(t);
}
}
var hasIzah = izahLines.some(function (t) { return t && $.trim(t) !== ""; });
var text = defLines.join("\n") + "\n";
if (!hasMane) {
// No definitions entered — emit {{mane?}} with nimûne?.
text = "# {{mane?|" + lang + "}}\n#* {{nimûne?|" + lang + "}}\n";
callback(text);
return;
}
// Runs the îzah-only linkify pass against `base` (either the raw
// text, when there's no linkable mane to run the main pass on
// first, or the already-linkified main text). Shared by both
// branches below so the token-splice logic only lives once.
function runIzahPass(base) {
var izahJoined = $.map(izahLines, function (raw, idx) {
if (!raw) return undefined;
return "{{wiktku-izah-open-" + idx + "}}" + raw + "{{wiktku-izah-close-" + idx + "}}";
}).join("\n");
linkifyText(izahJoined, function (izahLinked) {
var izahByIdx = {};
var re = /\{\{wiktku-izah-open-(\d+)\}\}([\s\S]*?)\{\{wiktku-izah-close-\1\}\}/g;
var m;
while ((m = re.exec(izahLinked)) !== null) {
izahByIdx[parseInt(m[1], 10)] = m[2];
}
var withIzah = base.replace(/\{\{wiktku-izah-(\d+)\}\}/g, function (_, n) {
var linked = izahByIdx[parseInt(n, 10)];
return linked !== undefined ? "{{îzah|" + linked + "}}" : "";
});
callback(restoreCites(withIzah));
});
}
if (!hasLinkableMane) {
if (!hasIzah) {
// All filled senses are template senses (or otherwise have
// no plain text at all) — nothing here needs linkify.
callback(restoreCites(text));
return;
}
// There's no plain mane text anywhere (e.g. tercime left blank
// with only îzah filled in), so every defLine is just a bare
// template call with nothing to word-link. Sending a line
// like "# {{wiktku-izah-0}}" through the main linkify pass
// gives it no plain words to work with, makes the linkify
// gadget hang — so skip that pass entirely and run only
// the îzah pass, splicing straight into the unlinkified text.
var loadIzahOnly = function () { runIzahPass(text); };
mw.loader.using("ext.gadget.linkify", loadIzahOnly, loadIzahOnly);
return;
}
var didTryToLoad = function () {
// First pass: the main definition text (mane), same as before.
linkifyText(text, function (mainLinked) {
if (!hasIzah) {
callback(restoreCites(mainLinked));
return;
}
// Second pass: îzah glosses, linkified via their own
// separate call. Each gloss is wrapped in its own
// {{wiktku-izah-open/close-N}} pair; like the existing
// {{wiktku-cite-N}} tokens, these sit inside double
// braces so linkify leaves the tokens themselves alone —
// only the raw gloss text between each pair gets linked.
runIzahPass(mainLinked);
});
};
mw.loader.using("ext.gadget.linkify", didTryToLoad, didTryToLoad);
}
},
je: makeWordListStep("je", "jê", "Kelîmeyên jê çêbûyî binivîse"),
tekildar: makeWordListStep("tekildar", "têkildar", "Kelîmeyên ji aliyê etîmolojiyê ve têkildarî vê kelîmeyê binivîse"),
binereherwiha: makeWordListStep("binereherwiha", "binêre herwiha", "Kelîmeyên din ên eleqedar binivîse"),
etym: {
id: "etym",
name: "etîmolojî",
question_fmt: "Etîmolojiya kelîmeyê binivîse",
// etymTpls populated from data.json
etymTpls: {},
visible: function (values) {
return values.lang && values.pos;
},
// Fills the insert-dropdown from the current etymTpls object.
refreshTplSelect: function () {
var sel = $("#wiktku-start-etym .wiktku-tpl-insert-select");
if (!sel.length) return;
sel.find("option[value!='']").remove();
$.each(steps.etym.etymTpls, function (name, tpl) {
sel.append($("<option></option>").val(tpl.snippet).text(name + " — " + tpl.desc));
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-etym-wrap").length) return null;
var wrap = $("<div class='wiktku-etym-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-etym-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-etym-text")
.attr("rows", 4)
.attr("placeholder", "Ji {{ji|en|ku|apple}}. yan rasterast binivîse…");
// Template insert dropdown — options also refreshed after data.json loads.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike…");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
$.each(steps.etym.etymTpls, function (name, tpl) {
sel.append($("<option></option>").val(tpl.snippet).text(name + " — " + tpl.desc));
});
sel.on("change", function () {
var snippet = $(this).val();
if (!snippet) return;
var lang = getValues().lang || "";
snippet = snippet.replace(/CODE/g, lang).replace(/SOURCELANG/g, "?");
insertAtCursor(ta[0], snippet);
$(this).val("");
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel);
wrap.append(ta);
stepDiv.append(wrap);
initSelects(wrap);
return ta;
},
output: function (values) {
var text = $.trim($("#wiktku-start-etym .wiktku-etym-text").val());
if (text) {
return "\n==== Etîmolojî ====\n" + text + "\n";
}
// No etymology entered — emit {{ji?|lang}} as a placeholder.
// Skip it only when every filled sense is a şablon sense
// a completely empty entry with no şablon chosen still gets the placeholder
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasFilledTplSense = dfnSenses.some(function (s) {
return !!s.tpl && !!s.tplTitle;
});
var hasRegularMane = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
if (hasFilledTplSense && !hasRegularMane) return "";
return "\n==== Etîmolojî ====\n{{ji?|" + values.lang + "}}\n";
} },
dunde: {
id: "dunde",
name: "dûnde",
question_fmt: "Eger ev kelîme ji vî zimanî ketibe zimanekî din, vî zimanî û kelîmeya wî binivîse",
visible: function (values) {
return !!values.pos;
},
disabledKeys: function (values) {
return {"navz": true, [values.lang]: true}
},
// Language dropdown + growing word-input list; a new row appends
// when the dropdown gets a value. Mirrors steps.trans, but flat.
buildRow: function (stepDiv) {
var row = $("<li class='wiktku-dunde-row wiktku-lang-row'></li>");
// Language selector — the searchable picker is applied after insertion into DOM.
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zimanekî bigere");
populateMenus(langSel, steps.dunde.keys || [], steps.dunde.disabledKeys);
// When a language is chosen, ensure a next empty row exists.
langSel.on("change", function () {
steps.dunde.onLangChange(stepDiv, row);
});
// Word list for this language.
var wordList = $("<ul class='wiktku-dunde-words wiktku-lang-row-words'></ul>");
var firstWord = steps.dunde.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
// The searchable picker is attached by initSelects() once the row
// is in the DOM (see onLangChange/build below).
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-dunde-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Kelîme…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-dunde-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.dunde.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (stepDiv, row) {
var list = stepDiv.find("ul.wiktku-dunde-list");
var isLast = row.is(list.children("li.wiktku-dunde-row:last-child"));
if (isLast) {
var newRow = steps.dunde.buildRow(stepDiv);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
// Keep disabled keys in sync across all lang selectors.
steps.dunde.syncDisabledKeys(stepDiv);
},
/** Disables already-selected languages in all other dropdowns. */
syncDisabledKeys: function (stepDiv) {
var taken = $.extend({}, steps.dunde.disabledKeys);
stepDiv.find("li.wiktku-dunde-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
stepDiv.find("li.wiktku-dunde-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
build: function (stepDiv) {
if (stepDiv.find("ul.wiktku-dunde-list").length) return null;
var list = $("<ul class='wiktku-dunde-list wiktku-lang-row-list'></ul>");
list.append(steps.dunde.buildRow(stepDiv));
stepDiv.append(list);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return null;
},
/** Reads all [langcode, words[]] rows from the DOM. */
getRows: function (stepDiv) {
var result = [];
stepDiv.find("li.wiktku-dunde-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-dunde-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
output: function () {
var stepDiv = $("#wiktku-start-dunde");
var rows = steps.dunde.getRows(stepDiv);
if (!rows.length) return "";
var lines = $.map(rows, function (row) {
var lang = row[0], words = row[1];
return "* {{dû|" + lang + "|" + words.join("|") + "}}";
});
return "\n==== Dûnde ====\n" + lines.join("\n") + "\n";
}
},
zarava: {
id: "zarava",
name: "bi zaravayên din",
question_fmt: "'"+ pageName + "' di zaravayên din de çawa tê gotin?",
visible: function (values) {
return steps.trans.visible(values);
},
disabledKeys: {},
buildRow: function (group) {
var row = $("<li class='wiktku-zarava-row wiktku-lang-row'></li>");
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zaravayekî bigere");
populateMenus(langSel, steps.zarava.keys || [], steps.zarava.disabledKeys);
langSel.on("change", function () {
steps.zarava.onLangChange(group, row);
});
var wordList = $("<ul class='wiktku-zarava-words wiktku-lang-row-words'></ul>");
var firstWord = steps.zarava.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-zarava-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Tercime…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-zarava-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.zarava.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (group, row) {
var list = group.find("ul.wiktku-zarava-list");
var isLast = row.is(list.children("li.wiktku-zarava-row:last-child"));
if (isLast) {
var newRow = steps.zarava.buildRow(group);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
steps.zarava.syncDisabledKeys(group);
},
/** Disables already-selected dialects in all other dropdowns within one group. */
syncDisabledKeys: function (group) {
var taken = $.extend({}, steps.zarava.disabledKeys);
group.find("li.wiktku-zarava-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
group.find("li.wiktku-zarava-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
/** Builds (or fetches) the .wiktku-zarava-group for one gloss. */
buildGroup: function (stepDiv, gi) {
var group = $("<div class='wiktku-zarava-group'></div>").attr("data-gloss-pos", gi);
var list = $("<ul class='wiktku-zarava-list wiktku-lang-row-list'></ul>");
list.append(steps.zarava.buildRow(group));
group.append(list);
stepDiv.append(group);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return group;
},
/** Syncs one .wiktku-zarava-group per current gloss (same logic as steps.trans.build). */
build: function (stepDiv) {
var glosses = steps.trans.glossList();
if (!glosses.length) {
stepDiv.find(".wiktku-zarava-group").remove();
return null;
}
var existingGroups = stepDiv.find(".wiktku-zarava-group");
if (existingGroups.length > glosses.length) {
existingGroups.slice(glosses.length).remove();
}
$.each(glosses, function (gi, gloss) {
var group = stepDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
if (!group.length) group = steps.zarava.buildGroup(stepDiv, gi);
var label = group.find(".wiktku-zarava-group-label");
if (glosses.length > 1) {
if (!label.length) {
label = $("<div class='wiktku-zarava-group-label'></div>");
group.prepend(label);
}
label.text(gloss.index + " " + gloss.text);
} else if (label.length) {
label.remove();
}
});
return null;
},
/** Reads the dialect rows for a single gloss group. */
getGroupTranslations: function (group) {
var result = [];
group.find("li.wiktku-zarava-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-zarava-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
/** Reads all rows from the DOM, grouped by gloss position. */
getTranslations: function (stepDiv) {
var result = [];
stepDiv.find(".wiktku-zarava-group").each(function () {
result.push(steps.zarava.getGroupTranslations($(this)));
});
return result;
},
output: function (values) {
if (values.lang !== "ku") return "";
var stepDiv = $("#wiktku-start-zarava");
var glosses = steps.trans.glossList();
if (!glosses.length) return "";
var blocks = $.map(glosses, function (gloss, gi) {
var group = stepDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
var rows = group.length ? steps.zarava.getGroupTranslations(group) : [];
if (!gloss.text && !rows.length) return undefined;
if (rows.length) {
rows.sort(function (a, b) {
var aLang = langsByCode[a[0]] || {};
var bLang = langsByCode[b[0]] || {};
return (aLang.sortKey || "").localeCompare(bLang.sortKey || "", "ku");
});
}
var wordLines = $.map(rows, function (row) {
var lang = row[0];
var words = row[1];
var wikiWords = words.map(function (w) {
return "{{W|" + lang + "|" + w + "}}";
}).join(", ");
return "* {{Z|" + lang + "}}: " + wikiWords;
}).join("\n");
if (!wordLines) return undefined;
var block = "{{werger-ser|" + (gloss.text || "?") + "|" + gloss.index + "}}";
block += "\n" + wordLines;
block += "\n{{werger-bin}}";
return block;
});
if (!blocks.length) return "";
return "\n==== Bi zaravayên din ====\n" + blocks.join("\n") + "\n";
}
},
trans: {
id: "trans",
name: "werger",
question_fmt: "Tercimeyên vê maneyê bi zimanên din binivîse",
visible: function (values) {
if (!(values.lang === "ku" && values.pos)) return false;
// Hide only when every sense is a filled template sense (no plain
// gloss to attach translations to). A mix, or nothing filled in
// yet, still shows Werger.
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasRealSense = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
var hasFilledTplSense = dfnSenses.some(function (s) {
return s.tpl && s.tplTitle;
});
return hasRealSense || !hasFilledTplSense;
},
disabledKeys: {
"navz": true,
"ku": true,
"ckb": true,
"sdh": true,
"lki": true,
"hac": true,
"zza": true },
// Language dropdown + growing word-input list, scoped to one gloss's
// group (each gloss has its own group and row list).
buildRow: function (group) {
var row = $("<li class='wiktku-trans-row wiktku-lang-row'></li>");
// Language selector — the searchable picker is applied after insertion into DOM.
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zimanekî bigere");
populateMenus(langSel, steps.trans.keys || [], steps.trans.disabledKeys);
// When a language is chosen, ensure a next empty row exists.
langSel.on("change", function () {
steps.trans.onLangChange(group, row);
});
// Word list for this language.
var wordList = $("<ul class='wiktku-trans-words wiktku-lang-row-words'></ul>");
var firstWord = steps.trans.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
// The searchable picker is attached by initSelects() once the row
// is in the DOM (see onLangChange/buildGroup below).
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-trans-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Tercime…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-trans-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.trans.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (group, row) {
var list = group.find("ul.wiktku-trans-list");
var isLast = row.is(list.children("li.wiktku-trans-row:last-child"));
if (isLast) {
var newRow = steps.trans.buildRow(group);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
// Keep disabled keys in sync across this gloss's lang selectors
// only — the same language can be used for different senses.
steps.trans.syncDisabledKeys(group);
},
/** Disables already-selected languages in all other dropdowns within one group. */
syncDisabledKeys: function (group) {
var taken = $.extend({}, steps.trans.disabledKeys);
group.find("li.wiktku-trans-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
group.find("li.wiktku-trans-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
// Builds (or fetches) the .wiktku-trans-group for one gloss.
buildGroup: function (stepDiv, gi) {
var group = $("<div class='wiktku-trans-group'></div>").attr("data-gloss-pos", gi);
var list = $("<ul class='wiktku-trans-list wiktku-lang-row-list'></ul>");
list.append(steps.trans.buildRow(group));
group.append(list);
stepDiv.append(group);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return group;
},
// Syncs one .wiktku-trans-group per current gloss, keyed by
// data-gloss-pos so groups stay matched across rebuilds.
build: function (stepDiv) {
var glosses = steps.trans.glossList();
if (!glosses.length) {
stepDiv.find(".wiktku-trans-group").remove();
return null;
}
// Drop groups for glosses that no longer exist (always from the
// tail — groups are only ever appended in gloss order below).
var existingGroups = stepDiv.find(".wiktku-trans-group");
if (existingGroups.length > glosses.length) {
existingGroups.slice(glosses.length).remove();
}
$.each(glosses, function (gi, gloss) {
var group = stepDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
if (!group.length) group = steps.trans.buildGroup(stepDiv, gi);
// Only label groups when there's more than one gloss to
// distinguish between — a single gloss needs no caption.
var label = group.find(".wiktku-trans-group-label");
if (glosses.length > 1) {
if (!label.length) {
label = $("<div class='wiktku-trans-group-label'></div>");
group.prepend(label);
}
label.text(gloss.index + " " + gloss.text);
} else if (label.length) {
label.remove();
}
});
return null;
},
/** Reads the translation rows for a single gloss group. */
getGroupTranslations: function (group) {
var result = [];
group.find("li.wiktku-trans-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-trans-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
// Reads all translation rows, grouped by gloss position.
getTranslations: function (stepDiv) {
var result = [];
stepDiv.find(".wiktku-trans-group").each(function () {
result.push(steps.trans.getGroupTranslations($(this)));
});
return result;
},
// Builds the numbered "{ index, gloss }" list, one per dfn sense
// with a real mane (skips template senses). index is 1-based and
// matches the sense's position in the "#" definition list.
// When nothing's filled in, returns one placeholder entry so
// Werger still has a group to attach to; when every sense is a
// filled template sense, stays empty (matches trans.visible()).
glossList: function () {
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var glosses = [];
var hasFilledTplSense = false;
$.each(dfnSenses, function (i, s) {
if (s.tpl) {
if (s.tplTitle) hasFilledTplSense = true;
return; // template sense — no gloss to caption with
}
var dfn = s.mane;
if (!dfn) {
// No mane, but other fields are filled — still gets a
// gloss group since dfn.getOutput() emits {{mane?}} for it.
if (senseHasExtraContent(s)) glosses.push({ index: i + 1, text: "" });
return;
}
if (dfn[0] !== dfn[0].toLowerCase()) dfn = decapitalize(dfn);
dfn = stripWikilinks(dfn).replace(/[.…?!)\]،؟]+$/, "");
glosses.push({ index: i + 1, text: dfn });
});
if (!glosses.length && !hasFilledTplSense) {
glosses.push({ index: 1, text: "" });
}
return glosses;
},
output: function (values) {
if (values.lang !== "ku") return "";
var stepDiv = $("#wiktku-start-trans");
var glosses = steps.trans.glossList();
// Every sense is a template sense — there's no real gloss
// anywhere and no group in the DOM either (glossList() only
// returns empty in that case), so skip the section entirely.
if (!glosses.length) return "";
// A completely empty entry (nothing filled in dfn at all, no
// şablon chosen either) still gets a placeholder Werger section
// to fill in later. Only
// skip an individual placeholder gloss below when some other
// sense actually has real content, making that particular
// placeholder redundant.
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasRegularMane = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
// Each gloss now has its own group of translation rows —
// attach every gloss's own words under its own werger-ser/-bin
// pair instead of dumping everything under the first one.
var blocks = $.map(glosses, function (gloss, gi) {
var group = stepDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
var rows = group.length ? steps.trans.getGroupTranslations(group) : [];
// Placeholder gloss (no real mane entered yet) with nothing
// translated into it. If some other sense already has real
// content, this placeholder is redundant — skip it. If the
// whole entry is empty, keep it so Werger still gets a
// section to fill in.
if (!gloss.text && !rows.length && hasRegularMane) return undefined;
if (rows.length) {
// Sort by Kurdish sort key.
rows.sort(function (a, b) {
var aLang = langsByCode[a[0]] || {};
var bLang = langsByCode[b[0]] || {};
return (aLang.sortKey || "").localeCompare(bLang.sortKey || "", "ku");
});
}
var wordLines = $.map(rows, function (row) {
var lang = row[0];
var words = row[1];
var wikiWords = words.map(function (w) {
return "{{W|" + lang + "|" + w + "}}";
}).join(", ");
return "* {{Z|" + lang + "}}: " + wikiWords;
}).join("\n");
var block = "{{werger-ser|" + (gloss.text || "?") + "|" + gloss.index + "}}";
if (wordLines) block += "\n" + wordLines;
block += "\n{{werger-bin}}";
return block;
});
if (!blocks.length) return "";
return "\n==== Werger ====\n" + blocks.join("\n") + "\n";
}
},
cavkani: {
id: "cavkani",
name: "çavkanî",
question_fmt: "Çavkaniyên din (ne jêgirtin) lê zêde bike",
visible: function (values) {
return !!values.pos;
},
// Fills the insert-dropdown from the members of [[Kategorî:Çavkanî]].
refreshTplSelect: function () {
var sel = $("#wiktku-start-cavkani .wiktku-tpl-insert-select");
if (!sel.length) return;
sel.find("option[value!='']").remove();
$.each(catSrcTemplates || [], function (_, name) {
sel.append($("<option></option>").val(name).text(name));
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-cavkani-wrap").length) return null;
var wrap = $("<div class='wiktku-cavkani-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-cavkani-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-cavkani-text")
.attr("rows", 4)
.attr("placeholder", "Şablonekî ji jêrê hilbijêre an rasterast binivîse…");
// Template insert dropdown, populated from [[Kategorî:Çavkanî]] —
// options refreshed once the category members are fetched.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike…");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
var status = $("<span class='wiktku-cavkani-status'></span>");
sel.on("change", function () {
var name = $(this).val();
if (!name) return;
insertAtCursor(ta[0], "\n* {{" + name + "}}");
$(this).val("");
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel);
wrap.append(status).append(ta);
stepDiv.append(wrap);
// build() runs again for every new beş (see the "+ Beş zêde bike"
// handler), after the initial page-wide pass — so this select needs
// its own init or it stays a plain, unsearchable native <select>.
initSelects(wrap);
// Populate only now: refreshTplSelect() looks the select up by id
// under #wiktku-start-cavkani, so running it before the wrap was
// appended found nothing and bailed out — which left the dropdown
// empty on every beş after the first, once the category members
// were already cached.
if (catSrcTemplates) {
steps.cavkani.refreshTplSelect();
} else {
status.text("Şablon tên barkirin…");
fetchCatSrcTemplates().then(function () {
steps.cavkani.refreshTplSelect();
status.text("");
}, function () {
status.text("Şablon nehatin barkirin.");
});
}
return ta;
},
output: function () {
var text = $.trim($("#wiktku-start-cavkani .wiktku-cavkani-text").val());
if (!text) return "";
return "\n==== Çavkanî ====\n" + text + "\n";
}
},
};
steps.trans.keys = steps.lang.choices;
steps.dunde.keys = steps.lang.choices;
steps.zarava.keys = getZaravaKeys(steps.lang.choices);
var ordered_steps = [
steps.lang, steps.pron, steps.pos, steps.cinsiyet, steps.lektur, steps.tr,
steps.dfn, steps.je, steps.tekildar,
steps.etym, steps.dunde, steps.binereherwiha, steps.zarava, steps.trans, steps.cavkani];
// Step ids that belong to each section (not shared across sections).
var PER_SECTION_STEP_IDS = [
"pos", "cinsiyet", "lektur", "tr",
"dfn", "je", "tekildar", "etym", "dunde", "binereherwiha", "zarava", "trans", "cavkani"
];
// ── Multi-section state ──────────────────────────────────────────────────
// Each entry is a plain snapshot: { pos, cinsiyet, lektur, tr, dfn (senses[]),
// je, tekildar, binereherwiha, trans (rows[]) }.
var sections = [{}]; // section 0 starts empty (DOM is the truth)
var activeSection = 0;
function snapshotDfn() {
return steps.dfn.getSenses($("#wiktku-start-dfn"));
}
// Rebuilds the dfn DOM from a previously snapshotted senses array.
function restoreDfn(senses) {
var stepDiv = $("#wiktku-start-dfn");
// Tear down the existing list so build() recreates it cleanly.
stepDiv.find("ol.wiktku-dfn-list").remove();
steps.dfn.build(stepDiv);
var list = stepDiv.find("ol.wiktku-dfn-list");
$.each(senses, function (i, sense) {
// Ensure enough blocks exist (build() seeds one).
var blocks = list.find("li.wiktku-dfn-sense");
var block = blocks.eq(i);
if (!block.length) {
var nb = steps.dfn.buildSenseBlock(stepDiv);
list.append(nb);
block = list.find("li.wiktku-dfn-sense").last();
}
// Template selector.
block.find("select.wiktku-dfn-tpl-select").val(sense.tpl || "");
if (sense.tpl) {
block.find("textarea.wiktku-dfn-mane").hide();
block.find("input.wiktku-dfn-tpl-title").val(sense.tplTitle || "").show();
} else {
block.find("textarea.wiktku-dfn-mane").val(sense.mane || "").show();
block.find("input.wiktku-dfn-tpl-title").hide().val("");
}
// dfnArea is the only thing actually saved, so split it back into
// tercime/îzah for editing (mirrors syncNonKuToMane's join format).
var maneParts = splitTercimeIzah(sense.mane);
block.find(".wiktku-dfn-tercime").val(maneParts ? maneParts.tercime : (sense.mane || ""));
block.find(".wiktku-dfn-izah").val(maneParts ? maneParts.izah : "");
// Re-sync the formên alternatîv/hevmane/… hide state now that
// tplSelect's value was set (its own "change"
// handler doesn't fire from .val(), so this doesn't happen otherwise).
var updateVis = block.data("updateFieldVisibility");
if (updateVis) updateVis();
// Same for the mane-box mode (plain vs tercime+îzah), since this
// also depends on tplSelect's (and lang's) value.
var updateMane = block.data("updateManeMode");
if (updateMane) updateMane();
// Restore a sub-list (etiket, formên alternatîv, hevmane …) from a values array.
function restoreSubList(cls, values) {
if (!values || !values.length) return;
var groupDiv = block.find("." + cls + "-group");
var subList = groupDiv.find("ol, ul").first();
if (!subList.length) return; // group not found
// Fill existing items, append new ones as needed.
$.each(values, function (j, val) {
var items = subList.find("li");
if (j < items.length) {
items.eq(j).find("textarea").val(val);
} else {
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-restore-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.val(val);
ta.on("input", function () {
steps.dfn.onSubInput(subList, this, 1, true);
});
subList.append($("<li></li>").append(ta));
}
});
}
// Reveal and populate lazy groups that have data.
var lazyMap = {
"wiktku-dfn-etiket": sense.etiket,
"wiktku-dfn-kategori": sense.kategori,
"wiktku-dfn-alternativ": sense.alternativ,
"wiktku-dfn-hevmane": sense.hevmane,
"wiktku-dfn-dijmane": sense.dijmane,
"wiktku-dfn-koordine": sense.koordine,
"wiktku-dfn-jornav": sense.jornav,
"wiktku-dfn-jernav": sense.jernav
};
$.each(lazyMap, function (cls, vals) {
if (vals && vals.length) restoreSubList(cls, vals);
});
// Nimûne items are objects { text, tr?, t? } — restore using the builder.
if (sense.nimune && sense.nimune.length) {
var nimuneGroupDiv = block.find(".wiktku-dfn-nimune-group");
var nimuneList = nimuneGroupDiv.find("ol.wiktku-dfn-nimune-list");
var buildFn = nimuneGroupDiv.data("buildNimuneLi");
nimuneList.empty();
$.each(sense.nimune, function (_, n) {
var text = typeof n === "object" ? (n.text || "") : n;
if (!text) return;
var li = buildFn ? buildFn() : $("<li class='wiktku-dfn-nimune-li'></li>");
li.find(".wiktku-dfn-nimune-text").val(text).each(function () { highlightLinebreak(this); });
if (n.tr) li.find(".wiktku-dfn-nimune-tr").val(n.tr);
if (n.t) li.find(".wiktku-dfn-nimune-t").val(n.t);
nimuneList.append(li);
});
// Always leave a blank trailing item.
if (buildFn) nimuneList.append(buildFn());
}
// Restore jêder entries — accepts current array shape or a legacy
// single object (older saved sections) for backwards compat.
var jederArr = $.isArray(sense.jeder) ? sense.jeder : (sense.jeder ? [sense.jeder] : []);
if (jederArr.length) {
var jederGroupDiv = block.find(".wiktku-dfn-jeder-group");
var jederList = jederGroupDiv.find("ol.wiktku-dfn-jeder-list");
var buildJederFn = jederGroupDiv.data("buildJederLi");
jederList.empty();
$.each(jederArr, function (_, j) {
if (!j || !j.quote) return;
var li = buildJederFn ? buildJederFn() : $("<li class='wiktku-dfn-jeder-li'></li>");
li.find(".wiktku-dfn-nimune-quote").val(j.quote).each(function () { highlightLinebreak(this); });
if (j.quoteTr) li.find(".wiktku-dfn-nimune-quote-tr").val(j.quoteTr);
if (j.quoteT) li.find(".wiktku-dfn-nimune-quote-t").val(j.quoteT);
if (j.jederManual) {
var manualSel = li.find(".wiktku-dfn-quote-src-sel");
manualSel.val("__manual__").trigger("change");
li.find(".wiktku-dfn-quote-src-manual").val(j.jederManual);
} else if (j.jederCatTpl) {
// Legacy format from before the şablon search switched rows to
// manual mode directly — convert it the same way now, so it's
// editable like any other free-form source.
var catSelEl = li.find(".wiktku-dfn-quote-src-sel");
catSelEl.val("__manual__").trigger("change");
li.find(".wiktku-dfn-quote-src-manual").val("{{" + j.jederCatTpl + "}}");
} else if (j.jederTpl) {
var srcSel = li.find(".wiktku-dfn-quote-src-sel");
srcSel.val(j.jederTpl).trigger("change");
if (j.jêderFields) {
$.each(j.jêderFields, function (key, val) {
li.find(".wiktku-dfn-quote-src-input[data-field-key='" + key + "']").val(val);
});
}
}
jederList.append(li);
});
// Always leave a blank trailing item, same as Nimûne.
if (buildJederFn) jederList.append(buildJederFn());
}
});
}
// Snapshots simple (non-dfn) per-section steps from the DOM into obj.
function saveCurrentSection() {
var snap = {};
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
snap.dfn = snapshotDfn();
return;
}
if (id === "etym") {
snap.etym = $.trim($("#wiktku-start-etym .wiktku-etym-text").val());
return;
}
if (id === "cavkani") {
snap.cavkani = $.trim($("#wiktku-start-cavkani .wiktku-cavkani-text").val());
return;
}
var step = steps[id];
if (!step) return;
var stepDiv = $("#wiktku-start-" + id);
if (id === "trans") {
snap.trans = steps.trans.getTranslations(stepDiv);
return;
}
if (id === "zarava") {
snap.zarava = steps.zarava.getTranslations(stepDiv);
return;
}
if (id === "dunde") {
snap.dunde = steps.dunde.getRows(stepDiv);
return;
}
// Generic: read all step fields.
var fields = stepDiv.find(".wiktku-start-step-field");
if (step.multiple) {
snap[id] = fields.map(function () { return $(this).val(); }).get();
} else {
snap[id] = fields.val();
}
});
sections[activeSection] = snap;
}
// Restores a previously saved snapshot into the form DOM.
function restoreSection(snap) {
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
restoreDfn(snap.dfn || []);
return;
}
if (id === "etym") {
$("#wiktku-start-etym .wiktku-etym-wrap").remove();
steps.etym.build($("#wiktku-start-etym"));
$("#wiktku-start-etym .wiktku-etym-text").val(snap.etym || "");
return;
}
if (id === "cavkani") {
$("#wiktku-start-cavkani .wiktku-cavkani-wrap").remove();
steps.cavkani.build($("#wiktku-start-cavkani"));
$("#wiktku-start-cavkani .wiktku-cavkani-text").val(snap.cavkani || "");
return;
}
if (id === "trans") {
// Rebuild trans groups (dfn must already be restored by this
// point in the $.each loop, so glossList() reflects it).
var transDiv = $("#wiktku-start-trans");
transDiv.find(".wiktku-trans-group").remove();
steps.trans.build(transDiv);
var groupsSnap = snap.trans || [];
$.each(groupsSnap, function (gi, rows) {
var group = transDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
if (!group.length) return; // gloss no longer exists — drop its rows
var list = group.find("ul.wiktku-trans-list");
$.each(rows, function (j, row) {
var lang = row[0], words = row[1];
var lastRow = list.find("li.wiktku-trans-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-trans-words");
$.each(words, function (k, word) {
var wordItems = wordList.find("li");
if (k < wordItems.length) {
wordItems.eq(k).find("textarea").val(word);
} else {
// .val() below doesn't fire "input", so the normal
// auto-grow never runs — append a matching item
// ourselves instead of silently dropping the word.
var extraInput = steps.trans.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
// Leave one trailing empty field so the row can still grow
// when the user types, matching a freshly-built row.
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.trans.makeWordInput()));
}
});
});
return;
}
if (id === "zarava") {
// Rebuild zarava groups (dfn must already be restored by this
// point in the $.each loop, so glossList() reflects it).
var zaravaDiv = $("#wiktku-start-zarava");
zaravaDiv.find(".wiktku-zarava-group").remove();
steps.zarava.build(zaravaDiv);
var zaravaGroupsSnap = snap.zarava || [];
$.each(zaravaGroupsSnap, function (gi, rows) {
var group = zaravaDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
if (!group.length) return; // gloss no longer exists — drop its rows
var list = group.find("ul.wiktku-zarava-list");
$.each(rows, function (j, row) {
var lang = row[0], words = row[1];
var lastRow = list.find("li.wiktku-zarava-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-zarava-words");
$.each(words, function (k, word) {
var wordItems = wordList.find("li");
if (k < wordItems.length) {
wordItems.eq(k).find("textarea").val(word);
} else {
var extraInput = steps.zarava.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.zarava.makeWordInput()));
}
});
});
return;
}
if (id === "dunde") {
// Rebuild dunde rows.
var dundeDiv = $("#wiktku-start-dunde");
dundeDiv.find("ul.wiktku-dunde-list").remove();
steps.dunde.build(dundeDiv);
var dundeRows = snap.dunde || [];
$.each(dundeRows, function (i, row) {
var lang = row[0], words = row[1];
var list = dundeDiv.find("ul.wiktku-dunde-list");
var lastRow = list.find("li.wiktku-dunde-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-dunde-words");
$.each(words, function (j, word) {
var wordItems = wordList.find("li");
if (j < wordItems.length) {
wordItems.eq(j).find("textarea").val(word);
} else {
// .val() below doesn't fire "input", so the normal
// auto-grow never runs — append a matching item
// ourselves instead of silently dropping the word.
var extraInput = steps.dunde.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
// Leave one trailing empty field so the row can still grow
// when the user types, matching a freshly-built row.
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.dunde.makeWordInput()));
}
});
return;
}
var step = steps[id];
if (!step) return;
var stepDiv = $("#wiktku-start-" + id);
var fields = stepDiv.find(".wiktku-start-step-field");
var val = snap[id];
if (val === undefined || val === null) return;
if (step.multiple) {
var arr = val;
fields.each(function (i) {
if (i < arr.length) $(this).val(arr[i]);
});
} else {
fields.val(val);
}
// Tell the pickers about the programmatic value change.
fields.filter("select").trigger("wiktku:refresh");
});
}
function getWikitextForCurrentSection(callback) {
var values = getValues();
var entry = steps.pos.output(values);
steps.dfn.getOutput(values, function (output) {
entry += output;
entry += steps.je.output(values);
entry += steps.tekildar.output(values);
entry += steps.etym.output(values);
entry += steps.dunde.output(values);
entry += steps.binereherwiha.output(values);
entry += steps.zarava.output(values);
entry += steps.trans.output(values);
entry += steps.cavkani.output(values);
callback(entry, values);
});
}
function getWikitextAllSections(callback) {
saveCurrentSection();
var results = new Array(sections.length);
var sharedValues = getValues(); // lang/pron are shared
function processSection(i) {
if (i >= sections.length) {
// All done — restore original active section.
restoreSection(sections[activeSection]);
refresh();
callback(results, sharedValues);
return;
}
restoreSection(sections[i]);
refresh();
getWikitextForCurrentSection(function (sectionText) {
results[i] = sectionText;
processSection(i + 1);
});
}
processSection(0);
}
// Assembles wikitext for all sections plus the shared lang/pron header.
function getWikitext(callback) {
getWikitextAllSections(function (sectionTexts, sharedValues) {
var entry = steps.lang.output(sharedValues);
entry += steps.pron.output(sharedValues);
entry += sectionTexts.join("\n");
// Edit summary uses section 0's values. Read from the saved snapshot
// (not the live DOM) so it doesn't mix section 0's pos with whichever
// section happens to be active/restored at this point.
var dfnSenses = (sections[0] && sections[0].dfn) || [];
var dfnSummary = dfnSenses.map(function (s) {
if (s.mane) return s.mane;
// Template sense (e.g. {{guharto|ku|somepage}}) — same
// construction as the tplCall built in getOutput, so the
// summary shows what actually gets written to the entry
// instead of going blank.
if (s.tpl && s.tplTitle) {
return s.tplNoLang
? "{{" + s.tpl + "|" + s.tplTitle + "}}"
: "{{" + s.tpl + "|" + sharedValues.lang + "|" + s.tplTitle + "}}";
}
return "";
}).filter(Boolean).join("; ");
var summary = "([[Mediawiki:Gadget-start.js|WF:NÛ]] v.2.0) +" +
sharedValues.lang + ":" + sections[0].pos + ":" + dfnSummary;
var summaryField = document.getElementById("wpSummary");
if (addLangMode && summaryField.value) {
summary = summaryField.value + " " + summary;
}
summaryField.value = summary;
callback(entry);
});
}
var continueBtn;
function getValuesForStep(stepId) {
var fields = $("#wiktku-start-" + stepId + " .wiktku-start-step-field");
var step = steps[stepId];
if (step.keys) {
var values = {};
fields.each(function (i, field) {
var key = $(field).prevAll(".wiktku-start-step-keyfield").val();
if (key) values[key] = $(field).val();
});
return values;
}
else if (step.multiple) {
return fields.map(function () {
return $(this).val();
}).get();
}
return fields.val();
}
function getValues() {
var values = {};
$.each(steps, function (stepId) {
values[stepId] = getValuesForStep(stepId);
});
return values;
}
function populateMenus(inputs, choices, disabledValues, placeholderText) {
if (!disabledValues) disabledValues = {};
var vals = inputs.map(function (i, input) {
return $(input).val();
});
inputs.empty();
inputs.append($("<option></option>").text(placeholderText || ""));
$.each(choices, function (j, choice) {
// Append the language code in parentheses so that typing a code
// (e.g. "ku") in the search box still finds the language name.
var displayText = capitalize(choice.label);
if (choice.sortKey !== undefined) {
// This is a language choice {code, label, sortKey} — show code.
displayText = capitalize(choice.label) + " (" + choice.code + ")";
}
var option = $(mw.html.element("option", {
value: choice.code }, displayText));
if (disabledValues[choice.code]) option.prop("disabled", true);
inputs.append(option);
});
inputs.val(function (i) {
return vals[i];
});
}
// Keys to disable for a key menu: already-taken or explicitly disabled.
function getDisabledKeys(step) {
var occupiedKeys = {};
$("#wiktku-start-" + step.id + " .wiktku-start-step-keyfield").each(function () {
occupiedKeys[$(this).val()] = true;
});
if (step.disabledKeys) $.extend(occupiedKeys, step.disabledKeys);
return occupiedKeys;
}
function buildKeyInput(step) {
if (!step.keys) return undefined;
var input = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
input.attr("data-placeholder", "Hilbijêre " + step.keyName);
populateMenus(input, step.keys, getDisabledKeys(step));
// Keep the key menus mutually exclusive: whatever one row selects is
// disabled in every other row. Recomputed from the DOM on each change.
input.on("change", function () {
var all = $("#wiktku-start-" + step.id + " .wiktku-start-step-keyfield");
var taken = {};
all.each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
all.not(this).each(function () {
var self = $(this), own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (code) $(this).prop("disabled", !!taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
});
// Return the wrapper; the select lives inside it and still fires change.
return wrapNativeSelect(input);
}
// Adds another text field to the list if the last one now has text.
function refreshForTextField(currentInput, step) {
currentInput = $(currentInput);
var value = currentInput.val();
var item = currentInput.parent();
if (value && !item.next("li").length) {
var nextInput = $("<textarea></textarea>")
.attr("name", "wiktku-field-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", currentInput.attr("class"))
.attr("rows", currentInput.attr("rows") || 1);
if (step.placeholder) nextInput.attr("placeholder", step.placeholder);
nextInput.on("input", function (evt) {
refreshForTextField(evt.target, step);
});
var nextKeyInput = buildKeyInput(step);
var nextItem = $("<li></li>").append(nextKeyInput).append(nextInput);
item.parent().append(nextItem);
if (nextKeyInput) initSelects(nextItem);
}
var canContinue = !continueBtn.isDisabled();
if ((value && !canContinue) || (!value && canContinue)) {
refresh(step);
}
}
function prepareInput(input, step) {
if (!input) return;
if (step.required) input.prop('required', true);
input.change(step, refresh);
}
// Shows/hides steps based on whether their prerequisites are met, and
// updates placeholders where applicable.
function refresh(evt) {
var values = getValues();
var changedStep = evt && evt.data;
var didFocus = false;
var canContinue = true;
// Re-filter template options in every sense block whenever lang changes.
$("#wiktku-start-dfn .wiktku-dfn-tpl-select").each(function () {
var fn = $(this).data("updateOptions");
if (typeof fn === "function") fn();
});
// Re-filter pronunciation and etymology template dropdowns when language changes.
steps.pron.refreshTplSelect();
steps.etym.refreshTplSelect();
steps.cavkani.refreshTplSelect();
// Re-render any step's question label that depends on current values
// (e.g. dfn's Werger-section reminder, which only applies to ku).
$.each(steps, function (stepId, step) {
if (typeof step.question_fmt === "function") {
$("#wiktku-start-" + stepId + " .wiktku-start-step-question")
.text(step.question_fmt(values));
}
});
// Sync every sense block's mane-box mode (plain mane vs tercime+îzah)
// to the current language, in case lang changes after blocks exist.
$("#wiktku-start-dfn li.wiktku-dfn-sense").each(function () {
var updateMane = $(this).data("updateManeMode");
if (updateMane) updateMane();
});
// Sync tr/t sub-fields in every nimûne item to the current language.
// tr shown when language needs transliteration; t shown when lang !== "ku".
(function () {
var lang = values.lang || "";
var showTr = needsTransliteration(lang);
var showT = lang && lang !== "ku";
$("#wiktku-start-dfn .wiktku-dfn-nimune-list li.wiktku-dfn-nimune-li").each(function () {
var li = $(this);
// Ensure the sub-wrapper exists when we need it.
var subWrap = li.find(".wiktku-dfn-nimune-sub");
// tr field
var trTa = li.find(".wiktku-dfn-nimune-tr");
if (showTr && !trTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
li.append(subWrap);
}
trTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-tr")
.attr("placeholder", "Transliterasyon…");
subWrap.prepend(trTa);
} else if (!showTr && trTa.length) {
trTa.remove();
}
// t field
var tTa = li.find(".wiktku-dfn-nimune-t");
if (showT && !tTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
li.append(subWrap);
}
tTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-t")
.attr("placeholder", "Tercimeya nimûneyê bi kurmancî…");
subWrap.append(tTa);
} else if (!showT && tTa.length) {
tTa.remove();
}
// Remove the wrapper if it ended up empty.
subWrap = li.find(".wiktku-dfn-nimune-sub");
if (subWrap.length && !subWrap.children().length) subWrap.remove();
});
}());
// Sync tr/t sub-fields in every jêder citation to the current language.
// tr shown when language needs transliteration; t shown when lang !== "ku".
(function () {
var lang = values.lang || "";
var showTr = needsTransliteration(lang);
var showT = lang && lang !== "ku";
$("#wiktku-start-dfn .wiktku-dfn-jeder-list li.wiktku-dfn-jeder-li").each(function () {
var li = $(this);
// Ensure the sub-wrapper exists when we need it. It must sit right
// after the quote textarea and before the source selector.
var subWrap = li.find(".wiktku-dfn-quote-sub");
// tr field
var trTa = li.find(".wiktku-dfn-nimune-quote-tr");
if (showTr && !trTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
// Insert after the quote textarea's resize-wrap (if the manual
// resize handle has already been attached to it), not after the
// bare textarea -- otherwise this lands *inside* that wrap,
// between the textarea and its own grip, breaking jêgirtin's
// handle and nesting the tr/t boxes inside it.
var quoteTa = li.find(".wiktku-dfn-nimune-quote");
var quoteResizeWrap = quoteTa.closest(".wiktku-resize-wrap");
(quoteResizeWrap.length ? quoteResizeWrap : quoteTa).after(subWrap);
}
trTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-tr")
.attr("placeholder", "Transliterasyona jêgirtinê…");
subWrap.prepend(trTa);
} else if (!showTr && trTa.length) {
trTa.remove();
}
// t field
var tTa = li.find(".wiktku-dfn-nimune-quote-t");
if (showT && !tTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
// See the tr-field branch above for why this targets the
// resize-wrap instead of the bare textarea.
var quoteTa2 = li.find(".wiktku-dfn-nimune-quote");
var quoteResizeWrap2 = quoteTa2.closest(".wiktku-resize-wrap");
(quoteResizeWrap2.length ? quoteResizeWrap2 : quoteTa2).after(subWrap);
}
tTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-t")
.attr("placeholder", "Tercimeya jêgirtinê bi kurmancî…");
subWrap.append(tTa);
} else if (!showT && tTa.length) {
tTa.remove();
}
// Remove the wrapper if it ended up empty.
subWrap = li.find(".wiktku-dfn-quote-sub");
if (subWrap.length && !subWrap.children().length) subWrap.remove();
});
}());
$.each(steps, function (stepId, step) {
if (typeof(step.visible) === "function" && !step.visible(values)) {
$("#wiktku-start-" + stepId).slideUp();
}
else {
var stepDiv = $("#wiktku-start-" + stepId);
if (changedStep !== step && typeof(step.build) === "function") {
prepareInput(step.build(stepDiv, values), step);
}
var input = stepDiv.find(".wiktku-start-step-field");
if (typeof(step.example) === "function") {
// .find() above already reaches nested fields (e.g. the dfn
// step's mane textareas inside each sense block), so one
// assignment covers every step; dfn keeps its own fallback.
var exampleText = step.example(values) || (step.id === "dfn" ? "Mane…" : "");
input.attr("placeholder", exampleText);
}
var didSlideDown;
if (!didFocus && stepDiv.css("display") === "none" && step.required) {
// Skip scrolling for the first section (ziman) since it's
// always at the top of the page.
if (step.id !== "lang") {
didSlideDown = function (evt) {
var stepEl = stepDiv.get(0);
if (stepEl && typeof stepEl.scrollIntoView === "function") {
stepEl.scrollIntoView({ behavior: "smooth", block: "start" });
}
};
}
didFocus = true;
}
};
didFocus = true;
}
stepDiv.slideDown(didSlideDown);
}
if (step.required &&
(values[stepId] === "" ||
(step.multiple && values[stepId].join("") === ""))) {
canContinue = false;
}
});
continueBtn.setDisabled(!canContinue);
}
function destroy() {
$("#wiktku-start-form, .noafterwizard").slideUp(function () {
$(this).remove();
});
$(".noarticletext .nowizard, #editform").slideDown();
$("#ca-edit").removeClass("selected");
$("#ca-wiktku-nowizard").addClass("selected");
}
// Priority order for Kurdish dialects and navz.
// Codes listed here come before all other languages; unlisted codes
// are sorted alphabetically by their display name via localeCompare.
var LANG_PRIORITY = ["navz", "ku", "hac", "sdh", "lki", "ckb", "zza"];
// Inserts a new "== {{ziman|code}} ==" section at the correct sorted
// position: navz, then ku/hac/sdh/lki/ckb/zza, then alphabetical by name.
function insertNewLangSection(existing, wikitext) {
var newCodeMatch = wikitext.match(new RegExp("^" + langHeaderSource("[^}]+")));
var newCode = newCodeMatch ? newCodeMatch[1] : "";
var sections = [];
var preamble = "";
var anyHeaderSrc = langHeaderSource("[^}]+");
var firstMatch = new RegExp("^" + anyHeaderSrc, "m").exec(existing);
if (!firstMatch) {
// No existing lang sections at all — just append.
var sep = existing && !/\n\s*$/.test(existing) ? "\n\n" : "";
return existing + sep + wikitext;
}
// Everything before the first == {{ziman|...}} == is the preamble.
var firstSectionStart = firstMatch.index;
// Walk back to the start of that line.
var lineStart = existing.lastIndexOf("\n", firstSectionStart - 1);
var preambleEnd = lineStart !== -1 ? lineStart + 1 : 0;
preamble = existing.slice(0, preambleEnd);
// Parse each language section: header line + everything until the next header.
var body = existing.slice(preambleEnd);
// (?![\s\S]) matches only true end-of-string, since a bare "$" with
// /m would stop at the section's first line break instead.
var langSectionRe = new RegExp(
"^(" + anyHeaderSrc + "\\n?)([\\s\\S]*?)(?=\\n" + anyHeaderSrc + "|(?![\\s\\S]))",
"gm"
);
var m;
while ((m = langSectionRe.exec(body)) !== null) {
sections.push({
code: m[2],
content: m[0] // full text of this section including header
});
}
// Determine sort rank: priority list first (by index), then alphabetical.
function getLangName(code) {
var entry = langsByCode[code];
return entry ? entry.label : code;
}
function sortRank(code) {
var idx = LANG_PRIORITY.indexOf(code);
return idx !== -1 ? idx : LANG_PRIORITY.length;
}
function compareLangs(a, b) {
var ra = sortRank(a), rb = sortRank(b);
if (ra !== rb) return ra - rb;
// Both are outside priority list — sort by display name.
return getLangName(a).localeCompare(getLangName(b), userLang);
}
// Insert the new section into the sorted list.
var newSection = { code: newCode, content: wikitext };
var inserted = false;
for (var i = 0; i < sections.length; i++) {
if (compareLangs(newCode, sections[i].code) < 0) {
sections.splice(i, 0, newSection);
inserted = true;
break;
}
}
if (!inserted) sections.push(newSection);
// Re-join: preamble + sections separated by newlines.
var joined = sections.map(function (s) {
// Ensure each section ends with exactly one newline before the next.
return s.content.replace(/\n+$/, "");
}).join("\n");
return preamble + joined + "\n";
}
function build() {
$(".nowizard, .nowizard .noafterwizard").hide();
var callToAction = $("#wiktku-calltoaction");
var origCallToActionText = callToAction.text();
$(mw.util.addPortletLink("p-views", "#", "Edîtora çavkaniyê veke",
"ca-wiktku-nowizard", "Vê rûpelê bi edîtora çavkaniyê çêke",
undefined, "#ca-watch")).click(function (evt) {
evt.preventDefault();
callToAction.text(origCallToActionText);
destroy();
});
if (callToAction.length) {
callToAction.text(origCallToActionText +
" Forma li jêr ji bo çêkirina madeyeke nû bi kar bîne.");
}
var startForm = $("<form id='wiktku-start-form'></form>");
var clearPageCheck = null;
if (addLangMode) {
startForm.append($("<p class='wiktku-addlang-notice'></p>").html(
"Bi vê formê tu yê zimanekî nû li rûpelê îlawe bikî. Eger ev ziman jixwe hebe, beşa nû li dawiya vî zimanî dê were îlawekirin. " +
"Ji kerema xwe netîceya dawî kontrol bike, eger problemek derkeve, li <a href='" +
mw.util.getUrl('Mediawiki talk:Gadget-start.js') +
"'>nîqaşa vê amûrê</a> problemê ragihîne."
));
clearPageCheck = $("<input type='checkbox' id='wiktku-clear-page-check'>");
var clearPageLabel = $("<label for='wiktku-clear-page-check'></label>")
.text(" Muhtewaya rûpelê paqij bike (her tiştî jê bibe û rûpelê ji nû ve binivîse)");
startForm.append(
$("<p class='wiktku-addlang-notice'></p>")
.append(clearPageCheck)
.append(clearPageLabel)
);
// Re-evaluate step visibility (e.g. the pron step) whenever this
// is toggled, since it changes what counts as "existing content".
clearPageCheck.on("change", function () {
refresh();
});
}
var spinner;
// Tab bar for switching between POS sections.
var sectionTabsDiv = $("<div id='wiktku-section-tabs'></div>");
startForm.submit(function (evt) {
evt.preventDefault();
continueBtn.setDisabled(true);
continueBtn.$element.addClass("wiktku-btn-sending");
spinner.show();
getWikitext(function (wikitext) {
if (addLangMode && clearPageCheck && clearPageCheck.prop("checked")) {
// User asked to wipe the page and start fresh — just
// write the newly generated wikitext as the full content.
$("#wpTextbox1").val(wikitext);
} else if (addLangMode) {
var textbox = $("#wpTextbox1");
var existing = textbox.val() || "";
// If this language's section already exists (whitespace
// differences aside), merge into it; otherwise insert new.
var langHeaderMatch = wikitext.match(new RegExp("^(" + langHeaderSource("[^}]+") + "\\n)"));
if (langHeaderMatch) {
var langHeader = langHeaderMatch[1]; // e.g. "== {{ziman|ku}} ==\n"
var newCode = langHeaderMatch[2];
var existingHeader = findLangHeader(existing, newCode);
if (existingHeader) {
// Strip the header from the new output.
var newContent = wikitext.slice(langHeader.length);
// Find the insertion point: end of the existing lang section.
// A new L2 heading marks the start of the next language block.
var searchFrom = existingHeader.index + existingHeader.match.length;
// Find the next == … == heading after this section's start.
var nextL2 = existing.indexOf("\n== ", searchFrom);
var insertAt = nextL2 !== -1 ? nextL2 : existing.length;
// Ensure there's a blank line before the inserted block.
var before = existing.slice(0, insertAt);
var after = existing.slice(insertAt);
var sep = /\n\s*$/.test(before) ? "" : "\n";
textbox.val(before + sep + newContent + after);
} else {
// New language — insert at the correct sorted position.
textbox.val(insertNewLangSection(existing, wikitext));
}
} else {
// Unexpected format — insert at sorted position anyway.
textbox.val(insertNewLangSection(existing, wikitext));
}
} else {
$("#wpTextbox1").val(wikitext);
}
$("html, body").animate({scrollTop: 0});
callToAction.text("Hindik ma!");
$("#wiktku-preview-container").remove();
destroy();
});
});
$.each(ordered_steps, function (i, step) {
var stepDiv = $(mw.html.element("div", {
"class": "wiktku-start-step",
id: "wiktku-start-" + step.id }));
var name = capitalize(step.name);
stepDiv.append($(mw.html.element("h3", {
"class": "wiktku-start-step-name" }, new mw.html.Raw(mw.html.element("label", {
"for": "wiktku-start-" + step.id + "-field" }, name)))));
if (step.question_fmt) {
// question_fmt can be a plain string, or a function of the
// current values (used by steps whose question text depends
// on e.g. the chosen language) — refresh() keeps it in sync
// afterwards via the .wiktku-start-step-question class.
var questionText = typeof step.question_fmt === "function"
? step.question_fmt(getValues())
: step.question_fmt;
stepDiv.append($(mw.html.element("label", {
"class": "wiktku-start-step-question",
"for": "wiktku-start-" + step.id + "-field" }, questionText)));
if (step.question_br) stepDiv.append($("<br>"));
}
var input;
if (step.choices) {
input = $(mw.html.element("select", {
"class": "wiktku-start-step-field",
id: "wiktku-start-" + step.id + "-field" }));
input.attr("data-placeholder",
capitalize(step.name) + " hilbijêre ");
populateMenus(input, step.choices);
if (step.multiple) input.attr("multiple", true);
// initSelects() runs over the whole form once it is in the DOM.
stepDiv.append(input);
} else if (typeof(step.build) === "function") {
input = step.build(stepDiv);
} else {
input = $("<textarea></textarea>")
.attr("class", "wiktku-start-step-field")
.attr("id", "wiktku-start-" + step.id + "-field")
.attr("rows", step.rows || 2);
if (step.narrow) input.addClass("wiktku-start-narrow");
if (step.placeholder) input.attr("placeholder", step.placeholder);
if (step.multiple) {
input.on("input", function (evt) {
refreshForTextField(evt.target, step);
});
var keyInput = buildKeyInput(step);
var list = $(step.ordered ? "<ol></ol>" : "<ul></ul>")
.append($("<li></li>").append(keyInput).append(input));
stepDiv.append(list);
}
else stepDiv.append(input);
}
prepareInput(input, step);
stepDiv.hide();
// Insert tab bar just before the first per-section step.
if (step.id === "pos") startForm.append(sectionTabsDiv);
startForm.append(stepDiv);
});
// ── Section tab helpers ──────────────────────────────────────────────
// ── Add-section button — lives in the tab bar, disabled until pos chosen ──
var addSectionBtn = new OO.ui.ButtonWidget({
label: "+ Beş zêde bike",
disabled: true
});
addSectionBtn.on("click", function () {
saveCurrentSection();
sections.push({});
activeSection = sections.length - 1;
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
var stepDiv = $("#wiktku-start-dfn");
stepDiv.find("ol.wiktku-dfn-list").remove();
steps.dfn.build(stepDiv);
return;
}
if (id === "etym") {
$("#wiktku-start-etym .wiktku-etym-wrap").remove();
steps.etym.build($("#wiktku-start-etym"));
return;
}
if (id === "cavkani") {
$("#wiktku-start-cavkani .wiktku-cavkani-wrap").remove();
steps.cavkani.build($("#wiktku-start-cavkani"));
return;
}
if (id === "trans") {
var transDiv = $("#wiktku-start-trans");
transDiv.find(".wiktku-trans-group").remove();
return;
}
if (id === "zarava") {
var zaravaDiv = $("#wiktku-start-zarava");
zaravaDiv.find(".wiktku-zarava-group").remove();
return;
}
if (id === "dunde") {
var dundeDiv = $("#wiktku-start-dunde");
dundeDiv.find("ul.wiktku-dunde-list").remove();
return;
}
var stepDiv = $("#wiktku-start-" + id);
stepDiv.find(".wiktku-start-step-field").val("");
stepDiv.find("select.wiktku-start-step-field").trigger("wiktku:refresh");
});
renderSectionTabs();
refresh();
$("html, body").animate({ scrollTop: sectionTabsDiv.offset().top - 20 }, 300);
});
/** Re-render the tab bar to reflect current sections[] and activeSection. */
function renderSectionTabs() {
// Detach (not remove) the button first: .empty() strips bound
// event data from any children left inside it, which would
// silently kill addSectionBtn's click handler on every re-render.
addSectionBtn.$element.detach();
sectionTabsDiv.empty();
var lang = getValues().lang || "";
if (!lang) {
sectionTabsDiv.hide();
return;
}
sectionTabsDiv.show();
$.each(sections, function (i) {
var posVal = sections[i].pos || "";
var tabLabel = posVal ? capitalize(posVal) : ("Beş " + (i + 1));
var tab = $("<span></span>")
.addClass("wiktku-section-tab")
.text(tabLabel)
.toggleClass("wiktku-tab-active", i === activeSection);
(function (idx) {
tab.on("click", function () {
if (idx === activeSection) return;
saveCurrentSection();
activeSection = idx;
restoreSection(sections[activeSection]);
refresh();
renderSectionTabs();
});
}(i));
sectionTabsDiv.append(tab);
});
// Enable "Beş zêde bike" only when the active section has a pos chosen.
var activePos = sections[activeSection] && sections[activeSection].pos
? sections[activeSection].pos
: getValues().pos;
addSectionBtn.setDisabled(!activePos);
sectionTabsDiv.append(addSectionBtn.$element);
}
renderSectionTabs();
/**
* Restores a full cached draft: shared lang/pron fields, then every
* section (via the same restoreSection()/refresh()/renderSectionTabs()
* sequence already used when switching tabs).
* @param cached {{lang: string, pron: string, sections: Array, activeSection: number}}
*/
function restoreFromCache(cached) {
if (cached.lang) {
$("#wiktku-start-lang-field").val(cached.lang);
$("#wiktku-start-lang-field").trigger("wiktku:refresh");
}
// Rebuild dependent steps (pos, pron wrap, etc.) now that lang is set.
refresh();
if (cached.pron !== undefined) {
$("#wiktku-start-pron .wiktku-pron-text").val(cached.pron);
}
sections = (cached.sections && cached.sections.length) ? cached.sections : [{}];
activeSection = (typeof cached.activeSection === "number" &&
cached.activeSection >= 0 && cached.activeSection < sections.length)
? cached.activeSection : 0;
restoreSection(sections[activeSection]);
refresh();
renderSectionTabs();
mw.notify("Danûstandina berê ya qeydkirî ji cache hate barkirin.",
{ type: "info", tag: "wiktku-cache-restore" });
}
// Update the active tab's label whenever pos changes.
startForm.on("change", "#wiktku-start-pos-field", function () {
renderSectionTabs();
});
// Show the tab bar as soon as a language is selected.
startForm.on("change", "#wiktku-start-lang-field", function () {
renderSectionTabs();
});
var footer = $("<div id='wiktku-start-footer'></div>");
spinner = $(mw.html.element("img", {
id: "wiktku-start-spinner",
src: "//upload.wikimedia.org/wikipedia/commons/d/de/Ajax-loader.gif",
alt: "Tê barkirin…",
title: "Tê barkirin…" }));
footer.append(spinner.hide());
continueBtn = new OO.ui.ButtonWidget({
id: "wiktku-unhide-editform",
label: "Bişîne",
flags: [ "primary", "progressive" ]
});
continueBtn.on("click", function () {
// Immediate feedback that the click registered
continueBtn.$element.addClass("wiktku-btn-flash");
setTimeout(function () {
continueBtn.$element.removeClass("wiktku-btn-flash");
}, 500);
mw.notify("Tê şandin…", { type: "info", tag: "wiktku-submit" });
startForm.trigger("submit");
});
footer.append(continueBtn.$element);
// "Edîtora çavkaniyê veke" button — inline fallback for the portlet link
var sourceEditorBtn = new OO.ui.ButtonWidget({
label: "Edîtora çavkaniyê veke"
});
sourceEditorBtn.on("click", function () {
destroy();
});
footer.append(sourceEditorBtn.$element);
// ── Cache save/clear buttons ─────────────────────────────────────────
// Manual, page-scoped save of the entire wizard (all sections, not
// just the active one) via [[MediaWiki:Gadget-StorageUtils.js]]'s
// ObjectStorage. Restoring happens silently on load (see the
// ziman.json .then() callback below), once the full language list
// is available.
var saveCacheBtn = new OO.ui.ButtonWidget({
label: "Li cache qeyd bike",
title: "Halê vê formê yê niha (ziman, bilêvkirin û hemû beş) li cache (localStorage) qeyd bike, da ku eger rûpel bêyî xwestin were girtin an ji nû ve were barkirin, tu karibî berdewam bikî."
});
saveCacheBtn.on("click", function () {
saveCurrentSection();
var snapshot = {
lang: getValues().lang || "",
pron: $("#wiktku-start-pron .wiktku-pron-text").val() || "",
sections: sections,
activeSection: activeSection
};
// ObjectStorage.Set() doesn't return a success/failure value, so
// the only way to detect a real failure (storage blocked, quota
// exceeded, JSON.stringify choking on something unexpected) is to
// catch it here rather than inspect a (nonexistent) return value.
try {
formCache.Set(snapshot);
mw.notify("Halê formê li cache hate qeydkirin.", { type: "success", tag: "wiktku-cache-save" });
} catch (e) {
mw.notify("Qeydkirina li cache bi ser neket.", { type: "error", tag: "wiktku-cache-save" });
}
});
footer.append(saveCacheBtn.$element);
var clearCacheBtn = new OO.ui.ButtonWidget({
label: "Cache paqij bike",
flags: [ "destructive" ],
title: "Datayên qeydkirî yên vê rûpelê ji cache jê bibe (forma ku niha xuya dike naguherîne)."
});
clearCacheBtn.on("click", function () {
formCache.Set({});
mw.notify("Cache hate paqijkirin.", { type: "success", tag: "wiktku-cache-clear" });
});
footer.append(clearCacheBtn.$element);
// ── Preview checkboxes ───────────────────────────────────────────────
// Wikitext preview (raw text panel)
var previewCheck = $("<input type='checkbox' id='wiktku-preview-toggle'>");
var previewLabel = $("<label for='wiktku-preview-toggle'></label>")
.text(" Pêşdîtina wîkîtekstê");
var previewPanel = $("<pre id='wiktku-preview-panel'></pre>").hide();
// Live rendered preview (parsed HTML panel, same logic as AjaxEdit).
// Not available on mobile — API polling causes too many problems on small screens.
var livePreviewCheck = null;
var livePreviewPanel = null;
if (!isMobile) {
livePreviewCheck = $("<input type='checkbox' id='wiktku-live-preview-toggle'>");
livePreviewPanel = $("<div id='wiktku-live-preview-panel'></div>").hide();
}
// Container that holds both panels and switches between stacked / side-by-side.
var previewContainer = $("<div id='wiktku-preview-container'></div>");
previewContainer.append(previewPanel);
if (!isMobile) previewContainer.append(livePreviewPanel);
var previewTimer = null;
var livePreviewIntervalId = -1;
var livePreviewActive = false; // guards in-flight fetches after uncheck
/** Rebuilds wikitext preview if its checkbox is checked. */
function schedulePreview() {
if (!previewCheck.prop("checked")) return;
clearTimeout(previewTimer);
// Debounce: wait 400 ms after the last keystroke before rebuilding.
previewTimer = setTimeout(function () {
getWikitext(function (wikitext) {
previewPanel.text(wikitext).show();
updatePanelLayout();
});
}, 400);
}
/** Fetches parsed HTML and populates the live preview panel. */
function loadLivePreview() {
getWikitext(function (wikitext) {
new mw.Api().parse(wikitext, { title: mw.config.get("wgPageName") }).done(function (html) {
// Discard result if the user unchecked while the fetch was in flight.
if (!livePreviewActive) return;
livePreviewPanel.html(html).show();
updatePanelLayout();
});
});
}
/** Adjusts panel widths depending on which previews are visible. */
function updatePanelLayout() {
var wikitextVisible = previewCheck.prop("checked");
var liveVisible = livePreviewCheck && livePreviewCheck.prop("checked");
if (wikitextVisible && liveVisible) {
// Side by side — each panel takes roughly half the available width.
previewPanel.css({ "flex": "1 1 45%", "min-width": "280px" });
livePreviewPanel.css({ "flex": "1 1 45%", "min-width": "280px" });
} else {
// Full width for whichever is visible — only touch panels that are
// actually shown so that setting flex doesn't override display:none.
if (wikitextVisible) previewPanel.css({ "flex": "1 1 100%", "min-width": "" });
if (liveVisible && livePreviewPanel) livePreviewPanel.css({ "flex": "1 1 100%", "min-width": "" });
}
}
previewCheck.on("change", function () {
if ($(this).prop("checked")) {
schedulePreview();
} else {
clearTimeout(previewTimer);
previewPanel.hide();
updatePanelLayout();
}
});
if (!isMobile) {
livePreviewCheck.on("change", function () {
if ($(this).prop("checked")) {
livePreviewActive = true;
livePreviewPanel.show();
loadLivePreview();
livePreviewIntervalId = setInterval(loadLivePreview, 500);
} else {
livePreviewActive = false;
clearInterval(livePreviewIntervalId);
livePreviewIntervalId = -1;
livePreviewPanel.hide().empty();
updatePanelLayout();
}
});
}
// Listen on all input/change events on the form and update both previews.
startForm.on("input change", function () {
schedulePreview();
});
footer.append($("<span style='margin-left:1em'></span>")
.append(previewCheck).append(previewLabel));
if (!isMobile) {
var livePreviewLabel = $("<label for='wiktku-live-preview-toggle'></label>")
.text(" Pêşdîtina zindî");
footer.append($("<span style='margin-left:1em'></span>")
.append(livePreviewCheck).append(livePreviewLabel));
}
startForm.append(footer);
$("#editform").hide().before(startForm);
// Insert preview container (holds both panels) after the form.
startForm.after(previewContainer);
// One pass over the whole form: every select that hasn't already been
// initialised, and isn't opted out with .wiktku-plain-select, gets
// the searchable picker.
initSelects(startForm);
refresh();
// Give every draggable textarea a custom resize grip (works
// consistently on Safari/iOS, unlike the native corner grip — see
// the "Manual drag-to-resize handle" comment in styles.css), and
// keep applying it to textareas added later on (new sense blocks,
// quote-source fields, nimûne rows, …).
wiktkuInitManualResize(startForm);
new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
$(mutation.addedNodes).each(function () {
if (this.nodeType !== 1) return;
wiktkuInitManualResize(this);
});
});
}).observe(startForm[0], { childList: true, subtree: true });
// Zimanan ji MediaWiki:Gadget-translation_editor.js/ziman.json bar bike.
// Kodên ku bi "-pro" diqedin û navên ku "zimanê destan" tê de heye
// tên derxistin.
// Pinned choices come from MediaWiki:Gadget-start.js/data.json (langChoices),
// already loaded into steps.lang.choices before build() runs.
var pinnedChoices = steps.lang.choices.slice();
var pinnedCodes = $.map(pinnedChoices, function (choice) { return choice.code; });
zimanJsonPromise.then(function (data) {
var page = data.query.pages[0];
var content = page &&
page.revisions &&
page.revisions[0].slots.main.content;
var zimanData;
try { zimanData = JSON.parse(content); } catch (e) { zimanData = {}; }
var extraChoices = [];
$.each(zimanData, function (code, name) {
// Filter: skip proto-language codes and reconstructed langs.
if (/-pro$/i.test(code)) return;
if (/ziman[eê]\s+destan/i.test(name)) return;
// Skip codes already in the pinned list (they are handled above).
if (pinnedCodes.indexOf(code) !== -1) return;
var choice = { code: code, label: name, sortKey: name };
extraChoices.push(choice);
langsByCode[code] = choice;
});
// Populate langsByCode for pinned choices too.
$.each(pinnedChoices, function (i, choice) {
// Ensure pinned choices have a sortKey.
if (choice.sortKey === undefined) choice.sortKey = choice.label;
langsByCode[choice.code] = choice;
});
// Sort the extra choices alphabetically by sort key.
extraChoices.sort(function (a, b) {
return a.sortKey.localeCompare(b.sortKey, userLang);
});
// Final list: pinned first, then the rest.
var allChoices = pinnedChoices.concat(extraChoices);
steps.lang.choices = allChoices;
steps.trans.keys = allChoices;
steps.dunde.keys = allChoices;
steps.zarava.keys = getZaravaKeys(allChoices);
// Replacing the option list only needs a wiktku:refresh so each
// picker re-reads its <option>s.
var langMenu = $("#wiktku-start-lang-field");
populateMenus(langMenu, steps.lang.choices);
langMenu.trigger("wiktku:refresh");
var transMenus = $("#wiktku-start-trans .wiktku-start-step-keyfield");
populateMenus(transMenus, steps.trans.keys, getDisabledKeys(steps.trans));
transMenus.trigger("wiktku:refresh");
var dundeMenus = $("#wiktku-start-dunde .wiktku-start-step-keyfield");
populateMenus(dundeMenus, steps.dunde.keys, getDisabledKeys(steps.dunde));
dundeMenus.trigger("wiktku:refresh");
var zaravaMenus = $("#wiktku-start-zarava .wiktku-start-step-keyfield");
populateMenus(zaravaMenus, steps.zarava.keys, getDisabledKeys(steps.zarava));
zaravaMenus.trigger("wiktku:refresh");
// Now that the full language list is loaded, silently restore any
// draft the editor previously saved for this page
var cachedDraft = formCache.Get();
if (cachedDraft && cachedDraft.sections && cachedDraft.sections.length) {
restoreFromCache(cachedDraft);
}
});
}
mw.loader.using(["oojs-ui-core"], function () {
// Load metadata, langChoices, posChoices and tplDefs from the companion
// data page so they can be updated without touching this script.
// (Request was already fired via metaApiPromise above, in parallel
// with this module load — we're just picking up the result here.)
metaApiPromise.then(function (data) {
var page = data.query.pages[0];
var content = page &&
page.revisions &&
page.revisions[0].slots.main.content;
var d;
try { d = JSON.parse(content); } catch (e) { d = {}; }
// Populate metadata.
if (d.metadata) $.extend(metadata, d.metadata);
// Populate gender labels.
if (d.genderLabels) $.extend(GENDER_BASE_LABELS, d.genderLabels);
// Populate lang choices (pinned list used by build() → ziman.json loader).
// data.json stores these as a plain {code: label} object.
if (d.langChoices) steps.lang.choices = choicesFromObject(d.langChoices, true);
// Populate POS choices — also a plain {code: label} object in data.json.
if (d.posChoices) steps.pos.choices = choicesFromObject(d.posChoices, false);
// Populate template definitions for the dfn sense-block builder.
if (d.tplDefs) steps.dfn.tplDefs = d.tplDefs;
// Populate pos placeholder examples.
if (d.posExamples) steps.dfn.posExamples = d.posExamples;
// Populate citation template definitions for the quote widget.
if (d.jederDefs) steps.dfn.jederDefs = d.jederDefs;
// Populate pronunciation and etymology template insert lists.
if (d.pronTpls) {
steps.pron.pronTpls = d.pronTpls;
steps.pron.refreshTplSelect();
}
if (d.etymTpls) {
steps.etym.etymTpls = d.etymTpls;
steps.etym.refreshTplSelect();
}
// Sync trans/dunde/zarava keys with the (now populated) lang choices.
steps.trans.keys = steps.lang.choices;
steps.dunde.keys = steps.lang.choices;
steps.zarava.keys = getZaravaKeys(steps.lang.choices);
}).always(build);
});
});
//</nowiki>
6qi0pmgksq1xbey909cqhxbmxauixaf
6292075
6292074
2026-07-29T20:22:25Z
Wikihez
7344
6292075
javascript
text/javascript
// Li ser [[vi:MediaWiki:Gadget-start.js]] hatiye refaktorkirin.
// implicit dependencies: StorageUtils (ObjectStorage)
//<nowiki>
$(function () {
if (window.location.href.includes("editintro=User:Wikihez/creation/intro")) {
return; // Do not run the script wextê WF:Bilez dişuxile
}
var ns = mw.config.get("wgNamespaceNumber");
if (ns &&
!(ns === 2 && mw.config.get("wgPageName").match(/\/ceribandin$|\/test$/))) {
return;
}
var action = mw.config.get("wgAction");
var pageExists = !!mw.config.get("wgArticleId");
var addLangMode = pageExists && mw.util.getParamValue("wiktkuaddlang") === "1";
if (action === "view" && pageExists) {
var targetContainer;
var skin = mw.config.get('skin');
if (skin === 'vector-2022') {
targetContainer = 'p-cactions';
} else if (skin === 'vector') {
targetContainer = 'p-tb';
} else {
targetContainer = 'p-views';
}
mw.util.addPortletLink(targetContainer,
mw.util.getUrl(mw.config.get("wgPageName"), { action: "submit", wiktkuaddlang: "1" }),
"+Ziman/beşeke din", "ca-wiktku-addlang",
"Ji vê rûpelê re ziman an jî beşeke nû zêde bike");
return;
}
if (!(action === "edit" || action === "submit")) {
return;
}
if (!addLangMode && !$(".mw-newarticletext, .mw-newarticletextanon").length) {
return;
}
mw.notify(
"Amûr dest pê dike, hinek bisekinin.\nNot: jkx Sentaks (Syntax highlighting) neaktîv bikin",
{ type: "info", tag: "wiktku-start-notice", autoHide: true, autoHideSeconds: 10 }
);
var dataJsonPromise, zimanJsonPromise;
var metaApiPromise = mw.loader.using("mediawiki.api").then(function () {
var metaApi = new mw.Api();
dataJsonPromise = metaApi.get({
action: "query",
prop: "revisions",
titles: "MediaWiki:Gadget-start.js/data.json",
rvprop: "content",
rvslots: "main",
formatversion: 2
});
zimanJsonPromise = metaApi.get({
action: "query",
prop: "revisions",
titles: "Bikarhêner:Wikihez/test.json",
rvprop: "content",
rvslots: "main",
formatversion: 2
});
return dataJsonPromise;
});
function capitalize(str) {
if (!str) return str;
return str[0].toUpperCase() + str.substr(1);
}
function decapitalize(str) {
if (!str) return str;
return str[0].toLowerCase() + str.substr(1);
}
function escapeRegExp(str) {
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
function langHeaderSource(codePattern) {
return "\n?==\\s*\\{\\{\\s*ziman\\s*\\|\\s*(" + codePattern + ")\\s*\\}\\}\\s*==";
}
function findLangHeader(text, code) {
var m = new RegExp(langHeaderSource(escapeRegExp(code))).exec(text);
return m ? { index: m.index, match: m[0] } : null;
}
function stripWikilinks(str) {
return str.replace(/\[\[([^\]|]+)(?:\|([^\]]+))?\]\]/g, function (m, target, display) {
return display || target;
});
}
function splitTercimeIzah(mane) {
var m = /^([\s\S]*?)\s*\{\{îzah\|([\s\S]*)\}\}\s*$/.exec(mane || "");
return m ? { tercime: m[1], izah: m[2] } : null;
}
function insertAtCursor(el, text) {
var start = el.selectionStart;
var end = el.selectionEnd;
var val = el.value;
el.value = val.slice(0, start) + text + val.slice(end);
var pos = start + text.length;
el.selectionStart = el.selectionEnd = pos;
}
var catSrcTemplates = null;
var catSrcTemplatesPromise = null;
function fetchCatSrcTemplates() {
if (catSrcTemplatesPromise) return catSrcTemplatesPromise;
catSrcTemplatesPromise = new mw.Api().get({
action: "query",
list: "categorymembers",
cmtitle: "Kategorî:Çavkanî",
cmnamespace: 10,
cmlimit: "max",
formatversion: 2
}).then(function (data) {
var members = (data.query && data.query.categorymembers) || [];
catSrcTemplates = $.map(members, function (m) {
// Pêşgira navî ya "Şablon:" rake.
return m.title.replace(/^[^:]+:/, "");
});
catSrcTemplates.sort(function (a, b) { return a.localeCompare(b, userLang); });
return catSrcTemplates;
}, function () {
catSrcTemplates = [];
return catSrcTemplates;
});
return catSrcTemplatesPromise;
}
var pageName = mw.config.get("wgPageName").replaceAll(/_/g, " ");
if (ns) pageName = pageName.replace(/.*\//, "");
var pageNameRe = escapeRegExp(pageName);
var userLang = mw.config.get("wgUserLanguage");
var formCache = new ObjectStorage("wiktku_start_draft_" + mw.config.get("wgPageName"), 1);
var isMobile = !!mw.config.get("wgMFMode") || window.matchMedia("(pointer: coarse)").matches;
var FOLD_EXTRA = {
"ı": "i", // dotless i
"ø": "o", // o with stroke
"đ": "d", // d with stroke
"ð": "d", // eth
"ə": "e", // schwa
"ħ": "h", // h with stroke
"ł": "l", // l with stroke
"ŋ": "n", // eng
"ʉ": "u", // u bar
"ɨ": "i", // i bar
"ʒ": "z", // ezh
"ɛ": "e", // open e
"ɔ": "o", // open o
"æ": "ae",
"œ": "oe",
"ß": "ss",
"þ": "th" };
function foldDiacritics(str) {
if (str === null || str === undefined) return "";
var s = String(str).toLowerCase();
if (typeof s.normalize === "function") {
// Split "î" into "i" + combining circumflex, then drop the accent.
s = s.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
}
return s.replace(/[^\u0000-\u007f]/g, function (ch) {
return Object.prototype.hasOwnProperty.call(FOLD_EXTRA, ch) ? FOLD_EXTRA[ch] : ch;
});
}
var WIKTKU_RESIZE_STORAGE_PREFIX = "wiktku_resize_height_";
/** Textareas of the same "kind" (e.g. every Nimûne box, every Tercime
* box) share a class list even though each individual box is a fresh
* DOM node built on the fly (new sense blocks, quote fields, …) with
* no stable id of its own. That class list is what we key the cached
* height on, so a size chosen for one Nimûne box is reused for every
* Nimûne box, on this page and on the next one. */
function wiktkuResizeStorageKey(textarea) {
var cls = (textarea.attr("class") || "").trim().replace(/\s+/g, "_");
return WIKTKU_RESIZE_STORAGE_PREFIX + cls;
}
function wiktkuSaveResizeHeight(textarea, height) {
if (!(window.mw && mw.storage)) return;
try {
mw.storage.set(wiktkuResizeStorageKey(textarea), String(Math.round(height)));
} catch (e) { /* localStorage unavailable (private mode, quota, …) — skip caching */ }
}
function wiktkuLoadResizeHeight(textarea) {
if (!(window.mw && mw.storage)) return null;
try {
var v = mw.storage.get(wiktkuResizeStorageKey(textarea));
return v ? parseFloat(v) : null;
} catch (e) {
return null;
}
}
/** Replaces a textarea's native corner resize grip with a small custom
* drag handle (see the "Manual drag-to-resize handle" comment and
* .wiktku-resize-wrap / .wiktku-resize-grip in styles.css). Needed
* because iOS Safari never implements the native grip at all and
* desktop Safari's own version is inconsistent, so we replace it
* everywhere for uniform behaviour. One-line fields (.wiktku-start-narrow)
* are meant to stay a fixed height and are left untouched. Safe to call
* more than once on the same textarea. */
function wiktkuMakeManualResizable(textarea) {
textarea = $(textarea);
if (!textarea.is("textarea") || textarea.hasClass("wiktku-start-narrow")) return;
if (textarea.data("wiktkuResizableDone")) return;
textarea.data("wiktkuResizableDone", true);
textarea.wrap("<div class='wiktku-resize-wrap'></div>");
var grip = $("<div class='wiktku-resize-grip'></div>");
textarea.after(grip);
// Restore a previously chosen height for this kind of field, if any.
var cachedHeight = wiktkuLoadResizeHeight(textarea);
if (cachedHeight) {
var minHeightInit = parseFloat(textarea.css("min-height")) || 0;
textarea.css("height", Math.max(cachedHeight, minHeightInit) + "px");
}
var dragging = false, startY = 0, startHeight = 0;
function onPointerMove(e) {
if (!dragging) return;
var oe = e.originalEvent || e;
var minHeight = parseFloat(textarea.css("min-height")) || 0;
var newHeight = startHeight + (oe.clientY - startY);
textarea.css("height", Math.max(newHeight, minHeight) + "px");
}
function onPointerUp(e) {
if (!dragging) return;
dragging = false;
var oe = e.originalEvent || e;
try { grip[0].releasePointerCapture(oe.pointerId); } catch (err) { /* ignore */ }
$(document).off("pointermove", onPointerMove);
$(document).off("pointerup pointercancel", onPointerUp);
wiktkuSaveResizeHeight(textarea, textarea.outerHeight());
}
grip.on("pointerdown", function (e) {
var oe = e.originalEvent || e;
if (oe.button !== undefined && oe.button !== 0) return; // primary contact only
e.preventDefault();
dragging = true;
startY = oe.clientY;
startHeight = textarea.outerHeight();
try { grip[0].setPointerCapture(oe.pointerId); } catch (err) { /* ignore */ }
$(document).on("pointermove", onPointerMove);
$(document).on("pointerup pointercancel", onPointerUp);
});
}
/** Applies wiktkuMakeManualResizable to every eligible textarea already
* inside `context` (context itself, if it is a textarea, or any of its
* descendants). Used both for the initial form render and, via the
* MutationObserver set up in build(), for textareas added later on
* (new sense blocks, quote-source fields, nimûne rows, …). */
function wiktkuInitManualResize(context) {
var $context = $(context);
var $textareas = $context.is("textarea") ? $context : $context.find("textarea");
$textareas.each(function () {
wiktkuMakeManualResizable(this);
});
}
function wrapNativeSelect(select) {
var wrapper = $("<span class='wiktku-native-select-wrap'></span>");
if (select.prop("multiple")) {
return wrapper.append(select);
}
var placeholder = select.attr("data-placeholder") || "Lê bigere...";
select.hide();
var textInput = $("<input type='search' autocomplete='off'>")
.attr("placeholder", placeholder)
.attr("role", "combobox")
.attr("aria-autocomplete", "list")
.attr("aria-expanded", "false")
.addClass("wiktku-start-narrow wiktku-ac-input");
var resultsList = $("<ul class='wiktku-ac-results' role='listbox'></ul>").hide();
var allOptions = [];
var shown = [];
var activeIndex = -1;
function cacheOptions() {
allOptions = [];
select.find("option").each(function () {
var v = $(this).val();
var text = $(this).text();
// A blank value with no label (most selects' placeholder) is
// never a real choice, so skip it. But a blank value WITH a
// label -- e.g. tplSelect's "— yan jî şablonek hilbijêre —" --
// is a meaningful "clear the selection" choice, so keep it
// searchable/selectable like any other option.
if (!v && !text) return;
// Language options read "Name (code)" -- score the name on its own
// so the trailing code doesn't also count as a name match.
var name = text.replace(/\s*\([^()]*\)\s*$/, "");
allOptions.push({
value: v,
text: text,
disabled: $(this).prop("disabled"),
foldCode: foldDiacritics(v),
foldName: foldDiacritics(name),
foldText: foldDiacritics(text)
});
});
}
cacheOptions();
// True if `q` starts a word inside `name` ("kevn" in "ingiliziya kevn").
function startsWord(name, q) {
var from = 0, at;
while ((at = name.indexOf(q, from)) !== -1) {
if (at === 0 || /[\s\-\u2013\u2014(/,.]/.test(name.charAt(at - 1))) return true;
from = at + 1;
}
return false;
}
// Lower rank = better match.
// a code that *is* the query, or begins with it, always outranks a name
// that merely contains it -- so "ang" lists "Îngilîziya kevn (ang)"
// first instead of burying it among every name containing "ang".
var RANK_NONE = 99;
function rankOption(o, q) {
var code = o.foldCode, name = o.foldName;
if (code === q) return 0; // exact code
if (code.indexOf(q) === 0) return 1; // code prefix
if (name === q) return 2; // exact name
if (name.indexOf(q) === 0) return 3; // name prefix
if (startsWord(name, q)) return 4; // starts a word in the name
if (name.indexOf(q) !== -1) return 5; // name substring
if (code.indexOf(q) !== -1) return 6; // code substring
if (o.foldText.indexOf(q) !== -1) return 7; // anywhere else in the label
return RANK_NONE;
}
function positionList() {
// Position the list above or below depending on viewport space.
var inputRect = textInput[0].getBoundingClientRect();
var viewportH = window.innerHeight;
var spaceBelow = viewportH - inputRect.bottom - 8;
var spaceAbove = inputRect.top - 8;
var maxH = Math.min(224, Math.max(spaceBelow, spaceAbove)); // 224px = 14em
resultsList.css({
"max-height": maxH + "px",
"top": spaceBelow >= spaceAbove ? "100%" : "auto",
"bottom": spaceBelow >= spaceAbove ? "auto" : "100%"
});
}
function closeList() {
resultsList.hide();
textInput.attr("aria-expanded", "false");
activeIndex = -1;
}
function showResults(query) {
var q = foldDiacritics($.trim(query || ""));
resultsList.empty();
activeIndex = -1;
var matched = [];
if (q) {
$.each(allOptions, function (i, o) {
if (o.disabled) return;
var rank = rankOption(o, q);
if (rank !== RANK_NONE) matched.push({ opt: o, rank: rank, i: i });
});
if (!matched.length && q.indexOf(" ") !== -1) {
var tokens = q.split(/\s+/);
$.each(allOptions, function (i, o) {
if (o.disabled) return;
var all = true;
$.each(tokens, function (_, t) {
if (o.foldText.indexOf(t) === -1) { all = false; return false; }
});
if (all) matched.push({ opt: o, rank: 8, i: i });
});
}
matched.sort(function (a, b) {
if (a.rank !== b.rank) return a.rank - b.rank;
// Inside the code tiers the shorter code is the better hit:
// "an" -> "an" before "ang" before "ang-x-...".
if (a.rank <= 1 && a.opt.foldCode.length !== b.opt.foldCode.length) {
return a.opt.foldCode.length - b.opt.foldCode.length;
}
// Otherwise keep the menu's own order (pinned languages first).
return a.i - b.i;
});
} else {
$.each(allOptions, function (i, o) {
if (!o.disabled) matched.push({ opt: o, rank: 0, i: i });
});
}
shown = $.map(matched.slice(0, 50), function (m) { return m.opt; });
if (!shown.length) {
closeList();
return;
}
$.each(shown, function (idx, opt) {
var li = $("<li role='option'></li>")
.text(opt.text)
.attr("data-value", opt.value)
.attr("aria-selected", "false");
// touchend (not touchstart) so a scroll doesn't trigger a select.
var touchMoved = false;
li.on("touchstart", function () {
touchMoved = false;
});
li.on("touchmove", function () {
touchMoved = true;
});
li.on("touchend", function (e) {
if (touchMoved) return; // was a scroll, not a tap
e.preventDefault();
selectOption(opt.value, opt.text);
});
// mousedown (not click) so it beats the input's blur handler.
li.on("mousedown", function (e) {
e.preventDefault();
selectOption(opt.value, opt.text);
});
li.on("mouseenter", function () {
// Hovered items are already in view -- don't scroll the list
// under the mouse, or the shift can trigger the next item's
// mouseenter and cascade into a runaway scroll.
setActive(idx, /* scrollIntoView */ false);
});
resultsList.append(li);
});
positionList();
resultsList.show();
resultsList[0].scrollTop = 0;
textInput.attr("aria-expanded", "true");
}
function setActive(idx, scrollIntoView) {
var items = resultsList.children("li");
if (!items.length) return;
if (idx < 0) idx = items.length - 1;
if (idx >= items.length) idx = 0;
activeIndex = idx;
items.removeClass("wiktku-ac-active").attr("aria-selected", "false");
var li = items.eq(idx).addClass("wiktku-ac-active").attr("aria-selected", "true");
if (scrollIntoView === false) return;
// Keep the cursor visible inside the scrollable list -- only for
// keyboard navigation. A mouse-hovered item is already visible, so
// scrolling here would shift the list under a stationary pointer
// and cascade into further mouseenter events.
var ul = resultsList[0], el = li[0];
if (el.offsetTop < ul.scrollTop) {
ul.scrollTop = el.offsetTop;
} else if (el.offsetTop + el.offsetHeight > ul.scrollTop + ul.clientHeight) {
ul.scrollTop = el.offsetTop + el.offsetHeight - ul.clientHeight;
}
}
/** Puts the currently selected option's label back in the text box. */
function syncInputToSelect() {
var cur = select.val();
var match = null;
if (cur) {
$.each(allOptions, function (_, o) {
if (o.value === cur) { match = o; return false; }
});
}
textInput.val(match ? match.text : "");
}
function selectOption(value, text) {
textInput.val(text);
select.val(value);
closeList();
select.trigger("change");
}
textInput.on("input", function () {
showResults($(this).val());
});
textInput.on("focus", function () {
// Select the current label so typing replaces it, and open the full list
this.select();
showResults("");
});
textInput.on("click", function () {
if (!resultsList.is(":visible")) showResults($(this).val());
});
textInput.on("keydown", function (e) {
var open = resultsList.is(":visible");
switch (e.which) {
case 40: // Down
e.preventDefault();
if (!open) { showResults($(this).val()); setActive(0); }
else setActive(activeIndex + 1);
break;
case 38: // Up
e.preventDefault();
if (!open) { showResults($(this).val()); setActive(-1); }
else setActive(activeIndex - 1);
break;
case 13: // Enter -- must never submit the form while the list is open
if (open) {
e.preventDefault();
if (activeIndex >= 0 && shown[activeIndex]) {
selectOption(shown[activeIndex].value, shown[activeIndex].text);
} else if (shown.length === 1) {
selectOption(shown[0].value, shown[0].text);
}
}
break;
case 27: // Esc -- abandon the search, restore the real value
if (open) {
e.preventDefault();
closeList();
syncInputToSelect();
}
break;
case 9: // Tab -- commit the highlighted row on the way out
if (open && activeIndex >= 0 && shown[activeIndex]) {
selectOption(shown[activeIndex].value, shown[activeIndex].text);
}
closeList();
break;
}
});
textInput.on("blur", function () {
// Short delay so a touchstart/mousedown on a result fires first.
setTimeout(function () {
closeList();
// Half-typed text that never became a selection would otherwise sit
// in the box looking like a choice -- put the real value back.
syncInputToSelect();
}, 200);
});
// Re-caches the option list. Fired after ziman.json loads, after
// options are enabled/disabled, and after programmatic .val() changes.
select.on("wiktku:refresh", function () {
cacheOptions();
syncInputToSelect();
if (resultsList.is(":visible")) showResults(textInput.val());
});
wrapper.append(textInput).append(resultsList).append(select);
return wrapper;
}
/**
* Gives every plain <select> under `root` the searchable picker. Selects
* marked .wiktku-plain-select opt out, and the call is idempotent, so it is
* safe to re-run after new rows or sense blocks are inserted.
*/
function initSelects(root) {
$(root).find("select").addBack("select").not(".wiktku-plain-select").each(function () {
var sel = $(this);
if (sel.prop("multiple")) return;
if (sel.closest(".wiktku-native-select-wrap").length) return; // already wrapped
var marker = $("<span></span>").insertBefore(sel);
marker.replaceWith(wrapNativeSelect(sel));
});
}
var langsByCode = {};
// Populated from [[MediaWiki:Gadget-start.js/data.json]] at runtime.
var metadata = {};
var ZARAVA_LANG_CODES = ["ckb", "sdh", "lki", "hac", "zza"];
// Converts a {code: label} object (langChoices/posChoices in data.json)
// into the {code, label[, sortKey]} array the rest of the script uses.
// isLang: true adds a sortKey and shows "(code)" after the label —
// language choices only.
function choicesFromObject(obj, isLang) {
var result = [];
$.each(obj || {}, function (code, label) {
var choice = { code: code, label: label };
if (isLang) choice.sortKey = label;
result.push(choice);
});
return result;
}
function getZaravaKeys(choices) {
var byCode = {};
$.each(choices || [], function (_, c) { byCode[c.code] = c; });
var result = [];
$.each(ZARAVA_LANG_CODES, function (_, code) {
if (byCode[code]) result.push(byCode[code]);
});
return result;
}
function needsTransliteration(langCode) {
var meta = metadata[langCode];
if (!meta || !meta.sc) return false;
var scripts = Array.isArray(meta.sc) ? meta.sc : [meta.sc];
return scripts.length > 0 && scripts[0] !== "Latn";
}
// Kodên cinsiyetê yên di metadata.g de — ji data.json tê dagirtin
var GENDER_BASE_LABELS = {};
// Sub-lists that only make sense for a plain (non-şablon) sense — hidden
// when a şablon (e.g. {{guharto|…}}) is chosen for that sense
var HIDDEN_ON_TPL_GROUPS = [
"wiktku-dfn-alternativ",
"wiktku-dfn-hevmane",
"wiktku-dfn-dijmane",
"wiktku-dfn-koordine",
"wiktku-dfn-jornav",
"wiktku-dfn-jernav"
];
function genderLabel(code) {
if (code === "p") return "Pirjimar";
var pluralMatch = code.match(/^(.+)-p$/);
if (pluralMatch && GENDER_BASE_LABELS[pluralMatch[1]]) {
return GENDER_BASE_LABELS[pluralMatch[1]] + " (pirjimar)";
}
return GENDER_BASE_LABELS[code] || code;
}
// True if a sense has content beyond mane worth keeping (etîket, word
// lists, nimûne, jêder) — so it's still emitted with {{mane?}} if empty.
function senseHasExtraContent(s) {
if (s.etiket && $.grep(s.etiket, function (e) { return $.trim(e) !== ""; }).length) return true;
if (s.kategori && $.grep(s.kategori, function (k) { return $.trim(k) !== ""; }).length) return true;
if (s.alternativ.length || s.hevmane.length || s.dijmane.length ||
s.koordine.length || s.jornav.length || s.jernav.length) return true;
if (s.nimune && $.grep(s.nimune, function (n) {
return (typeof n === "object" ? n.text : n) !== "";
}).length > 0) return true;
if (senseHasJeder(s)) return true;
return false;
}
// Bolds the *first* occurrence of the page name (plus any letters
// glued directly onto it, e.g. a plural "s") inside nimûne/jêgirtin
// text — "apple"/"Apple"/"apples"/"Apples" all match (case-insensitive),
// but only the first hit is wrapped, not every one in the text.
function boldPageNameOnce(text) {
if (!text || !pageNameRe) return text;
var re = new RegExp("(" + pageNameRe + "([^( |,|;|\\?|\\.|\\!)]+)?)", "i");
return text.replace(re, "'''$1'''");
}
// Converts literal line breaks typed into a nimûne/jêgirtin box into
// wikitext <br> tags, so a pasted/typed newline doesn't break the
// surrounding "#:"/"#*" wikitext list syntax on output.
function nlToBr(text) {
return text ? text.replace(/\r\n|\r|\n/g, "<br>") : text;
}
function escapeHtmlForBackdrop(str) {
return String(str)
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">");
}
// Mirrors a textarea's text, with a small highlighted marker placed
// right after each line that's followed by an actual typed/pasted
// linebreak. Rendered into a transparent backdrop layer behind the
// textarea (see ensureLinebreakBackdrop()), so only the point of the
// break is marked instead of the whole box.
function buildLinebreakBackdropHtml(text) {
var lines = text.split(/\r\n|\r|\n/);
return $.map(lines, function (line, i) {
var isLast = i === lines.length - 1;
return escapeHtmlForBackdrop(line) +
(isLast ? "" : "<mark class='wiktku-linebreak-mark'>↵</mark>\n");
}).join("");
}
// Copies the metrics that affect where text wraps/lands (font, line
// height, padding, border) from the real textarea onto its backdrop,
// via computed style rather than shared CSS classes — most of the
// box's own rules are written as "textarea.foo", which a <div> with
// the same class wouldn't match. Re-run on every update in case a
// responsive breakpoint changed the textarea's own font-size.
function syncLinebreakBackdropMetrics(textarea, backdrop) {
var cs = window.getComputedStyle(textarea[0]);
backdrop.css({
"box-sizing": cs.boxSizing,
"padding-top": cs.paddingTop,
"padding-right": cs.paddingRight,
"padding-bottom": cs.paddingBottom,
"padding-left": cs.paddingLeft,
"border-width": cs.borderWidth,
"border-style": "solid",
"font-family": cs.fontFamily,
"font-size": cs.fontSize,
"font-weight": cs.fontWeight,
"line-height": cs.lineHeight,
"letter-spacing": cs.letterSpacing
});
}
// Lazily wraps a textarea in its own positioning anchor (independent
// of .wiktku-resize-wrap, so this doesn't depend on load order versus
// wiktkuMakeManualResizable) and inserts the transparent backdrop
// layer used to mark the exact point of a linebreak. Safe to call
// more than once on the same textarea — the backdrop is cached.
function ensureLinebreakBackdrop(textarea) {
var existing = textarea.data("wiktkuLinebreakBackdrop");
if (existing) return existing;
textarea.wrap("<div class='wiktku-linebreak-wrap'></div>");
var backdrop = $("<div aria-hidden='true'></div>").addClass("wiktku-linebreak-backdrop");
textarea.before(backdrop);
textarea.data("wiktkuLinebreakBackdrop", backdrop);
textarea.on("scroll.wiktkuLinebreak", function () {
backdrop.scrollTop(textarea.scrollTop()).scrollLeft(textarea.scrollLeft());
});
return backdrop;
}
// Flags a nimûne/jêgirtin textarea (via CSS class, for the border
// tint + tooltip) while it contains a typed/pasted linebreak, so the
// user notices before it's silently turned into <br> on output.
// Marks only the exact point of the break via a mirrored backdrop,
// rather than tinting the whole box.
function highlightLinebreak(el) {
var textarea = $(el);
var text = textarea.val();
var hasBreak = /\r|\n/.test(text);
textarea
.toggleClass("wiktku-has-linebreak", hasBreak)
.attr("title", hasBreak ? "Xeta nû dê wek <br> bê nivîsandin" : "");
if (!hasBreak) {
var cached = textarea.data("wiktkuLinebreakBackdrop");
if (cached) cached.hide();
textarea.removeClass("wiktku-has-linebreak-source");
return;
}
var backdrop = ensureLinebreakBackdrop(textarea);
textarea.addClass("wiktku-has-linebreak-source");
syncLinebreakBackdropMetrics(textarea, backdrop);
backdrop.html(buildLinebreakBackdropHtml(text)).show();
backdrop.scrollTop(textarea.scrollTop()).scrollLeft(textarea.scrollLeft());
}
// Each nimûne item can be { text, tr, t }: text, transliteration, translation.
function formatNimune(nimunes, lang, hasJeder) {
var hasNimune = nimunes && $.grep(nimunes, function (n) {
return (typeof n === "object" ? n.text : n) !== "";
}).length > 0;
if (!hasNimune) {
return hasJeder ? "" : "\n#* {{nimûne?|" + lang + "}}";
}
return $.map(nimunes, function (n) {
var text = typeof n === "object" ? n.text : n;
if (!text) return undefined;
var bolded = nlToBr(boldPageNameOnce(text));
var tpl = "\n#: {{nm|" + lang + "|" + bolded;
if (typeof n === "object") {
if (n.tr) tpl += "|tr=" + nlToBr(n.tr);
// Translation as third positional param (no key needed).
if (n.t) tpl += "|" + nlToBr(n.t);
}
// Short examples fit on one line together with their translation.
// rêz=1 is not used for ku — definitions are shown on separate lines there.
if (text.length < 60 && lang !== "ku") tpl += "|rêz=1";
tpl += "}}";
return tpl;
}).join("");
}
// Formats jêder (citation) entries into "#* {{jêder…|…}}" lines; skips
// entries with no quote text. Falls back to the generic {{jêder}}
// template when no specific template was chosen.
function formatJeder(jederList, lang) {
if (!jederList || !jederList.length) return "";
return $.map(jederList, function (jeder) {
if (!jeder || !jeder.quote) return undefined;
var quote = nlToBr(boldPageNameOnce(jeder.quote));
var quoteTr = nlToBr(jeder.quoteTr);
var quoteT = nlToBr(jeder.quoteT);
if (jeder.jederTpl) {
var cite = "\n#* {{" + jeder.jederTpl + "|" + lang;
cite += "|jêgirtin=" + quote;
if (quoteTr) cite += "|tr=" + quoteTr;
if (quoteT) cite += "|tercime=" + quoteT;
$.each(jeder.jêderFields || {}, function (key, val) {
if (val) cite += "|" + key + "=" + val;
});
cite += "}}";
return cite;
}
var out = "\n#* {{jêder|" + lang + "|jêgirtin=" + quote;
if (quoteTr) out += "|tr=" + quoteTr;
if (quoteT) out += "|tercime=" + quoteT;
// A şablon picked from Kategorî:Çavkanî is transcluded as the
// source param (e.g. |{{Kovara X}}); manual text is used as-is.
var srcParam = jeder.jederCatTpl ? ("{{" + jeder.jederCatTpl + "}}") :
(jeder.jederManual ? jeder.jederManual : "çavkanî?");
// A positional param containing "=" gets parsed as its own key=value
// pair by MediaWiki and breaks the template, so force it to be
// explicitly named (|2=) whenever that's the case.
out += (srcParam.indexOf("=") !== -1 ? "|2=" : "|") + srcParam;
out += "}}";
return out;
}).join("");
}
// True if a sense has at least one jêder entry with quote text.
function senseHasJeder(sense) {
return !!(sense.jeder && $.grep(sense.jeder, function (j) {
return j && j.quote;
}).length > 0);
}
// Builds "{{tplName|lang|part1|part2|…}}" from a sense field (kategori,
// etiket), wrapped inline (" {{…}} ") or on its own line ("\n#: {{…}}").
function buildSenseTpl(sense, field, lang, tplName) {
if (!sense[field] || !sense[field].length) return "";
var parts = sense[field].map(function (p) { return $.trim(p); })
.filter(function (p) { return p !== ""; });
if (!parts.length) return "";
var call = "{{" + tplName + "|" + lang + "|" + parts.join("|") + "}}";
return call
}
/**
* Assembles the nimûne + jêder wikitext block for a sense. Shared by
* both the template-sense and normal-mane-sense branches below.
*/
function buildCite(sense, lang) {
return formatNimune(sense.nimune, lang, senseHasJeder(sense)) +
formatJeder(sense.jeder, lang);
}
function makeWordListStep(id, name, question_fmt) {
return {
id: id,
name: name,
question_fmt: question_fmt,
multiple: true,
narrow: true,
placeholder: "Kelîme…",
visible: function (values) {
return values.lang && values.pos;
},
output: function (values) {
var words = $.grep(values[id] || [], function (w) { return !!w; });
var header = capitalize(name);
if (!words.length) return "";
var lang = values.lang;
var section = "\n==== " + header + " ====\n";
var params = "cure=" + header + "\n" +
$.map(words, function (w) {
return "|" + w;
}).join("\n");
return section +
"{{kol3|" + lang + "|" + params + "\n}}\n";
} };
}
var steps = {
lang: {
id: "lang",
required: true,
name: "ziman",
question_fmt: '"' + pageName + '" bi çi zimanî ye?',
question_br: true,
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (langChoices).
choices: [],
output: function (values) {
if (addLangMode){
return "\n== {{ziman|" + values.lang + "}} ==\n";
}else {
return "== {{ziman|" + values.lang + "}} ==\n";
}
} },
pron: {
id: "pron",
name: "bilêvkirin",
question_fmt: '"' + pageName + '" çawa tê telafûzkirin?',
// pronTpls populated from data.json
pronTpls: {},
visible: function (values) {
if (!values.lang) return false;
// addLangMode: skip pron only if this lang already has a section.
if (addLangMode) {
// Clearing the page makes existing content irrelevant.
var clearPageCheck = $("#wiktku-clear-page-check");
if (clearPageCheck.length && clearPageCheck.prop("checked")) {
return true;
}
var existing = $("#wpTextbox1").val() || "";
return !findLangHeader(existing, values.lang);
}
return true;
},
// Fills the insert-dropdown from pronTpls, filtered by language.
refreshTplSelect: function () {
var sel = $("#wiktku-start-pron .wiktku-tpl-insert-select");
if (!sel.length) return;
var lang = getValues().lang || "";
sel.find("option[value!='']").remove();
$.each(steps.pron.pronTpls, function (name, tpl) {
// Filter: if tpl.langs exists, only show if lang is in that list; otherwise show always
var allowed = !tpl.langs || tpl.langs.indexOf(lang) !== -1;
if (allowed) {
sel.append($("<option></option>")
.val(tpl.snippet)
.text(name + " — " + tpl.desc)
.attr("data-nolang", tpl.noLang ? "1" : ""));
}
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-pron-wrap").length) return null;
var wrap = $("<div class='wiktku-pron-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-pron-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-pron-text")
.attr("rows", 4)
.attr("placeholder", "Nimûne: {{IPA|ku|/pɛɪ̯n/}} yan {{kîte|ku|he|ce|ki|rin}}");
// Template insert dropdown — filtered by language.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike ");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
var lang = getValues().lang || "";
$.each(steps.pron.pronTpls, function (name, tpl) {
// Filter: if tpl.langs exists, only show if lang is in that list; otherwise show always
var allowed = !tpl.langs || tpl.langs.indexOf(lang) !== -1;
if (allowed) {
sel.append($("<option></option>")
.val(tpl.snippet)
.text(name + " — " + tpl.desc)
.attr("data-nolang", tpl.noLang ? "1" : ""));
}
});
sel.on("change", function () {
var snippet = $(this).val();
if (!snippet) return;
var lang = getValues().lang || "";
// Check if the selected option has noLang flag
var selectedOption = sel.find("option:selected");
var hasNoLang = selectedOption.attr("data-nolang") === "1";
if (!hasNoLang) {
snippet = snippet.replace(/CODE/g, lang).replace(/SOURCELANG/g, "?");
}
insertAtCursor(ta[0], snippet);
$(this).val("");
// Clear the picker's search box
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel).append(ta);
stepDiv.append(wrap);
initSelects(wrap);
return ta;
},
output: function () {
var text = $.trim($("#wiktku-start-pron .wiktku-pron-text").val());
if (!text) return "";
var lines = text.split("\n");
var out = $.map(lines, function (line) {
line = $.trim(line);
if (!line) return undefined;
return line;
}).join("\n");
return "\n=== Bilêvkirin ===\n" + out + "\n";
} },
pos: {
id: "pos",
required: true,
name: "Cureyê rêzimanî",
question_fmt: 'Cureyê rêzimanî yê "' + pageName + '" çi ye?',
visible: function (values) {
return values.lang;
},
question_br: true,
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (posChoices).
choices: [],
output: function (values) {
var pos = values.pos || "";
var cinsiyet = values.cinsiyet || ""; // from the cinsiyet step
var lekTur = values.lektur || ""; // from the lêker transitivity step
var capitalizedPos = capitalize(pos);
var outputString = "\n=== " + capitalizedPos + " ===\n";
// Add ku-tewîn-nav for single-word navdêr/serenav with known gender.
if (!pageName.includes(" ") && cinsiyet && GENDER_BASE_LABELS[cinsiyet] &&
(pos === "navdêr" || pos === "serenav") && values.lang === "ku") {
outputString += "{{ku-tewîn-nav|" + pageName + "|" + GENDER_BASE_LABELS[cinsiyet];
if (pos === "serenav") outputString += "|y";
outputString += "}}\n";
}
outputString += "{{" + pos + "|" + values.lang;
if (pos === "navdêr" || pos === "serenav") {
if (cinsiyet) {
outputString += "|c=" + cinsiyet;
} else if (values.lang === "ku") {
outputString += "|c=?";
}
} else if (/^lêker/.test(pos) && lekTur) {
outputString += "|c=" + lekTur;
}
if (values.tr) {
outputString += "|tr=" + values.tr;
}
outputString += "}}\n";
return outputString;
}
},
// cinsiyet (gender) — shown for navdêr/serenav only, with choices built
// from metadata[lang].g since not every language has grammatical gender.
cinsiyet: {
id: "cinsiyet",
name: "cinsiyet",
question_fmt: 'Cinsiyeta "' + pageName + '" çi ye?',
question_br: true,
visible: function (values) {
var meta = metadata[values.lang];
return !!(values.lang && (values.pos === "navdêr" || values.pos === "serenav") &&
meta && meta.g && meta.g.length);
},
build: function (stepDiv, values) {
var select = stepDiv.find("select.wiktku-start-step-field");
if (!select.length) {
select = $(mw.html.element("select", {
"class": "wiktku-start-step-field wiktku-plain-select",
id: "wiktku-start-cinsiyet-field" }));
stepDiv.append(select);
}
if (!values) return select;
var meta = metadata[values.lang];
var codes = (meta && meta.g) || [];
var prevVal = select.val();
var choices = $.map(codes, function (code) {
return [{ code: code, label: genderLabel(code) }];
});
populateMenus(select, choices, null, "Cinsiyetê hilbijêre");
if ($.grep(choices, function (c) { return c.code === prevVal; }).length) {
select.val(prevVal);
}
return select;
},
output: function () { return ""; } // consumed by pos.output
},
// Lêker transitivity
lektur: {
id: "lektur",
name: "Cureyê lêkerê (fiîlê)",
question_fmt: "Cureyê lêkerê (fiîlê) çi ye?",
question_br: true,
visible: function (values) {
return values.lang && values.pos && /^lêker/.test(values.pos);
},
choices: [
{ code: "gh", label: "gerguhêz" },
{ code: "x-gh", label: "xwerû-gerguhêz" },
{ code: "p-gh", label: "pêkhatî-gerguhêz" },
{ code: "h-gh", label: "hevedudanî-gerguhêz" },
{ code: "b-gh", label: "biwêjî-gerguhêz" },
{ code: "ngh", label: "negerguhêz" },
{ code: "x-ngh", label: "xwerû-negerguhêz" },
{ code: "p-ngh", label: "pêkhatî-negerguhêz" },
{ code: "h-ngh", label: "hevedudanî-negerguhêz" },
{ code: "b-ngh", label: "biwêjî-negerguhêz" } ],
output: function () { return ""; } // consumed by pos.output
},
tr: {
id: "tr",
name: "transliterasyon",
question_fmt: "Transliterasyona vê kelîmeyê",
multiple: false,
narrow: true,
visible: function (values) {
return values.lang && values.pos && needsTransliteration(values.lang);
} },
dfn: {
id: "dfn",
name: "Mane",
question_fmt: function (values) {
var base = "Maneya kelîmeyê binivîse. Mane otomatîk tê lînkkirin!";
if (values.lang === "ku") {
return base + " Ji bo tercimeyan beşa 'Werger' bi kar bîne!";
}
return base;
},
multiple: true,
ordered: true,
rows: 3,
visible: function (values) {
return values.lang && values.pos;
},
example: function (values) {
// posExamples loaded from [[MediaWiki:Gadget-start.js/data.json]].
var examples = steps.dfn.posExamples || {};
var full = values.pos || "";
return examples[full] || "";
},
// Builds one sense block (<li>): mane textarea, nimûne list, and
// sub-lists for alternatîv/hevmane/dijmane/etc.
buildSenseBlock: function (stepDiv) {
var block = $("<li class='wiktku-dfn-sense'></li>");
// — Mane textarea (declared first so the template handler can reference it) —
var dfnArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-mane-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-start-step-field wiktku-dfn-mane")
.attr("rows", 6)
.attr("placeholder", "Mane…");
dfnArea.on("input", function () {
steps.dfn.onDfnInput(stepDiv, block, this);
});
// — Tercime + Îzah boxes (non-ku alternative to the plain mane box) —
// Non-ku entries get a direct translation plus a {{îzah|…}}-wrapped
// gloss instead of a Kurdish-style gloss. Rather than teach every
// consumer (getSenses/getOutput/linkify) a second data shape, these
// boxes just write their combined text into dfnArea and re-fire its
// "input" event, so dfnArea stays the single source of truth.
var tercimeArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-tercime-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-dfn-subfield wiktku-dfn-tercime")
.attr("rows", 2)
.attr("placeholder", "Tercimeyên rasterast ên kurmancî… Ji bo school-a îngilîzî li vir 'mekteb, medrese' binivîse");
var izahArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-izah-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-dfn-subfield wiktku-dfn-izah")
.attr("rows", 3)
.attr("placeholder", "Îzaha kurmancî… Ji bo school-a îngilîzî li vir 'cihê tehsîlgirtinê' binivîse");
var nonKuWrap = $("<div class='wiktku-dfn-nonku-wrap'></div>")
.append(tercimeArea).append(izahArea)
.hide();
function syncNonKuToMane() {
var t = $.trim(tercimeArea.val());
var iz = $.trim(izahArea.val());
// if tercime is blank, use îzah as definition
var combined = t ? (iz ? t + " {{îzah|" + iz + "}}" : t) : iz;
dfnArea.val(combined);
// Re-fires onDfnInput so the sense list still grows and
// refresh() still runs, exactly as if this were typed
// directly into the mane textarea.
dfnArea.trigger("input");
}
tercimeArea.on("input", syncNonKuToMane);
izahArea.on("input", syncNonKuToMane);
// Switches between the plain mane box and the tercime+îzah pair —
// only for non-ku entries with no tplSelect selected.
function updateManeMode() {
var lang = getValues().lang || "";
var isTpl = !!tplSelect.val();
if (lang && lang !== "ku" && !isTpl) {
dfnArea.hide();
nonKuWrap.show();
} else {
nonKuWrap.hide();
if (!isTpl) dfnArea.show();
}
}
// Store on the block so refresh() can re-sync every block when
// lang changes, and restoreDfn() can re-sync after restoring.
block.data("updateManeMode", updateManeMode);
// — Template selector (optional — replaces mane when chosen) —
// Template definitions loaded from [[MediaWiki:Gadget-start.js/data.json]].
var tplDefs = steps.dfn.tplDefs || {};
// Cache of all non-placeholder option elements, so updateTplOptions
// can detach/re-attach them without losing the full list.
var _allTplOptions = [];
var tplSelect = $(mw.html.element("select", { "class": "wiktku-dfn-tpl-select" }));
tplSelect.attr("data-placeholder", "Li şablonekê bigere");
tplSelect.append($("<option value=''>— yan jî şablonek hilbijêre —</option>"));
$.each(tplDefs, function (name, tpl) {
var opt = $("<option></option>")
.val(name)
.text(name)
.attr("data-langs", tpl.langs ? tpl.langs.join(",") : "")
.attr("data-nolang", tpl.noLang ? "1" : "");
tplSelect.append(opt);
_allTplOptions.push(opt[0]);
});
function updateTplOptions() {
var lang = getValues().lang || "";
var currentVal = tplSelect.val();
var currentStillValid = false;
// Detach all non-placeholder options, then re-attach only the visible
// ones — native <select> won't reliably hide options any other way.
tplSelect.find("option[value!='']").detach();
$.each(_allTplOptions, function (_, opt) {
var allowed = $(opt).attr("data-langs");
var visible = !allowed || allowed.split(",").indexOf(lang) !== -1;
if (visible) {
tplSelect.append(opt);
if ($(opt).val() === currentVal) currentStillValid = true;
}
});
tplSelect.trigger("wiktku:refresh");
if (currentVal && !currentStillValid) {
tplSelect.val("");
tplTitleInput.hide().val("");
updateManeMode();
}
}
// Store updater on the element so refresh() can call it for all blocks.
tplSelect.data("updateOptions", updateTplOptions);
var tplTitleInput = $("<input type='text'>")
.addClass("wiktku-dfn-tpl-title wiktku-start-narrow")
.attr("placeholder", "Navê rûpela hedefê…")
.hide();
// Grow the sense list when the title field of the last block gets content,
// mirroring what onDfnInput does for the plain mane textarea.
tplTitleInput.on("input", function () {
steps.dfn.onDfnInput(stepDiv, block, this);
});
// Şablon senses have no plain gloss, so hide alternatîv/hevmane/
// dijmane/etc. Etîket, Nimûne and Jêgirtin stay visible either way.
function updateFieldVisibility() {
var isTpl = !!tplSelect.val();
$.each(HIDDEN_ON_TPL_GROUPS, function (_, cls) {
block.find("." + cls + "-group").toggle(!isTpl);
});
}
// Store on the block so restoreDfn() can re-sync visibility
// after setting tplSelect's value.
block.data("updateFieldVisibility", updateFieldVisibility);
tplSelect.on("change", function () {
var chosen = $(this).val();
if (chosen) {
dfnArea.hide();
nonKuWrap.hide();
tplTitleInput.show().focus();
} else {
tplTitleInput.hide().val("");
updateManeMode();
}
updateFieldVisibility();
// Re-run refresh so the Werger step visibility updates.
refresh();
});
var tplRow = $("<div></div>").addClass("wiktku-dfn-tpl-row")
.append(tplSelect).append(" ").append(tplTitleInput);
block.append(tplRow);
block.append(dfnArea);
block.append(nonKuWrap);
// Apply lang filter on initial build.
updateTplOptions();
updateManeMode();
// — Sub-field groups are always visible with a placeholder textarea.
var allGroups = [
{ cls: "wiktku-dfn-etiket", label: "Etîket", rows: 1, narrow: true, izah: "xisûsen, Mêrdîn, anatomî, Badînî" },
{ cls: "wiktku-dfn-kategori", label: "Kategorî", rows: 1, narrow: true, izah: "wekî etîket lê xuya nabe tenê kategorîze dike" },
{ cls: "wiktku-dfn-alternativ", label: "Formên alternatîv", rows: 1, narrow: true, izah: "Varyantên vê kelîmeyê" },
{ cls: "wiktku-dfn-hevmane", label: "Hevmane", rows: 1, narrow: true, izah: "Spehî hevmaneya Bedew e." },
{ cls: "wiktku-dfn-dijmane", label: "Dijmane", rows: 1, narrow: true, izah: "Zengîn dijmaneya feqîr e." },
{ cls: "wiktku-dfn-koordine", label: "Termên koordîne", rows: 1, narrow: true, izah: "Pisîk û kûçik termên koordîne ne çunkî Jornavên wan gelek in" },
{ cls: "wiktku-dfn-jornav", label: "Jornav", rows: 1, narrow: true, izah: "Heywan jornavê guhandar e" },
{ cls: "wiktku-dfn-jernav", label: "Jêrnav", rows: 1, narrow: true, izah: "Guhandar jêrnavê heywan e" },
{ cls: "wiktku-dfn-nimune", label: "Nimûne", rows: 2, narrow: false }
];
$.each(allGroups, function (_, g) {
var groupDiv = $("<div></div>").addClass("wiktku-dfn-subgroup " + g.cls + "-group");
function buildNimuneLi() {
var lang = getValues().lang || "";
var li = $("<li></li>").addClass("wiktku-dfn-nimune-li");
var mainTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-text-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", g.rows)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-text")
.attr("placeholder", "Nimûneya emilandina kelîmeyê tu bi xwe binivîse…");
mainTa.on("input", function () {
highlightLinebreak(this);
var val = $.trim($(this).val());
var isLast = li.is(list.children("li:last-child"));
if (val && isLast) {
list.append(buildNimuneLi());
}
});
li.append(mainTa);
var subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
if (needsTransliteration(lang)) {
subWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-tr")
.attr("placeholder", "Transliterasyona bi alfabeya latînî")
);
}
if (lang && lang !== "ku") {
subWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-t")
.attr("placeholder", "Tercimeya nimûneyê bi kurmancî")
);
}
if (subWrap.children().length) li.append(subWrap);
return li;
}
if (g.cls === "wiktku-dfn-nimune") {
// Nimûne — compound widget with tr/t sub-fields.
var lbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text(g.label))
.append(": ");
var list = $("<ol></ol>").addClass("wiktku-dfn-sublist " + g.cls + "-list");
groupDiv.data("buildNimuneLi", buildNimuneLi);
list.append(buildNimuneLi());
groupDiv.append(lbl).append(list);
block.append(groupDiv);
} else {
// Regular always-visible group — label + growing textarea list.
var lbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text(g.label))
.append(": ")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-hint").text(g.izah));
var list = $("<ol></ol>").addClass("wiktku-dfn-sublist " + g.cls + "-list");
var firstInput = $("<textarea></textarea>")
.attr("name", g.cls + "-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", g.rows)
.attr("class", "wiktku-dfn-subfield" + (g.narrow ? " wiktku-start-narrow" : ""))
.attr("placeholder", g.label + "…");
firstInput.on("input", function () {
steps.dfn.onSubInput(list, this, g.rows, g.narrow);
});
list.append($("<li></li>").append(firstInput));
groupDiv.append(lbl).append(list);
block.append(groupDiv);
}
});
// — Jêder group — growing list, same structure as Nimûne. —
(function () {
var jederGroupDiv = $("<div></div>").addClass("wiktku-dfn-subgroup wiktku-dfn-jeder-group");
var jederLbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text("Jêgirtin"))
.append(": ");
var jederList = $("<ol></ol>").addClass("wiktku-dfn-sublist wiktku-dfn-jeder-list");
function buildJederLi() {
var lang = getValues().lang || "";
var li = $("<li></li>").addClass("wiktku-dfn-jeder-li");
// Quote text textarea
var quoteTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote")
.attr("placeholder", "Nimûneya emilandinê ji kitêb an çavkaniyeke din binivîse");
quoteTa.on("input", function () {
highlightLinebreak(this);
var val = $.trim($(this).val());
var isLast = li.is(jederList.children("li:last-child"));
if (val && isLast) {
jederList.append(buildJederLi());
}
});
li.append(quoteTa);
// tr/t sub-fields for the quote — shown as needed for the language.
var quoteSubWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
if (needsTransliteration(lang)) {
quoteSubWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-tr")
.attr("placeholder", "Transliterasyona jêgirtinê…")
);
}
if (lang && lang !== "ku") {
quoteSubWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-t")
.attr("placeholder", "Tercimeya jêgirtinê bi kurmancî")
);
}
if (quoteSubWrap.children().length) li.append(quoteSubWrap);
// Citoid auto-fill: fetch citation data from a URL, DOI or ISBN and
// prefill the source şablon + fields below (see Gadget-citoid-helper.js).
var citoidWrap = $("<div></div>").addClass("wiktku-dfn-quote-citoid");
var citoidInput = $("<textarea></textarea>")
.addClass("wiktku-dfn-subfield wiktku-dfn-quote-citoid-input")
.attr("rows", 1)
.attr("placeholder", "URL, DOI an ISBN binivîse ku otomatîk were tijekirin…");
var citoidBtn = new OO.ui.ButtonWidget({
label: "Bi Citoidê bîne",
classes: [ "wiktku-dfn-quote-citoid-btn" ]
});
var citoidStatus = $("<span></span>").addClass("wiktku-dfn-quote-citoid-status");
// Fetches citation data from Citoid and fills this citation's
// şablon + fields — only rebuilds fields on template change,
// and never overwrites values the user already typed.
function runCitoidFetch() {
var query = $.trim(citoidInput.val());
if (!query) {
mw.notify("Ji kerema xwe re pêşî URL, DOI an ISBNyekê binivîse.");
return;
}
citoidBtn.setDisabled(true);
citoidStatus.text("Tê anîn…");
wikt.citoidHelper.ensure().then(function () {
return wikt.citoid.fetchJederFields(query);
}).then(function (result) {
var jederKey = result.jederKey;
var hasTpl = !!jederKey && srcSel.find("option[value='" + jederKey + "']").length > 0;
var targetVal = hasTpl ? jederKey : "__manual__";
// Only rebuild if switching şablon, so a repeat fetch
// doesn't clear fields already filled in by hand.
if (srcSel.val() !== targetVal) {
srcSel.val(targetVal).trigger("change");
}
if (hasTpl) {
// Tenê qadên vala tijî bike.
$.each(result.fields, function (key, val) {
var input = srcFields.find("[data-field-key='" + key + "']");
if (input.length && !$.trim(input.val())) {
input.val(val);
}
});
} else {
// Şablonek nehat naskirin ji bo vê itemType — rêzikeke
// çavkaniyê ya bi destan a ji qadên Citoid tê çêkirin,
// lê tenê ger qada destan vala be.
var manualField = srcFields.find(".wiktku-dfn-quote-src-manual");
if (!$.trim(manualField.val())) {
var parts = [];
$.each(["nivîskar", "sernav", "websîte", "kovar", "weşanxane", "sal", "url"], function (_, k) {
if (result.fields[k]) parts.push(result.fields[k]);
});
manualField.val(parts.join(", "));
}
}
citoidStatus.text("");
}, function (errorMsg) {
citoidStatus.text(typeof errorMsg === "string" ? errorMsg : "Nehat dîtin. Kontrol bike ka URL/DOI/ISBN rast e.");
}).always(function () {
citoidBtn.setDisabled(false);
});
}
citoidBtn.on("click", runCitoidFetch);
citoidInput.on("keydown", function (e) {
if (e.which === 13) { // Enter
e.preventDefault();
runCitoidFetch();
}
});
citoidWrap.append(citoidInput).append(citoidBtn.$element).append(citoidStatus);
// Source template selector, specific to this citation.
var srcSel = $("<select></select>").addClass("wiktku-dfn-quote-src-sel wiktku-plain-select");
srcSel.append($("<option value=''>— Çavkaniyê hilbijêre —</option>"));
srcSel.append($("<option></option>").val("__manual__").text("Bi destê xwe binivîsim"));
srcSel.append($("<option></option>").val("__category__").text("Ji Kategorî:Çavkanî şablonekê hilbijêre"));
var jederDefs = steps.dfn.jederDefs || {};
$.each(jederDefs, function (tplName, def) {
srcSel.append($("<option></option>").val(tplName).text(def.label));
});
// Dynamic source fields container.
var srcFields = $("<div></div>").addClass("wiktku-dfn-quote-src-fields");
srcSel.on("change", function () {
srcFields.empty();
var chosen = $(this).val();
if (!chosen) return;
if (chosen === "__manual__") {
// Freeform source, written by the user — becomes the 2nd
// positional param of {{jêder|lang|…}} instead of çavkanî?.
srcFields.append(
$("<textarea></textarea>")
.attr("rows", 4)
.addClass("wiktku-dfn-subfield wiktku-dfn-quote-src-manual")
.attr("placeholder", "Çavkaniyê bi destê xwe binivîse…")
);
return;
}
if (chosen === "__category__") {
// Search widget over the members of [[Kategorî:Çavkanî]].
// Picking a şablon here immediately switches the row to
// "Bi destê xwe binivîsim" mode with {{Şablon}} pre-filled,
var catWrap = $("<span></span>").addClass("wiktku-native-select-wrap wiktku-dfn-quote-src-cat");
var catInput = $("<input type='search' autocomplete='off'>")
.addClass("wiktku-start-narrow wiktku-dfn-quote-src-cat-input")
.attr("placeholder", "Li navê şablonê bigere…");
var catResults = $("<ul></ul>").addClass("wiktku-ac-results wiktku-dfn-quote-src-cat-results").hide();
var catStatus = $("<span></span>").addClass("wiktku-dfn-quote-src-cat-status").text("Şablon tên barkirin…");
var showCatResults = function (query) {
var q = $.trim(query).toLowerCase();
catResults.empty();
var list = catSrcTemplates || [];
var matched = q ?
$.grep(list, function (name) { return name.toLowerCase().indexOf(q) !== -1; }) :
list;
if (!matched.length) {
catResults.hide();
return;
}
$.each(matched.slice(0, 50), function (_, name) {
var li = $("<li></li>").text(name).attr("data-value", name);
var touchMoved = false;
li.on("touchstart", function () { touchMoved = false; });
li.on("touchmove", function () { touchMoved = true; });
li.on("touchend", function (e) {
if (touchMoved) return;
e.preventDefault();
selectCatTpl(name);
});
li.on("mousedown", function (e) {
e.preventDefault();
selectCatTpl(name);
});
catResults.append(li);
});
catResults.show();
};
// Wraps the chosen şablon as {{Name}}, drops it into the
// manual textarea, and switches the row into manual mode
// so the user can keep editing it (add params, etc.).
var selectCatTpl = function (name) {
catResults.hide();
srcSel.val("__manual__");
srcSel.trigger("change");
srcFields.find(".wiktku-dfn-quote-src-manual")
.val("{{" + name + "}}")
.trigger("focus");
};
catInput.on("input", function () {
showCatResults($(this).val());
});
catInput.on("focus", function () {
showCatResults($(this).val());
});
catInput.on("blur", function () {
setTimeout(function () { catResults.hide(); }, 200);
});
catWrap.append(catInput).append(catResults).append(catStatus);
srcFields.append(catWrap);
fetchCatSrcTemplates().then(function () {
catStatus.text("");
}, function () {
catStatus.text("Şablon nehatin barkirin.");
});
return;
}
var def = (steps.dfn.jederDefs || {})[chosen];
if (!def) return;
$.each(def.fields, function (key, label) {
var row = $("<div></div>").addClass("wiktku-dfn-quote-src-row");
var fieldLbl = $("<label></label>").text(label + ": ");
var inp = $("<textarea></textarea>")
.attr("rows", 2)
.addClass("wiktku-dfn-quote-src-input wiktku-start-narrow")
.attr("data-field-key", key)
.attr("placeholder", label + "…");
// "Sernav" / "Sernavê orjînal" (title fields, e.g. for
// kitêb/kovar/malper) get a taller, draggable box; every
// other field in the template stays as-is. Field labels
// come from the on-wiki jederDefs data, so match on the
// (diacritic-folded) label text rather than a fixed key.
var foldedLabel = foldDiacritics(label);
if (/^sernav$/.test(foldedLabel) || /orjin/.test(foldedLabel)) {
inp.addClass("wiktku-dfn-quote-src-input--title");
}
row.append(fieldLbl).append(inp);
srcFields.append(row);
});
});
li.append(citoidWrap).append(srcSel).append(srcFields);
return li;
}
jederGroupDiv.data("buildJederLi", buildJederLi);
jederList.append(buildJederLi());
jederGroupDiv.append(jederLbl).append(jederList);
block.append(jederGroupDiv);
}());
// Apply the initial hide/show state for the sub-groups (matches
// tplSelect's starting value, which is normally empty).
updateFieldVisibility();
return block;
},
/** Grows the sense list when the last mane textarea gets content. */
onDfnInput: function (stepDiv, block, textarea) {
var val = $.trim($(textarea).val());
var list = stepDiv.find("ol.wiktku-dfn-list");
var isLast = block.is(list.children("li:last-child"));
if (val && isLast) {
var newBlock = steps.dfn.buildSenseBlock(stepDiv);
list.append(newBlock);
// Give the new block's template selector the searchable picker.
initSelects(newBlock);
}
refresh();
},
/** Grows a sub-list (nimûne/formên alternatîv/hevmane/dijmane/termên koordîne) on input. */
onSubInput: function (list, input, rows, narrow) {
var val = $.trim($(input).val());
var item = $(input).parent();
var isLast = item.is(list.children("li:last-child"));
if (val && isLast) {
var next = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-sub-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", rows)
.attr("class", "wiktku-dfn-subfield" + (narrow ? " wiktku-start-narrow" : ""));
next.on("input", function () {
steps.dfn.onSubInput(list, this, rows, narrow);
});
list.append($("<li></li>").append(next));
}
},
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (tplDefs, posExamples, jederDefs).
tplDefs: {},
posExamples: {},
jederDefs: {},
build: function (stepDiv) {
if (stepDiv.find("ol.wiktku-dfn-list").length) return null;
var list = $("<ol class='wiktku-dfn-list'></ol>");
list.append(steps.dfn.buildSenseBlock(stepDiv));
stepDiv.append(list);
return null;
},
/** Reads all sense blocks from the DOM and returns an array of sense objects. */
getSenses: function (stepDiv) {
var senses = [];
stepDiv.find("li.wiktku-dfn-sense").each(function () {
var block = $(this);
var tplSel = block.find("select.wiktku-dfn-tpl-select");
var tpl = tplSel.val() || "";
// noLang: template already encodes the language — don't add |lang| param.
var tplNoLang = tpl
? tplSel.find("option[value='" + tpl + "']").attr("data-nolang") === "1"
: false;
var tplTitle = $.trim(block.find("input.wiktku-dfn-tpl-title").val());
var mane = $.trim(block.find("textarea.wiktku-dfn-mane").val());
function readList(cls) {
var vals = [];
block.find("." + cls + "-list textarea").each(function () {
var v = $.trim($(this).val());
if (v) vals.push(v);
});
return vals;
}
// Nimûne items are compound: { text, tr?, t? }
function readNimuneList() {
var items = [];
block.find(".wiktku-dfn-nimune-list li.wiktku-dfn-nimune-li").each(function () {
var text = $.trim($(this).find(".wiktku-dfn-nimune-text").val());
if (!text) return;
var obj = { text: text };
var tr = $.trim($(this).find(".wiktku-dfn-nimune-tr").val());
var t = $.trim($(this).find(".wiktku-dfn-nimune-t").val());
if (tr) obj.tr = tr;
if (t) obj.t = t;
items.push(obj);
});
return items;
}
// Jêder is a growing list of citations, one per li — mirrors readNimuneList().
function readJederList() {
var items = [];
block.find(".wiktku-dfn-jeder-list li.wiktku-dfn-jeder-li").each(function () {
var li = $(this);
var quote = $.trim(li.find(".wiktku-dfn-nimune-quote").val());
if (!quote) return;
var obj = { quote: quote };
var qtr = $.trim(li.find(".wiktku-dfn-nimune-quote-tr").val());
var qt = $.trim(li.find(".wiktku-dfn-nimune-quote-t").val());
if (qtr) obj.quoteTr = qtr;
if (qt) obj.quoteT = qt;
var tplName = li.find(".wiktku-dfn-quote-src-sel").val();
if (tplName === "__manual__") {
var manual = $.trim(li.find(".wiktku-dfn-quote-src-manual").val());
if (manual) obj.jederManual = manual;
} else if (tplName === "__category__") {
// Reachable only if the user opened the category search but
// never picked a şablon — picking one switches the row to
// __manual__ (see selectCatTpl above), so there's nothing
// meaningful to save here.
} else if (tplName) {
obj.jederTpl = tplName;
var fields = {};
li.find(".wiktku-dfn-quote-src-input").each(function () {
var k = $(this).attr("data-field-key");
var v = $.trim($(this).val());
if (k && v) fields[k] = v;
});
obj.jêderFields = fields;
}
items.push(obj);
});
return items;
}
senses.push({
tpl: tpl,
tplNoLang: tplNoLang,
tplTitle: tplTitle,
mane: mane,
etiket: readList("wiktku-dfn-etiket"),
kategori: readList("wiktku-dfn-kategori"),
nimune: readNimuneList(),
jeder: readJederList(),
alternativ: readList("wiktku-dfn-alternativ"),
hevmane: readList("wiktku-dfn-hevmane"),
dijmane: readList("wiktku-dfn-dijmane"),
koordine: readList("wiktku-dfn-koordine"),
jornav: readList("wiktku-dfn-jornav"),
jernav: readList("wiktku-dfn-jernav")
});
});
return senses;
},
getOutput: function (values, callback) {
var stepDiv = $("#wiktku-start-dfn");
var senses = steps.dfn.getSenses(stepDiv);
var lang = values.lang;
// A sense counts as "filled" if it has a mane, a chosen template + title,
// or any other content (etîket/hevmane/nimûne/jêder…) worth keeping.
var hasMane = senses.some(function (s) {
return s.mane !== "" || (s.tpl && s.tplTitle) || senseHasExtraContent(s);
});
var defLines = []; // one entry per kept sense (goes to linkify)
var citeLines = []; // parallel — nimûne+jêder for that same sense
var izahLines = []; // parallel — raw îzah gloss for that same sense
// True only once some sense's *actual* dfn text (post tercime/îzah
// split) is non-empty.
var hasLinkableMane = false;
$.each(senses, function (_, sense) {
// — Template sense (e.g. {{guharto|ku|somepage}}) —
if (sense.tpl) {
if (!sense.tplTitle) return; // skip empty template senses
var tplKatTpl = buildSenseTpl(sense, "kategori", lang, "K");
var tplLabelTpl = buildSenseTpl(sense, "etiket", lang, "e");
var tplCall = sense.tplNoLang
? "{{" + sense.tpl + "|" + sense.tplTitle + "}}"
: "{{" + sense.tpl + "|" + lang + "|" + sense.tplTitle + "}}";
var idx = defLines.length;
var cite = buildCite(sense, lang);
defLines.push("# " + (tplKatTpl ? tplKatTpl + " " : "") + (tplLabelTpl ? tplLabelTpl + " " : "") + tplCall +
(cite ? "{{wiktku-cite-" + idx + "}}" : ""));
citeLines.push(cite);
izahLines.push(""); // template senses have no îzah
return;
}
// — Normal mane sense —
var dfn = sense.mane;
if (!dfn && !senseHasExtraContent(sense)) return; // truly empty
// Pull the îzah gloss (if any) out of the combined tercime+îzah
// string — it's spliced back in separately below, after its
// own linkify pass (see izahLines / the second linkifyText call).
var izahRaw = null;
var tercimeIzah = splitTercimeIzah(dfn);
if (tercimeIzah) {
dfn = tercimeIzah.tercime;
izahRaw = stripWikilinks(tercimeIzah.izah);
}
if (dfn) {
dfn = stripWikilinks(dfn);
// Sentence-case + trailing period are for ku definitions,
// which are written as full glosses.
if (lang === "ku") {
if (dfn[0] !== dfn[0].toUpperCase()) dfn = capitalize(dfn);
if (!dfn.match(/[.…?!)\]]$/)) dfn += ".";
}
} else if (izahRaw === null) {
dfn = lang === "ku" ? "{{mane?|" + lang + "}}" : "";
}
if (dfn) hasLinkableMane = true;
var katTpl = buildSenseTpl(sense, "kategori", lang, "K");
var labelTpl = buildSenseTpl(sense, "etiket", lang, "e");
var out = "# " + (katTpl ? katTpl + " " : "") + (labelTpl ? labelTpl + " " : "") + dfn;
var idx = defLines.length;
var hasThisIzah = izahRaw !== null && $.trim(izahRaw) !== "";
// Bare {{...}} token — like {{wiktku-cite-N}}, this survives
// linkify's first pass untouched (it treats template calls as
// opaque), then gets swapped for {{îzah|…}} once the actual
// gloss text has been linkified in its own separate pass.
if (hasThisIzah) {
out += (dfn ? " " : "") + "{{wiktku-izah-" + idx + "}}";
}
function wordLine(tpl, words) {
if (!words.length) return "";
return "\n#: {{" + tpl + "|" + lang + "|" + words.join("|") + "}}";
}
out += wordLine("alt-r", sense.alternativ);
out += wordLine("hevmane", sense.hevmane);
out += wordLine("dijmane", sense.dijmane);
out += wordLine("koordîne", sense.koordine);
out += wordLine("jornav", sense.jornav);
out += wordLine("jêrnav", sense.jernav);
var cite = buildCite(sense, lang);
defLines.push(out + (cite ? "{{wiktku-cite-" + idx + "}}" : ""));
citeLines.push(cite);
izahLines.push(hasThisIzah ? izahRaw : "");
});
// Splice citeLines back into a linkified string, replacing each
// {{wiktku-cite-N}} token with its stored nimûne/jêder block.
function restoreCites(t) {
return t.replace(/\{\{wiktku-cite-(\d+)\}\}/g, function (_, n) {
return citeLines[parseInt(n, 10)] || "";
});
}
// Runs text through the linkify gadget if it's loaded, otherwise
// just passes it through unchanged. Shared by both linkify passes
// below (main mane text, and — separately — îzah glosses).
function linkifyText(t, cb) {
if (typeof $.kuLinkify === "function") {
$.kuLinkify(t, cb);
} else {
cb(t);
}
}
var hasIzah = izahLines.some(function (t) { return t && $.trim(t) !== ""; });
var text = defLines.join("\n") + "\n";
if (!hasMane) {
// No definitions entered — emit {{mane?}} with nimûne?.
text = "# {{mane?|" + lang + "}}\n#* {{nimûne?|" + lang + "}}\n";
callback(text);
return;
}
// Runs the îzah-only linkify pass against `base` (either the raw
// text, when there's no linkable mane to run the main pass on
// first, or the already-linkified main text). Shared by both
// branches below so the token-splice logic only lives once.
function runIzahPass(base) {
var izahJoined = $.map(izahLines, function (raw, idx) {
if (!raw) return undefined;
return "{{wiktku-izah-open-" + idx + "}}" + raw + "{{wiktku-izah-close-" + idx + "}}";
}).join("\n");
linkifyText(izahJoined, function (izahLinked) {
var izahByIdx = {};
var re = /\{\{wiktku-izah-open-(\d+)\}\}([\s\S]*?)\{\{wiktku-izah-close-\1\}\}/g;
var m;
while ((m = re.exec(izahLinked)) !== null) {
izahByIdx[parseInt(m[1], 10)] = m[2];
}
var withIzah = base.replace(/\{\{wiktku-izah-(\d+)\}\}/g, function (_, n) {
var linked = izahByIdx[parseInt(n, 10)];
return linked !== undefined ? "{{îzah|" + linked + "}}" : "";
});
callback(restoreCites(withIzah));
});
}
if (!hasLinkableMane) {
if (!hasIzah) {
// All filled senses are template senses (or otherwise have
// no plain text at all) — nothing here needs linkify.
callback(restoreCites(text));
return;
}
// There's no plain mane text anywhere (e.g. tercime left blank
// with only îzah filled in), so every defLine is just a bare
// template call with nothing to word-link. Sending a line
// like "# {{wiktku-izah-0}}" through the main linkify pass
// gives it no plain words to work with, makes the linkify
// gadget hang — so skip that pass entirely and run only
// the îzah pass, splicing straight into the unlinkified text.
var loadIzahOnly = function () { runIzahPass(text); };
mw.loader.using("ext.gadget.linkify", loadIzahOnly, loadIzahOnly);
return;
}
var didTryToLoad = function () {
// First pass: the main definition text (mane), same as before.
linkifyText(text, function (mainLinked) {
if (!hasIzah) {
callback(restoreCites(mainLinked));
return;
}
// Second pass: îzah glosses, linkified via their own
// separate call. Each gloss is wrapped in its own
// {{wiktku-izah-open/close-N}} pair; like the existing
// {{wiktku-cite-N}} tokens, these sit inside double
// braces so linkify leaves the tokens themselves alone —
// only the raw gloss text between each pair gets linked.
runIzahPass(mainLinked);
});
};
mw.loader.using("ext.gadget.linkify", didTryToLoad, didTryToLoad);
}
},
je: makeWordListStep("je", "jê", "Kelîmeyên jê çêbûyî binivîse"),
tekildar: makeWordListStep("tekildar", "têkildar", "Kelîmeyên ji aliyê etîmolojiyê ve têkildarî vê kelîmeyê binivîse"),
binereherwiha: makeWordListStep("binereherwiha", "binêre herwiha", "Kelîmeyên din ên eleqedar binivîse"),
etym: {
id: "etym",
name: "etîmolojî",
question_fmt: "Etîmolojiya kelîmeyê binivîse",
// etymTpls populated from data.json
etymTpls: {},
visible: function (values) {
return values.lang && values.pos;
},
// Fills the insert-dropdown from the current etymTpls object.
refreshTplSelect: function () {
var sel = $("#wiktku-start-etym .wiktku-tpl-insert-select");
if (!sel.length) return;
sel.find("option[value!='']").remove();
$.each(steps.etym.etymTpls, function (name, tpl) {
sel.append($("<option></option>").val(tpl.snippet).text(name + " — " + tpl.desc));
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-etym-wrap").length) return null;
var wrap = $("<div class='wiktku-etym-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-etym-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-etym-text")
.attr("rows", 4)
.attr("placeholder", "Ji {{ji|en|ku|apple}}. yan rasterast binivîse…");
// Template insert dropdown — options also refreshed after data.json loads.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike…");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
$.each(steps.etym.etymTpls, function (name, tpl) {
sel.append($("<option></option>").val(tpl.snippet).text(name + " — " + tpl.desc));
});
sel.on("change", function () {
var snippet = $(this).val();
if (!snippet) return;
var lang = getValues().lang || "";
snippet = snippet.replace(/CODE/g, lang).replace(/SOURCELANG/g, "?");
insertAtCursor(ta[0], snippet);
$(this).val("");
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel);
wrap.append(ta);
stepDiv.append(wrap);
initSelects(wrap);
return ta;
},
output: function (values) {
var text = $.trim($("#wiktku-start-etym .wiktku-etym-text").val());
if (text) {
return "\n==== Etîmolojî ====\n" + text + "\n";
}
// No etymology entered — emit {{ji?|lang}} as a placeholder.
// Skip it only when every filled sense is a şablon sense
// a completely empty entry with no şablon chosen still gets the placeholder
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasFilledTplSense = dfnSenses.some(function (s) {
return !!s.tpl && !!s.tplTitle;
});
var hasRegularMane = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
if (hasFilledTplSense && !hasRegularMane) return "";
return "\n==== Etîmolojî ====\n{{ji?|" + values.lang + "}}\n";
} },
dunde: {
id: "dunde",
name: "dûnde",
question_fmt: "Eger ev kelîme ji vî zimanî ketibe zimanekî din, vî zimanî û kelîmeya wî binivîse",
visible: function (values) {
return !!values.pos;
},
disabledKeys: function (values) {
return {"navz": true, [values.lang]: true}
},
// Language dropdown + growing word-input list; a new row appends
// when the dropdown gets a value. Mirrors steps.trans, but flat.
buildRow: function (stepDiv) {
var row = $("<li class='wiktku-dunde-row wiktku-lang-row'></li>");
// Language selector — the searchable picker is applied after insertion into DOM.
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zimanekî bigere");
populateMenus(langSel, steps.dunde.keys || [], steps.dunde.disabledKeys);
// When a language is chosen, ensure a next empty row exists.
langSel.on("change", function () {
steps.dunde.onLangChange(stepDiv, row);
});
// Word list for this language.
var wordList = $("<ul class='wiktku-dunde-words wiktku-lang-row-words'></ul>");
var firstWord = steps.dunde.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
// The searchable picker is attached by initSelects() once the row
// is in the DOM (see onLangChange/build below).
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-dunde-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Kelîme…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-dunde-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.dunde.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (stepDiv, row) {
var list = stepDiv.find("ul.wiktku-dunde-list");
var isLast = row.is(list.children("li.wiktku-dunde-row:last-child"));
if (isLast) {
var newRow = steps.dunde.buildRow(stepDiv);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
// Keep disabled keys in sync across all lang selectors.
steps.dunde.syncDisabledKeys(stepDiv);
},
/** Disables already-selected languages in all other dropdowns. */
syncDisabledKeys: function (stepDiv) {
var taken = $.extend({}, steps.dunde.disabledKeys);
stepDiv.find("li.wiktku-dunde-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
stepDiv.find("li.wiktku-dunde-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
build: function (stepDiv) {
if (stepDiv.find("ul.wiktku-dunde-list").length) return null;
var list = $("<ul class='wiktku-dunde-list wiktku-lang-row-list'></ul>");
list.append(steps.dunde.buildRow(stepDiv));
stepDiv.append(list);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return null;
},
/** Reads all [langcode, words[]] rows from the DOM. */
getRows: function (stepDiv) {
var result = [];
stepDiv.find("li.wiktku-dunde-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-dunde-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
output: function () {
var stepDiv = $("#wiktku-start-dunde");
var rows = steps.dunde.getRows(stepDiv);
if (!rows.length) return "";
var lines = $.map(rows, function (row) {
var lang = row[0], words = row[1];
return "* {{dû|" + lang + "|" + words.join("|") + "}}";
});
return "\n==== Dûnde ====\n" + lines.join("\n") + "\n";
}
},
zarava: {
id: "zarava",
name: "bi zaravayên din",
question_fmt: "'"+ pageName + "' di zaravayên din de çawa tê gotin?",
visible: function (values) {
return steps.trans.visible(values);
},
disabledKeys: {},
buildRow: function (group) {
var row = $("<li class='wiktku-zarava-row wiktku-lang-row'></li>");
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zaravayekî bigere");
populateMenus(langSel, steps.zarava.keys || [], steps.zarava.disabledKeys);
langSel.on("change", function () {
steps.zarava.onLangChange(group, row);
});
var wordList = $("<ul class='wiktku-zarava-words wiktku-lang-row-words'></ul>");
var firstWord = steps.zarava.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-zarava-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Tercime…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-zarava-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.zarava.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (group, row) {
var list = group.find("ul.wiktku-zarava-list");
var isLast = row.is(list.children("li.wiktku-zarava-row:last-child"));
if (isLast) {
var newRow = steps.zarava.buildRow(group);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
steps.zarava.syncDisabledKeys(group);
},
/** Disables already-selected dialects in all other dropdowns within one group. */
syncDisabledKeys: function (group) {
var taken = $.extend({}, steps.zarava.disabledKeys);
group.find("li.wiktku-zarava-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
group.find("li.wiktku-zarava-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
/** Builds (or fetches) the .wiktku-zarava-group for one gloss. */
buildGroup: function (stepDiv, gi) {
var group = $("<div class='wiktku-zarava-group'></div>").attr("data-gloss-pos", gi);
var list = $("<ul class='wiktku-zarava-list wiktku-lang-row-list'></ul>");
list.append(steps.zarava.buildRow(group));
group.append(list);
stepDiv.append(group);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return group;
},
/** Syncs one .wiktku-zarava-group per current gloss (same logic as steps.trans.build). */
build: function (stepDiv) {
var glosses = steps.trans.glossList();
if (!glosses.length) {
stepDiv.find(".wiktku-zarava-group").remove();
return null;
}
var existingGroups = stepDiv.find(".wiktku-zarava-group");
if (existingGroups.length > glosses.length) {
existingGroups.slice(glosses.length).remove();
}
$.each(glosses, function (gi, gloss) {
var group = stepDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
if (!group.length) group = steps.zarava.buildGroup(stepDiv, gi);
var label = group.find(".wiktku-zarava-group-label");
if (glosses.length > 1) {
if (!label.length) {
label = $("<div class='wiktku-zarava-group-label'></div>");
group.prepend(label);
}
label.text(gloss.index + " " + gloss.text);
} else if (label.length) {
label.remove();
}
});
return null;
},
/** Reads the dialect rows for a single gloss group. */
getGroupTranslations: function (group) {
var result = [];
group.find("li.wiktku-zarava-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-zarava-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
/** Reads all rows from the DOM, grouped by gloss position. */
getTranslations: function (stepDiv) {
var result = [];
stepDiv.find(".wiktku-zarava-group").each(function () {
result.push(steps.zarava.getGroupTranslations($(this)));
});
return result;
},
output: function (values) {
if (values.lang !== "ku") return "";
var stepDiv = $("#wiktku-start-zarava");
var glosses = steps.trans.glossList();
if (!glosses.length) return "";
var blocks = $.map(glosses, function (gloss, gi) {
var group = stepDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
var rows = group.length ? steps.zarava.getGroupTranslations(group) : [];
if (!gloss.text && !rows.length) return undefined;
if (rows.length) {
rows.sort(function (a, b) {
var aLang = langsByCode[a[0]] || {};
var bLang = langsByCode[b[0]] || {};
return (aLang.sortKey || "").localeCompare(bLang.sortKey || "", "ku");
});
}
var wordLines = $.map(rows, function (row) {
var lang = row[0];
var words = row[1];
var wikiWords = words.map(function (w) {
return "{{W|" + lang + "|" + w + "}}";
}).join(", ");
return "* {{Z|" + lang + "}}: " + wikiWords;
}).join("\n");
if (!wordLines) return undefined;
var block = "{{werger-ser|" + (gloss.text || "?") + "|" + gloss.index + "}}";
block += "\n" + wordLines;
block += "\n{{werger-bin}}";
return block;
});
if (!blocks.length) return "";
return "\n==== Bi zaravayên din ====\n" + blocks.join("\n") + "\n";
}
},
trans: {
id: "trans",
name: "werger",
question_fmt: "Tercimeyên vê maneyê bi zimanên din binivîse",
visible: function (values) {
if (!(values.lang === "ku" && values.pos)) return false;
// Hide only when every sense is a filled template sense (no plain
// gloss to attach translations to). A mix, or nothing filled in
// yet, still shows Werger.
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasRealSense = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
var hasFilledTplSense = dfnSenses.some(function (s) {
return s.tpl && s.tplTitle;
});
return hasRealSense || !hasFilledTplSense;
},
disabledKeys: {
"navz": true,
"ku": true,
"ckb": true,
"sdh": true,
"lki": true,
"hac": true,
"zza": true },
// Language dropdown + growing word-input list, scoped to one gloss's
// group (each gloss has its own group and row list).
buildRow: function (group) {
var row = $("<li class='wiktku-trans-row wiktku-lang-row'></li>");
// Language selector — the searchable picker is applied after insertion into DOM.
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zimanekî bigere");
populateMenus(langSel, steps.trans.keys || [], steps.trans.disabledKeys);
// When a language is chosen, ensure a next empty row exists.
langSel.on("change", function () {
steps.trans.onLangChange(group, row);
});
// Word list for this language.
var wordList = $("<ul class='wiktku-trans-words wiktku-lang-row-words'></ul>");
var firstWord = steps.trans.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
// The searchable picker is attached by initSelects() once the row
// is in the DOM (see onLangChange/buildGroup below).
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-trans-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Tercime…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-trans-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.trans.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (group, row) {
var list = group.find("ul.wiktku-trans-list");
var isLast = row.is(list.children("li.wiktku-trans-row:last-child"));
if (isLast) {
var newRow = steps.trans.buildRow(group);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
// Keep disabled keys in sync across this gloss's lang selectors
// only — the same language can be used for different senses.
steps.trans.syncDisabledKeys(group);
},
/** Disables already-selected languages in all other dropdowns within one group. */
syncDisabledKeys: function (group) {
var taken = $.extend({}, steps.trans.disabledKeys);
group.find("li.wiktku-trans-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
group.find("li.wiktku-trans-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
// Builds (or fetches) the .wiktku-trans-group for one gloss.
buildGroup: function (stepDiv, gi) {
var group = $("<div class='wiktku-trans-group'></div>").attr("data-gloss-pos", gi);
var list = $("<ul class='wiktku-trans-list wiktku-lang-row-list'></ul>");
list.append(steps.trans.buildRow(group));
group.append(list);
stepDiv.append(group);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return group;
},
// Syncs one .wiktku-trans-group per current gloss, keyed by
// data-gloss-pos so groups stay matched across rebuilds.
build: function (stepDiv) {
var glosses = steps.trans.glossList();
if (!glosses.length) {
stepDiv.find(".wiktku-trans-group").remove();
return null;
}
// Drop groups for glosses that no longer exist (always from the
// tail — groups are only ever appended in gloss order below).
var existingGroups = stepDiv.find(".wiktku-trans-group");
if (existingGroups.length > glosses.length) {
existingGroups.slice(glosses.length).remove();
}
$.each(glosses, function (gi, gloss) {
var group = stepDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
if (!group.length) group = steps.trans.buildGroup(stepDiv, gi);
// Only label groups when there's more than one gloss to
// distinguish between — a single gloss needs no caption.
var label = group.find(".wiktku-trans-group-label");
if (glosses.length > 1) {
if (!label.length) {
label = $("<div class='wiktku-trans-group-label'></div>");
group.prepend(label);
}
label.text(gloss.index + " " + gloss.text);
} else if (label.length) {
label.remove();
}
});
return null;
},
/** Reads the translation rows for a single gloss group. */
getGroupTranslations: function (group) {
var result = [];
group.find("li.wiktku-trans-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-trans-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
// Reads all translation rows, grouped by gloss position.
getTranslations: function (stepDiv) {
var result = [];
stepDiv.find(".wiktku-trans-group").each(function () {
result.push(steps.trans.getGroupTranslations($(this)));
});
return result;
},
// Builds the numbered "{ index, gloss }" list, one per dfn sense
// with a real mane (skips template senses). index is 1-based and
// matches the sense's position in the "#" definition list.
// When nothing's filled in, returns one placeholder entry so
// Werger still has a group to attach to; when every sense is a
// filled template sense, stays empty (matches trans.visible()).
glossList: function () {
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var glosses = [];
var hasFilledTplSense = false;
$.each(dfnSenses, function (i, s) {
if (s.tpl) {
if (s.tplTitle) hasFilledTplSense = true;
return; // template sense — no gloss to caption with
}
var dfn = s.mane;
if (!dfn) {
// No mane, but other fields are filled — still gets a
// gloss group since dfn.getOutput() emits {{mane?}} for it.
if (senseHasExtraContent(s)) glosses.push({ index: i + 1, text: "" });
return;
}
if (dfn[0] !== dfn[0].toLowerCase()) dfn = decapitalize(dfn);
dfn = stripWikilinks(dfn).replace(/[.…?!)\]،؟]+$/, "");
glosses.push({ index: i + 1, text: dfn });
});
if (!glosses.length && !hasFilledTplSense) {
glosses.push({ index: 1, text: "" });
}
return glosses;
},
output: function (values) {
if (values.lang !== "ku") return "";
var stepDiv = $("#wiktku-start-trans");
var glosses = steps.trans.glossList();
// Every sense is a template sense — there's no real gloss
// anywhere and no group in the DOM either (glossList() only
// returns empty in that case), so skip the section entirely.
if (!glosses.length) return "";
// A completely empty entry (nothing filled in dfn at all, no
// şablon chosen either) still gets a placeholder Werger section
// to fill in later. Only
// skip an individual placeholder gloss below when some other
// sense actually has real content, making that particular
// placeholder redundant.
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasRegularMane = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
// Each gloss now has its own group of translation rows —
// attach every gloss's own words under its own werger-ser/-bin
// pair instead of dumping everything under the first one.
var blocks = $.map(glosses, function (gloss, gi) {
var group = stepDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
var rows = group.length ? steps.trans.getGroupTranslations(group) : [];
// Placeholder gloss (no real mane entered yet) with nothing
// translated into it. If some other sense already has real
// content, this placeholder is redundant — skip it. If the
// whole entry is empty, keep it so Werger still gets a
// section to fill in.
if (!gloss.text && !rows.length && hasRegularMane) return undefined;
if (rows.length) {
// Sort by Kurdish sort key.
rows.sort(function (a, b) {
var aLang = langsByCode[a[0]] || {};
var bLang = langsByCode[b[0]] || {};
return (aLang.sortKey || "").localeCompare(bLang.sortKey || "", "ku");
});
}
var wordLines = $.map(rows, function (row) {
var lang = row[0];
var words = row[1];
var wikiWords = words.map(function (w) {
return "{{W|" + lang + "|" + w + "}}";
}).join(", ");
return "* {{Z|" + lang + "}}: " + wikiWords;
}).join("\n");
var block = "{{werger-ser|" + (gloss.text || "?") + "|" + gloss.index + "}}";
if (wordLines) block += "\n" + wordLines;
block += "\n{{werger-bin}}";
return block;
});
if (!blocks.length) return "";
return "\n==== Werger ====\n" + blocks.join("\n") + "\n";
}
},
cavkani: {
id: "cavkani",
name: "çavkanî",
question_fmt: "Çavkaniyên din (ne jêgirtin) lê zêde bike",
visible: function (values) {
return !!values.pos;
},
// Fills the insert-dropdown from the members of [[Kategorî:Çavkanî]].
refreshTplSelect: function () {
var sel = $("#wiktku-start-cavkani .wiktku-tpl-insert-select");
if (!sel.length) return;
sel.find("option[value!='']").remove();
$.each(catSrcTemplates || [], function (_, name) {
sel.append($("<option></option>").val(name).text(name));
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-cavkani-wrap").length) return null;
var wrap = $("<div class='wiktku-cavkani-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-cavkani-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-cavkani-text")
.attr("rows", 4)
.attr("placeholder", "Şablonekî ji jêrê hilbijêre an rasterast binivîse…");
// Template insert dropdown, populated from [[Kategorî:Çavkanî]] —
// options refreshed once the category members are fetched.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike…");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
var status = $("<span class='wiktku-cavkani-status'></span>");
sel.on("change", function () {
var name = $(this).val();
if (!name) return;
insertAtCursor(ta[0], "\n* {{" + name + "}}");
$(this).val("");
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel);
wrap.append(status).append(ta);
stepDiv.append(wrap);
// build() runs again for every new beş (see the "+ Beş zêde bike"
// handler), after the initial page-wide pass — so this select needs
// its own init or it stays a plain, unsearchable native <select>.
initSelects(wrap);
// Populate only now: refreshTplSelect() looks the select up by id
// under #wiktku-start-cavkani, so running it before the wrap was
// appended found nothing and bailed out — which left the dropdown
// empty on every beş after the first, once the category members
// were already cached.
if (catSrcTemplates) {
steps.cavkani.refreshTplSelect();
} else {
status.text("Şablon tên barkirin…");
fetchCatSrcTemplates().then(function () {
steps.cavkani.refreshTplSelect();
status.text("");
}, function () {
status.text("Şablon nehatin barkirin.");
});
}
return ta;
},
output: function () {
var text = $.trim($("#wiktku-start-cavkani .wiktku-cavkani-text").val());
if (!text) return "";
return "\n==== Çavkanî ====\n" + text + "\n";
}
},
};
steps.trans.keys = steps.lang.choices;
steps.dunde.keys = steps.lang.choices;
steps.zarava.keys = getZaravaKeys(steps.lang.choices);
var ordered_steps = [
steps.lang, steps.pron, steps.pos, steps.cinsiyet, steps.lektur, steps.tr,
steps.dfn, steps.je, steps.tekildar,
steps.etym, steps.dunde, steps.binereherwiha, steps.zarava, steps.trans, steps.cavkani];
// Step ids that belong to each section (not shared across sections).
var PER_SECTION_STEP_IDS = [
"pos", "cinsiyet", "lektur", "tr",
"dfn", "je", "tekildar", "etym", "dunde", "binereherwiha", "zarava", "trans", "cavkani"
];
// ── Multi-section state ──────────────────────────────────────────────────
// Each entry is a plain snapshot: { pos, cinsiyet, lektur, tr, dfn (senses[]),
// je, tekildar, binereherwiha, trans (rows[]) }.
var sections = [{}]; // section 0 starts empty (DOM is the truth)
var activeSection = 0;
function snapshotDfn() {
return steps.dfn.getSenses($("#wiktku-start-dfn"));
}
// Rebuilds the dfn DOM from a previously snapshotted senses array.
function restoreDfn(senses) {
var stepDiv = $("#wiktku-start-dfn");
// Tear down the existing list so build() recreates it cleanly.
stepDiv.find("ol.wiktku-dfn-list").remove();
steps.dfn.build(stepDiv);
var list = stepDiv.find("ol.wiktku-dfn-list");
$.each(senses, function (i, sense) {
// Ensure enough blocks exist (build() seeds one).
var blocks = list.find("li.wiktku-dfn-sense");
var block = blocks.eq(i);
if (!block.length) {
var nb = steps.dfn.buildSenseBlock(stepDiv);
list.append(nb);
block = list.find("li.wiktku-dfn-sense").last();
}
// Template selector.
block.find("select.wiktku-dfn-tpl-select").val(sense.tpl || "");
if (sense.tpl) {
block.find("textarea.wiktku-dfn-mane").hide();
block.find("input.wiktku-dfn-tpl-title").val(sense.tplTitle || "").show();
} else {
block.find("textarea.wiktku-dfn-mane").val(sense.mane || "").show();
block.find("input.wiktku-dfn-tpl-title").hide().val("");
}
// dfnArea is the only thing actually saved, so split it back into
// tercime/îzah for editing (mirrors syncNonKuToMane's join format).
var maneParts = splitTercimeIzah(sense.mane);
block.find(".wiktku-dfn-tercime").val(maneParts ? maneParts.tercime : (sense.mane || ""));
block.find(".wiktku-dfn-izah").val(maneParts ? maneParts.izah : "");
// Re-sync the formên alternatîv/hevmane/… hide state now that
// tplSelect's value was set (its own "change"
// handler doesn't fire from .val(), so this doesn't happen otherwise).
var updateVis = block.data("updateFieldVisibility");
if (updateVis) updateVis();
// Same for the mane-box mode (plain vs tercime+îzah), since this
// also depends on tplSelect's (and lang's) value.
var updateMane = block.data("updateManeMode");
if (updateMane) updateMane();
// Restore a sub-list (etiket, formên alternatîv, hevmane …) from a values array.
function restoreSubList(cls, values) {
if (!values || !values.length) return;
var groupDiv = block.find("." + cls + "-group");
var subList = groupDiv.find("ol, ul").first();
if (!subList.length) return; // group not found
// Fill existing items, append new ones as needed.
$.each(values, function (j, val) {
var items = subList.find("li");
if (j < items.length) {
items.eq(j).find("textarea").val(val);
} else {
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-restore-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.val(val);
ta.on("input", function () {
steps.dfn.onSubInput(subList, this, 1, true);
});
subList.append($("<li></li>").append(ta));
}
});
}
// Reveal and populate lazy groups that have data.
var lazyMap = {
"wiktku-dfn-etiket": sense.etiket,
"wiktku-dfn-kategori": sense.kategori,
"wiktku-dfn-alternativ": sense.alternativ,
"wiktku-dfn-hevmane": sense.hevmane,
"wiktku-dfn-dijmane": sense.dijmane,
"wiktku-dfn-koordine": sense.koordine,
"wiktku-dfn-jornav": sense.jornav,
"wiktku-dfn-jernav": sense.jernav
};
$.each(lazyMap, function (cls, vals) {
if (vals && vals.length) restoreSubList(cls, vals);
});
// Nimûne items are objects { text, tr?, t? } — restore using the builder.
if (sense.nimune && sense.nimune.length) {
var nimuneGroupDiv = block.find(".wiktku-dfn-nimune-group");
var nimuneList = nimuneGroupDiv.find("ol.wiktku-dfn-nimune-list");
var buildFn = nimuneGroupDiv.data("buildNimuneLi");
nimuneList.empty();
$.each(sense.nimune, function (_, n) {
var text = typeof n === "object" ? (n.text || "") : n;
if (!text) return;
var li = buildFn ? buildFn() : $("<li class='wiktku-dfn-nimune-li'></li>");
li.find(".wiktku-dfn-nimune-text").val(text).each(function () { highlightLinebreak(this); });
if (n.tr) li.find(".wiktku-dfn-nimune-tr").val(n.tr);
if (n.t) li.find(".wiktku-dfn-nimune-t").val(n.t);
nimuneList.append(li);
});
// Always leave a blank trailing item.
if (buildFn) nimuneList.append(buildFn());
}
// Restore jêder entries — accepts current array shape or a legacy
// single object (older saved sections) for backwards compat.
var jederArr = $.isArray(sense.jeder) ? sense.jeder : (sense.jeder ? [sense.jeder] : []);
if (jederArr.length) {
var jederGroupDiv = block.find(".wiktku-dfn-jeder-group");
var jederList = jederGroupDiv.find("ol.wiktku-dfn-jeder-list");
var buildJederFn = jederGroupDiv.data("buildJederLi");
jederList.empty();
$.each(jederArr, function (_, j) {
if (!j || !j.quote) return;
var li = buildJederFn ? buildJederFn() : $("<li class='wiktku-dfn-jeder-li'></li>");
li.find(".wiktku-dfn-nimune-quote").val(j.quote).each(function () { highlightLinebreak(this); });
if (j.quoteTr) li.find(".wiktku-dfn-nimune-quote-tr").val(j.quoteTr);
if (j.quoteT) li.find(".wiktku-dfn-nimune-quote-t").val(j.quoteT);
if (j.jederManual) {
var manualSel = li.find(".wiktku-dfn-quote-src-sel");
manualSel.val("__manual__").trigger("change");
li.find(".wiktku-dfn-quote-src-manual").val(j.jederManual);
} else if (j.jederCatTpl) {
// Legacy format from before the şablon search switched rows to
// manual mode directly — convert it the same way now, so it's
// editable like any other free-form source.
var catSelEl = li.find(".wiktku-dfn-quote-src-sel");
catSelEl.val("__manual__").trigger("change");
li.find(".wiktku-dfn-quote-src-manual").val("{{" + j.jederCatTpl + "}}");
} else if (j.jederTpl) {
var srcSel = li.find(".wiktku-dfn-quote-src-sel");
srcSel.val(j.jederTpl).trigger("change");
if (j.jêderFields) {
$.each(j.jêderFields, function (key, val) {
li.find(".wiktku-dfn-quote-src-input[data-field-key='" + key + "']").val(val);
});
}
}
jederList.append(li);
});
// Always leave a blank trailing item, same as Nimûne.
if (buildJederFn) jederList.append(buildJederFn());
}
});
}
// Snapshots simple (non-dfn) per-section steps from the DOM into obj.
function saveCurrentSection() {
var snap = {};
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
snap.dfn = snapshotDfn();
return;
}
if (id === "etym") {
snap.etym = $.trim($("#wiktku-start-etym .wiktku-etym-text").val());
return;
}
if (id === "cavkani") {
snap.cavkani = $.trim($("#wiktku-start-cavkani .wiktku-cavkani-text").val());
return;
}
var step = steps[id];
if (!step) return;
var stepDiv = $("#wiktku-start-" + id);
if (id === "trans") {
snap.trans = steps.trans.getTranslations(stepDiv);
return;
}
if (id === "zarava") {
snap.zarava = steps.zarava.getTranslations(stepDiv);
return;
}
if (id === "dunde") {
snap.dunde = steps.dunde.getRows(stepDiv);
return;
}
// Generic: read all step fields.
var fields = stepDiv.find(".wiktku-start-step-field");
if (step.multiple) {
snap[id] = fields.map(function () { return $(this).val(); }).get();
} else {
snap[id] = fields.val();
}
});
sections[activeSection] = snap;
}
// Restores a previously saved snapshot into the form DOM.
function restoreSection(snap) {
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
restoreDfn(snap.dfn || []);
return;
}
if (id === "etym") {
$("#wiktku-start-etym .wiktku-etym-wrap").remove();
steps.etym.build($("#wiktku-start-etym"));
$("#wiktku-start-etym .wiktku-etym-text").val(snap.etym || "");
return;
}
if (id === "cavkani") {
$("#wiktku-start-cavkani .wiktku-cavkani-wrap").remove();
steps.cavkani.build($("#wiktku-start-cavkani"));
$("#wiktku-start-cavkani .wiktku-cavkani-text").val(snap.cavkani || "");
return;
}
if (id === "trans") {
// Rebuild trans groups (dfn must already be restored by this
// point in the $.each loop, so glossList() reflects it).
var transDiv = $("#wiktku-start-trans");
transDiv.find(".wiktku-trans-group").remove();
steps.trans.build(transDiv);
var groupsSnap = snap.trans || [];
$.each(groupsSnap, function (gi, rows) {
var group = transDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
if (!group.length) return; // gloss no longer exists — drop its rows
var list = group.find("ul.wiktku-trans-list");
$.each(rows, function (j, row) {
var lang = row[0], words = row[1];
var lastRow = list.find("li.wiktku-trans-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-trans-words");
$.each(words, function (k, word) {
var wordItems = wordList.find("li");
if (k < wordItems.length) {
wordItems.eq(k).find("textarea").val(word);
} else {
// .val() below doesn't fire "input", so the normal
// auto-grow never runs — append a matching item
// ourselves instead of silently dropping the word.
var extraInput = steps.trans.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
// Leave one trailing empty field so the row can still grow
// when the user types, matching a freshly-built row.
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.trans.makeWordInput()));
}
});
});
return;
}
if (id === "zarava") {
// Rebuild zarava groups (dfn must already be restored by this
// point in the $.each loop, so glossList() reflects it).
var zaravaDiv = $("#wiktku-start-zarava");
zaravaDiv.find(".wiktku-zarava-group").remove();
steps.zarava.build(zaravaDiv);
var zaravaGroupsSnap = snap.zarava || [];
$.each(zaravaGroupsSnap, function (gi, rows) {
var group = zaravaDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
if (!group.length) return; // gloss no longer exists — drop its rows
var list = group.find("ul.wiktku-zarava-list");
$.each(rows, function (j, row) {
var lang = row[0], words = row[1];
var lastRow = list.find("li.wiktku-zarava-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-zarava-words");
$.each(words, function (k, word) {
var wordItems = wordList.find("li");
if (k < wordItems.length) {
wordItems.eq(k).find("textarea").val(word);
} else {
var extraInput = steps.zarava.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.zarava.makeWordInput()));
}
});
});
return;
}
if (id === "dunde") {
// Rebuild dunde rows.
var dundeDiv = $("#wiktku-start-dunde");
dundeDiv.find("ul.wiktku-dunde-list").remove();
steps.dunde.build(dundeDiv);
var dundeRows = snap.dunde || [];
$.each(dundeRows, function (i, row) {
var lang = row[0], words = row[1];
var list = dundeDiv.find("ul.wiktku-dunde-list");
var lastRow = list.find("li.wiktku-dunde-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-dunde-words");
$.each(words, function (j, word) {
var wordItems = wordList.find("li");
if (j < wordItems.length) {
wordItems.eq(j).find("textarea").val(word);
} else {
// .val() below doesn't fire "input", so the normal
// auto-grow never runs — append a matching item
// ourselves instead of silently dropping the word.
var extraInput = steps.dunde.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
// Leave one trailing empty field so the row can still grow
// when the user types, matching a freshly-built row.
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.dunde.makeWordInput()));
}
});
return;
}
var step = steps[id];
if (!step) return;
var stepDiv = $("#wiktku-start-" + id);
var fields = stepDiv.find(".wiktku-start-step-field");
var val = snap[id];
if (val === undefined || val === null) return;
if (step.multiple) {
var arr = val;
fields.each(function (i) {
if (i < arr.length) $(this).val(arr[i]);
});
} else {
fields.val(val);
}
// Tell the pickers about the programmatic value change.
fields.filter("select").trigger("wiktku:refresh");
});
}
function getWikitextForCurrentSection(callback) {
var values = getValues();
var entry = steps.pos.output(values);
steps.dfn.getOutput(values, function (output) {
entry += output;
entry += steps.je.output(values);
entry += steps.tekildar.output(values);
entry += steps.etym.output(values);
entry += steps.dunde.output(values);
entry += steps.binereherwiha.output(values);
entry += steps.zarava.output(values);
entry += steps.trans.output(values);
entry += steps.cavkani.output(values);
callback(entry, values);
});
}
function getWikitextAllSections(callback) {
saveCurrentSection();
var results = new Array(sections.length);
var sharedValues = getValues(); // lang/pron are shared
function processSection(i) {
if (i >= sections.length) {
// All done — restore original active section.
restoreSection(sections[activeSection]);
refresh();
callback(results, sharedValues);
return;
}
restoreSection(sections[i]);
refresh();
getWikitextForCurrentSection(function (sectionText) {
results[i] = sectionText;
processSection(i + 1);
});
}
processSection(0);
}
// Assembles wikitext for all sections plus the shared lang/pron header.
function getWikitext(callback) {
getWikitextAllSections(function (sectionTexts, sharedValues) {
var entry = steps.lang.output(sharedValues);
entry += steps.pron.output(sharedValues);
entry += sectionTexts.join("\n");
// Edit summary uses section 0's values. Read from the saved snapshot
// (not the live DOM) so it doesn't mix section 0's pos with whichever
// section happens to be active/restored at this point.
var dfnSenses = (sections[0] && sections[0].dfn) || [];
var dfnSummary = dfnSenses.map(function (s) {
if (s.mane) return s.mane;
// Template sense (e.g. {{guharto|ku|somepage}}) — same
// construction as the tplCall built in getOutput, so the
// summary shows what actually gets written to the entry
// instead of going blank.
if (s.tpl && s.tplTitle) {
return s.tplNoLang
? "{{" + s.tpl + "|" + s.tplTitle + "}}"
: "{{" + s.tpl + "|" + sharedValues.lang + "|" + s.tplTitle + "}}";
}
return "";
}).filter(Boolean).join("; ");
var summary = "([[Mediawiki:Gadget-start.js|WF:NÛ]] v.2.0) +" +
sharedValues.lang + ":" + sections[0].pos + ":" + dfnSummary;
var summaryField = document.getElementById("wpSummary");
if (addLangMode && summaryField.value) {
summary = summaryField.value + " " + summary;
}
summaryField.value = summary;
callback(entry);
});
}
var continueBtn;
function getValuesForStep(stepId) {
var fields = $("#wiktku-start-" + stepId + " .wiktku-start-step-field");
var step = steps[stepId];
if (step.keys) {
var values = {};
fields.each(function (i, field) {
var key = $(field).prevAll(".wiktku-start-step-keyfield").val();
if (key) values[key] = $(field).val();
});
return values;
}
else if (step.multiple) {
return fields.map(function () {
return $(this).val();
}).get();
}
return fields.val();
}
function getValues() {
var values = {};
$.each(steps, function (stepId) {
values[stepId] = getValuesForStep(stepId);
});
return values;
}
function populateMenus(inputs, choices, disabledValues, placeholderText) {
if (!disabledValues) disabledValues = {};
var vals = inputs.map(function (i, input) {
return $(input).val();
});
inputs.empty();
inputs.append($("<option></option>").text(placeholderText || ""));
$.each(choices, function (j, choice) {
// Append the language code in parentheses so that typing a code
// (e.g. "ku") in the search box still finds the language name.
var displayText = capitalize(choice.label);
if (choice.sortKey !== undefined) {
// This is a language choice {code, label, sortKey} — show code.
displayText = capitalize(choice.label) + " (" + choice.code + ")";
}
var option = $(mw.html.element("option", {
value: choice.code }, displayText));
if (disabledValues[choice.code]) option.prop("disabled", true);
inputs.append(option);
});
inputs.val(function (i) {
return vals[i];
});
}
// Keys to disable for a key menu: already-taken or explicitly disabled.
function getDisabledKeys(step) {
var occupiedKeys = {};
$("#wiktku-start-" + step.id + " .wiktku-start-step-keyfield").each(function () {
occupiedKeys[$(this).val()] = true;
});
if (step.disabledKeys) $.extend(occupiedKeys, step.disabledKeys);
return occupiedKeys;
}
function buildKeyInput(step) {
if (!step.keys) return undefined;
var input = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
input.attr("data-placeholder", "Hilbijêre " + step.keyName);
populateMenus(input, step.keys, getDisabledKeys(step));
// Keep the key menus mutually exclusive: whatever one row selects is
// disabled in every other row. Recomputed from the DOM on each change.
input.on("change", function () {
var all = $("#wiktku-start-" + step.id + " .wiktku-start-step-keyfield");
var taken = {};
all.each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
all.not(this).each(function () {
var self = $(this), own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (code) $(this).prop("disabled", !!taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
});
// Return the wrapper; the select lives inside it and still fires change.
return wrapNativeSelect(input);
}
// Adds another text field to the list if the last one now has text.
function refreshForTextField(currentInput, step) {
currentInput = $(currentInput);
var value = currentInput.val();
var item = currentInput.parent();
if (value && !item.next("li").length) {
var nextInput = $("<textarea></textarea>")
.attr("name", "wiktku-field-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", currentInput.attr("class"))
.attr("rows", currentInput.attr("rows") || 1);
if (step.placeholder) nextInput.attr("placeholder", step.placeholder);
nextInput.on("input", function (evt) {
refreshForTextField(evt.target, step);
});
var nextKeyInput = buildKeyInput(step);
var nextItem = $("<li></li>").append(nextKeyInput).append(nextInput);
item.parent().append(nextItem);
if (nextKeyInput) initSelects(nextItem);
}
var canContinue = !continueBtn.isDisabled();
if ((value && !canContinue) || (!value && canContinue)) {
refresh(step);
}
}
function prepareInput(input, step) {
if (!input) return;
if (step.required) input.prop('required', true);
input.change(step, refresh);
}
// Shows/hides steps based on whether their prerequisites are met, and
// updates placeholders where applicable.
function refresh(evt) {
var values = getValues();
var changedStep = evt && evt.data;
var didFocus = false;
var canContinue = true;
// Re-filter template options in every sense block whenever lang changes.
$("#wiktku-start-dfn .wiktku-dfn-tpl-select").each(function () {
var fn = $(this).data("updateOptions");
if (typeof fn === "function") fn();
});
// Re-filter pronunciation and etymology template dropdowns when language changes.
steps.pron.refreshTplSelect();
steps.etym.refreshTplSelect();
steps.cavkani.refreshTplSelect();
// Re-render any step's question label that depends on current values
// (e.g. dfn's Werger-section reminder, which only applies to ku).
$.each(steps, function (stepId, step) {
if (typeof step.question_fmt === "function") {
$("#wiktku-start-" + stepId + " .wiktku-start-step-question")
.text(step.question_fmt(values));
}
});
// Sync every sense block's mane-box mode (plain mane vs tercime+îzah)
// to the current language, in case lang changes after blocks exist.
$("#wiktku-start-dfn li.wiktku-dfn-sense").each(function () {
var updateMane = $(this).data("updateManeMode");
if (updateMane) updateMane();
});
// Sync tr/t sub-fields in every nimûne item to the current language.
// tr shown when language needs transliteration; t shown when lang !== "ku".
(function () {
var lang = values.lang || "";
var showTr = needsTransliteration(lang);
var showT = lang && lang !== "ku";
$("#wiktku-start-dfn .wiktku-dfn-nimune-list li.wiktku-dfn-nimune-li").each(function () {
var li = $(this);
// Ensure the sub-wrapper exists when we need it.
var subWrap = li.find(".wiktku-dfn-nimune-sub");
// tr field
var trTa = li.find(".wiktku-dfn-nimune-tr");
if (showTr && !trTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
li.append(subWrap);
}
trTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-tr")
.attr("placeholder", "Transliterasyon…");
subWrap.prepend(trTa);
} else if (!showTr && trTa.length) {
trTa.remove();
}
// t field
var tTa = li.find(".wiktku-dfn-nimune-t");
if (showT && !tTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
li.append(subWrap);
}
tTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-t")
.attr("placeholder", "Tercimeya nimûneyê bi kurmancî…");
subWrap.append(tTa);
} else if (!showT && tTa.length) {
tTa.remove();
}
// Remove the wrapper if it ended up empty.
subWrap = li.find(".wiktku-dfn-nimune-sub");
if (subWrap.length && !subWrap.children().length) subWrap.remove();
});
}());
// Sync tr/t sub-fields in every jêder citation to the current language.
// tr shown when language needs transliteration; t shown when lang !== "ku".
(function () {
var lang = values.lang || "";
var showTr = needsTransliteration(lang);
var showT = lang && lang !== "ku";
$("#wiktku-start-dfn .wiktku-dfn-jeder-list li.wiktku-dfn-jeder-li").each(function () {
var li = $(this);
// Ensure the sub-wrapper exists when we need it. It must sit right
// after the quote textarea and before the source selector.
var subWrap = li.find(".wiktku-dfn-quote-sub");
// tr field
var trTa = li.find(".wiktku-dfn-nimune-quote-tr");
if (showTr && !trTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
// Insert after the quote textarea's resize-wrap (if the manual
// resize handle has already been attached to it), not after the
// bare textarea -- otherwise this lands *inside* that wrap,
// between the textarea and its own grip, breaking jêgirtin's
// handle and nesting the tr/t boxes inside it.
var quoteTa = li.find(".wiktku-dfn-nimune-quote");
var quoteResizeWrap = quoteTa.closest(".wiktku-resize-wrap");
(quoteResizeWrap.length ? quoteResizeWrap : quoteTa).after(subWrap);
}
trTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-tr")
.attr("placeholder", "Transliterasyona jêgirtinê…");
subWrap.prepend(trTa);
} else if (!showTr && trTa.length) {
trTa.remove();
}
// t field
var tTa = li.find(".wiktku-dfn-nimune-quote-t");
if (showT && !tTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
// See the tr-field branch above for why this targets the
// resize-wrap instead of the bare textarea.
var quoteTa2 = li.find(".wiktku-dfn-nimune-quote");
var quoteResizeWrap2 = quoteTa2.closest(".wiktku-resize-wrap");
(quoteResizeWrap2.length ? quoteResizeWrap2 : quoteTa2).after(subWrap);
}
tTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-t")
.attr("placeholder", "Tercimeya jêgirtinê bi kurmancî…");
subWrap.append(tTa);
} else if (!showT && tTa.length) {
tTa.remove();
}
// Remove the wrapper if it ended up empty.
subWrap = li.find(".wiktku-dfn-quote-sub");
if (subWrap.length && !subWrap.children().length) subWrap.remove();
});
}());
$.each(steps, function (stepId, step) {
if (typeof(step.visible) === "function" && !step.visible(values)) {
$("#wiktku-start-" + stepId).slideUp();
}
else {
var stepDiv = $("#wiktku-start-" + stepId);
if (changedStep !== step && typeof(step.build) === "function") {
prepareInput(step.build(stepDiv, values), step);
}
var input = stepDiv.find(".wiktku-start-step-field");
if (typeof(step.example) === "function") {
// .find() above already reaches nested fields (e.g. the dfn
// step's mane textareas inside each sense block), so one
// assignment covers every step; dfn keeps its own fallback.
var exampleText = step.example(values) || (step.id === "dfn" ? "Mane…" : "");
input.attr("placeholder", exampleText);
}
var didSlideDown;
if (!didFocus && stepDiv.css("display") === "none" && step.required) {
// Skip scrolling for the first section (ziman) since it's
// always at the top of the page.
if (step.id !== "lang") {
didSlideDown = function (evt) {
var stepEl = stepDiv.get(0);
if (stepEl && typeof stepEl.scrollIntoView === "function") {
stepEl.scrollIntoView({ behavior: "smooth", block: "start" });
}
};
}
didFocus = true;
}
stepDiv.slideDown(didSlideDown);
}
if (step.required &&
(values[stepId] === "" ||
(step.multiple && values[stepId].join("") === ""))) {
canContinue = false;
}
});
continueBtn.setDisabled(!canContinue);
}
function destroy() {
$("#wiktku-start-form, .noafterwizard").slideUp(function () {
$(this).remove();
});
$(".noarticletext .nowizard, #editform").slideDown();
$("#ca-edit").removeClass("selected");
$("#ca-wiktku-nowizard").addClass("selected");
}
// Priority order for Kurdish dialects and navz.
// Codes listed here come before all other languages; unlisted codes
// are sorted alphabetically by their display name via localeCompare.
var LANG_PRIORITY = ["navz", "ku", "hac", "sdh", "lki", "ckb", "zza"];
// Inserts a new "== {{ziman|code}} ==" section at the correct sorted
// position: navz, then ku/hac/sdh/lki/ckb/zza, then alphabetical by name.
function insertNewLangSection(existing, wikitext) {
var newCodeMatch = wikitext.match(new RegExp("^" + langHeaderSource("[^}]+")));
var newCode = newCodeMatch ? newCodeMatch[1] : "";
var sections = [];
var preamble = "";
var anyHeaderSrc = langHeaderSource("[^}]+");
var firstMatch = new RegExp("^" + anyHeaderSrc, "m").exec(existing);
if (!firstMatch) {
// No existing lang sections at all — just append.
var sep = existing && !/\n\s*$/.test(existing) ? "\n\n" : "";
return existing + sep + wikitext;
}
// Everything before the first == {{ziman|...}} == is the preamble.
var firstSectionStart = firstMatch.index;
// Walk back to the start of that line.
var lineStart = existing.lastIndexOf("\n", firstSectionStart - 1);
var preambleEnd = lineStart !== -1 ? lineStart + 1 : 0;
preamble = existing.slice(0, preambleEnd);
// Parse each language section: header line + everything until the next header.
var body = existing.slice(preambleEnd);
// (?![\s\S]) matches only true end-of-string, since a bare "$" with
// /m would stop at the section's first line break instead.
var langSectionRe = new RegExp(
"^(" + anyHeaderSrc + "\\n?)([\\s\\S]*?)(?=\\n" + anyHeaderSrc + "|(?![\\s\\S]))",
"gm"
);
var m;
while ((m = langSectionRe.exec(body)) !== null) {
sections.push({
code: m[2],
content: m[0] // full text of this section including header
});
}
// Determine sort rank: priority list first (by index), then alphabetical.
function getLangName(code) {
var entry = langsByCode[code];
return entry ? entry.label : code;
}
function sortRank(code) {
var idx = LANG_PRIORITY.indexOf(code);
return idx !== -1 ? idx : LANG_PRIORITY.length;
}
function compareLangs(a, b) {
var ra = sortRank(a), rb = sortRank(b);
if (ra !== rb) return ra - rb;
// Both are outside priority list — sort by display name.
return getLangName(a).localeCompare(getLangName(b), userLang);
}
// Insert the new section into the sorted list.
var newSection = { code: newCode, content: wikitext };
var inserted = false;
for (var i = 0; i < sections.length; i++) {
if (compareLangs(newCode, sections[i].code) < 0) {
sections.splice(i, 0, newSection);
inserted = true;
break;
}
}
if (!inserted) sections.push(newSection);
// Re-join: preamble + sections separated by newlines.
var joined = sections.map(function (s) {
// Ensure each section ends with exactly one newline before the next.
return s.content.replace(/\n+$/, "");
}).join("\n");
return preamble + joined + "\n";
}
function build() {
$(".nowizard, .nowizard .noafterwizard").hide();
var callToAction = $("#wiktku-calltoaction");
var origCallToActionText = callToAction.text();
$(mw.util.addPortletLink("p-views", "#", "Edîtora çavkaniyê veke",
"ca-wiktku-nowizard", "Vê rûpelê bi edîtora çavkaniyê çêke",
undefined, "#ca-watch")).click(function (evt) {
evt.preventDefault();
callToAction.text(origCallToActionText);
destroy();
});
if (callToAction.length) {
callToAction.text(origCallToActionText +
" Forma li jêr ji bo çêkirina madeyeke nû bi kar bîne.");
}
var startForm = $("<form id='wiktku-start-form'></form>");
var clearPageCheck = null;
if (addLangMode) {
startForm.append($("<p class='wiktku-addlang-notice'></p>").html(
"Bi vê formê tu yê zimanekî nû li rûpelê îlawe bikî. Eger ev ziman jixwe hebe, beşa nû li dawiya vî zimanî dê were îlawekirin. " +
"Ji kerema xwe netîceya dawî kontrol bike, eger problemek derkeve, li <a href='" +
mw.util.getUrl('Mediawiki talk:Gadget-start.js') +
"'>nîqaşa vê amûrê</a> problemê ragihîne."
));
clearPageCheck = $("<input type='checkbox' id='wiktku-clear-page-check'>");
var clearPageLabel = $("<label for='wiktku-clear-page-check'></label>")
.text(" Muhtewaya rûpelê paqij bike (her tiştî jê bibe û rûpelê ji nû ve binivîse)");
startForm.append(
$("<p class='wiktku-addlang-notice'></p>")
.append(clearPageCheck)
.append(clearPageLabel)
);
// Re-evaluate step visibility (e.g. the pron step) whenever this
// is toggled, since it changes what counts as "existing content".
clearPageCheck.on("change", function () {
refresh();
});
}
var spinner;
// Tab bar for switching between POS sections.
var sectionTabsDiv = $("<div id='wiktku-section-tabs'></div>");
startForm.submit(function (evt) {
evt.preventDefault();
continueBtn.setDisabled(true);
continueBtn.$element.addClass("wiktku-btn-sending");
spinner.show();
getWikitext(function (wikitext) {
if (addLangMode && clearPageCheck && clearPageCheck.prop("checked")) {
// User asked to wipe the page and start fresh — just
// write the newly generated wikitext as the full content.
$("#wpTextbox1").val(wikitext);
} else if (addLangMode) {
var textbox = $("#wpTextbox1");
var existing = textbox.val() || "";
// If this language's section already exists (whitespace
// differences aside), merge into it; otherwise insert new.
var langHeaderMatch = wikitext.match(new RegExp("^(" + langHeaderSource("[^}]+") + "\\n)"));
if (langHeaderMatch) {
var langHeader = langHeaderMatch[1]; // e.g. "== {{ziman|ku}} ==\n"
var newCode = langHeaderMatch[2];
var existingHeader = findLangHeader(existing, newCode);
if (existingHeader) {
// Strip the header from the new output.
var newContent = wikitext.slice(langHeader.length);
// Find the insertion point: end of the existing lang section.
// A new L2 heading marks the start of the next language block.
var searchFrom = existingHeader.index + existingHeader.match.length;
// Find the next == … == heading after this section's start.
var nextL2 = existing.indexOf("\n== ", searchFrom);
var insertAt = nextL2 !== -1 ? nextL2 : existing.length;
// Ensure there's a blank line before the inserted block.
var before = existing.slice(0, insertAt);
var after = existing.slice(insertAt);
var sep = /\n\s*$/.test(before) ? "" : "\n";
textbox.val(before + sep + newContent + after);
} else {
// New language — insert at the correct sorted position.
textbox.val(insertNewLangSection(existing, wikitext));
}
} else {
// Unexpected format — insert at sorted position anyway.
textbox.val(insertNewLangSection(existing, wikitext));
}
} else {
$("#wpTextbox1").val(wikitext);
}
$("html, body").animate({scrollTop: 0});
callToAction.text("Hindik ma!");
$("#wiktku-preview-container").remove();
destroy();
});
});
$.each(ordered_steps, function (i, step) {
var stepDiv = $(mw.html.element("div", {
"class": "wiktku-start-step",
id: "wiktku-start-" + step.id }));
var name = capitalize(step.name);
stepDiv.append($(mw.html.element("h3", {
"class": "wiktku-start-step-name" }, new mw.html.Raw(mw.html.element("label", {
"for": "wiktku-start-" + step.id + "-field" }, name)))));
if (step.question_fmt) {
// question_fmt can be a plain string, or a function of the
// current values (used by steps whose question text depends
// on e.g. the chosen language) — refresh() keeps it in sync
// afterwards via the .wiktku-start-step-question class.
var questionText = typeof step.question_fmt === "function"
? step.question_fmt(getValues())
: step.question_fmt;
stepDiv.append($(mw.html.element("label", {
"class": "wiktku-start-step-question",
"for": "wiktku-start-" + step.id + "-field" }, questionText)));
if (step.question_br) stepDiv.append($("<br>"));
}
var input;
if (step.choices) {
input = $(mw.html.element("select", {
"class": "wiktku-start-step-field",
id: "wiktku-start-" + step.id + "-field" }));
input.attr("data-placeholder",
capitalize(step.name) + " hilbijêre ");
populateMenus(input, step.choices);
if (step.multiple) input.attr("multiple", true);
// initSelects() runs over the whole form once it is in the DOM.
stepDiv.append(input);
} else if (typeof(step.build) === "function") {
input = step.build(stepDiv);
} else {
input = $("<textarea></textarea>")
.attr("class", "wiktku-start-step-field")
.attr("id", "wiktku-start-" + step.id + "-field")
.attr("rows", step.rows || 2);
if (step.narrow) input.addClass("wiktku-start-narrow");
if (step.placeholder) input.attr("placeholder", step.placeholder);
if (step.multiple) {
input.on("input", function (evt) {
refreshForTextField(evt.target, step);
});
var keyInput = buildKeyInput(step);
var list = $(step.ordered ? "<ol></ol>" : "<ul></ul>")
.append($("<li></li>").append(keyInput).append(input));
stepDiv.append(list);
}
else stepDiv.append(input);
}
prepareInput(input, step);
stepDiv.hide();
// Insert tab bar just before the first per-section step.
if (step.id === "pos") startForm.append(sectionTabsDiv);
startForm.append(stepDiv);
});
// ── Section tab helpers ──────────────────────────────────────────────
// ── Add-section button — lives in the tab bar, disabled until pos chosen ──
var addSectionBtn = new OO.ui.ButtonWidget({
label: "+ Beş zêde bike",
disabled: true
});
addSectionBtn.on("click", function () {
saveCurrentSection();
sections.push({});
activeSection = sections.length - 1;
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
var stepDiv = $("#wiktku-start-dfn");
stepDiv.find("ol.wiktku-dfn-list").remove();
steps.dfn.build(stepDiv);
return;
}
if (id === "etym") {
$("#wiktku-start-etym .wiktku-etym-wrap").remove();
steps.etym.build($("#wiktku-start-etym"));
return;
}
if (id === "cavkani") {
$("#wiktku-start-cavkani .wiktku-cavkani-wrap").remove();
steps.cavkani.build($("#wiktku-start-cavkani"));
return;
}
if (id === "trans") {
var transDiv = $("#wiktku-start-trans");
transDiv.find(".wiktku-trans-group").remove();
return;
}
if (id === "zarava") {
var zaravaDiv = $("#wiktku-start-zarava");
zaravaDiv.find(".wiktku-zarava-group").remove();
return;
}
if (id === "dunde") {
var dundeDiv = $("#wiktku-start-dunde");
dundeDiv.find("ul.wiktku-dunde-list").remove();
return;
}
var stepDiv = $("#wiktku-start-" + id);
stepDiv.find(".wiktku-start-step-field").val("");
stepDiv.find("select.wiktku-start-step-field").trigger("wiktku:refresh");
});
renderSectionTabs();
refresh();
$("html, body").animate({ scrollTop: sectionTabsDiv.offset().top - 20 }, 300);
});
/** Re-render the tab bar to reflect current sections[] and activeSection. */
function renderSectionTabs() {
// Detach (not remove) the button first: .empty() strips bound
// event data from any children left inside it, which would
// silently kill addSectionBtn's click handler on every re-render.
addSectionBtn.$element.detach();
sectionTabsDiv.empty();
var lang = getValues().lang || "";
if (!lang) {
sectionTabsDiv.hide();
return;
}
sectionTabsDiv.show();
$.each(sections, function (i) {
var posVal = sections[i].pos || "";
var tabLabel = posVal ? capitalize(posVal) : ("Beş " + (i + 1));
var tab = $("<span></span>")
.addClass("wiktku-section-tab")
.text(tabLabel)
.toggleClass("wiktku-tab-active", i === activeSection);
(function (idx) {
tab.on("click", function () {
if (idx === activeSection) return;
saveCurrentSection();
activeSection = idx;
restoreSection(sections[activeSection]);
refresh();
renderSectionTabs();
});
}(i));
sectionTabsDiv.append(tab);
});
// Enable "Beş zêde bike" only when the active section has a pos chosen.
var activePos = sections[activeSection] && sections[activeSection].pos
? sections[activeSection].pos
: getValues().pos;
addSectionBtn.setDisabled(!activePos);
sectionTabsDiv.append(addSectionBtn.$element);
}
renderSectionTabs();
/**
* Restores a full cached draft: shared lang/pron fields, then every
* section (via the same restoreSection()/refresh()/renderSectionTabs()
* sequence already used when switching tabs).
* @param cached {{lang: string, pron: string, sections: Array, activeSection: number}}
*/
function restoreFromCache(cached) {
if (cached.lang) {
$("#wiktku-start-lang-field").val(cached.lang);
$("#wiktku-start-lang-field").trigger("wiktku:refresh");
}
// Rebuild dependent steps (pos, pron wrap, etc.) now that lang is set.
refresh();
if (cached.pron !== undefined) {
$("#wiktku-start-pron .wiktku-pron-text").val(cached.pron);
}
sections = (cached.sections && cached.sections.length) ? cached.sections : [{}];
activeSection = (typeof cached.activeSection === "number" &&
cached.activeSection >= 0 && cached.activeSection < sections.length)
? cached.activeSection : 0;
restoreSection(sections[activeSection]);
refresh();
renderSectionTabs();
mw.notify("Danûstandina berê ya qeydkirî ji cache hate barkirin.",
{ type: "info", tag: "wiktku-cache-restore" });
}
// Update the active tab's label whenever pos changes.
startForm.on("change", "#wiktku-start-pos-field", function () {
renderSectionTabs();
});
// Show the tab bar as soon as a language is selected.
startForm.on("change", "#wiktku-start-lang-field", function () {
renderSectionTabs();
});
var footer = $("<div id='wiktku-start-footer'></div>");
spinner = $(mw.html.element("img", {
id: "wiktku-start-spinner",
src: "//upload.wikimedia.org/wikipedia/commons/d/de/Ajax-loader.gif",
alt: "Tê barkirin…",
title: "Tê barkirin…" }));
footer.append(spinner.hide());
continueBtn = new OO.ui.ButtonWidget({
id: "wiktku-unhide-editform",
label: "Bişîne",
flags: [ "primary", "progressive" ]
});
continueBtn.on("click", function () {
// Immediate feedback that the click registered
continueBtn.$element.addClass("wiktku-btn-flash");
setTimeout(function () {
continueBtn.$element.removeClass("wiktku-btn-flash");
}, 500);
mw.notify("Tê şandin…", { type: "info", tag: "wiktku-submit" });
startForm.trigger("submit");
});
footer.append(continueBtn.$element);
// "Edîtora çavkaniyê veke" button — inline fallback for the portlet link
var sourceEditorBtn = new OO.ui.ButtonWidget({
label: "Edîtora çavkaniyê veke"
});
sourceEditorBtn.on("click", function () {
destroy();
});
footer.append(sourceEditorBtn.$element);
// ── Cache save/clear buttons ─────────────────────────────────────────
// Manual, page-scoped save of the entire wizard (all sections, not
// just the active one) via [[MediaWiki:Gadget-StorageUtils.js]]'s
// ObjectStorage. Restoring happens silently on load (see the
// ziman.json .then() callback below), once the full language list
// is available.
var saveCacheBtn = new OO.ui.ButtonWidget({
label: "Li cache qeyd bike",
title: "Halê vê formê yê niha (ziman, bilêvkirin û hemû beş) li cache (localStorage) qeyd bike, da ku eger rûpel bêyî xwestin were girtin an ji nû ve were barkirin, tu karibî berdewam bikî."
});
saveCacheBtn.on("click", function () {
saveCurrentSection();
var snapshot = {
lang: getValues().lang || "",
pron: $("#wiktku-start-pron .wiktku-pron-text").val() || "",
sections: sections,
activeSection: activeSection
};
// ObjectStorage.Set() doesn't return a success/failure value, so
// the only way to detect a real failure (storage blocked, quota
// exceeded, JSON.stringify choking on something unexpected) is to
// catch it here rather than inspect a (nonexistent) return value.
try {
formCache.Set(snapshot);
mw.notify("Halê formê li cache hate qeydkirin.", { type: "success", tag: "wiktku-cache-save" });
} catch (e) {
mw.notify("Qeydkirina li cache bi ser neket.", { type: "error", tag: "wiktku-cache-save" });
}
});
footer.append(saveCacheBtn.$element);
var clearCacheBtn = new OO.ui.ButtonWidget({
label: "Cache paqij bike",
flags: [ "destructive" ],
title: "Datayên qeydkirî yên vê rûpelê ji cache jê bibe (forma ku niha xuya dike naguherîne)."
});
clearCacheBtn.on("click", function () {
formCache.Set({});
mw.notify("Cache hate paqijkirin.", { type: "success", tag: "wiktku-cache-clear" });
});
footer.append(clearCacheBtn.$element);
// ── Preview checkboxes ───────────────────────────────────────────────
// Wikitext preview (raw text panel)
var previewCheck = $("<input type='checkbox' id='wiktku-preview-toggle'>");
var previewLabel = $("<label for='wiktku-preview-toggle'></label>")
.text(" Pêşdîtina wîkîtekstê");
var previewPanel = $("<pre id='wiktku-preview-panel'></pre>").hide();
// Live rendered preview (parsed HTML panel, same logic as AjaxEdit).
// Not available on mobile — API polling causes too many problems on small screens.
var livePreviewCheck = null;
var livePreviewPanel = null;
if (!isMobile) {
livePreviewCheck = $("<input type='checkbox' id='wiktku-live-preview-toggle'>");
livePreviewPanel = $("<div id='wiktku-live-preview-panel'></div>").hide();
}
// Container that holds both panels and switches between stacked / side-by-side.
var previewContainer = $("<div id='wiktku-preview-container'></div>");
previewContainer.append(previewPanel);
if (!isMobile) previewContainer.append(livePreviewPanel);
var previewTimer = null;
var livePreviewIntervalId = -1;
var livePreviewActive = false; // guards in-flight fetches after uncheck
/** Rebuilds wikitext preview if its checkbox is checked. */
function schedulePreview() {
if (!previewCheck.prop("checked")) return;
clearTimeout(previewTimer);
// Debounce: wait 400 ms after the last keystroke before rebuilding.
previewTimer = setTimeout(function () {
getWikitext(function (wikitext) {
previewPanel.text(wikitext).show();
updatePanelLayout();
});
}, 400);
}
/** Fetches parsed HTML and populates the live preview panel. */
function loadLivePreview() {
getWikitext(function (wikitext) {
new mw.Api().parse(wikitext, { title: mw.config.get("wgPageName") }).done(function (html) {
// Discard result if the user unchecked while the fetch was in flight.
if (!livePreviewActive) return;
livePreviewPanel.html(html).show();
updatePanelLayout();
});
});
}
/** Adjusts panel widths depending on which previews are visible. */
function updatePanelLayout() {
var wikitextVisible = previewCheck.prop("checked");
var liveVisible = livePreviewCheck && livePreviewCheck.prop("checked");
if (wikitextVisible && liveVisible) {
// Side by side — each panel takes roughly half the available width.
previewPanel.css({ "flex": "1 1 45%", "min-width": "280px" });
livePreviewPanel.css({ "flex": "1 1 45%", "min-width": "280px" });
} else {
// Full width for whichever is visible — only touch panels that are
// actually shown so that setting flex doesn't override display:none.
if (wikitextVisible) previewPanel.css({ "flex": "1 1 100%", "min-width": "" });
if (liveVisible && livePreviewPanel) livePreviewPanel.css({ "flex": "1 1 100%", "min-width": "" });
}
}
previewCheck.on("change", function () {
if ($(this).prop("checked")) {
schedulePreview();
} else {
clearTimeout(previewTimer);
previewPanel.hide();
updatePanelLayout();
}
});
if (!isMobile) {
livePreviewCheck.on("change", function () {
if ($(this).prop("checked")) {
livePreviewActive = true;
livePreviewPanel.show();
loadLivePreview();
livePreviewIntervalId = setInterval(loadLivePreview, 500);
} else {
livePreviewActive = false;
clearInterval(livePreviewIntervalId);
livePreviewIntervalId = -1;
livePreviewPanel.hide().empty();
updatePanelLayout();
}
});
}
// Listen on all input/change events on the form and update both previews.
startForm.on("input change", function () {
schedulePreview();
});
footer.append($("<span style='margin-left:1em'></span>")
.append(previewCheck).append(previewLabel));
if (!isMobile) {
var livePreviewLabel = $("<label for='wiktku-live-preview-toggle'></label>")
.text(" Pêşdîtina zindî");
footer.append($("<span style='margin-left:1em'></span>")
.append(livePreviewCheck).append(livePreviewLabel));
}
startForm.append(footer);
$("#editform").hide().before(startForm);
// Insert preview container (holds both panels) after the form.
startForm.after(previewContainer);
// One pass over the whole form: every select that hasn't already been
// initialised, and isn't opted out with .wiktku-plain-select, gets
// the searchable picker.
initSelects(startForm);
refresh();
// Give every draggable textarea a custom resize grip (works
// consistently on Safari/iOS, unlike the native corner grip — see
// the "Manual drag-to-resize handle" comment in styles.css), and
// keep applying it to textareas added later on (new sense blocks,
// quote-source fields, nimûne rows, …).
wiktkuInitManualResize(startForm);
new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
$(mutation.addedNodes).each(function () {
if (this.nodeType !== 1) return;
wiktkuInitManualResize(this);
});
});
}).observe(startForm[0], { childList: true, subtree: true });
// Zimanan ji MediaWiki:Gadget-translation_editor.js/ziman.json bar bike.
// Kodên ku bi "-pro" diqedin û navên ku "zimanê destan" tê de heye
// tên derxistin.
// Pinned choices come from MediaWiki:Gadget-start.js/data.json (langChoices),
// already loaded into steps.lang.choices before build() runs.
var pinnedChoices = steps.lang.choices.slice();
var pinnedCodes = $.map(pinnedChoices, function (choice) { return choice.code; });
zimanJsonPromise.then(function (data) {
var page = data.query.pages[0];
var content = page &&
page.revisions &&
page.revisions[0].slots.main.content;
var zimanData;
try { zimanData = JSON.parse(content); } catch (e) { zimanData = {}; }
var extraChoices = [];
$.each(zimanData, function (code, name) {
// Filter: skip proto-language codes and reconstructed langs.
if (/-pro$/i.test(code)) return;
if (/ziman[eê]\s+destan/i.test(name)) return;
// Skip codes already in the pinned list (they are handled above).
if (pinnedCodes.indexOf(code) !== -1) return;
var choice = { code: code, label: name, sortKey: name };
extraChoices.push(choice);
langsByCode[code] = choice;
});
// Populate langsByCode for pinned choices too.
$.each(pinnedChoices, function (i, choice) {
// Ensure pinned choices have a sortKey.
if (choice.sortKey === undefined) choice.sortKey = choice.label;
langsByCode[choice.code] = choice;
});
// Sort the extra choices alphabetically by sort key.
extraChoices.sort(function (a, b) {
return a.sortKey.localeCompare(b.sortKey, userLang);
});
// Final list: pinned first, then the rest.
var allChoices = pinnedChoices.concat(extraChoices);
steps.lang.choices = allChoices;
steps.trans.keys = allChoices;
steps.dunde.keys = allChoices;
steps.zarava.keys = getZaravaKeys(allChoices);
// Replacing the option list only needs a wiktku:refresh so each
// picker re-reads its <option>s.
var langMenu = $("#wiktku-start-lang-field");
populateMenus(langMenu, steps.lang.choices);
langMenu.trigger("wiktku:refresh");
var transMenus = $("#wiktku-start-trans .wiktku-start-step-keyfield");
populateMenus(transMenus, steps.trans.keys, getDisabledKeys(steps.trans));
transMenus.trigger("wiktku:refresh");
var dundeMenus = $("#wiktku-start-dunde .wiktku-start-step-keyfield");
populateMenus(dundeMenus, steps.dunde.keys, getDisabledKeys(steps.dunde));
dundeMenus.trigger("wiktku:refresh");
var zaravaMenus = $("#wiktku-start-zarava .wiktku-start-step-keyfield");
populateMenus(zaravaMenus, steps.zarava.keys, getDisabledKeys(steps.zarava));
zaravaMenus.trigger("wiktku:refresh");
// Now that the full language list is loaded, silently restore any
// draft the editor previously saved for this page
var cachedDraft = formCache.Get();
if (cachedDraft && cachedDraft.sections && cachedDraft.sections.length) {
restoreFromCache(cachedDraft);
}
});
}
mw.loader.using(["oojs-ui-core"], function () {
// Load metadata, langChoices, posChoices and tplDefs from the companion
// data page so they can be updated without touching this script.
// (Request was already fired via metaApiPromise above, in parallel
// with this module load — we're just picking up the result here.)
metaApiPromise.then(function (data) {
var page = data.query.pages[0];
var content = page &&
page.revisions &&
page.revisions[0].slots.main.content;
var d;
try { d = JSON.parse(content); } catch (e) { d = {}; }
// Populate metadata.
if (d.metadata) $.extend(metadata, d.metadata);
// Populate gender labels.
if (d.genderLabels) $.extend(GENDER_BASE_LABELS, d.genderLabels);
// Populate lang choices (pinned list used by build() → ziman.json loader).
// data.json stores these as a plain {code: label} object.
if (d.langChoices) steps.lang.choices = choicesFromObject(d.langChoices, true);
// Populate POS choices — also a plain {code: label} object in data.json.
if (d.posChoices) steps.pos.choices = choicesFromObject(d.posChoices, false);
// Populate template definitions for the dfn sense-block builder.
if (d.tplDefs) steps.dfn.tplDefs = d.tplDefs;
// Populate pos placeholder examples.
if (d.posExamples) steps.dfn.posExamples = d.posExamples;
// Populate citation template definitions for the quote widget.
if (d.jederDefs) steps.dfn.jederDefs = d.jederDefs;
// Populate pronunciation and etymology template insert lists.
if (d.pronTpls) {
steps.pron.pronTpls = d.pronTpls;
steps.pron.refreshTplSelect();
}
if (d.etymTpls) {
steps.etym.etymTpls = d.etymTpls;
steps.etym.refreshTplSelect();
}
// Sync trans/dunde/zarava keys with the (now populated) lang choices.
steps.trans.keys = steps.lang.choices;
steps.dunde.keys = steps.lang.choices;
steps.zarava.keys = getZaravaKeys(steps.lang.choices);
}).always(build);
});
});
//</nowiki>
dzj9n7s1bnvodvfcna7aczxsvgqjbdn
6292077
6292075
2026-07-29T20:30:09Z
Wikihez
7344
6292077
javascript
text/javascript
// Li ser [[vi:MediaWiki:Gadget-start.js]] hatiye refaktorkirin.
// implicit dependencies: StorageUtils (ObjectStorage)
//<nowiki>
$(function () {
if (window.location.href.includes("editintro=User:Wikihez/creation/intro")) {
return; // Do not run the script wextê WF:Bilez dişuxile
}
var ns = mw.config.get("wgNamespaceNumber");
if (ns &&
!(ns === 2 && mw.config.get("wgPageName").match(/\/ceribandin$|\/test$/))) {
return;
}
var action = mw.config.get("wgAction");
var pageExists = !!mw.config.get("wgArticleId");
var addLangMode = pageExists && mw.util.getParamValue("wiktkuaddlang") === "1";
if (action === "view" && pageExists) {
var targetContainer;
var skin = mw.config.get('skin');
if (skin === 'vector-2022') {
targetContainer = 'p-cactions';
} else if (skin === 'vector') {
targetContainer = 'p-tb';
} else {
targetContainer = 'p-views';
}
mw.util.addPortletLink(targetContainer,
mw.util.getUrl(mw.config.get("wgPageName"), { action: "submit", wiktkuaddlang: "1" }),
"+Ziman/beşeke din", "ca-wiktku-addlang",
"Ji vê rûpelê re ziman an jî beşeke nû zêde bike");
return;
}
if (!(action === "edit" || action === "submit")) {
return;
}
if (!addLangMode && !$(".mw-newarticletext, .mw-newarticletextanon").length) {
return;
}
mw.notify(
"Amûr dest pê dike, hinek bisekinin.\nNot: jkx Sentaks (Syntax highlighting) neaktîv bikin",
{ type: "info", tag: "wiktku-start-notice", autoHide: true, autoHideSeconds: 10 }
);
var dataJsonPromise;
var metaApiPromise = mw.loader.using("mediawiki.api").then(function () {
var metaApi = new mw.Api();
dataJsonPromise = metaApi.get({
action: "query",
prop: "revisions",
titles: "MediaWiki:Gadget-start.js/data.json",
rvprop: "content",
rvslots: "main",
formatversion: 2
});
return dataJsonPromise;
});
function capitalize(str) {
if (!str) return str;
return str[0].toUpperCase() + str.substr(1);
}
function decapitalize(str) {
if (!str) return str;
return str[0].toLowerCase() + str.substr(1);
}
function escapeRegExp(str) {
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
function langHeaderSource(codePattern) {
return "\n?==\\s*\\{\\{\\s*ziman\\s*\\|\\s*(" + codePattern + ")\\s*\\}\\}\\s*==";
}
function findLangHeader(text, code) {
var m = new RegExp(langHeaderSource(escapeRegExp(code))).exec(text);
return m ? { index: m.index, match: m[0] } : null;
}
function stripWikilinks(str) {
return str.replace(/\[\[([^\]|]+)(?:\|([^\]]+))?\]\]/g, function (m, target, display) {
return display || target;
});
}
function splitTercimeIzah(mane) {
var m = /^([\s\S]*?)\s*\{\{îzah\|([\s\S]*)\}\}\s*$/.exec(mane || "");
return m ? { tercime: m[1], izah: m[2] } : null;
}
function insertAtCursor(el, text) {
var start = el.selectionStart;
var end = el.selectionEnd;
var val = el.value;
el.value = val.slice(0, start) + text + val.slice(end);
var pos = start + text.length;
el.selectionStart = el.selectionEnd = pos;
}
var catSrcTemplates = null;
var catSrcTemplatesPromise = null;
function fetchCatSrcTemplates() {
if (catSrcTemplatesPromise) return catSrcTemplatesPromise;
catSrcTemplatesPromise = new mw.Api().get({
action: "query",
list: "categorymembers",
cmtitle: "Kategorî:Çavkanî",
cmnamespace: 10,
cmlimit: "max",
formatversion: 2
}).then(function (data) {
var members = (data.query && data.query.categorymembers) || [];
catSrcTemplates = $.map(members, function (m) {
// Pêşgira navî ya "Şablon:" rake.
return m.title.replace(/^[^:]+:/, "");
});
catSrcTemplates.sort(function (a, b) { return a.localeCompare(b, userLang); });
return catSrcTemplates;
}, function () {
catSrcTemplates = [];
return catSrcTemplates;
});
return catSrcTemplatesPromise;
}
var pageName = mw.config.get("wgPageName").replaceAll(/_/g, " ");
if (ns) pageName = pageName.replace(/.*\//, "");
var pageNameRe = escapeRegExp(pageName);
var userLang = mw.config.get("wgUserLanguage");
var formCache = new ObjectStorage("wiktku_start_draft_" + mw.config.get("wgPageName"), 1);
var isMobile = !!mw.config.get("wgMFMode") || window.matchMedia("(pointer: coarse)").matches;
var FOLD_EXTRA = {
"ı": "i", // dotless i
"ø": "o", // o with stroke
"đ": "d", // d with stroke
"ð": "d", // eth
"ə": "e", // schwa
"ħ": "h", // h with stroke
"ł": "l", // l with stroke
"ŋ": "n", // eng
"ʉ": "u", // u bar
"ɨ": "i", // i bar
"ʒ": "z", // ezh
"ɛ": "e", // open e
"ɔ": "o", // open o
"æ": "ae",
"œ": "oe",
"ß": "ss",
"þ": "th" };
function foldDiacritics(str) {
if (str === null || str === undefined) return "";
var s = String(str).toLowerCase();
if (typeof s.normalize === "function") {
// Split "î" into "i" + combining circumflex, then drop the accent.
s = s.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
}
return s.replace(/[^\u0000-\u007f]/g, function (ch) {
return Object.prototype.hasOwnProperty.call(FOLD_EXTRA, ch) ? FOLD_EXTRA[ch] : ch;
});
}
var WIKTKU_RESIZE_STORAGE_PREFIX = "wiktku_resize_height_";
/** Textareas of the same "kind" (e.g. every Nimûne box, every Tercime
* box) share a class list even though each individual box is a fresh
* DOM node built on the fly (new sense blocks, quote fields, …) with
* no stable id of its own. That class list is what we key the cached
* height on, so a size chosen for one Nimûne box is reused for every
* Nimûne box, on this page and on the next one. */
function wiktkuResizeStorageKey(textarea) {
var cls = (textarea.attr("class") || "").trim().replace(/\s+/g, "_");
return WIKTKU_RESIZE_STORAGE_PREFIX + cls;
}
function wiktkuSaveResizeHeight(textarea, height) {
if (!(window.mw && mw.storage)) return;
try {
mw.storage.set(wiktkuResizeStorageKey(textarea), String(Math.round(height)));
} catch (e) { /* localStorage unavailable (private mode, quota, …) — skip caching */ }
}
function wiktkuLoadResizeHeight(textarea) {
if (!(window.mw && mw.storage)) return null;
try {
var v = mw.storage.get(wiktkuResizeStorageKey(textarea));
return v ? parseFloat(v) : null;
} catch (e) {
return null;
}
}
/** Replaces a textarea's native corner resize grip with a small custom
* drag handle (see the "Manual drag-to-resize handle" comment and
* .wiktku-resize-wrap / .wiktku-resize-grip in styles.css). Needed
* because iOS Safari never implements the native grip at all and
* desktop Safari's own version is inconsistent, so we replace it
* everywhere for uniform behaviour. One-line fields (.wiktku-start-narrow)
* are meant to stay a fixed height and are left untouched. Safe to call
* more than once on the same textarea. */
function wiktkuMakeManualResizable(textarea) {
textarea = $(textarea);
if (!textarea.is("textarea") || textarea.hasClass("wiktku-start-narrow")) return;
if (textarea.data("wiktkuResizableDone")) return;
textarea.data("wiktkuResizableDone", true);
textarea.wrap("<div class='wiktku-resize-wrap'></div>");
var grip = $("<div class='wiktku-resize-grip'></div>");
textarea.after(grip);
// Restore a previously chosen height for this kind of field, if any.
var cachedHeight = wiktkuLoadResizeHeight(textarea);
if (cachedHeight) {
var minHeightInit = parseFloat(textarea.css("min-height")) || 0;
textarea.css("height", Math.max(cachedHeight, minHeightInit) + "px");
}
var dragging = false, startY = 0, startHeight = 0;
function onPointerMove(e) {
if (!dragging) return;
var oe = e.originalEvent || e;
var minHeight = parseFloat(textarea.css("min-height")) || 0;
var newHeight = startHeight + (oe.clientY - startY);
textarea.css("height", Math.max(newHeight, minHeight) + "px");
}
function onPointerUp(e) {
if (!dragging) return;
dragging = false;
var oe = e.originalEvent || e;
try { grip[0].releasePointerCapture(oe.pointerId); } catch (err) { /* ignore */ }
$(document).off("pointermove", onPointerMove);
$(document).off("pointerup pointercancel", onPointerUp);
wiktkuSaveResizeHeight(textarea, textarea.outerHeight());
}
grip.on("pointerdown", function (e) {
var oe = e.originalEvent || e;
if (oe.button !== undefined && oe.button !== 0) return; // primary contact only
e.preventDefault();
dragging = true;
startY = oe.clientY;
startHeight = textarea.outerHeight();
try { grip[0].setPointerCapture(oe.pointerId); } catch (err) { /* ignore */ }
$(document).on("pointermove", onPointerMove);
$(document).on("pointerup pointercancel", onPointerUp);
});
}
/** Applies wiktkuMakeManualResizable to every eligible textarea already
* inside `context` (context itself, if it is a textarea, or any of its
* descendants). Used both for the initial form render and, via the
* MutationObserver set up in build(), for textareas added later on
* (new sense blocks, quote-source fields, nimûne rows, …). */
function wiktkuInitManualResize(context) {
var $context = $(context);
var $textareas = $context.is("textarea") ? $context : $context.find("textarea");
$textareas.each(function () {
wiktkuMakeManualResizable(this);
});
}
function wrapNativeSelect(select) {
var wrapper = $("<span class='wiktku-native-select-wrap'></span>");
if (select.prop("multiple")) {
return wrapper.append(select);
}
var placeholder = select.attr("data-placeholder") || "Lê bigere...";
select.hide();
var textInput = $("<input type='search' autocomplete='off'>")
.attr("placeholder", placeholder)
.attr("role", "combobox")
.attr("aria-autocomplete", "list")
.attr("aria-expanded", "false")
.addClass("wiktku-start-narrow wiktku-ac-input");
var resultsList = $("<ul class='wiktku-ac-results' role='listbox'></ul>").hide();
var allOptions = [];
var shown = [];
var activeIndex = -1;
function cacheOptions() {
allOptions = [];
select.find("option").each(function () {
var v = $(this).val();
var text = $(this).text();
// A blank value with no label (most selects' placeholder) is
// never a real choice, so skip it. But a blank value WITH a
// label -- e.g. tplSelect's "— yan jî şablonek hilbijêre —" --
// is a meaningful "clear the selection" choice, so keep it
// searchable/selectable like any other option.
if (!v && !text) return;
// Language options read "Name (code)" -- score the name on its own
// so the trailing code doesn't also count as a name match.
var name = text.replace(/\s*\([^()]*\)\s*$/, "");
allOptions.push({
value: v,
text: text,
disabled: $(this).prop("disabled"),
foldCode: foldDiacritics(v),
foldName: foldDiacritics(name),
foldText: foldDiacritics(text)
});
});
}
cacheOptions();
// True if `q` starts a word inside `name` ("kevn" in "ingiliziya kevn").
function startsWord(name, q) {
var from = 0, at;
while ((at = name.indexOf(q, from)) !== -1) {
if (at === 0 || /[\s\-\u2013\u2014(/,.]/.test(name.charAt(at - 1))) return true;
from = at + 1;
}
return false;
}
// Lower rank = better match.
// a code that *is* the query, or begins with it, always outranks a name
// that merely contains it -- so "ang" lists "Îngilîziya kevn (ang)"
// first instead of burying it among every name containing "ang".
var RANK_NONE = 99;
function rankOption(o, q) {
var code = o.foldCode, name = o.foldName;
if (code === q) return 0; // exact code
if (code.indexOf(q) === 0) return 1; // code prefix
if (name === q) return 2; // exact name
if (name.indexOf(q) === 0) return 3; // name prefix
if (startsWord(name, q)) return 4; // starts a word in the name
if (name.indexOf(q) !== -1) return 5; // name substring
if (code.indexOf(q) !== -1) return 6; // code substring
if (o.foldText.indexOf(q) !== -1) return 7; // anywhere else in the label
return RANK_NONE;
}
function positionList() {
// Position the list above or below depending on viewport space.
var inputRect = textInput[0].getBoundingClientRect();
var viewportH = window.innerHeight;
var spaceBelow = viewportH - inputRect.bottom - 8;
var spaceAbove = inputRect.top - 8;
var maxH = Math.min(224, Math.max(spaceBelow, spaceAbove)); // 224px = 14em
resultsList.css({
"max-height": maxH + "px",
"top": spaceBelow >= spaceAbove ? "100%" : "auto",
"bottom": spaceBelow >= spaceAbove ? "auto" : "100%"
});
}
function closeList() {
resultsList.hide();
textInput.attr("aria-expanded", "false");
activeIndex = -1;
}
function showResults(query) {
var q = foldDiacritics($.trim(query || ""));
resultsList.empty();
activeIndex = -1;
var matched = [];
if (q) {
$.each(allOptions, function (i, o) {
if (o.disabled) return;
var rank = rankOption(o, q);
if (rank !== RANK_NONE) matched.push({ opt: o, rank: rank, i: i });
});
if (!matched.length && q.indexOf(" ") !== -1) {
var tokens = q.split(/\s+/);
$.each(allOptions, function (i, o) {
if (o.disabled) return;
var all = true;
$.each(tokens, function (_, t) {
if (o.foldText.indexOf(t) === -1) { all = false; return false; }
});
if (all) matched.push({ opt: o, rank: 8, i: i });
});
}
matched.sort(function (a, b) {
if (a.rank !== b.rank) return a.rank - b.rank;
// Inside the code tiers the shorter code is the better hit:
// "an" -> "an" before "ang" before "ang-x-...".
if (a.rank <= 1 && a.opt.foldCode.length !== b.opt.foldCode.length) {
return a.opt.foldCode.length - b.opt.foldCode.length;
}
// Otherwise keep the menu's own order (pinned languages first).
return a.i - b.i;
});
} else {
$.each(allOptions, function (i, o) {
if (!o.disabled) matched.push({ opt: o, rank: 0, i: i });
});
}
shown = $.map(matched.slice(0, 50), function (m) { return m.opt; });
if (!shown.length) {
closeList();
return;
}
$.each(shown, function (idx, opt) {
var li = $("<li role='option'></li>")
.text(opt.text)
.attr("data-value", opt.value)
.attr("aria-selected", "false");
// touchend (not touchstart) so a scroll doesn't trigger a select.
var touchMoved = false;
li.on("touchstart", function () {
touchMoved = false;
});
li.on("touchmove", function () {
touchMoved = true;
});
li.on("touchend", function (e) {
if (touchMoved) return; // was a scroll, not a tap
e.preventDefault();
selectOption(opt.value, opt.text);
});
// mousedown (not click) so it beats the input's blur handler.
li.on("mousedown", function (e) {
e.preventDefault();
selectOption(opt.value, opt.text);
});
li.on("mouseenter", function () {
// Hovered items are already in view -- don't scroll the list
// under the mouse, or the shift can trigger the next item's
// mouseenter and cascade into a runaway scroll.
setActive(idx, /* scrollIntoView */ false);
});
resultsList.append(li);
});
positionList();
resultsList.show();
resultsList[0].scrollTop = 0;
textInput.attr("aria-expanded", "true");
}
function setActive(idx, scrollIntoView) {
var items = resultsList.children("li");
if (!items.length) return;
if (idx < 0) idx = items.length - 1;
if (idx >= items.length) idx = 0;
activeIndex = idx;
items.removeClass("wiktku-ac-active").attr("aria-selected", "false");
var li = items.eq(idx).addClass("wiktku-ac-active").attr("aria-selected", "true");
if (scrollIntoView === false) return;
// Keep the cursor visible inside the scrollable list -- only for
// keyboard navigation. A mouse-hovered item is already visible, so
// scrolling here would shift the list under a stationary pointer
// and cascade into further mouseenter events.
var ul = resultsList[0], el = li[0];
if (el.offsetTop < ul.scrollTop) {
ul.scrollTop = el.offsetTop;
} else if (el.offsetTop + el.offsetHeight > ul.scrollTop + ul.clientHeight) {
ul.scrollTop = el.offsetTop + el.offsetHeight - ul.clientHeight;
}
}
/** Puts the currently selected option's label back in the text box. */
function syncInputToSelect() {
var cur = select.val();
var match = null;
if (cur) {
$.each(allOptions, function (_, o) {
if (o.value === cur) { match = o; return false; }
});
}
textInput.val(match ? match.text : "");
}
function selectOption(value, text) {
textInput.val(text);
select.val(value);
closeList();
select.trigger("change");
}
textInput.on("input", function () {
showResults($(this).val());
});
textInput.on("focus", function () {
// Select the current label so typing replaces it, and open the full list
this.select();
showResults("");
});
textInput.on("click", function () {
if (!resultsList.is(":visible")) showResults($(this).val());
});
textInput.on("keydown", function (e) {
var open = resultsList.is(":visible");
switch (e.which) {
case 40: // Down
e.preventDefault();
if (!open) { showResults($(this).val()); setActive(0); }
else setActive(activeIndex + 1);
break;
case 38: // Up
e.preventDefault();
if (!open) { showResults($(this).val()); setActive(-1); }
else setActive(activeIndex - 1);
break;
case 13: // Enter -- must never submit the form while the list is open
if (open) {
e.preventDefault();
if (activeIndex >= 0 && shown[activeIndex]) {
selectOption(shown[activeIndex].value, shown[activeIndex].text);
} else if (shown.length === 1) {
selectOption(shown[0].value, shown[0].text);
}
}
break;
case 27: // Esc -- abandon the search, restore the real value
if (open) {
e.preventDefault();
closeList();
syncInputToSelect();
}
break;
case 9: // Tab -- commit the highlighted row on the way out
if (open && activeIndex >= 0 && shown[activeIndex]) {
selectOption(shown[activeIndex].value, shown[activeIndex].text);
}
closeList();
break;
}
});
textInput.on("blur", function () {
// Short delay so a touchstart/mousedown on a result fires first.
setTimeout(function () {
closeList();
// Half-typed text that never became a selection would otherwise sit
// in the box looking like a choice -- put the real value back.
syncInputToSelect();
}, 200);
});
// Re-caches the option list. Fired after the full language list loads, after
// options are enabled/disabled, and after programmatic .val() changes.
select.on("wiktku:refresh", function () {
cacheOptions();
syncInputToSelect();
if (resultsList.is(":visible")) showResults(textInput.val());
});
wrapper.append(textInput).append(resultsList).append(select);
return wrapper;
}
/**
* Gives every plain <select> under `root` the searchable picker. Selects
* marked .wiktku-plain-select opt out, and the call is idempotent, so it is
* safe to re-run after new rows or sense blocks are inserted.
*/
function initSelects(root) {
$(root).find("select").addBack("select").not(".wiktku-plain-select").each(function () {
var sel = $(this);
if (sel.prop("multiple")) return;
if (sel.closest(".wiktku-native-select-wrap").length) return; // already wrapped
var marker = $("<span></span>").insertBefore(sel);
marker.replaceWith(wrapNativeSelect(sel));
});
}
var langsByCode = {};
// Populated from [[MediaWiki:Gadget-start.js/data.json]] at runtime.
var metadata = {};
var ZARAVA_LANG_CODES = ["ckb", "sdh", "lki", "hac", "zza"];
// Converts a {code: label} object (langChoices/posChoices in data.json)
// into the {code, label[, sortKey]} array the rest of the script uses.
// isLang: true adds a sortKey and shows "(code)" after the label —
// language choices only.
function choicesFromObject(obj, isLang) {
var result = [];
$.each(obj || {}, function (code, label) {
var choice = { code: code, label: label };
if (isLang) choice.sortKey = label;
result.push(choice);
});
return result;
}
function getZaravaKeys(choices) {
var byCode = {};
$.each(choices || [], function (_, c) { byCode[c.code] = c; });
var result = [];
$.each(ZARAVA_LANG_CODES, function (_, code) {
if (byCode[code]) result.push(byCode[code]);
});
return result;
}
function needsTransliteration(langCode) {
var meta = metadata[langCode];
if (!meta || !meta.sc) return false;
var scripts = Array.isArray(meta.sc) ? meta.sc : [meta.sc];
return scripts.length > 0 && scripts[0] !== "Latn";
}
// Kodên cinsiyetê yên di metadata.g de — ji data.json tê dagirtin
var GENDER_BASE_LABELS = {};
// Sub-lists that only make sense for a plain (non-şablon) sense — hidden
// when a şablon (e.g. {{guharto|…}}) is chosen for that sense
var HIDDEN_ON_TPL_GROUPS = [
"wiktku-dfn-alternativ",
"wiktku-dfn-hevmane",
"wiktku-dfn-dijmane",
"wiktku-dfn-koordine",
"wiktku-dfn-jornav",
"wiktku-dfn-jernav"
];
function genderLabel(code) {
if (code === "p") return "Pirjimar";
var pluralMatch = code.match(/^(.+)-p$/);
if (pluralMatch && GENDER_BASE_LABELS[pluralMatch[1]]) {
return GENDER_BASE_LABELS[pluralMatch[1]] + " (pirjimar)";
}
return GENDER_BASE_LABELS[code] || code;
}
// True if a sense has content beyond mane worth keeping (etîket, word
// lists, nimûne, jêder) — so it's still emitted with {{mane?}} if empty.
function senseHasExtraContent(s) {
if (s.etiket && $.grep(s.etiket, function (e) { return $.trim(e) !== ""; }).length) return true;
if (s.kategori && $.grep(s.kategori, function (k) { return $.trim(k) !== ""; }).length) return true;
if (s.alternativ.length || s.hevmane.length || s.dijmane.length ||
s.koordine.length || s.jornav.length || s.jernav.length) return true;
if (s.nimune && $.grep(s.nimune, function (n) {
return (typeof n === "object" ? n.text : n) !== "";
}).length > 0) return true;
if (senseHasJeder(s)) return true;
return false;
}
// Bolds the *first* occurrence of the page name (plus any letters
// glued directly onto it, e.g. a plural "s") inside nimûne/jêgirtin
// text — "apple"/"Apple"/"apples"/"Apples" all match (case-insensitive),
// but only the first hit is wrapped, not every one in the text.
function boldPageNameOnce(text) {
if (!text || !pageNameRe) return text;
var re = new RegExp("(" + pageNameRe + "([^( |,|;|\\?|\\.|\\!)]+)?)", "i");
return text.replace(re, "'''$1'''");
}
// Converts literal line breaks typed into a nimûne/jêgirtin box into
// wikitext <br> tags, so a pasted/typed newline doesn't break the
// surrounding "#:"/"#*" wikitext list syntax on output.
function nlToBr(text) {
return text ? text.replace(/\r\n|\r|\n/g, "<br>") : text;
}
function escapeHtmlForBackdrop(str) {
return String(str)
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">");
}
// Mirrors a textarea's text, with a small highlighted marker placed
// right after each line that's followed by an actual typed/pasted
// linebreak. Rendered into a transparent backdrop layer behind the
// textarea (see ensureLinebreakBackdrop()), so only the point of the
// break is marked instead of the whole box.
function buildLinebreakBackdropHtml(text) {
var lines = text.split(/\r\n|\r|\n/);
return $.map(lines, function (line, i) {
var isLast = i === lines.length - 1;
return escapeHtmlForBackdrop(line) +
(isLast ? "" : "<mark class='wiktku-linebreak-mark'>↵</mark>\n");
}).join("");
}
// Copies the metrics that affect where text wraps/lands (font, line
// height, padding, border) from the real textarea onto its backdrop,
// via computed style rather than shared CSS classes — most of the
// box's own rules are written as "textarea.foo", which a <div> with
// the same class wouldn't match. Re-run on every update in case a
// responsive breakpoint changed the textarea's own font-size.
function syncLinebreakBackdropMetrics(textarea, backdrop) {
var cs = window.getComputedStyle(textarea[0]);
backdrop.css({
"box-sizing": cs.boxSizing,
"padding-top": cs.paddingTop,
"padding-right": cs.paddingRight,
"padding-bottom": cs.paddingBottom,
"padding-left": cs.paddingLeft,
"border-width": cs.borderWidth,
"border-style": "solid",
"font-family": cs.fontFamily,
"font-size": cs.fontSize,
"font-weight": cs.fontWeight,
"line-height": cs.lineHeight,
"letter-spacing": cs.letterSpacing
});
}
// Lazily wraps a textarea in its own positioning anchor (independent
// of .wiktku-resize-wrap, so this doesn't depend on load order versus
// wiktkuMakeManualResizable) and inserts the transparent backdrop
// layer used to mark the exact point of a linebreak. Safe to call
// more than once on the same textarea — the backdrop is cached.
function ensureLinebreakBackdrop(textarea) {
var existing = textarea.data("wiktkuLinebreakBackdrop");
if (existing) return existing;
textarea.wrap("<div class='wiktku-linebreak-wrap'></div>");
var backdrop = $("<div aria-hidden='true'></div>").addClass("wiktku-linebreak-backdrop");
textarea.before(backdrop);
textarea.data("wiktkuLinebreakBackdrop", backdrop);
textarea.on("scroll.wiktkuLinebreak", function () {
backdrop.scrollTop(textarea.scrollTop()).scrollLeft(textarea.scrollLeft());
});
return backdrop;
}
// Flags a nimûne/jêgirtin textarea (via CSS class, for the border
// tint + tooltip) while it contains a typed/pasted linebreak, so the
// user notices before it's silently turned into <br> on output.
// Marks only the exact point of the break via a mirrored backdrop,
// rather than tinting the whole box.
function highlightLinebreak(el) {
var textarea = $(el);
var text = textarea.val();
var hasBreak = /\r|\n/.test(text);
textarea
.toggleClass("wiktku-has-linebreak", hasBreak)
.attr("title", hasBreak ? "Xeta nû dê wek <br> bê nivîsandin" : "");
if (!hasBreak) {
var cached = textarea.data("wiktkuLinebreakBackdrop");
if (cached) cached.hide();
textarea.removeClass("wiktku-has-linebreak-source");
return;
}
var backdrop = ensureLinebreakBackdrop(textarea);
textarea.addClass("wiktku-has-linebreak-source");
syncLinebreakBackdropMetrics(textarea, backdrop);
backdrop.html(buildLinebreakBackdropHtml(text)).show();
backdrop.scrollTop(textarea.scrollTop()).scrollLeft(textarea.scrollLeft());
}
// Each nimûne item can be { text, tr, t }: text, transliteration, translation.
function formatNimune(nimunes, lang, hasJeder) {
var hasNimune = nimunes && $.grep(nimunes, function (n) {
return (typeof n === "object" ? n.text : n) !== "";
}).length > 0;
if (!hasNimune) {
return hasJeder ? "" : "\n#* {{nimûne?|" + lang + "}}";
}
return $.map(nimunes, function (n) {
var text = typeof n === "object" ? n.text : n;
if (!text) return undefined;
var bolded = nlToBr(boldPageNameOnce(text));
var tpl = "\n#: {{nm|" + lang + "|" + bolded;
if (typeof n === "object") {
if (n.tr) tpl += "|tr=" + nlToBr(n.tr);
// Translation as third positional param (no key needed).
if (n.t) tpl += "|" + nlToBr(n.t);
}
// Short examples fit on one line together with their translation.
// rêz=1 is not used for ku — definitions are shown on separate lines there.
if (text.length < 60 && lang !== "ku") tpl += "|rêz=1";
tpl += "}}";
return tpl;
}).join("");
}
// Formats jêder (citation) entries into "#* {{jêder…|…}}" lines; skips
// entries with no quote text. Falls back to the generic {{jêder}}
// template when no specific template was chosen.
function formatJeder(jederList, lang) {
if (!jederList || !jederList.length) return "";
return $.map(jederList, function (jeder) {
if (!jeder || !jeder.quote) return undefined;
var quote = nlToBr(boldPageNameOnce(jeder.quote));
var quoteTr = nlToBr(jeder.quoteTr);
var quoteT = nlToBr(jeder.quoteT);
if (jeder.jederTpl) {
var cite = "\n#* {{" + jeder.jederTpl + "|" + lang;
cite += "|jêgirtin=" + quote;
if (quoteTr) cite += "|tr=" + quoteTr;
if (quoteT) cite += "|tercime=" + quoteT;
$.each(jeder.jêderFields || {}, function (key, val) {
if (val) cite += "|" + key + "=" + val;
});
cite += "}}";
return cite;
}
var out = "\n#* {{jêder|" + lang + "|jêgirtin=" + quote;
if (quoteTr) out += "|tr=" + quoteTr;
if (quoteT) out += "|tercime=" + quoteT;
// A şablon picked from Kategorî:Çavkanî is transcluded as the
// source param (e.g. |{{Kovara X}}); manual text is used as-is.
var srcParam = jeder.jederCatTpl ? ("{{" + jeder.jederCatTpl + "}}") :
(jeder.jederManual ? jeder.jederManual : "çavkanî?");
// A positional param containing "=" gets parsed as its own key=value
// pair by MediaWiki and breaks the template, so force it to be
// explicitly named (|2=) whenever that's the case.
out += (srcParam.indexOf("=") !== -1 ? "|2=" : "|") + srcParam;
out += "}}";
return out;
}).join("");
}
// True if a sense has at least one jêder entry with quote text.
function senseHasJeder(sense) {
return !!(sense.jeder && $.grep(sense.jeder, function (j) {
return j && j.quote;
}).length > 0);
}
// Builds "{{tplName|lang|part1|part2|…}}" from a sense field (kategori,
// etiket), wrapped inline (" {{…}} ") or on its own line ("\n#: {{…}}").
function buildSenseTpl(sense, field, lang, tplName) {
if (!sense[field] || !sense[field].length) return "";
var parts = sense[field].map(function (p) { return $.trim(p); })
.filter(function (p) { return p !== ""; });
if (!parts.length) return "";
var call = "{{" + tplName + "|" + lang + "|" + parts.join("|") + "}}";
return call
}
/**
* Assembles the nimûne + jêder wikitext block for a sense. Shared by
* both the template-sense and normal-mane-sense branches below.
*/
function buildCite(sense, lang) {
return formatNimune(sense.nimune, lang, senseHasJeder(sense)) +
formatJeder(sense.jeder, lang);
}
function makeWordListStep(id, name, question_fmt) {
return {
id: id,
name: name,
question_fmt: question_fmt,
multiple: true,
narrow: true,
placeholder: "Kelîme…",
visible: function (values) {
return values.lang && values.pos;
},
output: function (values) {
var words = $.grep(values[id] || [], function (w) { return !!w; });
var header = capitalize(name);
if (!words.length) return "";
var lang = values.lang;
var section = "\n==== " + header + " ====\n";
var params = "cure=" + header + "\n" +
$.map(words, function (w) {
return "|" + w;
}).join("\n");
return section +
"{{kol3|" + lang + "|" + params + "\n}}\n";
} };
}
var steps = {
lang: {
id: "lang",
required: true,
name: "ziman",
question_fmt: '"' + pageName + '" bi çi zimanî ye?',
question_br: true,
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (langChoices).
choices: [],
output: function (values) {
if (addLangMode){
return "\n== {{ziman|" + values.lang + "}} ==\n";
}else {
return "== {{ziman|" + values.lang + "}} ==\n";
}
} },
pron: {
id: "pron",
name: "bilêvkirin",
question_fmt: '"' + pageName + '" çawa tê telafûzkirin?',
// pronTpls populated from data.json
pronTpls: {},
visible: function (values) {
if (!values.lang) return false;
// addLangMode: skip pron only if this lang already has a section.
if (addLangMode) {
// Clearing the page makes existing content irrelevant.
var clearPageCheck = $("#wiktku-clear-page-check");
if (clearPageCheck.length && clearPageCheck.prop("checked")) {
return true;
}
var existing = $("#wpTextbox1").val() || "";
return !findLangHeader(existing, values.lang);
}
return true;
},
// Fills the insert-dropdown from pronTpls, filtered by language.
refreshTplSelect: function () {
var sel = $("#wiktku-start-pron .wiktku-tpl-insert-select");
if (!sel.length) return;
var lang = getValues().lang || "";
sel.find("option[value!='']").remove();
$.each(steps.pron.pronTpls, function (name, tpl) {
// Filter: if tpl.langs exists, only show if lang is in that list; otherwise show always
var allowed = !tpl.langs || tpl.langs.indexOf(lang) !== -1;
if (allowed) {
sel.append($("<option></option>")
.val(tpl.snippet)
.text(name + " — " + tpl.desc)
.attr("data-nolang", tpl.noLang ? "1" : ""));
}
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-pron-wrap").length) return null;
var wrap = $("<div class='wiktku-pron-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-pron-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-pron-text")
.attr("rows", 4)
.attr("placeholder", "Nimûne: {{IPA|ku|/pɛɪ̯n/}} yan {{kîte|ku|he|ce|ki|rin}}");
// Template insert dropdown — filtered by language.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike ");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
var lang = getValues().lang || "";
$.each(steps.pron.pronTpls, function (name, tpl) {
// Filter: if tpl.langs exists, only show if lang is in that list; otherwise show always
var allowed = !tpl.langs || tpl.langs.indexOf(lang) !== -1;
if (allowed) {
sel.append($("<option></option>")
.val(tpl.snippet)
.text(name + " — " + tpl.desc)
.attr("data-nolang", tpl.noLang ? "1" : ""));
}
});
sel.on("change", function () {
var snippet = $(this).val();
if (!snippet) return;
var lang = getValues().lang || "";
// Check if the selected option has noLang flag
var selectedOption = sel.find("option:selected");
var hasNoLang = selectedOption.attr("data-nolang") === "1";
if (!hasNoLang) {
snippet = snippet.replace(/CODE/g, lang).replace(/SOURCELANG/g, "?");
}
insertAtCursor(ta[0], snippet);
$(this).val("");
// Clear the picker's search box
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel).append(ta);
stepDiv.append(wrap);
initSelects(wrap);
return ta;
},
output: function () {
var text = $.trim($("#wiktku-start-pron .wiktku-pron-text").val());
if (!text) return "";
var lines = text.split("\n");
var out = $.map(lines, function (line) {
line = $.trim(line);
if (!line) return undefined;
return line;
}).join("\n");
return "\n=== Bilêvkirin ===\n" + out + "\n";
} },
pos: {
id: "pos",
required: true,
name: "Cureyê rêzimanî",
question_fmt: 'Cureyê rêzimanî yê "' + pageName + '" çi ye?',
visible: function (values) {
return values.lang;
},
question_br: true,
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (posChoices).
choices: [],
output: function (values) {
var pos = values.pos || "";
var cinsiyet = values.cinsiyet || ""; // from the cinsiyet step
var lekTur = values.lektur || ""; // from the lêker transitivity step
var capitalizedPos = capitalize(pos);
var outputString = "\n=== " + capitalizedPos + " ===\n";
// Add ku-tewîn-nav for single-word navdêr/serenav with known gender.
if (!pageName.includes(" ") && cinsiyet && GENDER_BASE_LABELS[cinsiyet] &&
(pos === "navdêr" || pos === "serenav") && values.lang === "ku") {
outputString += "{{ku-tewîn-nav|" + pageName + "|" + GENDER_BASE_LABELS[cinsiyet];
if (pos === "serenav") outputString += "|y";
outputString += "}}\n";
}
outputString += "{{" + pos + "|" + values.lang;
if (pos === "navdêr" || pos === "serenav") {
if (cinsiyet) {
outputString += "|c=" + cinsiyet;
} else if (values.lang === "ku") {
outputString += "|c=?";
}
} else if (/^lêker/.test(pos) && lekTur) {
outputString += "|c=" + lekTur;
}
if (values.tr) {
outputString += "|tr=" + values.tr;
}
outputString += "}}\n";
return outputString;
}
},
// cinsiyet (gender) — shown for navdêr/serenav only, with choices built
// from metadata[lang].g since not every language has grammatical gender.
cinsiyet: {
id: "cinsiyet",
name: "cinsiyet",
question_fmt: 'Cinsiyeta "' + pageName + '" çi ye?',
question_br: true,
visible: function (values) {
var meta = metadata[values.lang];
return !!(values.lang && (values.pos === "navdêr" || values.pos === "serenav") &&
meta && meta.g && meta.g.length);
},
build: function (stepDiv, values) {
var select = stepDiv.find("select.wiktku-start-step-field");
if (!select.length) {
select = $(mw.html.element("select", {
"class": "wiktku-start-step-field wiktku-plain-select",
id: "wiktku-start-cinsiyet-field" }));
stepDiv.append(select);
}
if (!values) return select;
var meta = metadata[values.lang];
var codes = (meta && meta.g) || [];
var prevVal = select.val();
var choices = $.map(codes, function (code) {
return [{ code: code, label: genderLabel(code) }];
});
populateMenus(select, choices, null, "Cinsiyetê hilbijêre");
if ($.grep(choices, function (c) { return c.code === prevVal; }).length) {
select.val(prevVal);
}
return select;
},
output: function () { return ""; } // consumed by pos.output
},
// Lêker transitivity
lektur: {
id: "lektur",
name: "Cureyê lêkerê (fiîlê)",
question_fmt: "Cureyê lêkerê (fiîlê) çi ye?",
question_br: true,
visible: function (values) {
return values.lang && values.pos && /^lêker/.test(values.pos);
},
choices: [
{ code: "gh", label: "gerguhêz" },
{ code: "x-gh", label: "xwerû-gerguhêz" },
{ code: "p-gh", label: "pêkhatî-gerguhêz" },
{ code: "h-gh", label: "hevedudanî-gerguhêz" },
{ code: "b-gh", label: "biwêjî-gerguhêz" },
{ code: "ngh", label: "negerguhêz" },
{ code: "x-ngh", label: "xwerû-negerguhêz" },
{ code: "p-ngh", label: "pêkhatî-negerguhêz" },
{ code: "h-ngh", label: "hevedudanî-negerguhêz" },
{ code: "b-ngh", label: "biwêjî-negerguhêz" } ],
output: function () { return ""; } // consumed by pos.output
},
tr: {
id: "tr",
name: "transliterasyon",
question_fmt: "Transliterasyona vê kelîmeyê",
multiple: false,
narrow: true,
visible: function (values) {
return values.lang && values.pos && needsTransliteration(values.lang);
} },
dfn: {
id: "dfn",
name: "Mane",
question_fmt: function (values) {
var base = "Maneya kelîmeyê binivîse. Mane otomatîk tê lînkkirin!";
if (values.lang === "ku") {
return base + " Ji bo tercimeyan beşa 'Werger' bi kar bîne!";
}
return base;
},
multiple: true,
ordered: true,
rows: 3,
visible: function (values) {
return values.lang && values.pos;
},
example: function (values) {
// posExamples loaded from [[MediaWiki:Gadget-start.js/data.json]].
var examples = steps.dfn.posExamples || {};
var full = values.pos || "";
return examples[full] || "";
},
// Builds one sense block (<li>): mane textarea, nimûne list, and
// sub-lists for alternatîv/hevmane/dijmane/etc.
buildSenseBlock: function (stepDiv) {
var block = $("<li class='wiktku-dfn-sense'></li>");
// — Mane textarea (declared first so the template handler can reference it) —
var dfnArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-mane-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-start-step-field wiktku-dfn-mane")
.attr("rows", 6)
.attr("placeholder", "Mane…");
dfnArea.on("input", function () {
steps.dfn.onDfnInput(stepDiv, block, this);
});
// — Tercime + Îzah boxes (non-ku alternative to the plain mane box) —
// Non-ku entries get a direct translation plus a {{îzah|…}}-wrapped
// gloss instead of a Kurdish-style gloss. Rather than teach every
// consumer (getSenses/getOutput/linkify) a second data shape, these
// boxes just write their combined text into dfnArea and re-fire its
// "input" event, so dfnArea stays the single source of truth.
var tercimeArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-tercime-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-dfn-subfield wiktku-dfn-tercime")
.attr("rows", 2)
.attr("placeholder", "Tercimeyên rasterast ên kurmancî… Ji bo school-a îngilîzî li vir 'mekteb, medrese' binivîse");
var izahArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-izah-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-dfn-subfield wiktku-dfn-izah")
.attr("rows", 3)
.attr("placeholder", "Îzaha kurmancî… Ji bo school-a îngilîzî li vir 'cihê tehsîlgirtinê' binivîse");
var nonKuWrap = $("<div class='wiktku-dfn-nonku-wrap'></div>")
.append(tercimeArea).append(izahArea)
.hide();
function syncNonKuToMane() {
var t = $.trim(tercimeArea.val());
var iz = $.trim(izahArea.val());
// if tercime is blank, use îzah as definition
var combined = t ? (iz ? t + " {{îzah|" + iz + "}}" : t) : iz;
dfnArea.val(combined);
// Re-fires onDfnInput so the sense list still grows and
// refresh() still runs, exactly as if this were typed
// directly into the mane textarea.
dfnArea.trigger("input");
}
tercimeArea.on("input", syncNonKuToMane);
izahArea.on("input", syncNonKuToMane);
// Switches between the plain mane box and the tercime+îzah pair —
// only for non-ku entries with no tplSelect selected.
function updateManeMode() {
var lang = getValues().lang || "";
var isTpl = !!tplSelect.val();
if (lang && lang !== "ku" && !isTpl) {
dfnArea.hide();
nonKuWrap.show();
} else {
nonKuWrap.hide();
if (!isTpl) dfnArea.show();
}
}
// Store on the block so refresh() can re-sync every block when
// lang changes, and restoreDfn() can re-sync after restoring.
block.data("updateManeMode", updateManeMode);
// — Template selector (optional — replaces mane when chosen) —
// Template definitions loaded from [[MediaWiki:Gadget-start.js/data.json]].
var tplDefs = steps.dfn.tplDefs || {};
// Cache of all non-placeholder option elements, so updateTplOptions
// can detach/re-attach them without losing the full list.
var _allTplOptions = [];
var tplSelect = $(mw.html.element("select", { "class": "wiktku-dfn-tpl-select" }));
tplSelect.attr("data-placeholder", "Li şablonekê bigere");
tplSelect.append($("<option value=''>— yan jî şablonek hilbijêre —</option>"));
$.each(tplDefs, function (name, tpl) {
var opt = $("<option></option>")
.val(name)
.text(name)
.attr("data-langs", tpl.langs ? tpl.langs.join(",") : "")
.attr("data-nolang", tpl.noLang ? "1" : "");
tplSelect.append(opt);
_allTplOptions.push(opt[0]);
});
function updateTplOptions() {
var lang = getValues().lang || "";
var currentVal = tplSelect.val();
var currentStillValid = false;
// Detach all non-placeholder options, then re-attach only the visible
// ones — native <select> won't reliably hide options any other way.
tplSelect.find("option[value!='']").detach();
$.each(_allTplOptions, function (_, opt) {
var allowed = $(opt).attr("data-langs");
var visible = !allowed || allowed.split(",").indexOf(lang) !== -1;
if (visible) {
tplSelect.append(opt);
if ($(opt).val() === currentVal) currentStillValid = true;
}
});
tplSelect.trigger("wiktku:refresh");
if (currentVal && !currentStillValid) {
tplSelect.val("");
tplTitleInput.hide().val("");
updateManeMode();
}
}
// Store updater on the element so refresh() can call it for all blocks.
tplSelect.data("updateOptions", updateTplOptions);
var tplTitleInput = $("<input type='text'>")
.addClass("wiktku-dfn-tpl-title wiktku-start-narrow")
.attr("placeholder", "Navê rûpela hedefê…")
.hide();
// Grow the sense list when the title field of the last block gets content,
// mirroring what onDfnInput does for the plain mane textarea.
tplTitleInput.on("input", function () {
steps.dfn.onDfnInput(stepDiv, block, this);
});
// Şablon senses have no plain gloss, so hide alternatîv/hevmane/
// dijmane/etc. Etîket, Nimûne and Jêgirtin stay visible either way.
function updateFieldVisibility() {
var isTpl = !!tplSelect.val();
$.each(HIDDEN_ON_TPL_GROUPS, function (_, cls) {
block.find("." + cls + "-group").toggle(!isTpl);
});
}
// Store on the block so restoreDfn() can re-sync visibility
// after setting tplSelect's value.
block.data("updateFieldVisibility", updateFieldVisibility);
tplSelect.on("change", function () {
var chosen = $(this).val();
if (chosen) {
dfnArea.hide();
nonKuWrap.hide();
tplTitleInput.show().focus();
} else {
tplTitleInput.hide().val("");
updateManeMode();
}
updateFieldVisibility();
// Re-run refresh so the Werger step visibility updates.
refresh();
});
var tplRow = $("<div></div>").addClass("wiktku-dfn-tpl-row")
.append(tplSelect).append(" ").append(tplTitleInput);
block.append(tplRow);
block.append(dfnArea);
block.append(nonKuWrap);
// Apply lang filter on initial build.
updateTplOptions();
updateManeMode();
// — Sub-field groups are always visible with a placeholder textarea.
var allGroups = [
{ cls: "wiktku-dfn-etiket", label: "Etîket", rows: 1, narrow: true, izah: "xisûsen, Mêrdîn, anatomî, Badînî" },
{ cls: "wiktku-dfn-kategori", label: "Kategorî", rows: 1, narrow: true, izah: "wekî etîket lê xuya nabe tenê kategorîze dike" },
{ cls: "wiktku-dfn-alternativ", label: "Formên alternatîv", rows: 1, narrow: true, izah: "Varyantên vê kelîmeyê" },
{ cls: "wiktku-dfn-hevmane", label: "Hevmane", rows: 1, narrow: true, izah: "Spehî hevmaneya Bedew e." },
{ cls: "wiktku-dfn-dijmane", label: "Dijmane", rows: 1, narrow: true, izah: "Zengîn dijmaneya feqîr e." },
{ cls: "wiktku-dfn-koordine", label: "Termên koordîne", rows: 1, narrow: true, izah: "Pisîk û kûçik termên koordîne ne çunkî Jornavên wan gelek in" },
{ cls: "wiktku-dfn-jornav", label: "Jornav", rows: 1, narrow: true, izah: "Heywan jornavê guhandar e" },
{ cls: "wiktku-dfn-jernav", label: "Jêrnav", rows: 1, narrow: true, izah: "Guhandar jêrnavê heywan e" },
{ cls: "wiktku-dfn-nimune", label: "Nimûne", rows: 2, narrow: false }
];
$.each(allGroups, function (_, g) {
var groupDiv = $("<div></div>").addClass("wiktku-dfn-subgroup " + g.cls + "-group");
function buildNimuneLi() {
var lang = getValues().lang || "";
var li = $("<li></li>").addClass("wiktku-dfn-nimune-li");
var mainTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-text-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", g.rows)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-text")
.attr("placeholder", "Nimûneya emilandina kelîmeyê tu bi xwe binivîse…");
mainTa.on("input", function () {
highlightLinebreak(this);
var val = $.trim($(this).val());
var isLast = li.is(list.children("li:last-child"));
if (val && isLast) {
list.append(buildNimuneLi());
}
});
li.append(mainTa);
var subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
if (needsTransliteration(lang)) {
subWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-tr")
.attr("placeholder", "Transliterasyona bi alfabeya latînî")
);
}
if (lang && lang !== "ku") {
subWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-t")
.attr("placeholder", "Tercimeya nimûneyê bi kurmancî")
);
}
if (subWrap.children().length) li.append(subWrap);
return li;
}
if (g.cls === "wiktku-dfn-nimune") {
// Nimûne — compound widget with tr/t sub-fields.
var lbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text(g.label))
.append(": ");
var list = $("<ol></ol>").addClass("wiktku-dfn-sublist " + g.cls + "-list");
groupDiv.data("buildNimuneLi", buildNimuneLi);
list.append(buildNimuneLi());
groupDiv.append(lbl).append(list);
block.append(groupDiv);
} else {
// Regular always-visible group — label + growing textarea list.
var lbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text(g.label))
.append(": ")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-hint").text(g.izah));
var list = $("<ol></ol>").addClass("wiktku-dfn-sublist " + g.cls + "-list");
var firstInput = $("<textarea></textarea>")
.attr("name", g.cls + "-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", g.rows)
.attr("class", "wiktku-dfn-subfield" + (g.narrow ? " wiktku-start-narrow" : ""))
.attr("placeholder", g.label + "…");
firstInput.on("input", function () {
steps.dfn.onSubInput(list, this, g.rows, g.narrow);
});
list.append($("<li></li>").append(firstInput));
groupDiv.append(lbl).append(list);
block.append(groupDiv);
}
});
// — Jêder group — growing list, same structure as Nimûne. —
(function () {
var jederGroupDiv = $("<div></div>").addClass("wiktku-dfn-subgroup wiktku-dfn-jeder-group");
var jederLbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text("Jêgirtin"))
.append(": ");
var jederList = $("<ol></ol>").addClass("wiktku-dfn-sublist wiktku-dfn-jeder-list");
function buildJederLi() {
var lang = getValues().lang || "";
var li = $("<li></li>").addClass("wiktku-dfn-jeder-li");
// Quote text textarea
var quoteTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote")
.attr("placeholder", "Nimûneya emilandinê ji kitêb an çavkaniyeke din binivîse");
quoteTa.on("input", function () {
highlightLinebreak(this);
var val = $.trim($(this).val());
var isLast = li.is(jederList.children("li:last-child"));
if (val && isLast) {
jederList.append(buildJederLi());
}
});
li.append(quoteTa);
// tr/t sub-fields for the quote — shown as needed for the language.
var quoteSubWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
if (needsTransliteration(lang)) {
quoteSubWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-tr")
.attr("placeholder", "Transliterasyona jêgirtinê…")
);
}
if (lang && lang !== "ku") {
quoteSubWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-t")
.attr("placeholder", "Tercimeya jêgirtinê bi kurmancî")
);
}
if (quoteSubWrap.children().length) li.append(quoteSubWrap);
// Citoid auto-fill: fetch citation data from a URL, DOI or ISBN and
// prefill the source şablon + fields below (see Gadget-citoid-helper.js).
var citoidWrap = $("<div></div>").addClass("wiktku-dfn-quote-citoid");
var citoidInput = $("<textarea></textarea>")
.addClass("wiktku-dfn-subfield wiktku-dfn-quote-citoid-input")
.attr("rows", 1)
.attr("placeholder", "URL, DOI an ISBN binivîse ku otomatîk were tijekirin…");
var citoidBtn = new OO.ui.ButtonWidget({
label: "Bi Citoidê bîne",
classes: [ "wiktku-dfn-quote-citoid-btn" ]
});
var citoidStatus = $("<span></span>").addClass("wiktku-dfn-quote-citoid-status");
// Fetches citation data from Citoid and fills this citation's
// şablon + fields — only rebuilds fields on template change,
// and never overwrites values the user already typed.
function runCitoidFetch() {
var query = $.trim(citoidInput.val());
if (!query) {
mw.notify("Ji kerema xwe re pêşî URL, DOI an ISBNyekê binivîse.");
return;
}
citoidBtn.setDisabled(true);
citoidStatus.text("Tê anîn…");
wikt.citoidHelper.ensure().then(function () {
return wikt.citoid.fetchJederFields(query);
}).then(function (result) {
var jederKey = result.jederKey;
var hasTpl = !!jederKey && srcSel.find("option[value='" + jederKey + "']").length > 0;
var targetVal = hasTpl ? jederKey : "__manual__";
// Only rebuild if switching şablon, so a repeat fetch
// doesn't clear fields already filled in by hand.
if (srcSel.val() !== targetVal) {
srcSel.val(targetVal).trigger("change");
}
if (hasTpl) {
// Tenê qadên vala tijî bike.
$.each(result.fields, function (key, val) {
var input = srcFields.find("[data-field-key='" + key + "']");
if (input.length && !$.trim(input.val())) {
input.val(val);
}
});
} else {
// Şablonek nehat naskirin ji bo vê itemType — rêzikeke
// çavkaniyê ya bi destan a ji qadên Citoid tê çêkirin,
// lê tenê ger qada destan vala be.
var manualField = srcFields.find(".wiktku-dfn-quote-src-manual");
if (!$.trim(manualField.val())) {
var parts = [];
$.each(["nivîskar", "sernav", "websîte", "kovar", "weşanxane", "sal", "url"], function (_, k) {
if (result.fields[k]) parts.push(result.fields[k]);
});
manualField.val(parts.join(", "));
}
}
citoidStatus.text("");
}, function (errorMsg) {
citoidStatus.text(typeof errorMsg === "string" ? errorMsg : "Nehat dîtin. Kontrol bike ka URL/DOI/ISBN rast e.");
}).always(function () {
citoidBtn.setDisabled(false);
});
}
citoidBtn.on("click", runCitoidFetch);
citoidInput.on("keydown", function (e) {
if (e.which === 13) { // Enter
e.preventDefault();
runCitoidFetch();
}
});
citoidWrap.append(citoidInput).append(citoidBtn.$element).append(citoidStatus);
// Source template selector, specific to this citation.
var srcSel = $("<select></select>").addClass("wiktku-dfn-quote-src-sel wiktku-plain-select");
srcSel.append($("<option value=''>— Çavkaniyê hilbijêre —</option>"));
srcSel.append($("<option></option>").val("__manual__").text("Bi destê xwe binivîsim"));
srcSel.append($("<option></option>").val("__category__").text("Ji Kategorî:Çavkanî şablonekê hilbijêre"));
var jederDefs = steps.dfn.jederDefs || {};
$.each(jederDefs, function (tplName, def) {
srcSel.append($("<option></option>").val(tplName).text(def.label));
});
// Dynamic source fields container.
var srcFields = $("<div></div>").addClass("wiktku-dfn-quote-src-fields");
srcSel.on("change", function () {
srcFields.empty();
var chosen = $(this).val();
if (!chosen) return;
if (chosen === "__manual__") {
// Freeform source, written by the user — becomes the 2nd
// positional param of {{jêder|lang|…}} instead of çavkanî?.
srcFields.append(
$("<textarea></textarea>")
.attr("rows", 4)
.addClass("wiktku-dfn-subfield wiktku-dfn-quote-src-manual")
.attr("placeholder", "Çavkaniyê bi destê xwe binivîse…")
);
return;
}
if (chosen === "__category__") {
// Search widget over the members of [[Kategorî:Çavkanî]].
// Picking a şablon here immediately switches the row to
// "Bi destê xwe binivîsim" mode with {{Şablon}} pre-filled,
var catWrap = $("<span></span>").addClass("wiktku-native-select-wrap wiktku-dfn-quote-src-cat");
var catInput = $("<input type='search' autocomplete='off'>")
.addClass("wiktku-start-narrow wiktku-dfn-quote-src-cat-input")
.attr("placeholder", "Li navê şablonê bigere…");
var catResults = $("<ul></ul>").addClass("wiktku-ac-results wiktku-dfn-quote-src-cat-results").hide();
var catStatus = $("<span></span>").addClass("wiktku-dfn-quote-src-cat-status").text("Şablon tên barkirin…");
var showCatResults = function (query) {
var q = $.trim(query).toLowerCase();
catResults.empty();
var list = catSrcTemplates || [];
var matched = q ?
$.grep(list, function (name) { return name.toLowerCase().indexOf(q) !== -1; }) :
list;
if (!matched.length) {
catResults.hide();
return;
}
$.each(matched.slice(0, 50), function (_, name) {
var li = $("<li></li>").text(name).attr("data-value", name);
var touchMoved = false;
li.on("touchstart", function () { touchMoved = false; });
li.on("touchmove", function () { touchMoved = true; });
li.on("touchend", function (e) {
if (touchMoved) return;
e.preventDefault();
selectCatTpl(name);
});
li.on("mousedown", function (e) {
e.preventDefault();
selectCatTpl(name);
});
catResults.append(li);
});
catResults.show();
};
// Wraps the chosen şablon as {{Name}}, drops it into the
// manual textarea, and switches the row into manual mode
// so the user can keep editing it (add params, etc.).
var selectCatTpl = function (name) {
catResults.hide();
srcSel.val("__manual__");
srcSel.trigger("change");
srcFields.find(".wiktku-dfn-quote-src-manual")
.val("{{" + name + "}}")
.trigger("focus");
};
catInput.on("input", function () {
showCatResults($(this).val());
});
catInput.on("focus", function () {
showCatResults($(this).val());
});
catInput.on("blur", function () {
setTimeout(function () { catResults.hide(); }, 200);
});
catWrap.append(catInput).append(catResults).append(catStatus);
srcFields.append(catWrap);
fetchCatSrcTemplates().then(function () {
catStatus.text("");
}, function () {
catStatus.text("Şablon nehatin barkirin.");
});
return;
}
var def = (steps.dfn.jederDefs || {})[chosen];
if (!def) return;
$.each(def.fields, function (key, label) {
var row = $("<div></div>").addClass("wiktku-dfn-quote-src-row");
var fieldLbl = $("<label></label>").text(label + ": ");
var inp = $("<textarea></textarea>")
.attr("rows", 2)
.addClass("wiktku-dfn-quote-src-input wiktku-start-narrow")
.attr("data-field-key", key)
.attr("placeholder", label + "…");
// "Sernav" / "Sernavê orjînal" (title fields, e.g. for
// kitêb/kovar/malper) get a taller, draggable box; every
// other field in the template stays as-is. Field labels
// come from the on-wiki jederDefs data, so match on the
// (diacritic-folded) label text rather than a fixed key.
var foldedLabel = foldDiacritics(label);
if (/^sernav$/.test(foldedLabel) || /orjin/.test(foldedLabel)) {
inp.addClass("wiktku-dfn-quote-src-input--title");
}
row.append(fieldLbl).append(inp);
srcFields.append(row);
});
});
li.append(citoidWrap).append(srcSel).append(srcFields);
return li;
}
jederGroupDiv.data("buildJederLi", buildJederLi);
jederList.append(buildJederLi());
jederGroupDiv.append(jederLbl).append(jederList);
block.append(jederGroupDiv);
}());
// Apply the initial hide/show state for the sub-groups (matches
// tplSelect's starting value, which is normally empty).
updateFieldVisibility();
return block;
},
/** Grows the sense list when the last mane textarea gets content. */
onDfnInput: function (stepDiv, block, textarea) {
var val = $.trim($(textarea).val());
var list = stepDiv.find("ol.wiktku-dfn-list");
var isLast = block.is(list.children("li:last-child"));
if (val && isLast) {
var newBlock = steps.dfn.buildSenseBlock(stepDiv);
list.append(newBlock);
// Give the new block's template selector the searchable picker.
initSelects(newBlock);
}
refresh();
},
/** Grows a sub-list (nimûne/formên alternatîv/hevmane/dijmane/termên koordîne) on input. */
onSubInput: function (list, input, rows, narrow) {
var val = $.trim($(input).val());
var item = $(input).parent();
var isLast = item.is(list.children("li:last-child"));
if (val && isLast) {
var next = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-sub-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", rows)
.attr("class", "wiktku-dfn-subfield" + (narrow ? " wiktku-start-narrow" : ""));
next.on("input", function () {
steps.dfn.onSubInput(list, this, rows, narrow);
});
list.append($("<li></li>").append(next));
}
},
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (tplDefs, posExamples, jederDefs).
tplDefs: {},
posExamples: {},
jederDefs: {},
build: function (stepDiv) {
if (stepDiv.find("ol.wiktku-dfn-list").length) return null;
var list = $("<ol class='wiktku-dfn-list'></ol>");
list.append(steps.dfn.buildSenseBlock(stepDiv));
stepDiv.append(list);
return null;
},
/** Reads all sense blocks from the DOM and returns an array of sense objects. */
getSenses: function (stepDiv) {
var senses = [];
stepDiv.find("li.wiktku-dfn-sense").each(function () {
var block = $(this);
var tplSel = block.find("select.wiktku-dfn-tpl-select");
var tpl = tplSel.val() || "";
// noLang: template already encodes the language — don't add |lang| param.
var tplNoLang = tpl
? tplSel.find("option[value='" + tpl + "']").attr("data-nolang") === "1"
: false;
var tplTitle = $.trim(block.find("input.wiktku-dfn-tpl-title").val());
var mane = $.trim(block.find("textarea.wiktku-dfn-mane").val());
function readList(cls) {
var vals = [];
block.find("." + cls + "-list textarea").each(function () {
var v = $.trim($(this).val());
if (v) vals.push(v);
});
return vals;
}
// Nimûne items are compound: { text, tr?, t? }
function readNimuneList() {
var items = [];
block.find(".wiktku-dfn-nimune-list li.wiktku-dfn-nimune-li").each(function () {
var text = $.trim($(this).find(".wiktku-dfn-nimune-text").val());
if (!text) return;
var obj = { text: text };
var tr = $.trim($(this).find(".wiktku-dfn-nimune-tr").val());
var t = $.trim($(this).find(".wiktku-dfn-nimune-t").val());
if (tr) obj.tr = tr;
if (t) obj.t = t;
items.push(obj);
});
return items;
}
// Jêder is a growing list of citations, one per li — mirrors readNimuneList().
function readJederList() {
var items = [];
block.find(".wiktku-dfn-jeder-list li.wiktku-dfn-jeder-li").each(function () {
var li = $(this);
var quote = $.trim(li.find(".wiktku-dfn-nimune-quote").val());
if (!quote) return;
var obj = { quote: quote };
var qtr = $.trim(li.find(".wiktku-dfn-nimune-quote-tr").val());
var qt = $.trim(li.find(".wiktku-dfn-nimune-quote-t").val());
if (qtr) obj.quoteTr = qtr;
if (qt) obj.quoteT = qt;
var tplName = li.find(".wiktku-dfn-quote-src-sel").val();
if (tplName === "__manual__") {
var manual = $.trim(li.find(".wiktku-dfn-quote-src-manual").val());
if (manual) obj.jederManual = manual;
} else if (tplName === "__category__") {
// Reachable only if the user opened the category search but
// never picked a şablon — picking one switches the row to
// __manual__ (see selectCatTpl above), so there's nothing
// meaningful to save here.
} else if (tplName) {
obj.jederTpl = tplName;
var fields = {};
li.find(".wiktku-dfn-quote-src-input").each(function () {
var k = $(this).attr("data-field-key");
var v = $.trim($(this).val());
if (k && v) fields[k] = v;
});
obj.jêderFields = fields;
}
items.push(obj);
});
return items;
}
senses.push({
tpl: tpl,
tplNoLang: tplNoLang,
tplTitle: tplTitle,
mane: mane,
etiket: readList("wiktku-dfn-etiket"),
kategori: readList("wiktku-dfn-kategori"),
nimune: readNimuneList(),
jeder: readJederList(),
alternativ: readList("wiktku-dfn-alternativ"),
hevmane: readList("wiktku-dfn-hevmane"),
dijmane: readList("wiktku-dfn-dijmane"),
koordine: readList("wiktku-dfn-koordine"),
jornav: readList("wiktku-dfn-jornav"),
jernav: readList("wiktku-dfn-jernav")
});
});
return senses;
},
getOutput: function (values, callback) {
var stepDiv = $("#wiktku-start-dfn");
var senses = steps.dfn.getSenses(stepDiv);
var lang = values.lang;
// A sense counts as "filled" if it has a mane, a chosen template + title,
// or any other content (etîket/hevmane/nimûne/jêder…) worth keeping.
var hasMane = senses.some(function (s) {
return s.mane !== "" || (s.tpl && s.tplTitle) || senseHasExtraContent(s);
});
var defLines = []; // one entry per kept sense (goes to linkify)
var citeLines = []; // parallel — nimûne+jêder for that same sense
var izahLines = []; // parallel — raw îzah gloss for that same sense
// True only once some sense's *actual* dfn text (post tercime/îzah
// split) is non-empty.
var hasLinkableMane = false;
$.each(senses, function (_, sense) {
// — Template sense (e.g. {{guharto|ku|somepage}}) —
if (sense.tpl) {
if (!sense.tplTitle) return; // skip empty template senses
var tplKatTpl = buildSenseTpl(sense, "kategori", lang, "K");
var tplLabelTpl = buildSenseTpl(sense, "etiket", lang, "e");
var tplCall = sense.tplNoLang
? "{{" + sense.tpl + "|" + sense.tplTitle + "}}"
: "{{" + sense.tpl + "|" + lang + "|" + sense.tplTitle + "}}";
var idx = defLines.length;
var cite = buildCite(sense, lang);
defLines.push("# " + (tplKatTpl ? tplKatTpl + " " : "") + (tplLabelTpl ? tplLabelTpl + " " : "") + tplCall +
(cite ? "{{wiktku-cite-" + idx + "}}" : ""));
citeLines.push(cite);
izahLines.push(""); // template senses have no îzah
return;
}
// — Normal mane sense —
var dfn = sense.mane;
if (!dfn && !senseHasExtraContent(sense)) return; // truly empty
// Pull the îzah gloss (if any) out of the combined tercime+îzah
// string — it's spliced back in separately below, after its
// own linkify pass (see izahLines / the second linkifyText call).
var izahRaw = null;
var tercimeIzah = splitTercimeIzah(dfn);
if (tercimeIzah) {
dfn = tercimeIzah.tercime;
izahRaw = stripWikilinks(tercimeIzah.izah);
}
if (dfn) {
dfn = stripWikilinks(dfn);
// Sentence-case + trailing period are for ku definitions,
// which are written as full glosses.
if (lang === "ku") {
if (dfn[0] !== dfn[0].toUpperCase()) dfn = capitalize(dfn);
if (!dfn.match(/[.…?!)\]]$/)) dfn += ".";
}
} else if (izahRaw === null) {
dfn = lang === "ku" ? "{{mane?|" + lang + "}}" : "";
}
if (dfn) hasLinkableMane = true;
var katTpl = buildSenseTpl(sense, "kategori", lang, "K");
var labelTpl = buildSenseTpl(sense, "etiket", lang, "e");
var out = "# " + (katTpl ? katTpl + " " : "") + (labelTpl ? labelTpl + " " : "") + dfn;
var idx = defLines.length;
var hasThisIzah = izahRaw !== null && $.trim(izahRaw) !== "";
// Bare {{...}} token — like {{wiktku-cite-N}}, this survives
// linkify's first pass untouched (it treats template calls as
// opaque), then gets swapped for {{îzah|…}} once the actual
// gloss text has been linkified in its own separate pass.
if (hasThisIzah) {
out += (dfn ? " " : "") + "{{wiktku-izah-" + idx + "}}";
}
function wordLine(tpl, words) {
if (!words.length) return "";
return "\n#: {{" + tpl + "|" + lang + "|" + words.join("|") + "}}";
}
out += wordLine("alt-r", sense.alternativ);
out += wordLine("hevmane", sense.hevmane);
out += wordLine("dijmane", sense.dijmane);
out += wordLine("koordîne", sense.koordine);
out += wordLine("jornav", sense.jornav);
out += wordLine("jêrnav", sense.jernav);
var cite = buildCite(sense, lang);
defLines.push(out + (cite ? "{{wiktku-cite-" + idx + "}}" : ""));
citeLines.push(cite);
izahLines.push(hasThisIzah ? izahRaw : "");
});
// Splice citeLines back into a linkified string, replacing each
// {{wiktku-cite-N}} token with its stored nimûne/jêder block.
function restoreCites(t) {
return t.replace(/\{\{wiktku-cite-(\d+)\}\}/g, function (_, n) {
return citeLines[parseInt(n, 10)] || "";
});
}
// Runs text through the linkify gadget if it's loaded, otherwise
// just passes it through unchanged. Shared by both linkify passes
// below (main mane text, and — separately — îzah glosses).
function linkifyText(t, cb) {
if (typeof $.kuLinkify === "function") {
$.kuLinkify(t, cb);
} else {
cb(t);
}
}
var hasIzah = izahLines.some(function (t) { return t && $.trim(t) !== ""; });
var text = defLines.join("\n") + "\n";
if (!hasMane) {
// No definitions entered — emit {{mane?}} with nimûne?.
text = "# {{mane?|" + lang + "}}\n#* {{nimûne?|" + lang + "}}\n";
callback(text);
return;
}
// Runs the îzah-only linkify pass against `base` (either the raw
// text, when there's no linkable mane to run the main pass on
// first, or the already-linkified main text). Shared by both
// branches below so the token-splice logic only lives once.
function runIzahPass(base) {
var izahJoined = $.map(izahLines, function (raw, idx) {
if (!raw) return undefined;
return "{{wiktku-izah-open-" + idx + "}}" + raw + "{{wiktku-izah-close-" + idx + "}}";
}).join("\n");
linkifyText(izahJoined, function (izahLinked) {
var izahByIdx = {};
var re = /\{\{wiktku-izah-open-(\d+)\}\}([\s\S]*?)\{\{wiktku-izah-close-\1\}\}/g;
var m;
while ((m = re.exec(izahLinked)) !== null) {
izahByIdx[parseInt(m[1], 10)] = m[2];
}
var withIzah = base.replace(/\{\{wiktku-izah-(\d+)\}\}/g, function (_, n) {
var linked = izahByIdx[parseInt(n, 10)];
return linked !== undefined ? "{{îzah|" + linked + "}}" : "";
});
callback(restoreCites(withIzah));
});
}
if (!hasLinkableMane) {
if (!hasIzah) {
// All filled senses are template senses (or otherwise have
// no plain text at all) — nothing here needs linkify.
callback(restoreCites(text));
return;
}
// There's no plain mane text anywhere (e.g. tercime left blank
// with only îzah filled in), so every defLine is just a bare
// template call with nothing to word-link. Sending a line
// like "# {{wiktku-izah-0}}" through the main linkify pass
// gives it no plain words to work with, makes the linkify
// gadget hang — so skip that pass entirely and run only
// the îzah pass, splicing straight into the unlinkified text.
var loadIzahOnly = function () { runIzahPass(text); };
mw.loader.using("ext.gadget.linkify", loadIzahOnly, loadIzahOnly);
return;
}
var didTryToLoad = function () {
// First pass: the main definition text (mane), same as before.
linkifyText(text, function (mainLinked) {
if (!hasIzah) {
callback(restoreCites(mainLinked));
return;
}
// Second pass: îzah glosses, linkified via their own
// separate call. Each gloss is wrapped in its own
// {{wiktku-izah-open/close-N}} pair; like the existing
// {{wiktku-cite-N}} tokens, these sit inside double
// braces so linkify leaves the tokens themselves alone —
// only the raw gloss text between each pair gets linked.
runIzahPass(mainLinked);
});
};
mw.loader.using("ext.gadget.linkify", didTryToLoad, didTryToLoad);
}
},
je: makeWordListStep("je", "jê", "Kelîmeyên jê çêbûyî binivîse"),
tekildar: makeWordListStep("tekildar", "têkildar", "Kelîmeyên ji aliyê etîmolojiyê ve têkildarî vê kelîmeyê binivîse"),
binereherwiha: makeWordListStep("binereherwiha", "binêre herwiha", "Kelîmeyên din ên eleqedar binivîse"),
etym: {
id: "etym",
name: "etîmolojî",
question_fmt: "Etîmolojiya kelîmeyê binivîse",
// etymTpls populated from data.json
etymTpls: {},
visible: function (values) {
return values.lang && values.pos;
},
// Fills the insert-dropdown from the current etymTpls object.
refreshTplSelect: function () {
var sel = $("#wiktku-start-etym .wiktku-tpl-insert-select");
if (!sel.length) return;
sel.find("option[value!='']").remove();
$.each(steps.etym.etymTpls, function (name, tpl) {
sel.append($("<option></option>").val(tpl.snippet).text(name + " — " + tpl.desc));
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-etym-wrap").length) return null;
var wrap = $("<div class='wiktku-etym-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-etym-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-etym-text")
.attr("rows", 4)
.attr("placeholder", "Ji {{ji|en|ku|apple}}. yan rasterast binivîse…");
// Template insert dropdown — options also refreshed after data.json loads.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike…");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
$.each(steps.etym.etymTpls, function (name, tpl) {
sel.append($("<option></option>").val(tpl.snippet).text(name + " — " + tpl.desc));
});
sel.on("change", function () {
var snippet = $(this).val();
if (!snippet) return;
var lang = getValues().lang || "";
snippet = snippet.replace(/CODE/g, lang).replace(/SOURCELANG/g, "?");
insertAtCursor(ta[0], snippet);
$(this).val("");
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel);
wrap.append(ta);
stepDiv.append(wrap);
initSelects(wrap);
return ta;
},
output: function (values) {
var text = $.trim($("#wiktku-start-etym .wiktku-etym-text").val());
if (text) {
return "\n==== Etîmolojî ====\n" + text + "\n";
}
// No etymology entered — emit {{ji?|lang}} as a placeholder.
// Skip it only when every filled sense is a şablon sense
// a completely empty entry with no şablon chosen still gets the placeholder
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasFilledTplSense = dfnSenses.some(function (s) {
return !!s.tpl && !!s.tplTitle;
});
var hasRegularMane = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
if (hasFilledTplSense && !hasRegularMane) return "";
return "\n==== Etîmolojî ====\n{{ji?|" + values.lang + "}}\n";
} },
dunde: {
id: "dunde",
name: "dûnde",
question_fmt: "Eger ev kelîme ji vî zimanî ketibe zimanekî din, vî zimanî û kelîmeya wî binivîse",
visible: function (values) {
return !!values.pos;
},
disabledKeys: function (values) {
return {"navz": true, [values.lang]: true}
},
// Language dropdown + growing word-input list; a new row appends
// when the dropdown gets a value. Mirrors steps.trans, but flat.
buildRow: function (stepDiv) {
var row = $("<li class='wiktku-dunde-row wiktku-lang-row'></li>");
// Language selector — the searchable picker is applied after insertion into DOM.
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zimanekî bigere");
populateMenus(langSel, steps.dunde.keys || [], steps.dunde.disabledKeys);
// When a language is chosen, ensure a next empty row exists.
langSel.on("change", function () {
steps.dunde.onLangChange(stepDiv, row);
});
// Word list for this language.
var wordList = $("<ul class='wiktku-dunde-words wiktku-lang-row-words'></ul>");
var firstWord = steps.dunde.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
// The searchable picker is attached by initSelects() once the row
// is in the DOM (see onLangChange/build below).
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-dunde-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Kelîme…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-dunde-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.dunde.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (stepDiv, row) {
var list = stepDiv.find("ul.wiktku-dunde-list");
var isLast = row.is(list.children("li.wiktku-dunde-row:last-child"));
if (isLast) {
var newRow = steps.dunde.buildRow(stepDiv);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
// Keep disabled keys in sync across all lang selectors.
steps.dunde.syncDisabledKeys(stepDiv);
},
/** Disables already-selected languages in all other dropdowns. */
syncDisabledKeys: function (stepDiv) {
var taken = $.extend({}, steps.dunde.disabledKeys);
stepDiv.find("li.wiktku-dunde-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
stepDiv.find("li.wiktku-dunde-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
build: function (stepDiv) {
if (stepDiv.find("ul.wiktku-dunde-list").length) return null;
var list = $("<ul class='wiktku-dunde-list wiktku-lang-row-list'></ul>");
list.append(steps.dunde.buildRow(stepDiv));
stepDiv.append(list);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return null;
},
/** Reads all [langcode, words[]] rows from the DOM. */
getRows: function (stepDiv) {
var result = [];
stepDiv.find("li.wiktku-dunde-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-dunde-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
output: function () {
var stepDiv = $("#wiktku-start-dunde");
var rows = steps.dunde.getRows(stepDiv);
if (!rows.length) return "";
var lines = $.map(rows, function (row) {
var lang = row[0], words = row[1];
return "* {{dû|" + lang + "|" + words.join("|") + "}}";
});
return "\n==== Dûnde ====\n" + lines.join("\n") + "\n";
}
},
zarava: {
id: "zarava",
name: "bi zaravayên din",
question_fmt: "'"+ pageName + "' di zaravayên din de çawa tê gotin?",
visible: function (values) {
return steps.trans.visible(values);
},
disabledKeys: {},
buildRow: function (group) {
var row = $("<li class='wiktku-zarava-row wiktku-lang-row'></li>");
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zaravayekî bigere");
populateMenus(langSel, steps.zarava.keys || [], steps.zarava.disabledKeys);
langSel.on("change", function () {
steps.zarava.onLangChange(group, row);
});
var wordList = $("<ul class='wiktku-zarava-words wiktku-lang-row-words'></ul>");
var firstWord = steps.zarava.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-zarava-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Tercime…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-zarava-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.zarava.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (group, row) {
var list = group.find("ul.wiktku-zarava-list");
var isLast = row.is(list.children("li.wiktku-zarava-row:last-child"));
if (isLast) {
var newRow = steps.zarava.buildRow(group);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
steps.zarava.syncDisabledKeys(group);
},
/** Disables already-selected dialects in all other dropdowns within one group. */
syncDisabledKeys: function (group) {
var taken = $.extend({}, steps.zarava.disabledKeys);
group.find("li.wiktku-zarava-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
group.find("li.wiktku-zarava-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
/** Builds (or fetches) the .wiktku-zarava-group for one gloss. */
buildGroup: function (stepDiv, gi) {
var group = $("<div class='wiktku-zarava-group'></div>").attr("data-gloss-pos", gi);
var list = $("<ul class='wiktku-zarava-list wiktku-lang-row-list'></ul>");
list.append(steps.zarava.buildRow(group));
group.append(list);
stepDiv.append(group);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return group;
},
/** Syncs one .wiktku-zarava-group per current gloss (same logic as steps.trans.build). */
build: function (stepDiv) {
var glosses = steps.trans.glossList();
if (!glosses.length) {
stepDiv.find(".wiktku-zarava-group").remove();
return null;
}
var existingGroups = stepDiv.find(".wiktku-zarava-group");
if (existingGroups.length > glosses.length) {
existingGroups.slice(glosses.length).remove();
}
$.each(glosses, function (gi, gloss) {
var group = stepDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
if (!group.length) group = steps.zarava.buildGroup(stepDiv, gi);
var label = group.find(".wiktku-zarava-group-label");
if (glosses.length > 1) {
if (!label.length) {
label = $("<div class='wiktku-zarava-group-label'></div>");
group.prepend(label);
}
label.text(gloss.index + " " + gloss.text);
} else if (label.length) {
label.remove();
}
});
return null;
},
/** Reads the dialect rows for a single gloss group. */
getGroupTranslations: function (group) {
var result = [];
group.find("li.wiktku-zarava-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-zarava-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
/** Reads all rows from the DOM, grouped by gloss position. */
getTranslations: function (stepDiv) {
var result = [];
stepDiv.find(".wiktku-zarava-group").each(function () {
result.push(steps.zarava.getGroupTranslations($(this)));
});
return result;
},
output: function (values) {
if (values.lang !== "ku") return "";
var stepDiv = $("#wiktku-start-zarava");
var glosses = steps.trans.glossList();
if (!glosses.length) return "";
var blocks = $.map(glosses, function (gloss, gi) {
var group = stepDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
var rows = group.length ? steps.zarava.getGroupTranslations(group) : [];
if (!gloss.text && !rows.length) return undefined;
if (rows.length) {
rows.sort(function (a, b) {
var aLang = langsByCode[a[0]] || {};
var bLang = langsByCode[b[0]] || {};
return (aLang.sortKey || "").localeCompare(bLang.sortKey || "", "ku");
});
}
var wordLines = $.map(rows, function (row) {
var lang = row[0];
var words = row[1];
var wikiWords = words.map(function (w) {
return "{{W|" + lang + "|" + w + "}}";
}).join(", ");
return "* {{Z|" + lang + "}}: " + wikiWords;
}).join("\n");
if (!wordLines) return undefined;
var block = "{{werger-ser|" + (gloss.text || "?") + "|" + gloss.index + "}}";
block += "\n" + wordLines;
block += "\n{{werger-bin}}";
return block;
});
if (!blocks.length) return "";
return "\n==== Bi zaravayên din ====\n" + blocks.join("\n") + "\n";
}
},
trans: {
id: "trans",
name: "werger",
question_fmt: "Tercimeyên vê maneyê bi zimanên din binivîse",
visible: function (values) {
if (!(values.lang === "ku" && values.pos)) return false;
// Hide only when every sense is a filled template sense (no plain
// gloss to attach translations to). A mix, or nothing filled in
// yet, still shows Werger.
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasRealSense = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
var hasFilledTplSense = dfnSenses.some(function (s) {
return s.tpl && s.tplTitle;
});
return hasRealSense || !hasFilledTplSense;
},
disabledKeys: {
"navz": true,
"ku": true,
"ckb": true,
"sdh": true,
"lki": true,
"hac": true,
"zza": true },
// Language dropdown + growing word-input list, scoped to one gloss's
// group (each gloss has its own group and row list).
buildRow: function (group) {
var row = $("<li class='wiktku-trans-row wiktku-lang-row'></li>");
// Language selector — the searchable picker is applied after insertion into DOM.
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zimanekî bigere");
populateMenus(langSel, steps.trans.keys || [], steps.trans.disabledKeys);
// When a language is chosen, ensure a next empty row exists.
langSel.on("change", function () {
steps.trans.onLangChange(group, row);
});
// Word list for this language.
var wordList = $("<ul class='wiktku-trans-words wiktku-lang-row-words'></ul>");
var firstWord = steps.trans.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
// The searchable picker is attached by initSelects() once the row
// is in the DOM (see onLangChange/buildGroup below).
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-trans-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Tercime…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-trans-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.trans.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (group, row) {
var list = group.find("ul.wiktku-trans-list");
var isLast = row.is(list.children("li.wiktku-trans-row:last-child"));
if (isLast) {
var newRow = steps.trans.buildRow(group);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
// Keep disabled keys in sync across this gloss's lang selectors
// only — the same language can be used for different senses.
steps.trans.syncDisabledKeys(group);
},
/** Disables already-selected languages in all other dropdowns within one group. */
syncDisabledKeys: function (group) {
var taken = $.extend({}, steps.trans.disabledKeys);
group.find("li.wiktku-trans-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
group.find("li.wiktku-trans-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
// Builds (or fetches) the .wiktku-trans-group for one gloss.
buildGroup: function (stepDiv, gi) {
var group = $("<div class='wiktku-trans-group'></div>").attr("data-gloss-pos", gi);
var list = $("<ul class='wiktku-trans-list wiktku-lang-row-list'></ul>");
list.append(steps.trans.buildRow(group));
group.append(list);
stepDiv.append(group);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return group;
},
// Syncs one .wiktku-trans-group per current gloss, keyed by
// data-gloss-pos so groups stay matched across rebuilds.
build: function (stepDiv) {
var glosses = steps.trans.glossList();
if (!glosses.length) {
stepDiv.find(".wiktku-trans-group").remove();
return null;
}
// Drop groups for glosses that no longer exist (always from the
// tail — groups are only ever appended in gloss order below).
var existingGroups = stepDiv.find(".wiktku-trans-group");
if (existingGroups.length > glosses.length) {
existingGroups.slice(glosses.length).remove();
}
$.each(glosses, function (gi, gloss) {
var group = stepDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
if (!group.length) group = steps.trans.buildGroup(stepDiv, gi);
// Only label groups when there's more than one gloss to
// distinguish between — a single gloss needs no caption.
var label = group.find(".wiktku-trans-group-label");
if (glosses.length > 1) {
if (!label.length) {
label = $("<div class='wiktku-trans-group-label'></div>");
group.prepend(label);
}
label.text(gloss.index + " " + gloss.text);
} else if (label.length) {
label.remove();
}
});
return null;
},
/** Reads the translation rows for a single gloss group. */
getGroupTranslations: function (group) {
var result = [];
group.find("li.wiktku-trans-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-trans-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
// Reads all translation rows, grouped by gloss position.
getTranslations: function (stepDiv) {
var result = [];
stepDiv.find(".wiktku-trans-group").each(function () {
result.push(steps.trans.getGroupTranslations($(this)));
});
return result;
},
// Builds the numbered "{ index, gloss }" list, one per dfn sense
// with a real mane (skips template senses). index is 1-based and
// matches the sense's position in the "#" definition list.
// When nothing's filled in, returns one placeholder entry so
// Werger still has a group to attach to; when every sense is a
// filled template sense, stays empty (matches trans.visible()).
glossList: function () {
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var glosses = [];
var hasFilledTplSense = false;
$.each(dfnSenses, function (i, s) {
if (s.tpl) {
if (s.tplTitle) hasFilledTplSense = true;
return; // template sense — no gloss to caption with
}
var dfn = s.mane;
if (!dfn) {
// No mane, but other fields are filled — still gets a
// gloss group since dfn.getOutput() emits {{mane?}} for it.
if (senseHasExtraContent(s)) glosses.push({ index: i + 1, text: "" });
return;
}
if (dfn[0] !== dfn[0].toLowerCase()) dfn = decapitalize(dfn);
dfn = stripWikilinks(dfn).replace(/[.…?!)\]،؟]+$/, "");
glosses.push({ index: i + 1, text: dfn });
});
if (!glosses.length && !hasFilledTplSense) {
glosses.push({ index: 1, text: "" });
}
return glosses;
},
output: function (values) {
if (values.lang !== "ku") return "";
var stepDiv = $("#wiktku-start-trans");
var glosses = steps.trans.glossList();
// Every sense is a template sense — there's no real gloss
// anywhere and no group in the DOM either (glossList() only
// returns empty in that case), so skip the section entirely.
if (!glosses.length) return "";
// A completely empty entry (nothing filled in dfn at all, no
// şablon chosen either) still gets a placeholder Werger section
// to fill in later. Only
// skip an individual placeholder gloss below when some other
// sense actually has real content, making that particular
// placeholder redundant.
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasRegularMane = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
// Each gloss now has its own group of translation rows —
// attach every gloss's own words under its own werger-ser/-bin
// pair instead of dumping everything under the first one.
var blocks = $.map(glosses, function (gloss, gi) {
var group = stepDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
var rows = group.length ? steps.trans.getGroupTranslations(group) : [];
// Placeholder gloss (no real mane entered yet) with nothing
// translated into it. If some other sense already has real
// content, this placeholder is redundant — skip it. If the
// whole entry is empty, keep it so Werger still gets a
// section to fill in.
if (!gloss.text && !rows.length && hasRegularMane) return undefined;
if (rows.length) {
// Sort by Kurdish sort key.
rows.sort(function (a, b) {
var aLang = langsByCode[a[0]] || {};
var bLang = langsByCode[b[0]] || {};
return (aLang.sortKey || "").localeCompare(bLang.sortKey || "", "ku");
});
}
var wordLines = $.map(rows, function (row) {
var lang = row[0];
var words = row[1];
var wikiWords = words.map(function (w) {
return "{{W|" + lang + "|" + w + "}}";
}).join(", ");
return "* {{Z|" + lang + "}}: " + wikiWords;
}).join("\n");
var block = "{{werger-ser|" + (gloss.text || "?") + "|" + gloss.index + "}}";
if (wordLines) block += "\n" + wordLines;
block += "\n{{werger-bin}}";
return block;
});
if (!blocks.length) return "";
return "\n==== Werger ====\n" + blocks.join("\n") + "\n";
}
},
cavkani: {
id: "cavkani",
name: "çavkanî",
question_fmt: "Çavkaniyên din (ne jêgirtin) lê zêde bike",
visible: function (values) {
return !!values.pos;
},
// Fills the insert-dropdown from the members of [[Kategorî:Çavkanî]].
refreshTplSelect: function () {
var sel = $("#wiktku-start-cavkani .wiktku-tpl-insert-select");
if (!sel.length) return;
sel.find("option[value!='']").remove();
$.each(catSrcTemplates || [], function (_, name) {
sel.append($("<option></option>").val(name).text(name));
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-cavkani-wrap").length) return null;
var wrap = $("<div class='wiktku-cavkani-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-cavkani-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-cavkani-text")
.attr("rows", 4)
.attr("placeholder", "Şablonekî ji jêrê hilbijêre an rasterast binivîse…");
// Template insert dropdown, populated from [[Kategorî:Çavkanî]] —
// options refreshed once the category members are fetched.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike…");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
var status = $("<span class='wiktku-cavkani-status'></span>");
sel.on("change", function () {
var name = $(this).val();
if (!name) return;
insertAtCursor(ta[0], "\n* {{" + name + "}}");
$(this).val("");
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel);
wrap.append(status).append(ta);
stepDiv.append(wrap);
// build() runs again for every new beş (see the "+ Beş zêde bike"
// handler), after the initial page-wide pass — so this select needs
// its own init or it stays a plain, unsearchable native <select>.
initSelects(wrap);
// Populate only now: refreshTplSelect() looks the select up by id
// under #wiktku-start-cavkani, so running it before the wrap was
// appended found nothing and bailed out — which left the dropdown
// empty on every beş after the first, once the category members
// were already cached.
if (catSrcTemplates) {
steps.cavkani.refreshTplSelect();
} else {
status.text("Şablon tên barkirin…");
fetchCatSrcTemplates().then(function () {
steps.cavkani.refreshTplSelect();
status.text("");
}, function () {
status.text("Şablon nehatin barkirin.");
});
}
return ta;
},
output: function () {
var text = $.trim($("#wiktku-start-cavkani .wiktku-cavkani-text").val());
if (!text) return "";
return "\n==== Çavkanî ====\n" + text + "\n";
}
},
};
steps.trans.keys = steps.lang.choices;
steps.dunde.keys = steps.lang.choices;
steps.zarava.keys = getZaravaKeys(steps.lang.choices);
var ordered_steps = [
steps.lang, steps.pron, steps.pos, steps.cinsiyet, steps.lektur, steps.tr,
steps.dfn, steps.je, steps.tekildar,
steps.etym, steps.dunde, steps.binereherwiha, steps.zarava, steps.trans, steps.cavkani];
// Step ids that belong to each section (not shared across sections).
var PER_SECTION_STEP_IDS = [
"pos", "cinsiyet", "lektur", "tr",
"dfn", "je", "tekildar", "etym", "dunde", "binereherwiha", "zarava", "trans", "cavkani"
];
// ── Multi-section state ──────────────────────────────────────────────────
// Each entry is a plain snapshot: { pos, cinsiyet, lektur, tr, dfn (senses[]),
// je, tekildar, binereherwiha, trans (rows[]) }.
var sections = [{}]; // section 0 starts empty (DOM is the truth)
var activeSection = 0;
function snapshotDfn() {
return steps.dfn.getSenses($("#wiktku-start-dfn"));
}
// Rebuilds the dfn DOM from a previously snapshotted senses array.
function restoreDfn(senses) {
var stepDiv = $("#wiktku-start-dfn");
// Tear down the existing list so build() recreates it cleanly.
stepDiv.find("ol.wiktku-dfn-list").remove();
steps.dfn.build(stepDiv);
var list = stepDiv.find("ol.wiktku-dfn-list");
$.each(senses, function (i, sense) {
// Ensure enough blocks exist (build() seeds one).
var blocks = list.find("li.wiktku-dfn-sense");
var block = blocks.eq(i);
if (!block.length) {
var nb = steps.dfn.buildSenseBlock(stepDiv);
list.append(nb);
block = list.find("li.wiktku-dfn-sense").last();
}
// Template selector.
block.find("select.wiktku-dfn-tpl-select").val(sense.tpl || "");
if (sense.tpl) {
block.find("textarea.wiktku-dfn-mane").hide();
block.find("input.wiktku-dfn-tpl-title").val(sense.tplTitle || "").show();
} else {
block.find("textarea.wiktku-dfn-mane").val(sense.mane || "").show();
block.find("input.wiktku-dfn-tpl-title").hide().val("");
}
// dfnArea is the only thing actually saved, so split it back into
// tercime/îzah for editing (mirrors syncNonKuToMane's join format).
var maneParts = splitTercimeIzah(sense.mane);
block.find(".wiktku-dfn-tercime").val(maneParts ? maneParts.tercime : (sense.mane || ""));
block.find(".wiktku-dfn-izah").val(maneParts ? maneParts.izah : "");
// Re-sync the formên alternatîv/hevmane/… hide state now that
// tplSelect's value was set (its own "change"
// handler doesn't fire from .val(), so this doesn't happen otherwise).
var updateVis = block.data("updateFieldVisibility");
if (updateVis) updateVis();
// Same for the mane-box mode (plain vs tercime+îzah), since this
// also depends on tplSelect's (and lang's) value.
var updateMane = block.data("updateManeMode");
if (updateMane) updateMane();
// Restore a sub-list (etiket, formên alternatîv, hevmane …) from a values array.
function restoreSubList(cls, values) {
if (!values || !values.length) return;
var groupDiv = block.find("." + cls + "-group");
var subList = groupDiv.find("ol, ul").first();
if (!subList.length) return; // group not found
// Fill existing items, append new ones as needed.
$.each(values, function (j, val) {
var items = subList.find("li");
if (j < items.length) {
items.eq(j).find("textarea").val(val);
} else {
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-restore-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.val(val);
ta.on("input", function () {
steps.dfn.onSubInput(subList, this, 1, true);
});
subList.append($("<li></li>").append(ta));
}
});
}
// Reveal and populate lazy groups that have data.
var lazyMap = {
"wiktku-dfn-etiket": sense.etiket,
"wiktku-dfn-kategori": sense.kategori,
"wiktku-dfn-alternativ": sense.alternativ,
"wiktku-dfn-hevmane": sense.hevmane,
"wiktku-dfn-dijmane": sense.dijmane,
"wiktku-dfn-koordine": sense.koordine,
"wiktku-dfn-jornav": sense.jornav,
"wiktku-dfn-jernav": sense.jernav
};
$.each(lazyMap, function (cls, vals) {
if (vals && vals.length) restoreSubList(cls, vals);
});
// Nimûne items are objects { text, tr?, t? } — restore using the builder.
if (sense.nimune && sense.nimune.length) {
var nimuneGroupDiv = block.find(".wiktku-dfn-nimune-group");
var nimuneList = nimuneGroupDiv.find("ol.wiktku-dfn-nimune-list");
var buildFn = nimuneGroupDiv.data("buildNimuneLi");
nimuneList.empty();
$.each(sense.nimune, function (_, n) {
var text = typeof n === "object" ? (n.text || "") : n;
if (!text) return;
var li = buildFn ? buildFn() : $("<li class='wiktku-dfn-nimune-li'></li>");
li.find(".wiktku-dfn-nimune-text").val(text).each(function () { highlightLinebreak(this); });
if (n.tr) li.find(".wiktku-dfn-nimune-tr").val(n.tr);
if (n.t) li.find(".wiktku-dfn-nimune-t").val(n.t);
nimuneList.append(li);
});
// Always leave a blank trailing item.
if (buildFn) nimuneList.append(buildFn());
}
// Restore jêder entries — accepts current array shape or a legacy
// single object (older saved sections) for backwards compat.
var jederArr = $.isArray(sense.jeder) ? sense.jeder : (sense.jeder ? [sense.jeder] : []);
if (jederArr.length) {
var jederGroupDiv = block.find(".wiktku-dfn-jeder-group");
var jederList = jederGroupDiv.find("ol.wiktku-dfn-jeder-list");
var buildJederFn = jederGroupDiv.data("buildJederLi");
jederList.empty();
$.each(jederArr, function (_, j) {
if (!j || !j.quote) return;
var li = buildJederFn ? buildJederFn() : $("<li class='wiktku-dfn-jeder-li'></li>");
li.find(".wiktku-dfn-nimune-quote").val(j.quote).each(function () { highlightLinebreak(this); });
if (j.quoteTr) li.find(".wiktku-dfn-nimune-quote-tr").val(j.quoteTr);
if (j.quoteT) li.find(".wiktku-dfn-nimune-quote-t").val(j.quoteT);
if (j.jederManual) {
var manualSel = li.find(".wiktku-dfn-quote-src-sel");
manualSel.val("__manual__").trigger("change");
li.find(".wiktku-dfn-quote-src-manual").val(j.jederManual);
} else if (j.jederCatTpl) {
// Legacy format from before the şablon search switched rows to
// manual mode directly — convert it the same way now, so it's
// editable like any other free-form source.
var catSelEl = li.find(".wiktku-dfn-quote-src-sel");
catSelEl.val("__manual__").trigger("change");
li.find(".wiktku-dfn-quote-src-manual").val("{{" + j.jederCatTpl + "}}");
} else if (j.jederTpl) {
var srcSel = li.find(".wiktku-dfn-quote-src-sel");
srcSel.val(j.jederTpl).trigger("change");
if (j.jêderFields) {
$.each(j.jêderFields, function (key, val) {
li.find(".wiktku-dfn-quote-src-input[data-field-key='" + key + "']").val(val);
});
}
}
jederList.append(li);
});
// Always leave a blank trailing item, same as Nimûne.
if (buildJederFn) jederList.append(buildJederFn());
}
});
}
// Snapshots simple (non-dfn) per-section steps from the DOM into obj.
function saveCurrentSection() {
var snap = {};
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
snap.dfn = snapshotDfn();
return;
}
if (id === "etym") {
snap.etym = $.trim($("#wiktku-start-etym .wiktku-etym-text").val());
return;
}
if (id === "cavkani") {
snap.cavkani = $.trim($("#wiktku-start-cavkani .wiktku-cavkani-text").val());
return;
}
var step = steps[id];
if (!step) return;
var stepDiv = $("#wiktku-start-" + id);
if (id === "trans") {
snap.trans = steps.trans.getTranslations(stepDiv);
return;
}
if (id === "zarava") {
snap.zarava = steps.zarava.getTranslations(stepDiv);
return;
}
if (id === "dunde") {
snap.dunde = steps.dunde.getRows(stepDiv);
return;
}
// Generic: read all step fields.
var fields = stepDiv.find(".wiktku-start-step-field");
if (step.multiple) {
snap[id] = fields.map(function () { return $(this).val(); }).get();
} else {
snap[id] = fields.val();
}
});
sections[activeSection] = snap;
}
// Restores a previously saved snapshot into the form DOM.
function restoreSection(snap) {
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
restoreDfn(snap.dfn || []);
return;
}
if (id === "etym") {
$("#wiktku-start-etym .wiktku-etym-wrap").remove();
steps.etym.build($("#wiktku-start-etym"));
$("#wiktku-start-etym .wiktku-etym-text").val(snap.etym || "");
return;
}
if (id === "cavkani") {
$("#wiktku-start-cavkani .wiktku-cavkani-wrap").remove();
steps.cavkani.build($("#wiktku-start-cavkani"));
$("#wiktku-start-cavkani .wiktku-cavkani-text").val(snap.cavkani || "");
return;
}
if (id === "trans") {
// Rebuild trans groups (dfn must already be restored by this
// point in the $.each loop, so glossList() reflects it).
var transDiv = $("#wiktku-start-trans");
transDiv.find(".wiktku-trans-group").remove();
steps.trans.build(transDiv);
var groupsSnap = snap.trans || [];
$.each(groupsSnap, function (gi, rows) {
var group = transDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
if (!group.length) return; // gloss no longer exists — drop its rows
var list = group.find("ul.wiktku-trans-list");
$.each(rows, function (j, row) {
var lang = row[0], words = row[1];
var lastRow = list.find("li.wiktku-trans-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-trans-words");
$.each(words, function (k, word) {
var wordItems = wordList.find("li");
if (k < wordItems.length) {
wordItems.eq(k).find("textarea").val(word);
} else {
// .val() below doesn't fire "input", so the normal
// auto-grow never runs — append a matching item
// ourselves instead of silently dropping the word.
var extraInput = steps.trans.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
// Leave one trailing empty field so the row can still grow
// when the user types, matching a freshly-built row.
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.trans.makeWordInput()));
}
});
});
return;
}
if (id === "zarava") {
// Rebuild zarava groups (dfn must already be restored by this
// point in the $.each loop, so glossList() reflects it).
var zaravaDiv = $("#wiktku-start-zarava");
zaravaDiv.find(".wiktku-zarava-group").remove();
steps.zarava.build(zaravaDiv);
var zaravaGroupsSnap = snap.zarava || [];
$.each(zaravaGroupsSnap, function (gi, rows) {
var group = zaravaDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
if (!group.length) return; // gloss no longer exists — drop its rows
var list = group.find("ul.wiktku-zarava-list");
$.each(rows, function (j, row) {
var lang = row[0], words = row[1];
var lastRow = list.find("li.wiktku-zarava-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-zarava-words");
$.each(words, function (k, word) {
var wordItems = wordList.find("li");
if (k < wordItems.length) {
wordItems.eq(k).find("textarea").val(word);
} else {
var extraInput = steps.zarava.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.zarava.makeWordInput()));
}
});
});
return;
}
if (id === "dunde") {
// Rebuild dunde rows.
var dundeDiv = $("#wiktku-start-dunde");
dundeDiv.find("ul.wiktku-dunde-list").remove();
steps.dunde.build(dundeDiv);
var dundeRows = snap.dunde || [];
$.each(dundeRows, function (i, row) {
var lang = row[0], words = row[1];
var list = dundeDiv.find("ul.wiktku-dunde-list");
var lastRow = list.find("li.wiktku-dunde-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-dunde-words");
$.each(words, function (j, word) {
var wordItems = wordList.find("li");
if (j < wordItems.length) {
wordItems.eq(j).find("textarea").val(word);
} else {
// .val() below doesn't fire "input", so the normal
// auto-grow never runs — append a matching item
// ourselves instead of silently dropping the word.
var extraInput = steps.dunde.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
// Leave one trailing empty field so the row can still grow
// when the user types, matching a freshly-built row.
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.dunde.makeWordInput()));
}
});
return;
}
var step = steps[id];
if (!step) return;
var stepDiv = $("#wiktku-start-" + id);
var fields = stepDiv.find(".wiktku-start-step-field");
var val = snap[id];
if (val === undefined || val === null) return;
if (step.multiple) {
var arr = val;
fields.each(function (i) {
if (i < arr.length) $(this).val(arr[i]);
});
} else {
fields.val(val);
}
// Tell the pickers about the programmatic value change.
fields.filter("select").trigger("wiktku:refresh");
});
}
function getWikitextForCurrentSection(callback) {
var values = getValues();
var entry = steps.pos.output(values);
steps.dfn.getOutput(values, function (output) {
entry += output;
entry += steps.je.output(values);
entry += steps.tekildar.output(values);
entry += steps.etym.output(values);
entry += steps.dunde.output(values);
entry += steps.binereherwiha.output(values);
entry += steps.zarava.output(values);
entry += steps.trans.output(values);
entry += steps.cavkani.output(values);
callback(entry, values);
});
}
function getWikitextAllSections(callback) {
saveCurrentSection();
var results = new Array(sections.length);
var sharedValues = getValues(); // lang/pron are shared
function processSection(i) {
if (i >= sections.length) {
// All done — restore original active section.
restoreSection(sections[activeSection]);
refresh();
callback(results, sharedValues);
return;
}
restoreSection(sections[i]);
refresh();
getWikitextForCurrentSection(function (sectionText) {
results[i] = sectionText;
processSection(i + 1);
});
}
processSection(0);
}
// Assembles wikitext for all sections plus the shared lang/pron header.
function getWikitext(callback) {
getWikitextAllSections(function (sectionTexts, sharedValues) {
var entry = steps.lang.output(sharedValues);
entry += steps.pron.output(sharedValues);
entry += sectionTexts.join("\n");
// Edit summary uses section 0's values. Read from the saved snapshot
// (not the live DOM) so it doesn't mix section 0's pos with whichever
// section happens to be active/restored at this point.
var dfnSenses = (sections[0] && sections[0].dfn) || [];
var dfnSummary = dfnSenses.map(function (s) {
if (s.mane) return s.mane;
// Template sense (e.g. {{guharto|ku|somepage}}) — same
// construction as the tplCall built in getOutput, so the
// summary shows what actually gets written to the entry
// instead of going blank.
if (s.tpl && s.tplTitle) {
return s.tplNoLang
? "{{" + s.tpl + "|" + s.tplTitle + "}}"
: "{{" + s.tpl + "|" + sharedValues.lang + "|" + s.tplTitle + "}}";
}
return "";
}).filter(Boolean).join("; ");
var summary = "([[Mediawiki:Gadget-start.js|WF:NÛ]] v.2.0) +" +
sharedValues.lang + ":" + sections[0].pos + ":" + dfnSummary;
var summaryField = document.getElementById("wpSummary");
if (addLangMode && summaryField.value) {
summary = summaryField.value + " " + summary;
}
summaryField.value = summary;
callback(entry);
});
}
var continueBtn;
function getValuesForStep(stepId) {
var fields = $("#wiktku-start-" + stepId + " .wiktku-start-step-field");
var step = steps[stepId];
if (step.keys) {
var values = {};
fields.each(function (i, field) {
var key = $(field).prevAll(".wiktku-start-step-keyfield").val();
if (key) values[key] = $(field).val();
});
return values;
}
else if (step.multiple) {
return fields.map(function () {
return $(this).val();
}).get();
}
return fields.val();
}
function getValues() {
var values = {};
$.each(steps, function (stepId) {
values[stepId] = getValuesForStep(stepId);
});
return values;
}
function populateMenus(inputs, choices, disabledValues, placeholderText) {
if (!disabledValues) disabledValues = {};
var vals = inputs.map(function (i, input) {
return $(input).val();
});
inputs.empty();
inputs.append($("<option></option>").text(placeholderText || ""));
$.each(choices, function (j, choice) {
// Append the language code in parentheses so that typing a code
// (e.g. "ku") in the search box still finds the language name.
var displayText = capitalize(choice.label);
if (choice.sortKey !== undefined) {
// This is a language choice {code, label, sortKey} — show code.
displayText = capitalize(choice.label) + " (" + choice.code + ")";
}
var option = $(mw.html.element("option", {
value: choice.code }, displayText));
if (disabledValues[choice.code]) option.prop("disabled", true);
inputs.append(option);
});
inputs.val(function (i) {
return vals[i];
});
}
// Keys to disable for a key menu: already-taken or explicitly disabled.
function getDisabledKeys(step) {
var occupiedKeys = {};
$("#wiktku-start-" + step.id + " .wiktku-start-step-keyfield").each(function () {
occupiedKeys[$(this).val()] = true;
});
if (step.disabledKeys) $.extend(occupiedKeys, step.disabledKeys);
return occupiedKeys;
}
function buildKeyInput(step) {
if (!step.keys) return undefined;
var input = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
input.attr("data-placeholder", "Hilbijêre " + step.keyName);
populateMenus(input, step.keys, getDisabledKeys(step));
// Keep the key menus mutually exclusive: whatever one row selects is
// disabled in every other row. Recomputed from the DOM on each change.
input.on("change", function () {
var all = $("#wiktku-start-" + step.id + " .wiktku-start-step-keyfield");
var taken = {};
all.each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
all.not(this).each(function () {
var self = $(this), own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (code) $(this).prop("disabled", !!taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
});
// Return the wrapper; the select lives inside it and still fires change.
return wrapNativeSelect(input);
}
// Adds another text field to the list if the last one now has text.
function refreshForTextField(currentInput, step) {
currentInput = $(currentInput);
var value = currentInput.val();
var item = currentInput.parent();
if (value && !item.next("li").length) {
var nextInput = $("<textarea></textarea>")
.attr("name", "wiktku-field-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", currentInput.attr("class"))
.attr("rows", currentInput.attr("rows") || 1);
if (step.placeholder) nextInput.attr("placeholder", step.placeholder);
nextInput.on("input", function (evt) {
refreshForTextField(evt.target, step);
});
var nextKeyInput = buildKeyInput(step);
var nextItem = $("<li></li>").append(nextKeyInput).append(nextInput);
item.parent().append(nextItem);
if (nextKeyInput) initSelects(nextItem);
}
var canContinue = !continueBtn.isDisabled();
if ((value && !canContinue) || (!value && canContinue)) {
refresh(step);
}
}
function prepareInput(input, step) {
if (!input) return;
if (step.required) input.prop('required', true);
input.change(step, refresh);
}
// Shows/hides steps based on whether their prerequisites are met, and
// updates placeholders where applicable.
function refresh(evt) {
var values = getValues();
var changedStep = evt && evt.data;
var didFocus = false;
var canContinue = true;
// Re-filter template options in every sense block whenever lang changes.
$("#wiktku-start-dfn .wiktku-dfn-tpl-select").each(function () {
var fn = $(this).data("updateOptions");
if (typeof fn === "function") fn();
});
// Re-filter pronunciation and etymology template dropdowns when language changes.
steps.pron.refreshTplSelect();
steps.etym.refreshTplSelect();
steps.cavkani.refreshTplSelect();
// Re-render any step's question label that depends on current values
// (e.g. dfn's Werger-section reminder, which only applies to ku).
$.each(steps, function (stepId, step) {
if (typeof step.question_fmt === "function") {
$("#wiktku-start-" + stepId + " .wiktku-start-step-question")
.text(step.question_fmt(values));
}
});
// Sync every sense block's mane-box mode (plain mane vs tercime+îzah)
// to the current language, in case lang changes after blocks exist.
$("#wiktku-start-dfn li.wiktku-dfn-sense").each(function () {
var updateMane = $(this).data("updateManeMode");
if (updateMane) updateMane();
});
// Sync tr/t sub-fields in every nimûne item to the current language.
// tr shown when language needs transliteration; t shown when lang !== "ku".
(function () {
var lang = values.lang || "";
var showTr = needsTransliteration(lang);
var showT = lang && lang !== "ku";
$("#wiktku-start-dfn .wiktku-dfn-nimune-list li.wiktku-dfn-nimune-li").each(function () {
var li = $(this);
// Ensure the sub-wrapper exists when we need it.
var subWrap = li.find(".wiktku-dfn-nimune-sub");
// tr field
var trTa = li.find(".wiktku-dfn-nimune-tr");
if (showTr && !trTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
li.append(subWrap);
}
trTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-tr")
.attr("placeholder", "Transliterasyon…");
subWrap.prepend(trTa);
} else if (!showTr && trTa.length) {
trTa.remove();
}
// t field
var tTa = li.find(".wiktku-dfn-nimune-t");
if (showT && !tTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
li.append(subWrap);
}
tTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-t")
.attr("placeholder", "Tercimeya nimûneyê bi kurmancî…");
subWrap.append(tTa);
} else if (!showT && tTa.length) {
tTa.remove();
}
// Remove the wrapper if it ended up empty.
subWrap = li.find(".wiktku-dfn-nimune-sub");
if (subWrap.length && !subWrap.children().length) subWrap.remove();
});
}());
// Sync tr/t sub-fields in every jêder citation to the current language.
// tr shown when language needs transliteration; t shown when lang !== "ku".
(function () {
var lang = values.lang || "";
var showTr = needsTransliteration(lang);
var showT = lang && lang !== "ku";
$("#wiktku-start-dfn .wiktku-dfn-jeder-list li.wiktku-dfn-jeder-li").each(function () {
var li = $(this);
// Ensure the sub-wrapper exists when we need it. It must sit right
// after the quote textarea and before the source selector.
var subWrap = li.find(".wiktku-dfn-quote-sub");
// tr field
var trTa = li.find(".wiktku-dfn-nimune-quote-tr");
if (showTr && !trTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
// Insert after the quote textarea's resize-wrap (if the manual
// resize handle has already been attached to it), not after the
// bare textarea -- otherwise this lands *inside* that wrap,
// between the textarea and its own grip, breaking jêgirtin's
// handle and nesting the tr/t boxes inside it.
var quoteTa = li.find(".wiktku-dfn-nimune-quote");
var quoteResizeWrap = quoteTa.closest(".wiktku-resize-wrap");
(quoteResizeWrap.length ? quoteResizeWrap : quoteTa).after(subWrap);
}
trTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-tr")
.attr("placeholder", "Transliterasyona jêgirtinê…");
subWrap.prepend(trTa);
} else if (!showTr && trTa.length) {
trTa.remove();
}
// t field
var tTa = li.find(".wiktku-dfn-nimune-quote-t");
if (showT && !tTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
// See the tr-field branch above for why this targets the
// resize-wrap instead of the bare textarea.
var quoteTa2 = li.find(".wiktku-dfn-nimune-quote");
var quoteResizeWrap2 = quoteTa2.closest(".wiktku-resize-wrap");
(quoteResizeWrap2.length ? quoteResizeWrap2 : quoteTa2).after(subWrap);
}
tTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-t")
.attr("placeholder", "Tercimeya jêgirtinê bi kurmancî…");
subWrap.append(tTa);
} else if (!showT && tTa.length) {
tTa.remove();
}
// Remove the wrapper if it ended up empty.
subWrap = li.find(".wiktku-dfn-quote-sub");
if (subWrap.length && !subWrap.children().length) subWrap.remove();
});
}());
$.each(steps, function (stepId, step) {
if (typeof(step.visible) === "function" && !step.visible(values)) {
$("#wiktku-start-" + stepId).slideUp();
}
else {
var stepDiv = $("#wiktku-start-" + stepId);
if (changedStep !== step && typeof(step.build) === "function") {
prepareInput(step.build(stepDiv, values), step);
}
var input = stepDiv.find(".wiktku-start-step-field");
if (typeof(step.example) === "function") {
// .find() above already reaches nested fields (e.g. the dfn
// step's mane textareas inside each sense block), so one
// assignment covers every step; dfn keeps its own fallback.
var exampleText = step.example(values) || (step.id === "dfn" ? "Mane…" : "");
input.attr("placeholder", exampleText);
}
var didSlideDown;
if (!didFocus && stepDiv.css("display") === "none" && step.required) {
// Skip scrolling for the first section (ziman) since it's
// always at the top of the page.
if (step.id !== "lang") {
didSlideDown = function (evt) {
var stepEl = stepDiv.get(0);
if (stepEl && typeof stepEl.scrollIntoView === "function") {
stepEl.scrollIntoView({ behavior: "smooth", block: "start" });
}
};
}
didFocus = true;
}
stepDiv.slideDown(didSlideDown);
}
if (step.required &&
(values[stepId] === "" ||
(step.multiple && values[stepId].join("") === ""))) {
canContinue = false;
}
});
continueBtn.setDisabled(!canContinue);
}
function destroy() {
$("#wiktku-start-form, .noafterwizard").slideUp(function () {
$(this).remove();
});
$(".noarticletext .nowizard, #editform").slideDown();
$("#ca-edit").removeClass("selected");
$("#ca-wiktku-nowizard").addClass("selected");
}
// Priority order for Kurdish dialects and navz.
// Codes listed here come before all other languages; unlisted codes
// are sorted alphabetically by their display name via localeCompare.
var LANG_PRIORITY = ["navz", "ku", "hac", "sdh", "lki", "ckb", "zza"];
// Inserts a new "== {{ziman|code}} ==" section at the correct sorted
// position: navz, then ku/hac/sdh/lki/ckb/zza, then alphabetical by name.
function insertNewLangSection(existing, wikitext) {
var newCodeMatch = wikitext.match(new RegExp("^" + langHeaderSource("[^}]+")));
var newCode = newCodeMatch ? newCodeMatch[1] : "";
var sections = [];
var preamble = "";
var anyHeaderSrc = langHeaderSource("[^}]+");
var firstMatch = new RegExp("^" + anyHeaderSrc, "m").exec(existing);
if (!firstMatch) {
// No existing lang sections at all — just append.
var sep = existing && !/\n\s*$/.test(existing) ? "\n\n" : "";
return existing + sep + wikitext;
}
// Everything before the first == {{ziman|...}} == is the preamble.
var firstSectionStart = firstMatch.index;
// Walk back to the start of that line.
var lineStart = existing.lastIndexOf("\n", firstSectionStart - 1);
var preambleEnd = lineStart !== -1 ? lineStart + 1 : 0;
preamble = existing.slice(0, preambleEnd);
// Parse each language section: header line + everything until the next header.
var body = existing.slice(preambleEnd);
// (?![\s\S]) matches only true end-of-string, since a bare "$" with
// /m would stop at the section's first line break instead.
var langSectionRe = new RegExp(
"^(" + anyHeaderSrc + "\\n?)([\\s\\S]*?)(?=\\n" + anyHeaderSrc + "|(?![\\s\\S]))",
"gm"
);
var m;
while ((m = langSectionRe.exec(body)) !== null) {
sections.push({
code: m[2],
content: m[0] // full text of this section including header
});
}
// Determine sort rank: priority list first (by index), then alphabetical.
function getLangName(code) {
var entry = langsByCode[code];
return entry ? entry.label : code;
}
function sortRank(code) {
var idx = LANG_PRIORITY.indexOf(code);
return idx !== -1 ? idx : LANG_PRIORITY.length;
}
function compareLangs(a, b) {
var ra = sortRank(a), rb = sortRank(b);
if (ra !== rb) return ra - rb;
// Both are outside priority list — sort by display name.
return getLangName(a).localeCompare(getLangName(b), userLang);
}
// Insert the new section into the sorted list.
var newSection = { code: newCode, content: wikitext };
var inserted = false;
for (var i = 0; i < sections.length; i++) {
if (compareLangs(newCode, sections[i].code) < 0) {
sections.splice(i, 0, newSection);
inserted = true;
break;
}
}
if (!inserted) sections.push(newSection);
// Re-join: preamble + sections separated by newlines.
var joined = sections.map(function (s) {
// Ensure each section ends with exactly one newline before the next.
return s.content.replace(/\n+$/, "");
}).join("\n");
return preamble + joined + "\n";
}
function build() {
$(".nowizard, .nowizard .noafterwizard").hide();
var callToAction = $("#wiktku-calltoaction");
var origCallToActionText = callToAction.text();
$(mw.util.addPortletLink("p-views", "#", "Edîtora çavkaniyê veke",
"ca-wiktku-nowizard", "Vê rûpelê bi edîtora çavkaniyê çêke",
undefined, "#ca-watch")).click(function (evt) {
evt.preventDefault();
callToAction.text(origCallToActionText);
destroy();
});
if (callToAction.length) {
callToAction.text(origCallToActionText +
" Forma li jêr ji bo çêkirina madeyeke nû bi kar bîne.");
}
var startForm = $("<form id='wiktku-start-form'></form>");
var clearPageCheck = null;
if (addLangMode) {
startForm.append($("<p class='wiktku-addlang-notice'></p>").html(
"Bi vê formê tu yê zimanekî nû li rûpelê îlawe bikî. Eger ev ziman jixwe hebe, beşa nû li dawiya vî zimanî dê were îlawekirin. " +
"Ji kerema xwe netîceya dawî kontrol bike, eger problemek derkeve, li <a href='" +
mw.util.getUrl('Mediawiki talk:Gadget-start.js') +
"'>nîqaşa vê amûrê</a> problemê ragihîne."
));
clearPageCheck = $("<input type='checkbox' id='wiktku-clear-page-check'>");
var clearPageLabel = $("<label for='wiktku-clear-page-check'></label>")
.text(" Muhtewaya rûpelê paqij bike (her tiştî jê bibe û rûpelê ji nû ve binivîse)");
startForm.append(
$("<p class='wiktku-addlang-notice'></p>")
.append(clearPageCheck)
.append(clearPageLabel)
);
// Re-evaluate step visibility (e.g. the pron step) whenever this
// is toggled, since it changes what counts as "existing content".
clearPageCheck.on("change", function () {
refresh();
});
}
var spinner;
// Tab bar for switching between POS sections.
var sectionTabsDiv = $("<div id='wiktku-section-tabs'></div>");
startForm.submit(function (evt) {
evt.preventDefault();
continueBtn.setDisabled(true);
continueBtn.$element.addClass("wiktku-btn-sending");
spinner.show();
getWikitext(function (wikitext) {
if (addLangMode && clearPageCheck && clearPageCheck.prop("checked")) {
// User asked to wipe the page and start fresh — just
// write the newly generated wikitext as the full content.
$("#wpTextbox1").val(wikitext);
} else if (addLangMode) {
var textbox = $("#wpTextbox1");
var existing = textbox.val() || "";
// If this language's section already exists (whitespace
// differences aside), merge into it; otherwise insert new.
var langHeaderMatch = wikitext.match(new RegExp("^(" + langHeaderSource("[^}]+") + "\\n)"));
if (langHeaderMatch) {
var langHeader = langHeaderMatch[1]; // e.g. "== {{ziman|ku}} ==\n"
var newCode = langHeaderMatch[2];
var existingHeader = findLangHeader(existing, newCode);
if (existingHeader) {
// Strip the header from the new output.
var newContent = wikitext.slice(langHeader.length);
// Find the insertion point: end of the existing lang section.
// A new L2 heading marks the start of the next language block.
var searchFrom = existingHeader.index + existingHeader.match.length;
// Find the next == … == heading after this section's start.
var nextL2 = existing.indexOf("\n== ", searchFrom);
var insertAt = nextL2 !== -1 ? nextL2 : existing.length;
// Ensure there's a blank line before the inserted block.
var before = existing.slice(0, insertAt);
var after = existing.slice(insertAt);
var sep = /\n\s*$/.test(before) ? "" : "\n";
textbox.val(before + sep + newContent + after);
} else {
// New language — insert at the correct sorted position.
textbox.val(insertNewLangSection(existing, wikitext));
}
} else {
// Unexpected format — insert at sorted position anyway.
textbox.val(insertNewLangSection(existing, wikitext));
}
} else {
$("#wpTextbox1").val(wikitext);
}
$("html, body").animate({scrollTop: 0});
callToAction.text("Hindik ma!");
$("#wiktku-preview-container").remove();
destroy();
});
});
$.each(ordered_steps, function (i, step) {
var stepDiv = $(mw.html.element("div", {
"class": "wiktku-start-step",
id: "wiktku-start-" + step.id }));
var name = capitalize(step.name);
stepDiv.append($(mw.html.element("h3", {
"class": "wiktku-start-step-name" }, new mw.html.Raw(mw.html.element("label", {
"for": "wiktku-start-" + step.id + "-field" }, name)))));
if (step.question_fmt) {
// question_fmt can be a plain string, or a function of the
// current values (used by steps whose question text depends
// on e.g. the chosen language) — refresh() keeps it in sync
// afterwards via the .wiktku-start-step-question class.
var questionText = typeof step.question_fmt === "function"
? step.question_fmt(getValues())
: step.question_fmt;
stepDiv.append($(mw.html.element("label", {
"class": "wiktku-start-step-question",
"for": "wiktku-start-" + step.id + "-field" }, questionText)));
if (step.question_br) stepDiv.append($("<br>"));
}
var input;
if (step.choices) {
input = $(mw.html.element("select", {
"class": "wiktku-start-step-field",
id: "wiktku-start-" + step.id + "-field" }));
input.attr("data-placeholder",
capitalize(step.name) + " hilbijêre ");
populateMenus(input, step.choices);
if (step.multiple) input.attr("multiple", true);
// initSelects() runs over the whole form once it is in the DOM.
stepDiv.append(input);
} else if (typeof(step.build) === "function") {
input = step.build(stepDiv);
} else {
input = $("<textarea></textarea>")
.attr("class", "wiktku-start-step-field")
.attr("id", "wiktku-start-" + step.id + "-field")
.attr("rows", step.rows || 2);
if (step.narrow) input.addClass("wiktku-start-narrow");
if (step.placeholder) input.attr("placeholder", step.placeholder);
if (step.multiple) {
input.on("input", function (evt) {
refreshForTextField(evt.target, step);
});
var keyInput = buildKeyInput(step);
var list = $(step.ordered ? "<ol></ol>" : "<ul></ul>")
.append($("<li></li>").append(keyInput).append(input));
stepDiv.append(list);
}
else stepDiv.append(input);
}
prepareInput(input, step);
stepDiv.hide();
// Insert tab bar just before the first per-section step.
if (step.id === "pos") startForm.append(sectionTabsDiv);
startForm.append(stepDiv);
});
// ── Section tab helpers ──────────────────────────────────────────────
// ── Add-section button — lives in the tab bar, disabled until pos chosen ──
var addSectionBtn = new OO.ui.ButtonWidget({
label: "+ Beş zêde bike",
disabled: true
});
addSectionBtn.on("click", function () {
saveCurrentSection();
sections.push({});
activeSection = sections.length - 1;
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
var stepDiv = $("#wiktku-start-dfn");
stepDiv.find("ol.wiktku-dfn-list").remove();
steps.dfn.build(stepDiv);
return;
}
if (id === "etym") {
$("#wiktku-start-etym .wiktku-etym-wrap").remove();
steps.etym.build($("#wiktku-start-etym"));
return;
}
if (id === "cavkani") {
$("#wiktku-start-cavkani .wiktku-cavkani-wrap").remove();
steps.cavkani.build($("#wiktku-start-cavkani"));
return;
}
if (id === "trans") {
var transDiv = $("#wiktku-start-trans");
transDiv.find(".wiktku-trans-group").remove();
return;
}
if (id === "zarava") {
var zaravaDiv = $("#wiktku-start-zarava");
zaravaDiv.find(".wiktku-zarava-group").remove();
return;
}
if (id === "dunde") {
var dundeDiv = $("#wiktku-start-dunde");
dundeDiv.find("ul.wiktku-dunde-list").remove();
return;
}
var stepDiv = $("#wiktku-start-" + id);
stepDiv.find(".wiktku-start-step-field").val("");
stepDiv.find("select.wiktku-start-step-field").trigger("wiktku:refresh");
});
renderSectionTabs();
refresh();
$("html, body").animate({ scrollTop: sectionTabsDiv.offset().top - 20 }, 300);
});
/** Re-render the tab bar to reflect current sections[] and activeSection. */
function renderSectionTabs() {
// Detach (not remove) the button first: .empty() strips bound
// event data from any children left inside it, which would
// silently kill addSectionBtn's click handler on every re-render.
addSectionBtn.$element.detach();
sectionTabsDiv.empty();
var lang = getValues().lang || "";
if (!lang) {
sectionTabsDiv.hide();
return;
}
sectionTabsDiv.show();
$.each(sections, function (i) {
var posVal = sections[i].pos || "";
var tabLabel = posVal ? capitalize(posVal) : ("Beş " + (i + 1));
var tab = $("<span></span>")
.addClass("wiktku-section-tab")
.text(tabLabel)
.toggleClass("wiktku-tab-active", i === activeSection);
(function (idx) {
tab.on("click", function () {
if (idx === activeSection) return;
saveCurrentSection();
activeSection = idx;
restoreSection(sections[activeSection]);
refresh();
renderSectionTabs();
});
}(i));
sectionTabsDiv.append(tab);
});
// Enable "Beş zêde bike" only when the active section has a pos chosen.
var activePos = sections[activeSection] && sections[activeSection].pos
? sections[activeSection].pos
: getValues().pos;
addSectionBtn.setDisabled(!activePos);
sectionTabsDiv.append(addSectionBtn.$element);
}
renderSectionTabs();
/**
* Restores a full cached draft: shared lang/pron fields, then every
* section (via the same restoreSection()/refresh()/renderSectionTabs()
* sequence already used when switching tabs).
* @param cached {{lang: string, pron: string, sections: Array, activeSection: number}}
*/
function restoreFromCache(cached) {
if (cached.lang) {
$("#wiktku-start-lang-field").val(cached.lang);
$("#wiktku-start-lang-field").trigger("wiktku:refresh");
}
// Rebuild dependent steps (pos, pron wrap, etc.) now that lang is set.
refresh();
if (cached.pron !== undefined) {
$("#wiktku-start-pron .wiktku-pron-text").val(cached.pron);
}
sections = (cached.sections && cached.sections.length) ? cached.sections : [{}];
activeSection = (typeof cached.activeSection === "number" &&
cached.activeSection >= 0 && cached.activeSection < sections.length)
? cached.activeSection : 0;
restoreSection(sections[activeSection]);
refresh();
renderSectionTabs();
mw.notify("Danûstandina berê ya qeydkirî ji cache hate barkirin.",
{ type: "info", tag: "wiktku-cache-restore" });
}
// Update the active tab's label whenever pos changes.
startForm.on("change", "#wiktku-start-pos-field", function () {
renderSectionTabs();
});
// Show the tab bar as soon as a language is selected.
startForm.on("change", "#wiktku-start-lang-field", function () {
renderSectionTabs();
});
var footer = $("<div id='wiktku-start-footer'></div>");
spinner = $(mw.html.element("img", {
id: "wiktku-start-spinner",
src: "//upload.wikimedia.org/wikipedia/commons/d/de/Ajax-loader.gif",
alt: "Tê barkirin…",
title: "Tê barkirin…" }));
footer.append(spinner.hide());
continueBtn = new OO.ui.ButtonWidget({
id: "wiktku-unhide-editform",
label: "Bişîne",
flags: [ "primary", "progressive" ]
});
continueBtn.on("click", function () {
// Immediate feedback that the click registered
continueBtn.$element.addClass("wiktku-btn-flash");
setTimeout(function () {
continueBtn.$element.removeClass("wiktku-btn-flash");
}, 500);
mw.notify("Tê şandin…", { type: "info", tag: "wiktku-submit" });
startForm.trigger("submit");
});
footer.append(continueBtn.$element);
// "Edîtora çavkaniyê veke" button — inline fallback for the portlet link
var sourceEditorBtn = new OO.ui.ButtonWidget({
label: "Edîtora çavkaniyê veke"
});
sourceEditorBtn.on("click", function () {
destroy();
});
footer.append(sourceEditorBtn.$element);
// ── Cache save/clear buttons ─────────────────────────────────────────
// Manual, page-scoped save of the entire wizard (all sections, not
// just the active one) via [[MediaWiki:Gadget-StorageUtils.js]]'s
// ObjectStorage. Restoring happens silently on load at the end of
// build(), once the full language list is available.
var saveCacheBtn = new OO.ui.ButtonWidget({
label: "Li cache qeyd bike",
title: "Halê vê formê yê niha (ziman, bilêvkirin û hemû beş) li cache (localStorage) qeyd bike, da ku eger rûpel bêyî xwestin were girtin an ji nû ve were barkirin, tu karibî berdewam bikî."
});
saveCacheBtn.on("click", function () {
saveCurrentSection();
var snapshot = {
lang: getValues().lang || "",
pron: $("#wiktku-start-pron .wiktku-pron-text").val() || "",
sections: sections,
activeSection: activeSection
};
// ObjectStorage.Set() doesn't return a success/failure value, so
// the only way to detect a real failure (storage blocked, quota
// exceeded, JSON.stringify choking on something unexpected) is to
// catch it here rather than inspect a (nonexistent) return value.
try {
formCache.Set(snapshot);
mw.notify("Halê formê li cache hate qeydkirin.", { type: "success", tag: "wiktku-cache-save" });
} catch (e) {
mw.notify("Qeydkirina li cache bi ser neket.", { type: "error", tag: "wiktku-cache-save" });
}
});
footer.append(saveCacheBtn.$element);
var clearCacheBtn = new OO.ui.ButtonWidget({
label: "Cache paqij bike",
flags: [ "destructive" ],
title: "Datayên qeydkirî yên vê rûpelê ji cache jê bibe (forma ku niha xuya dike naguherîne)."
});
clearCacheBtn.on("click", function () {
formCache.Set({});
mw.notify("Cache hate paqijkirin.", { type: "success", tag: "wiktku-cache-clear" });
});
footer.append(clearCacheBtn.$element);
// ── Preview checkboxes ───────────────────────────────────────────────
// Wikitext preview (raw text panel)
var previewCheck = $("<input type='checkbox' id='wiktku-preview-toggle'>");
var previewLabel = $("<label for='wiktku-preview-toggle'></label>")
.text(" Pêşdîtina wîkîtekstê");
var previewPanel = $("<pre id='wiktku-preview-panel'></pre>").hide();
// Live rendered preview (parsed HTML panel, same logic as AjaxEdit).
// Not available on mobile — API polling causes too many problems on small screens.
var livePreviewCheck = null;
var livePreviewPanel = null;
if (!isMobile) {
livePreviewCheck = $("<input type='checkbox' id='wiktku-live-preview-toggle'>");
livePreviewPanel = $("<div id='wiktku-live-preview-panel'></div>").hide();
}
// Container that holds both panels and switches between stacked / side-by-side.
var previewContainer = $("<div id='wiktku-preview-container'></div>");
previewContainer.append(previewPanel);
if (!isMobile) previewContainer.append(livePreviewPanel);
var previewTimer = null;
var livePreviewIntervalId = -1;
var livePreviewActive = false; // guards in-flight fetches after uncheck
/** Rebuilds wikitext preview if its checkbox is checked. */
function schedulePreview() {
if (!previewCheck.prop("checked")) return;
clearTimeout(previewTimer);
// Debounce: wait 400 ms after the last keystroke before rebuilding.
previewTimer = setTimeout(function () {
getWikitext(function (wikitext) {
previewPanel.text(wikitext).show();
updatePanelLayout();
});
}, 400);
}
/** Fetches parsed HTML and populates the live preview panel. */
function loadLivePreview() {
getWikitext(function (wikitext) {
new mw.Api().parse(wikitext, { title: mw.config.get("wgPageName") }).done(function (html) {
// Discard result if the user unchecked while the fetch was in flight.
if (!livePreviewActive) return;
livePreviewPanel.html(html).show();
updatePanelLayout();
});
});
}
/** Adjusts panel widths depending on which previews are visible. */
function updatePanelLayout() {
var wikitextVisible = previewCheck.prop("checked");
var liveVisible = livePreviewCheck && livePreviewCheck.prop("checked");
if (wikitextVisible && liveVisible) {
// Side by side — each panel takes roughly half the available width.
previewPanel.css({ "flex": "1 1 45%", "min-width": "280px" });
livePreviewPanel.css({ "flex": "1 1 45%", "min-width": "280px" });
} else {
// Full width for whichever is visible — only touch panels that are
// actually shown so that setting flex doesn't override display:none.
if (wikitextVisible) previewPanel.css({ "flex": "1 1 100%", "min-width": "" });
if (liveVisible && livePreviewPanel) livePreviewPanel.css({ "flex": "1 1 100%", "min-width": "" });
}
}
previewCheck.on("change", function () {
if ($(this).prop("checked")) {
schedulePreview();
} else {
clearTimeout(previewTimer);
previewPanel.hide();
updatePanelLayout();
}
});
if (!isMobile) {
livePreviewCheck.on("change", function () {
if ($(this).prop("checked")) {
livePreviewActive = true;
livePreviewPanel.show();
loadLivePreview();
livePreviewIntervalId = setInterval(loadLivePreview, 500);
} else {
livePreviewActive = false;
clearInterval(livePreviewIntervalId);
livePreviewIntervalId = -1;
livePreviewPanel.hide().empty();
updatePanelLayout();
}
});
}
// Listen on all input/change events on the form and update both previews.
startForm.on("input change", function () {
schedulePreview();
});
footer.append($("<span style='margin-left:1em'></span>")
.append(previewCheck).append(previewLabel));
if (!isMobile) {
var livePreviewLabel = $("<label for='wiktku-live-preview-toggle'></label>")
.text(" Pêşdîtina zindî");
footer.append($("<span style='margin-left:1em'></span>")
.append(livePreviewCheck).append(livePreviewLabel));
}
startForm.append(footer);
$("#editform").hide().before(startForm);
// Insert preview container (holds both panels) after the form.
startForm.after(previewContainer);
// One pass over the whole form: every select that hasn't already been
// initialised, and isn't opted out with .wiktku-plain-select, gets
// the searchable picker.
initSelects(startForm);
refresh();
// Give every draggable textarea a custom resize grip (works
// consistently on Safari/iOS, unlike the native corner grip — see
// the "Manual drag-to-resize handle" comment in styles.css), and
// keep applying it to textareas added later on (new sense blocks,
// quote-source fields, nimûne rows, …).
wiktkuInitManualResize(startForm);
new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
$(mutation.addedNodes).each(function () {
if (this.nodeType !== 1) return;
wiktkuInitManualResize(this);
});
});
}).observe(startForm[0], { childList: true, subtree: true });
// Now that the full language list is loaded, silently restore any
// draft the editor previously saved for this page.
var cachedDraft = formCache.Get();
if (cachedDraft && cachedDraft.sections && cachedDraft.sections.length) {
restoreFromCache(cachedDraft);
}
}
mw.loader.using(["oojs-ui-core"], function () {
// Load metadata, langChoices, posChoices and tplDefs from the companion
// data page so they can be updated without touching this script.
// (Request was already fired via metaApiPromise above, in parallel
// with this module load — we're just picking up the result here.)
metaApiPromise.then(function (data) {
var page = data.query.pages[0];
var content = page &&
page.revisions &&
page.revisions[0].slots.main.content;
var d;
try { d = JSON.parse(content); } catch (e) { d = {}; }
// Populate metadata.
if (d.metadata) $.extend(metadata, d.metadata);
// Populate gender labels.
if (d.genderLabels) $.extend(GENDER_BASE_LABELS, d.genderLabels);
// Populate lang choices (pinned list).
if (d.langChoices) steps.lang.choices = choicesFromObject(d.langChoices, true);
// Populate langsByCode and merge full language list from d.ziman.
// d.ziman is a {code: name} object with all known languages.
$.each(steps.lang.choices, function (i, choice) {
if (choice.sortKey === undefined) choice.sortKey = choice.label;
langsByCode[choice.code] = choice;
});
if (d.ziman) {
var pinnedCodes = {};
$.each(steps.lang.choices, function (i, c) { pinnedCodes[c.code] = true; });
var extraChoices = [];
$.each(d.ziman, function (code, name) {
if (/-pro$/i.test(code)) return;
if (/ziman[eê]\s+destan/i.test(name)) return;
if (pinnedCodes[code]) return;
var choice = { code: code, label: name, sortKey: name };
extraChoices.push(choice);
langsByCode[code] = choice;
});
extraChoices.sort(function (a, b) {
return a.sortKey.localeCompare(b.sortKey, userLang);
});
steps.lang.choices = steps.lang.choices.concat(extraChoices);
}
// Populate POS choices — also a plain {code: label} object in data.json.
if (d.posChoices) steps.pos.choices = choicesFromObject(d.posChoices, false);
// Populate template definitions for the dfn sense-block builder.
if (d.tplDefs) steps.dfn.tplDefs = d.tplDefs;
// Populate pos placeholder examples.
if (d.posExamples) steps.dfn.posExamples = d.posExamples;
// Populate citation template definitions for the quote widget.
if (d.jederDefs) steps.dfn.jederDefs = d.jederDefs;
// Populate pronunciation and etymology template insert lists.
if (d.pronTpls) {
steps.pron.pronTpls = d.pronTpls;
steps.pron.refreshTplSelect();
}
if (d.etymTpls) {
steps.etym.etymTpls = d.etymTpls;
steps.etym.refreshTplSelect();
}
// Sync trans/dunde/zarava keys with the full language list.
steps.trans.keys = steps.lang.choices;
steps.dunde.keys = steps.lang.choices;
steps.zarava.keys = getZaravaKeys(steps.lang.choices);
}).always(build);
});
});
//</nowiki>
hhdusmfvad8tv1xdgkmubvdsny0ocsy
6292086
6292077
2026-07-29T21:12:17Z
Wikihez
7344
6292086
javascript
text/javascript
// Li ser [[vi:MediaWiki:Gadget-start.js]] hatiye refaktorkirin.
// implicit dependencies: StorageUtils (ObjectStorage)
//<nowiki>
$(function () {
if (window.location.href.includes("editintro=User:Wikihez/creation/intro")) {
return; // Do not run the script wextê WF:Bilez dişuxile
}
var ns = mw.config.get("wgNamespaceNumber");
if (ns &&
!(ns === 2 && mw.config.get("wgPageName").match(/\/ceribandin$|\/test$/))) {
return;
}
var action = mw.config.get("wgAction");
var pageExists = !!mw.config.get("wgArticleId");
var addLangMode = pageExists && mw.util.getParamValue("wiktkuaddlang") === "1";
if (action === "view" && pageExists) {
var targetContainer;
var skin = mw.config.get('skin');
if (skin === 'vector-2022') {
targetContainer = 'p-cactions';
} else if (skin === 'vector') {
targetContainer = 'p-tb';
} else {
targetContainer = 'p-views';
}
mw.util.addPortletLink(targetContainer,
mw.util.getUrl(mw.config.get("wgPageName"), { action: "submit", wiktkuaddlang: "1" }),
"+Ziman/beşeke din", "ca-wiktku-addlang",
"Ji vê rûpelê re ziman an jî beşeke nû zêde bike");
return;
}
if (!(action === "edit" || action === "submit")) {
return;
}
if (!addLangMode && !$(".mw-newarticletext, .mw-newarticletextanon").length) {
return;
}
mw.notify(
"Amûr dest pê dike, hinek bisekinin.\nNot: jkx Sentaks (Syntax highlighting) neaktîv bikin",
{ type: "info", tag: "wiktku-start-notice", autoHide: true, autoHideSeconds: 10 }
);
var dataJsonPromise;
var metaApiPromise = mw.loader.using("mediawiki.api").then(function () {
var metaApi = new mw.Api();
dataJsonPromise = metaApi.get({
action: "query",
prop: "revisions",
titles: "MediaWiki:Gadget-start.js/data.json",
rvprop: "content",
rvslots: "main",
formatversion: 2
});
return dataJsonPromise;
});
function capitalize(str) {
if (!str) return str;
return str[0].toUpperCase() + str.substr(1);
}
function decapitalize(str) {
if (!str) return str;
return str[0].toLowerCase() + str.substr(1);
}
function escapeRegExp(str) {
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
function langHeaderSource(codePattern) {
return "\n?==\\s*\\{\\{\\s*ziman\\s*\\|\\s*(" + codePattern + ")\\s*\\}\\}\\s*==";
}
function findLangHeader(text, code) {
var m = new RegExp(langHeaderSource(escapeRegExp(code))).exec(text);
return m ? { index: m.index, match: m[0] } : null;
}
function stripWikilinks(str) {
return str.replace(/\[\[([^\]|]+)(?:\|([^\]]+))?\]\]/g, function (m, target, display) {
return display || target;
});
}
function splitTercimeIzah(mane) {
var m = /^([\s\S]*?)\s*\{\{îzah\|([\s\S]*)\}\}\s*$/.exec(mane || "");
return m ? { tercime: m[1], izah: m[2] } : null;
}
function insertAtCursor(el, text) {
var start = el.selectionStart;
var end = el.selectionEnd;
var val = el.value;
el.value = val.slice(0, start) + text + val.slice(end);
var pos = start + text.length;
el.selectionStart = el.selectionEnd = pos;
}
var catSrcTemplates = null;
var catSrcTemplatesPromise = null;
function fetchCatSrcTemplates() {
if (catSrcTemplatesPromise) return catSrcTemplatesPromise;
catSrcTemplatesPromise = new mw.Api().get({
action: "query",
list: "categorymembers",
cmtitle: "Kategorî:Çavkanî",
cmnamespace: 10,
cmlimit: "max",
formatversion: 2
}).then(function (data) {
var members = (data.query && data.query.categorymembers) || [];
catSrcTemplates = $.map(members, function (m) {
// Pêşgira navî ya "Şablon:" rake.
return m.title.replace(/^[^:]+:/, "");
});
catSrcTemplates.sort(function (a, b) { return a.localeCompare(b, userLang); });
return catSrcTemplates;
}, function () {
catSrcTemplates = [];
return catSrcTemplates;
});
return catSrcTemplatesPromise;
}
var pageName = mw.config.get("wgPageName").replaceAll(/_/g, " ");
if (ns) pageName = pageName.replace(/.*\//, "");
var pageNameRe = escapeRegExp(pageName);
var userLang = mw.config.get("wgUserLanguage");
var formCache = new ObjectStorage("wiktku_start_draft_" + mw.config.get("wgPageName"), 1);
var isMobile = !!mw.config.get("wgMFMode") || window.matchMedia("(pointer: coarse)").matches;
var FOLD_EXTRA = {
"ı": "i", // dotless i
"ø": "o", // o with stroke
"đ": "d", // d with stroke
"ð": "d", // eth
"ə": "e", // schwa
"ħ": "h", // h with stroke
"ł": "l", // l with stroke
"ŋ": "n", // eng
"ʉ": "u", // u bar
"ɨ": "i", // i bar
"ʒ": "z", // ezh
"ɛ": "e", // open e
"ɔ": "o", // open o
"æ": "ae",
"œ": "oe",
"ß": "ss",
"þ": "th" };
function foldDiacritics(str) {
if (str === null || str === undefined) return "";
var s = String(str).toLowerCase();
if (typeof s.normalize === "function") {
// Split "î" into "i" + combining circumflex, then drop the accent.
s = s.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
}
return s.replace(/[^\u0000-\u007f]/g, function (ch) {
return Object.prototype.hasOwnProperty.call(FOLD_EXTRA, ch) ? FOLD_EXTRA[ch] : ch;
});
}
var WIKTKU_RESIZE_STORAGE_PREFIX = "wiktku_resize_height_";
/** Textareas of the same "kind" (e.g. every Nimûne box, every Tercime
* box) share a class list even though each individual box is a fresh
* DOM node built on the fly (new sense blocks, quote fields, …) with
* no stable id of its own. That class list is what we key the cached
* height on, so a size chosen for one Nimûne box is reused for every
* Nimûne box, on this page and on the next one. */
function wiktkuResizeStorageKey(textarea) {
var cls = (textarea.attr("class") || "").trim().replace(/\s+/g, "_");
return WIKTKU_RESIZE_STORAGE_PREFIX + cls;
}
function wiktkuSaveResizeHeight(textarea, height) {
if (!(window.mw && mw.storage)) return;
try {
mw.storage.set(wiktkuResizeStorageKey(textarea), String(Math.round(height)));
} catch (e) { /* localStorage unavailable (private mode, quota, …) — skip caching */ }
}
function wiktkuLoadResizeHeight(textarea) {
if (!(window.mw && mw.storage)) return null;
try {
var v = mw.storage.get(wiktkuResizeStorageKey(textarea));
return v ? parseFloat(v) : null;
} catch (e) {
return null;
}
}
/** Replaces a textarea's native corner resize grip with a small custom
* drag handle (see the "Manual drag-to-resize handle" comment and
* .wiktku-resize-wrap / .wiktku-resize-grip in styles.css). Needed
* because iOS Safari never implements the native grip at all and
* desktop Safari's own version is inconsistent, so we replace it
* everywhere for uniform behaviour. One-line fields (.wiktku-start-narrow)
* are meant to stay a fixed height and are left untouched. Safe to call
* more than once on the same textarea. */
function wiktkuMakeManualResizable(textarea) {
textarea = $(textarea);
if (!textarea.is("textarea") || textarea.hasClass("wiktku-start-narrow")) return;
if (textarea.data("wiktkuResizableDone")) return;
textarea.data("wiktkuResizableDone", true);
textarea.wrap("<div class='wiktku-resize-wrap'></div>");
var grip = $("<div class='wiktku-resize-grip'></div>");
textarea.after(grip);
// Restore a previously chosen height for this kind of field, if any.
var cachedHeight = wiktkuLoadResizeHeight(textarea);
if (cachedHeight) {
var minHeightInit = parseFloat(textarea.css("min-height")) || 0;
textarea.css("height", Math.max(cachedHeight, minHeightInit) + "px");
}
var dragging = false, startY = 0, startHeight = 0;
function onPointerMove(e) {
if (!dragging) return;
var oe = e.originalEvent || e;
var minHeight = parseFloat(textarea.css("min-height")) || 0;
var newHeight = startHeight + (oe.clientY - startY);
textarea.css("height", Math.max(newHeight, minHeight) + "px");
}
function onPointerUp(e) {
if (!dragging) return;
dragging = false;
var oe = e.originalEvent || e;
try { grip[0].releasePointerCapture(oe.pointerId); } catch (err) { /* ignore */ }
$(document).off("pointermove", onPointerMove);
$(document).off("pointerup pointercancel", onPointerUp);
wiktkuSaveResizeHeight(textarea, textarea.outerHeight());
}
grip.on("pointerdown", function (e) {
var oe = e.originalEvent || e;
if (oe.button !== undefined && oe.button !== 0) return; // primary contact only
e.preventDefault();
dragging = true;
startY = oe.clientY;
startHeight = textarea.outerHeight();
try { grip[0].setPointerCapture(oe.pointerId); } catch (err) { /* ignore */ }
$(document).on("pointermove", onPointerMove);
$(document).on("pointerup pointercancel", onPointerUp);
});
}
/** Applies wiktkuMakeManualResizable to every eligible textarea already
* inside `context` (context itself, if it is a textarea, or any of its
* descendants). Used both for the initial form render and, via the
* MutationObserver set up in build(), for textareas added later on
* (new sense blocks, quote-source fields, nimûne rows, …). */
function wiktkuInitManualResize(context) {
var $context = $(context);
var $textareas = $context.is("textarea") ? $context : $context.find("textarea");
$textareas.each(function () {
wiktkuMakeManualResizable(this);
});
}
function wrapNativeSelect(select) {
var wrapper = $("<span class='wiktku-native-select-wrap'></span>");
if (select.prop("multiple")) {
return wrapper.append(select);
}
var placeholder = select.attr("data-placeholder") || "Lê bigere...";
select.hide();
var textInput = $("<input type='search' autocomplete='off'>")
.attr("placeholder", placeholder)
.attr("role", "combobox")
.attr("aria-autocomplete", "list")
.attr("aria-expanded", "false")
.addClass("wiktku-start-narrow wiktku-ac-input");
var resultsList = $("<ul class='wiktku-ac-results' role='listbox'></ul>").hide();
var allOptions = [];
var shown = [];
var activeIndex = -1;
function cacheOptions() {
allOptions = [];
select.find("option").each(function () {
var v = $(this).val();
var text = $(this).text();
// A blank value with no label (most selects' placeholder) is
// never a real choice, so skip it. But a blank value WITH a
// label -- e.g. tplSelect's "— yan jî şablonek hilbijêre —" --
// is a meaningful "clear the selection" choice, so keep it
// searchable/selectable like any other option.
if (!v && !text) return;
// Language options read "Name (code)" -- score the name on its own
// so the trailing code doesn't also count as a name match.
var name = text.replace(/\s*\([^()]*\)\s*$/, "");
allOptions.push({
value: v,
text: text,
disabled: $(this).prop("disabled"),
foldCode: foldDiacritics(v),
foldName: foldDiacritics(name),
foldText: foldDiacritics(text)
});
});
}
cacheOptions();
// True if `q` starts a word inside `name` ("kevn" in "ingiliziya kevn").
function startsWord(name, q) {
var from = 0, at;
while ((at = name.indexOf(q, from)) !== -1) {
if (at === 0 || /[\s\-\u2013\u2014(/,.]/.test(name.charAt(at - 1))) return true;
from = at + 1;
}
return false;
}
// Lower rank = better match.
// a code that *is* the query, or begins with it, always outranks a name
// that merely contains it -- so "ang" lists "Îngilîziya kevn (ang)"
// first instead of burying it among every name containing "ang".
var RANK_NONE = 99;
function rankOption(o, q) {
var code = o.foldCode, name = o.foldName;
if (code === q) return 0; // exact code
if (code.indexOf(q) === 0) return 1; // code prefix
if (name === q) return 2; // exact name
if (name.indexOf(q) === 0) return 3; // name prefix
if (startsWord(name, q)) return 4; // starts a word in the name
if (name.indexOf(q) !== -1) return 5; // name substring
if (code.indexOf(q) !== -1) return 6; // code substring
if (o.foldText.indexOf(q) !== -1) return 7; // anywhere else in the label
return RANK_NONE;
}
function positionList() {
// Position the list above or below depending on viewport space.
var inputRect = textInput[0].getBoundingClientRect();
var viewportH = window.innerHeight;
var spaceBelow = viewportH - inputRect.bottom - 8;
var spaceAbove = inputRect.top - 8;
var maxH = Math.min(224, Math.max(spaceBelow, spaceAbove)); // 224px = 14em
resultsList.css({
"max-height": maxH + "px",
"top": spaceBelow >= spaceAbove ? "100%" : "auto",
"bottom": spaceBelow >= spaceAbove ? "auto" : "100%"
});
}
function closeList() {
resultsList.hide();
textInput.attr("aria-expanded", "false");
activeIndex = -1;
}
function showResults(query) {
var q = foldDiacritics($.trim(query || ""));
resultsList.empty();
activeIndex = -1;
var matched = [];
if (q) {
$.each(allOptions, function (i, o) {
if (o.disabled) return;
var rank = rankOption(o, q);
if (rank !== RANK_NONE) matched.push({ opt: o, rank: rank, i: i });
});
if (!matched.length && q.indexOf(" ") !== -1) {
var tokens = q.split(/\s+/);
$.each(allOptions, function (i, o) {
if (o.disabled) return;
var all = true;
$.each(tokens, function (_, t) {
if (o.foldText.indexOf(t) === -1) { all = false; return false; }
});
if (all) matched.push({ opt: o, rank: 8, i: i });
});
}
matched.sort(function (a, b) {
if (a.rank !== b.rank) return a.rank - b.rank;
// Inside the code tiers the shorter code is the better hit:
// "an" -> "an" before "ang" before "ang-x-...".
if (a.rank <= 1 && a.opt.foldCode.length !== b.opt.foldCode.length) {
return a.opt.foldCode.length - b.opt.foldCode.length;
}
// Otherwise keep the menu's own order (pinned languages first).
return a.i - b.i;
});
} else {
$.each(allOptions, function (i, o) {
if (!o.disabled) matched.push({ opt: o, rank: 0, i: i });
});
}
shown = $.map(matched.slice(0, 50), function (m) { return m.opt; });
if (!shown.length) {
closeList();
return;
}
$.each(shown, function (idx, opt) {
var li = $("<li role='option'></li>")
.text(opt.text)
.attr("data-value", opt.value)
.attr("aria-selected", "false");
// touchend (not touchstart) so a scroll doesn't trigger a select.
var touchMoved = false;
li.on("touchstart", function () {
touchMoved = false;
});
li.on("touchmove", function () {
touchMoved = true;
});
li.on("touchend", function (e) {
if (touchMoved) return; // was a scroll, not a tap
e.preventDefault();
selectOption(opt.value, opt.text);
});
// mousedown (not click) so it beats the input's blur handler.
li.on("mousedown", function (e) {
e.preventDefault();
selectOption(opt.value, opt.text);
});
li.on("mouseenter", function () {
// Hovered items are already in view -- don't scroll the list
// under the mouse, or the shift can trigger the next item's
// mouseenter and cascade into a runaway scroll.
setActive(idx, /* scrollIntoView */ false);
});
resultsList.append(li);
});
positionList();
resultsList.show();
resultsList[0].scrollTop = 0;
textInput.attr("aria-expanded", "true");
}
function setActive(idx, scrollIntoView) {
var items = resultsList.children("li");
if (!items.length) return;
if (idx < 0) idx = items.length - 1;
if (idx >= items.length) idx = 0;
activeIndex = idx;
items.removeClass("wiktku-ac-active").attr("aria-selected", "false");
var li = items.eq(idx).addClass("wiktku-ac-active").attr("aria-selected", "true");
if (scrollIntoView === false) return;
// Keep the cursor visible inside the scrollable list -- only for
// keyboard navigation. A mouse-hovered item is already visible, so
// scrolling here would shift the list under a stationary pointer
// and cascade into further mouseenter events.
var ul = resultsList[0], el = li[0];
if (el.offsetTop < ul.scrollTop) {
ul.scrollTop = el.offsetTop;
} else if (el.offsetTop + el.offsetHeight > ul.scrollTop + ul.clientHeight) {
ul.scrollTop = el.offsetTop + el.offsetHeight - ul.clientHeight;
}
}
/** Puts the currently selected option's label back in the text box. */
function syncInputToSelect() {
var cur = select.val();
var match = null;
if (cur) {
$.each(allOptions, function (_, o) {
if (o.value === cur) { match = o; return false; }
});
}
textInput.val(match ? match.text : "");
}
function selectOption(value, text) {
textInput.val(text);
select.val(value);
closeList();
select.trigger("change");
}
textInput.on("input", function () {
showResults($(this).val());
});
textInput.on("focus", function () {
// Select the current label so typing replaces it, and open the full list
this.select();
showResults("");
});
textInput.on("click", function () {
if (!resultsList.is(":visible")) showResults($(this).val());
});
textInput.on("keydown", function (e) {
var open = resultsList.is(":visible");
switch (e.which) {
case 40: // Down
e.preventDefault();
if (!open) { showResults($(this).val()); setActive(0); }
else setActive(activeIndex + 1);
break;
case 38: // Up
e.preventDefault();
if (!open) { showResults($(this).val()); setActive(-1); }
else setActive(activeIndex - 1);
break;
case 13: // Enter -- must never submit the form while the list is open
if (open) {
e.preventDefault();
if (activeIndex >= 0 && shown[activeIndex]) {
selectOption(shown[activeIndex].value, shown[activeIndex].text);
} else if (shown.length === 1) {
selectOption(shown[0].value, shown[0].text);
}
}
break;
case 27: // Esc -- abandon the search, restore the real value
if (open) {
e.preventDefault();
closeList();
syncInputToSelect();
}
break;
case 9: // Tab -- commit the highlighted row on the way out
if (open && activeIndex >= 0 && shown[activeIndex]) {
selectOption(shown[activeIndex].value, shown[activeIndex].text);
}
closeList();
break;
}
});
textInput.on("blur", function () {
// Short delay so a touchstart/mousedown on a result fires first.
setTimeout(function () {
closeList();
// Half-typed text that never became a selection would otherwise sit
// in the box looking like a choice -- put the real value back.
syncInputToSelect();
}, 200);
});
// Re-caches the option list. Fired after the full language list loads, after
// options are enabled/disabled, and after programmatic .val() changes.
select.on("wiktku:refresh", function () {
cacheOptions();
syncInputToSelect();
if (resultsList.is(":visible")) showResults(textInput.val());
});
wrapper.append(textInput).append(resultsList).append(select);
return wrapper;
}
/**
* Gives every plain <select> under `root` the searchable picker. Selects
* marked .wiktku-plain-select opt out, and the call is idempotent, so it is
* safe to re-run after new rows or sense blocks are inserted.
*/
function initSelects(root) {
$(root).find("select").addBack("select").not(".wiktku-plain-select").each(function () {
var sel = $(this);
if (sel.prop("multiple")) return;
if (sel.closest(".wiktku-native-select-wrap").length) return; // already wrapped
var marker = $("<span></span>").insertBefore(sel);
marker.replaceWith(wrapNativeSelect(sel));
});
}
var langsByCode = {};
// Populated from [[MediaWiki:Gadget-start.js/data.json]] at runtime.
var metadata = {};
var ZARAVA_LANG_CODES = ["ckb", "sdh", "lki", "hac", "zza"];
// Converts a {code: label} object (langChoices/posChoices in data.json)
// into the {code, label[, sortKey]} array the rest of the script uses.
// isLang: true adds a sortKey and shows "(code)" after the label —
// language choices only.
function choicesFromObject(obj, isLang) {
var result = [];
$.each(obj || {}, function (code, label) {
var choice = { code: code, label: label };
if (isLang) choice.sortKey = label;
result.push(choice);
});
return result;
}
function getZaravaKeys(choices) {
var byCode = {};
$.each(choices || [], function (_, c) { byCode[c.code] = c; });
var result = [];
$.each(ZARAVA_LANG_CODES, function (_, code) {
if (byCode[code]) result.push(byCode[code]);
});
return result;
}
function needsTransliteration(langCode) {
var meta = metadata[langCode];
if (!meta || !meta.sc) return false;
var scripts = Array.isArray(meta.sc) ? meta.sc : [meta.sc];
return scripts.length > 0 && scripts[0] !== "Latn";
}
// Kodên cinsiyetê yên di metadata.g de — ji data.json tê dagirtin
var GENDER_BASE_LABELS = {};
// Sub-lists that only make sense for a plain (non-şablon) sense — hidden
// when a şablon (e.g. {{guharto|…}}) is chosen for that sense
var HIDDEN_ON_TPL_GROUPS = [
"wiktku-dfn-alternativ",
"wiktku-dfn-hevmane",
"wiktku-dfn-dijmane",
"wiktku-dfn-koordine",
"wiktku-dfn-jornav",
"wiktku-dfn-jernav"
];
function genderLabel(code) {
if (code === "p") return "Pirjimar";
var pluralMatch = code.match(/^(.+)-p$/);
if (pluralMatch && GENDER_BASE_LABELS[pluralMatch[1]]) {
return GENDER_BASE_LABELS[pluralMatch[1]] + " (pirjimar)";
}
return GENDER_BASE_LABELS[code] || code;
}
// True if a sense has content beyond mane worth keeping (etîket, word
// lists, nimûne, jêder) — so it's still emitted with {{mane?}} if empty.
function senseHasExtraContent(s) {
if (s.etiket && $.grep(s.etiket, function (e) { return $.trim(e) !== ""; }).length) return true;
if (s.kategori && $.grep(s.kategori, function (k) { return $.trim(k) !== ""; }).length) return true;
if (s.alternativ.length || s.hevmane.length || s.dijmane.length ||
s.koordine.length || s.jornav.length || s.jernav.length) return true;
if (s.nimune && $.grep(s.nimune, function (n) {
return (typeof n === "object" ? n.text : n) !== "";
}).length > 0) return true;
if (senseHasJeder(s)) return true;
return false;
}
// Bolds the *first* occurrence of the page name (plus any letters
// glued directly onto it, e.g. a plural "s") inside nimûne/jêgirtin
// text — "apple"/"Apple"/"apples"/"Apples" all match (case-insensitive),
// but only the first hit is wrapped, not every one in the text.
function boldPageNameOnce(text) {
if (!text || !pageNameRe) return text;
var re = new RegExp("(" + pageNameRe + "([^( |,|;|\\?|\\.|\\!)]+)?)", "i");
return text.replace(re, "'''$1'''");
}
// Converts literal line breaks typed into a nimûne/jêgirtin box into
// wikitext <br> tags, so a pasted/typed newline doesn't break the
// surrounding "#:"/"#*" wikitext list syntax on output.
function nlToBr(text) {
return text ? text.replace(/\r\n|\r|\n/g, "<br>") : text;
}
function escapeHtmlForBackdrop(str) {
return String(str)
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">");
}
// Mirrors a textarea's text, with a small highlighted marker placed
// right after each line that's followed by an actual typed/pasted
// linebreak. Rendered into a transparent backdrop layer behind the
// textarea (see ensureLinebreakBackdrop()), so only the point of the
// break is marked instead of the whole box.
function buildLinebreakBackdropHtml(text) {
var lines = text.split(/\r\n|\r|\n/);
return $.map(lines, function (line, i) {
var isLast = i === lines.length - 1;
return escapeHtmlForBackdrop(line) +
(isLast ? "" : "<mark class='wiktku-linebreak-mark'>↵</mark>\n");
}).join("");
}
// Copies the metrics that affect where text wraps/lands (font, line
// height, padding, border) from the real textarea onto its backdrop,
// via computed style rather than shared CSS classes — most of the
// box's own rules are written as "textarea.foo", which a <div> with
// the same class wouldn't match. Re-run on every update in case a
// responsive breakpoint changed the textarea's own font-size.
function syncLinebreakBackdropMetrics(textarea, backdrop) {
var cs = window.getComputedStyle(textarea[0]);
backdrop.css({
"box-sizing": cs.boxSizing,
"padding-top": cs.paddingTop,
"padding-right": cs.paddingRight,
"padding-bottom": cs.paddingBottom,
"padding-left": cs.paddingLeft,
"border-width": cs.borderWidth,
"border-style": "solid",
"font-family": cs.fontFamily,
"font-size": cs.fontSize,
"font-weight": cs.fontWeight,
"line-height": cs.lineHeight,
"letter-spacing": cs.letterSpacing
});
}
// Lazily wraps a textarea in its own positioning anchor (independent
// of .wiktku-resize-wrap, so this doesn't depend on load order versus
// wiktkuMakeManualResizable) and inserts the transparent backdrop
// layer used to mark the exact point of a linebreak. Safe to call
// more than once on the same textarea — the backdrop is cached.
function ensureLinebreakBackdrop(textarea) {
var existing = textarea.data("wiktkuLinebreakBackdrop");
if (existing) return existing;
textarea.wrap("<div class='wiktku-linebreak-wrap'></div>");
var backdrop = $("<div aria-hidden='true'></div>").addClass("wiktku-linebreak-backdrop");
textarea.before(backdrop);
textarea.data("wiktkuLinebreakBackdrop", backdrop);
textarea.on("scroll.wiktkuLinebreak", function () {
backdrop.scrollTop(textarea.scrollTop()).scrollLeft(textarea.scrollLeft());
});
return backdrop;
}
// Flags a nimûne/jêgirtin textarea (via CSS class, for the border
// tint + tooltip) while it contains a typed/pasted linebreak, so the
// user notices before it's silently turned into <br> on output.
// Marks only the exact point of the break via a mirrored backdrop,
// rather than tinting the whole box.
function highlightLinebreak(el) {
var textarea = $(el);
var text = textarea.val();
var hasBreak = /\r|\n/.test(text);
textarea
.toggleClass("wiktku-has-linebreak", hasBreak)
.attr("title", hasBreak ? "Xeta nû dê wek <br> bê nivîsandin" : "");
if (!hasBreak) {
var cached = textarea.data("wiktkuLinebreakBackdrop");
if (cached) cached.hide();
textarea.removeClass("wiktku-has-linebreak-source");
return;
}
var backdrop = ensureLinebreakBackdrop(textarea);
textarea.addClass("wiktku-has-linebreak-source");
syncLinebreakBackdropMetrics(textarea, backdrop);
backdrop.html(buildLinebreakBackdropHtml(text)).show();
backdrop.scrollTop(textarea.scrollTop()).scrollLeft(textarea.scrollLeft());
}
// Each nimûne item can be { text, tr, t }: text, transliteration, translation.
function formatNimune(nimunes, lang, hasJeder) {
var hasNimune = nimunes && $.grep(nimunes, function (n) {
return (typeof n === "object" ? n.text : n) !== "";
}).length > 0;
if (!hasNimune) {
return hasJeder ? "" : "\n#* {{nimûne?|" + lang + "}}";
}
return $.map(nimunes, function (n) {
var text = typeof n === "object" ? n.text : n;
if (!text) return undefined;
var bolded = nlToBr(boldPageNameOnce(text));
var tpl = "\n#: {{nm|" + lang + "|" + bolded;
if (typeof n === "object") {
if (n.tr) tpl += "|tr=" + nlToBr(n.tr);
// Translation as third positional param (no key needed).
if (n.t) tpl += "|" + nlToBr(n.t);
}
// Short examples fit on one line together with their translation.
// rêz=1 is not used for ku — definitions are shown on separate lines there.
if (text.length < 60 && lang !== "ku") tpl += "|rêz=1";
tpl += "}}";
return tpl;
}).join("");
}
// Formats jêder (citation) entries into "#* {{jêder…|…}}" lines; skips
// entries with no quote text. Falls back to the generic {{jêder}}
// template when no specific template was chosen.
function formatJeder(jederList, lang) {
if (!jederList || !jederList.length) return "";
return $.map(jederList, function (jeder) {
if (!jeder || !jeder.quote) return undefined;
var quote = nlToBr(boldPageNameOnce(jeder.quote));
var quoteTr = nlToBr(jeder.quoteTr);
var quoteT = nlToBr(jeder.quoteT);
if (jeder.jederTpl) {
var cite = "\n#* {{" + jeder.jederTpl + "|" + lang;
cite += "|jêgirtin=" + quote;
if (quoteTr) cite += "|tr=" + quoteTr;
if (quoteT) cite += "|tercime=" + quoteT;
$.each(jeder.jêderFields || {}, function (key, val) {
if (val) cite += "|" + key + "=" + val;
});
cite += "}}";
return cite;
}
var out = "\n#* {{jêder|" + lang + "|jêgirtin=" + quote;
if (quoteTr) out += "|tr=" + quoteTr;
if (quoteT) out += "|tercime=" + quoteT;
// A şablon picked from Kategorî:Çavkanî is transcluded as the
// source param (e.g. |{{Kovara X}}); manual text is used as-is.
var srcParam = jeder.jederCatTpl ? ("{{" + jeder.jederCatTpl + "}}") :
(jeder.jederManual ? jeder.jederManual : "çavkanî?");
// A positional param containing "=" gets parsed as its own key=value
// pair by MediaWiki and breaks the template, so force it to be
// explicitly named (|2=) whenever that's the case.
out += (srcParam.indexOf("=") !== -1 ? "|2=" : "|") + srcParam;
out += "}}";
return out;
}).join("");
}
// True if a sense has at least one jêder entry with quote text.
function senseHasJeder(sense) {
return !!(sense.jeder && $.grep(sense.jeder, function (j) {
return j && j.quote;
}).length > 0);
}
// Builds "{{tplName|lang|part1|part2|…}}" from a sense field (kategori,
// etiket), wrapped inline (" {{…}} ") or on its own line ("\n#: {{…}}").
function buildSenseTpl(sense, field, lang, tplName) {
if (!sense[field] || !sense[field].length) return "";
var parts = sense[field].map(function (p) { return $.trim(p); })
.filter(function (p) { return p !== ""; });
if (!parts.length) return "";
var call = "{{" + tplName + "|" + lang + "|" + parts.join("|") + "}}";
return call
}
/**
* Assembles the nimûne + jêder wikitext block for a sense. Shared by
* both the template-sense and normal-mane-sense branches below.
*/
function buildCite(sense, lang) {
return formatNimune(sense.nimune, lang, senseHasJeder(sense)) +
formatJeder(sense.jeder, lang);
}
function makeWordListStep(id, name, question_fmt) {
return {
id: id,
name: name,
question_fmt: question_fmt,
multiple: true,
narrow: true,
placeholder: "Kelîme…",
visible: function (values) {
return values.lang && values.pos;
},
output: function (values) {
var words = $.grep(values[id] || [], function (w) { return !!w; });
var header = capitalize(name);
if (!words.length) return "";
var lang = values.lang;
var section = "\n==== " + header + " ====\n";
var params = "cure=" + header + "\n" +
$.map(words, function (w) {
return "|" + w;
}).join("\n");
return section +
"{{kol3|" + lang + "|" + params + "\n}}\n";
} };
}
var steps = {
lang: {
id: "lang",
required: true,
name: "ziman",
question_fmt: '"' + pageName + '" bi çi zimanî ye?',
question_br: true,
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (langChoices).
choices: [],
output: function (values) {
if (addLangMode){
return "\n== {{ziman|" + values.lang + "}} ==\n";
}else {
return "== {{ziman|" + values.lang + "}} ==\n";
}
} },
pron: {
id: "pron",
name: "bilêvkirin",
question_fmt: '"' + pageName + '" çawa tê telafûzkirin?',
// pronTpls populated from data.json
pronTpls: {},
visible: function (values) {
if (!values.lang) return false;
// addLangMode: skip pron only if this lang already has a section.
if (addLangMode) {
// Clearing the page makes existing content irrelevant.
var clearPageCheck = $("#wiktku-clear-page-check");
if (clearPageCheck.length && clearPageCheck.prop("checked")) {
return true;
}
var existing = $("#wpTextbox1").val() || "";
return !findLangHeader(existing, values.lang);
}
return true;
},
// Fills the insert-dropdown from pronTpls, filtered by language.
refreshTplSelect: function () {
var sel = $("#wiktku-start-pron .wiktku-tpl-insert-select");
if (!sel.length) return;
var lang = getValues().lang || "";
sel.find("option[value!='']").remove();
$.each(steps.pron.pronTpls, function (name, tpl) {
// Filter: if tpl.langs exists, only show if lang is in that list; otherwise show always
var allowed = !tpl.langs || tpl.langs.indexOf(lang) !== -1;
if (allowed) {
sel.append($("<option></option>")
.val(tpl.snippet)
.text(name + " — " + tpl.desc)
.attr("data-nolang", tpl.noLang ? "1" : ""));
}
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-pron-wrap").length) return null;
var wrap = $("<div class='wiktku-pron-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-pron-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-pron-text")
.attr("rows", 4)
.attr("placeholder", "Nimûne: {{IPA|ku|/pɛɪ̯n/}} yan {{kîte|ku|he|ce|ki|rin}}");
// Template insert dropdown — filtered by language.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike ");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
var lang = getValues().lang || "";
$.each(steps.pron.pronTpls, function (name, tpl) {
// Filter: if tpl.langs exists, only show if lang is in that list; otherwise show always
var allowed = !tpl.langs || tpl.langs.indexOf(lang) !== -1;
if (allowed) {
sel.append($("<option></option>")
.val(tpl.snippet)
.text(name + " — " + tpl.desc)
.attr("data-nolang", tpl.noLang ? "1" : ""));
}
});
sel.on("change", function () {
var snippet = $(this).val();
if (!snippet) return;
var lang = getValues().lang || "";
// Check if the selected option has noLang flag
var selectedOption = sel.find("option:selected");
var hasNoLang = selectedOption.attr("data-nolang") === "1";
if (!hasNoLang) {
snippet = snippet.replace(/CODE/g, lang).replace(/SOURCELANG/g, "?");
}
insertAtCursor(ta[0], snippet);
$(this).val("");
// Clear the picker's search box
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel).append(ta);
stepDiv.append(wrap);
initSelects(wrap);
return ta;
},
output: function () {
var text = $.trim($("#wiktku-start-pron .wiktku-pron-text").val());
if (!text) return "";
var lines = text.split("\n");
var out = $.map(lines, function (line) {
line = $.trim(line);
if (!line) return undefined;
return line;
}).join("\n");
return "\n=== Bilêvkirin ===\n" + out + "\n";
} },
pos: {
id: "pos",
required: true,
name: "Cureyê rêzimanî",
question_fmt: 'Cureyê rêzimanî yê "' + pageName + '" çi ye?',
visible: function (values) {
return values.lang;
},
question_br: true,
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (posChoices).
choices: [],
output: function (values) {
var pos = values.pos || "";
var cinsiyet = values.cinsiyet || ""; // from the cinsiyet step
var lekTur = values.lektur || ""; // from the lêker transitivity step
var capitalizedPos = capitalize(pos);
var outputString = "\n=== " + capitalizedPos + " ===\n";
// Add ku-tewîn-nav for single-word navdêr/serenav with known gender.
if (!pageName.includes(" ") && cinsiyet && GENDER_BASE_LABELS[cinsiyet] &&
(pos === "navdêr" || pos === "serenav") && values.lang === "ku") {
outputString += "{{ku-tewîn-nav|" + pageName + "|" + GENDER_BASE_LABELS[cinsiyet];
if (pos === "serenav") outputString += "|y";
outputString += "}}\n";
}
outputString += "{{" + pos + "|" + values.lang;
if (pos === "navdêr" || pos === "serenav") {
if (cinsiyet) {
outputString += "|c=" + cinsiyet;
} else if (values.lang === "ku") {
outputString += "|c=?";
}
} else if (/^lêker/.test(pos) && lekTur) {
outputString += "|c=" + lekTur;
}
if (values.tr) {
outputString += "|tr=" + values.tr;
}
outputString += "}}\n";
return outputString;
}
},
// cinsiyet (gender) — shown for navdêr/serenav only, with choices built
// from metadata[lang].g since not every language has grammatical gender.
cinsiyet: {
id: "cinsiyet",
name: "cinsiyet",
question_fmt: 'Cinsiyeta "' + pageName + '" çi ye?',
question_br: true,
visible: function (values) {
var meta = metadata[values.lang];
return !!(values.lang && (values.pos === "navdêr" || values.pos === "serenav") &&
meta && meta.g && meta.g.length);
},
build: function (stepDiv, values) {
var select = stepDiv.find("select.wiktku-start-step-field");
if (!select.length) {
select = $(mw.html.element("select", {
"class": "wiktku-start-step-field wiktku-plain-select",
id: "wiktku-start-cinsiyet-field" }));
stepDiv.append(select);
}
if (!values) return select;
var meta = metadata[values.lang];
var codes = (meta && meta.g) || [];
var prevVal = select.val();
var choices = $.map(codes, function (code) {
return [{ code: code, label: genderLabel(code) }];
});
populateMenus(select, choices, null, "Cinsiyetê hilbijêre");
if ($.grep(choices, function (c) { return c.code === prevVal; }).length) {
select.val(prevVal);
}
return select;
},
output: function () { return ""; } // consumed by pos.output
},
// Lêker transitivity
lektur: {
id: "lektur",
name: "Cureyê lêkerê (fiîlê)",
question_fmt: "Cureyê lêkerê (fiîlê) çi ye?",
question_br: true,
visible: function (values) {
return values.lang && values.pos && /^lêker/.test(values.pos);
},
choices: [
{ code: "gh", label: "gerguhêz" },
{ code: "x-gh", label: "xwerû-gerguhêz" },
{ code: "p-gh", label: "pêkhatî-gerguhêz" },
{ code: "h-gh", label: "hevedudanî-gerguhêz" },
{ code: "b-gh", label: "biwêjî-gerguhêz" },
{ code: "ngh", label: "negerguhêz" },
{ code: "x-ngh", label: "xwerû-negerguhêz" },
{ code: "p-ngh", label: "pêkhatî-negerguhêz" },
{ code: "h-ngh", label: "hevedudanî-negerguhêz" },
{ code: "b-ngh", label: "biwêjî-negerguhêz" } ],
output: function () { return ""; } // consumed by pos.output
},
tr: {
id: "tr",
name: "transliterasyon",
question_fmt: "Transliterasyona vê kelîmeyê",
multiple: false,
narrow: true,
visible: function (values) {
return values.lang && values.pos && needsTransliteration(values.lang);
} },
dfn: {
id: "dfn",
name: "Mane",
question_fmt: function (values) {
var base = "Maneya kelîmeyê binivîse. Mane otomatîk tê lînkkirin!";
if (values.lang === "ku") {
return base + " Ji bo tercimeyan beşa 'Werger' bi kar bîne!";
}
return base;
},
multiple: true,
ordered: true,
rows: 3,
visible: function (values) {
return values.lang && values.pos;
},
example: function (values) {
// posExamples loaded from [[MediaWiki:Gadget-start.js/data.json]].
var examples = steps.dfn.posExamples || {};
var full = values.pos || "";
return examples[full] || "";
},
// Builds one sense block (<li>): mane textarea, nimûne list, and
// sub-lists for alternatîv/hevmane/dijmane/etc.
buildSenseBlock: function (stepDiv) {
var block = $("<li class='wiktku-dfn-sense'></li>");
// — Mane textarea (declared first so the template handler can reference it) —
var dfnArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-mane-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-start-step-field wiktku-dfn-mane")
.attr("rows", 6)
.attr("placeholder", "Mane…");
dfnArea.on("input", function () {
steps.dfn.onDfnInput(stepDiv, block, this);
});
// — Tercime + Îzah boxes (non-ku alternative to the plain mane box) —
// Non-ku entries get a direct translation plus a {{îzah|…}}-wrapped
// gloss instead of a Kurdish-style gloss. Rather than teach every
// consumer (getSenses/getOutput/linkify) a second data shape, these
// boxes just write their combined text into dfnArea and re-fire its
// "input" event, so dfnArea stays the single source of truth.
var tercimeArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-tercime-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-dfn-subfield wiktku-dfn-tercime")
.attr("rows", 2)
.attr("placeholder", "Tercimeyên rasterast ên kurmancî… Ji bo school-a îngilîzî li vir 'mekteb, medrese' binivîse");
var izahArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-izah-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-dfn-subfield wiktku-dfn-izah")
.attr("rows", 3)
.attr("placeholder", "Îzaha kurmancî… Ji bo school-a îngilîzî li vir 'cihê tehsîlgirtinê' binivîse");
var nonKuWrap = $("<div class='wiktku-dfn-nonku-wrap'></div>")
.append(tercimeArea).append(izahArea)
.hide();
function syncNonKuToMane() {
var t = $.trim(tercimeArea.val());
var iz = $.trim(izahArea.val());
// if tercime is blank, use îzah as definition
var combined = t ? (iz ? t + " {{îzah|" + iz + "}}" : t) : iz;
dfnArea.val(combined);
// Re-fires onDfnInput so the sense list still grows and
// refresh() still runs, exactly as if this were typed
// directly into the mane textarea.
dfnArea.trigger("input");
}
tercimeArea.on("input", syncNonKuToMane);
izahArea.on("input", syncNonKuToMane);
// Switches between the plain mane box and the tercime+îzah pair —
// only for non-ku entries with no tplSelect selected.
function updateManeMode() {
var lang = getValues().lang || "";
var isTpl = !!tplSelect.val();
if (lang && lang !== "ku" && !isTpl) {
dfnArea.hide();
nonKuWrap.show();
} else {
nonKuWrap.hide();
if (!isTpl) dfnArea.show();
}
}
// Store on the block so refresh() can re-sync every block when
// lang changes, and restoreDfn() can re-sync after restoring.
block.data("updateManeMode", updateManeMode);
// — Template selector (optional — replaces mane when chosen) —
// Template definitions loaded from [[MediaWiki:Gadget-start.js/data.json]].
var tplDefs = steps.dfn.tplDefs || {};
// Cache of all non-placeholder option elements, so updateTplOptions
// can detach/re-attach them without losing the full list.
var _allTplOptions = [];
var tplSelect = $(mw.html.element("select", { "class": "wiktku-dfn-tpl-select" }));
tplSelect.attr("data-placeholder", "Li şablonekê bigere");
tplSelect.append($("<option value=''>— yan jî şablonek hilbijêre —</option>"));
$.each(tplDefs, function (name, tpl) {
var opt = $("<option></option>")
.val(name)
.text(name)
.attr("data-langs", tpl.langs ? tpl.langs.join(",") : "")
.attr("data-nolang", tpl.noLang ? "1" : "");
tplSelect.append(opt);
_allTplOptions.push(opt[0]);
});
function updateTplOptions() {
var lang = getValues().lang || "";
var currentVal = tplSelect.val();
var currentStillValid = false;
// Detach all non-placeholder options, then re-attach only the visible
// ones — native <select> won't reliably hide options any other way.
tplSelect.find("option[value!='']").detach();
$.each(_allTplOptions, function (_, opt) {
var allowed = $(opt).attr("data-langs");
var visible = !allowed || allowed.split(",").indexOf(lang) !== -1;
if (visible) {
tplSelect.append(opt);
if ($(opt).val() === currentVal) currentStillValid = true;
}
});
tplSelect.trigger("wiktku:refresh");
if (currentVal && !currentStillValid) {
tplSelect.val("");
tplTitleInput.hide().val("");
updateManeMode();
}
}
// Store updater on the element so refresh() can call it for all blocks.
tplSelect.data("updateOptions", updateTplOptions);
var tplTitleInput = $("<input type='text'>")
.addClass("wiktku-dfn-tpl-title wiktku-start-narrow")
.attr("placeholder", "Navê rûpela hedefê…")
.hide();
// Grow the sense list when the title field of the last block gets content,
// mirroring what onDfnInput does for the plain mane textarea.
tplTitleInput.on("input", function () {
steps.dfn.onDfnInput(stepDiv, block, this);
});
// Şablon senses have no plain gloss, so hide alternatîv/hevmane/
// dijmane/etc. Etîket, Nimûne and Jêgirtin stay visible either way.
function updateFieldVisibility() {
var isTpl = !!tplSelect.val();
$.each(HIDDEN_ON_TPL_GROUPS, function (_, cls) {
block.find("." + cls + "-group").toggle(!isTpl);
});
}
// Store on the block so restoreDfn() can re-sync visibility
// after setting tplSelect's value.
block.data("updateFieldVisibility", updateFieldVisibility);
tplSelect.on("change", function () {
var chosen = $(this).val();
if (chosen) {
dfnArea.hide();
nonKuWrap.hide();
tplTitleInput.show().focus();
} else {
tplTitleInput.hide().val("");
updateManeMode();
}
updateFieldVisibility();
// Re-run refresh so the Werger step visibility updates.
refresh();
});
var tplRow = $("<div></div>").addClass("wiktku-dfn-tpl-row")
.append(tplSelect).append(" ").append(tplTitleInput);
block.append(tplRow);
block.append(dfnArea);
block.append(nonKuWrap);
// Apply lang filter on initial build.
updateTplOptions();
updateManeMode();
// — Sub-field groups are always visible with a placeholder textarea.
var allGroups = [
{ cls: "wiktku-dfn-etiket", label: "Etîket", rows: 1, narrow: true, izah: "xisûsen, Mêrdîn, anatomî, Badînî" },
{ cls: "wiktku-dfn-kategori", label: "Kategorî", rows: 1, narrow: true, izah: "wekî etîket lê xuya nabe tenê kategorîze dike" },
{ cls: "wiktku-dfn-alternativ", label: "Formên alternatîv", rows: 1, narrow: true, izah: "Varyantên vê kelîmeyê" },
{ cls: "wiktku-dfn-hevmane", label: "Hevmane", rows: 1, narrow: true, izah: "Spehî hevmaneya Bedew e." },
{ cls: "wiktku-dfn-dijmane", label: "Dijmane", rows: 1, narrow: true, izah: "Zengîn dijmaneya feqîr e." },
{ cls: "wiktku-dfn-koordine", label: "Termên koordîne", rows: 1, narrow: true, izah: "Pisîk û kûçik termên koordîne ne çunkî Jornavên wan gelek in" },
{ cls: "wiktku-dfn-jornav", label: "Jornav", rows: 1, narrow: true, izah: "Heywan jornavê guhandar e" },
{ cls: "wiktku-dfn-jernav", label: "Jêrnav", rows: 1, narrow: true, izah: "Guhandar jêrnavê heywan e" },
{ cls: "wiktku-dfn-nimune", label: "Nimûne", rows: 2, narrow: false }
];
$.each(allGroups, function (_, g) {
var groupDiv = $("<div></div>").addClass("wiktku-dfn-subgroup " + g.cls + "-group");
function buildNimuneLi() {
var lang = getValues().lang || "";
var li = $("<li></li>").addClass("wiktku-dfn-nimune-li");
var mainTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-text-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", g.rows)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-text")
.attr("placeholder", "Nimûneya emilandina kelîmeyê tu bi xwe binivîse…");
mainTa.on("input", function () {
highlightLinebreak(this);
var val = $.trim($(this).val());
var isLast = li.is(list.children("li:last-child"));
if (val && isLast) {
list.append(buildNimuneLi());
}
});
li.append(mainTa);
var subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
if (needsTransliteration(lang)) {
subWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-tr")
.attr("placeholder", "Transliterasyona bi alfabeya latînî")
);
}
if (lang && lang !== "ku") {
subWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-t")
.attr("placeholder", "Tercimeya nimûneyê bi kurmancî")
);
}
if (subWrap.children().length) li.append(subWrap);
return li;
}
if (g.cls === "wiktku-dfn-nimune") {
// Nimûne — compound widget with tr/t sub-fields.
var lbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text(g.label))
.append(": ");
var list = $("<ol></ol>").addClass("wiktku-dfn-sublist " + g.cls + "-list");
groupDiv.data("buildNimuneLi", buildNimuneLi);
list.append(buildNimuneLi());
groupDiv.append(lbl).append(list);
block.append(groupDiv);
} else {
// Regular always-visible group — label + growing textarea list.
var lbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text(g.label))
.append(": ")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-hint").text(g.izah));
var list = $("<ol></ol>").addClass("wiktku-dfn-sublist " + g.cls + "-list");
var firstInput = $("<textarea></textarea>")
.attr("name", g.cls + "-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", g.rows)
.attr("class", "wiktku-dfn-subfield" + (g.narrow ? " wiktku-start-narrow" : ""))
.attr("placeholder", g.label + "…");
firstInput.on("input", function () {
steps.dfn.onSubInput(list, this, g.rows, g.narrow);
});
list.append($("<li></li>").append(firstInput));
groupDiv.append(lbl).append(list);
block.append(groupDiv);
}
});
// — Jêder group — growing list, same structure as Nimûne. —
(function () {
var jederGroupDiv = $("<div></div>").addClass("wiktku-dfn-subgroup wiktku-dfn-jeder-group");
var jederLbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text("Jêgirtin"))
.append(": ");
var jederList = $("<ol></ol>").addClass("wiktku-dfn-sublist wiktku-dfn-jeder-list");
function buildJederLi() {
var lang = getValues().lang || "";
var li = $("<li></li>").addClass("wiktku-dfn-jeder-li");
// Quote text textarea
var quoteTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote")
.attr("placeholder", "Nimûneya emilandinê ji kitêb an çavkaniyeke din binivîse");
quoteTa.on("input", function () {
highlightLinebreak(this);
var val = $.trim($(this).val());
var isLast = li.is(jederList.children("li:last-child"));
if (val && isLast) {
jederList.append(buildJederLi());
}
});
li.append(quoteTa);
// tr/t sub-fields for the quote — shown as needed for the language.
var quoteSubWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
if (needsTransliteration(lang)) {
quoteSubWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-tr")
.attr("placeholder", "Transliterasyona jêgirtinê…")
);
}
if (lang && lang !== "ku") {
quoteSubWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-t")
.attr("placeholder", "Tercimeya jêgirtinê bi kurmancî")
);
}
if (quoteSubWrap.children().length) li.append(quoteSubWrap);
// Citoid auto-fill: fetch citation data from a URL, DOI or ISBN and
// prefill the source şablon + fields below (see Gadget-citoid-helper.js).
var citoidWrap = $("<div></div>").addClass("wiktku-dfn-quote-citoid");
var citoidInput = $("<textarea></textarea>")
.addClass("wiktku-dfn-subfield wiktku-dfn-quote-citoid-input")
.attr("rows", 1)
.attr("placeholder", "URL, DOI an ISBN binivîse ku otomatîk were tijekirin…");
var citoidBtn = new OO.ui.ButtonWidget({
label: "Bi Citoidê bîne",
classes: [ "wiktku-dfn-quote-citoid-btn" ]
});
var citoidStatus = $("<span></span>").addClass("wiktku-dfn-quote-citoid-status");
// Fetches citation data from Citoid and fills this citation's
// şablon + fields — only rebuilds fields on template change,
// and never overwrites values the user already typed.
function runCitoidFetch() {
var query = $.trim(citoidInput.val());
if (!query) {
mw.notify("Ji kerema xwe re pêşî URL, DOI an ISBNyekê binivîse.");
return;
}
citoidBtn.setDisabled(true);
citoidStatus.text("Tê anîn…");
wikt.citoidHelper.ensure().then(function () {
return wikt.citoid.fetchJederFields(query);
}).then(function (result) {
var jederKey = result.jederKey;
var hasTpl = !!jederKey && srcSel.find("option[value='" + jederKey + "']").length > 0;
var targetVal = hasTpl ? jederKey : "__manual__";
// Only rebuild if switching şablon, so a repeat fetch
// doesn't clear fields already filled in by hand.
if (srcSel.val() !== targetVal) {
srcSel.val(targetVal).trigger("change");
}
if (hasTpl) {
// Tenê qadên vala tijî bike.
$.each(result.fields, function (key, val) {
var input = srcFields.find("[data-field-key='" + key + "']");
if (input.length && !$.trim(input.val())) {
input.val(val);
}
});
} else {
// Şablonek nehat naskirin ji bo vê itemType — rêzikeke
// çavkaniyê ya bi destan a ji qadên Citoid tê çêkirin,
// lê tenê ger qada destan vala be.
var manualField = srcFields.find(".wiktku-dfn-quote-src-manual");
if (!$.trim(manualField.val())) {
var parts = [];
$.each(["nivîskar", "sernav", "websîte", "kovar", "weşanxane", "sal", "url"], function (_, k) {
if (result.fields[k]) parts.push(result.fields[k]);
});
manualField.val(parts.join(", "));
}
}
citoidStatus.text("");
}, function (errorMsg) {
citoidStatus.text(typeof errorMsg === "string" ? errorMsg : "Nehat dîtin. Kontrol bike ka URL/DOI/ISBN rast e.");
}).always(function () {
citoidBtn.setDisabled(false);
});
}
citoidBtn.on("click", runCitoidFetch);
citoidInput.on("keydown", function (e) {
if (e.which === 13) { // Enter
e.preventDefault();
runCitoidFetch();
}
});
citoidWrap.append(citoidInput).append(citoidBtn.$element).append(citoidStatus);
// Source template selector, specific to this citation.
var srcSel = $("<select></select>").addClass("wiktku-dfn-quote-src-sel wiktku-plain-select");
srcSel.append($("<option value=''>— Çavkaniyê hilbijêre —</option>"));
srcSel.append($("<option></option>").val("__manual__").text("Bi destê xwe binivîsim"));
srcSel.append($("<option></option>").val("__category__").text("Ji Kategorî:Çavkanî şablonekê hilbijêre"));
var jederDefs = steps.dfn.jederDefs || {};
$.each(jederDefs, function (tplName, def) {
srcSel.append($("<option></option>").val(tplName).text(def.label));
});
// Dynamic source fields container.
var srcFields = $("<div></div>").addClass("wiktku-dfn-quote-src-fields");
srcSel.on("change", function () {
srcFields.empty();
var chosen = $(this).val();
if (!chosen) return;
if (chosen === "__manual__") {
// Freeform source, written by the user — becomes the 2nd
// positional param of {{jêder|lang|…}} instead of çavkanî?.
srcFields.append(
$("<textarea></textarea>")
.attr("rows", 4)
.addClass("wiktku-dfn-subfield wiktku-dfn-quote-src-manual")
.attr("placeholder", "Çavkaniyê bi destê xwe binivîse…")
);
return;
}
if (chosen === "__category__") {
// Search widget over the members of [[Kategorî:Çavkanî]].
// Picking a şablon here immediately switches the row to
// "Bi destê xwe binivîsim" mode with {{Şablon}} pre-filled,
var catWrap = $("<span></span>").addClass("wiktku-native-select-wrap wiktku-dfn-quote-src-cat");
var catInput = $("<input type='search' autocomplete='off'>")
.addClass("wiktku-start-narrow wiktku-dfn-quote-src-cat-input")
.attr("placeholder", "Li navê şablonê bigere…");
var catResults = $("<ul></ul>").addClass("wiktku-ac-results wiktku-dfn-quote-src-cat-results").hide();
var catStatus = $("<span></span>").addClass("wiktku-dfn-quote-src-cat-status").text("Şablon tên barkirin…");
var showCatResults = function (query) {
var q = $.trim(query).toLowerCase();
catResults.empty();
var list = catSrcTemplates || [];
var matched = q ?
$.grep(list, function (name) { return name.toLowerCase().indexOf(q) !== -1; }) :
list;
if (!matched.length) {
catResults.hide();
return;
}
$.each(matched.slice(0, 50), function (_, name) {
var li = $("<li></li>").text(name).attr("data-value", name);
var touchMoved = false;
li.on("touchstart", function () { touchMoved = false; });
li.on("touchmove", function () { touchMoved = true; });
li.on("touchend", function (e) {
if (touchMoved) return;
e.preventDefault();
selectCatTpl(name);
});
li.on("mousedown", function (e) {
e.preventDefault();
selectCatTpl(name);
});
catResults.append(li);
});
catResults.show();
};
// Wraps the chosen şablon as {{Name}}, drops it into the
// manual textarea, and switches the row into manual mode
// so the user can keep editing it (add params, etc.).
var selectCatTpl = function (name) {
catResults.hide();
srcSel.val("__manual__");
srcSel.trigger("change");
srcFields.find(".wiktku-dfn-quote-src-manual")
.val("{{" + name + "}}")
.trigger("focus");
};
catInput.on("input", function () {
showCatResults($(this).val());
});
catInput.on("focus", function () {
showCatResults($(this).val());
});
catInput.on("blur", function () {
setTimeout(function () { catResults.hide(); }, 200);
});
catWrap.append(catInput).append(catResults).append(catStatus);
srcFields.append(catWrap);
fetchCatSrcTemplates().then(function () {
catStatus.text("");
}, function () {
catStatus.text("Şablon nehatin barkirin.");
});
return;
}
var def = (steps.dfn.jederDefs || {})[chosen];
if (!def) return;
$.each(def.fields, function (key, label) {
var row = $("<div></div>").addClass("wiktku-dfn-quote-src-row");
var fieldLbl = $("<label></label>").text(label + ": ");
var inp = $("<textarea></textarea>")
.attr("rows", 2)
.addClass("wiktku-dfn-quote-src-input wiktku-start-narrow")
.attr("data-field-key", key)
.attr("placeholder", label + "…");
// "Sernav" / "Sernavê orjînal" (title fields, e.g. for
// kitêb/kovar/malper) get a taller, draggable box; every
// other field in the template stays as-is. Field labels
// come from the on-wiki jederDefs data, so match on the
// (diacritic-folded) label text rather than a fixed key.
var foldedLabel = foldDiacritics(label);
if (/^sernav$/.test(foldedLabel) || /orjin/.test(foldedLabel)) {
inp.addClass("wiktku-dfn-quote-src-input--title");
}
row.append(fieldLbl).append(inp);
srcFields.append(row);
});
});
li.append(citoidWrap).append(srcSel).append(srcFields);
return li;
}
jederGroupDiv.data("buildJederLi", buildJederLi);
jederList.append(buildJederLi());
jederGroupDiv.append(jederLbl).append(jederList);
block.append(jederGroupDiv);
}());
// Apply the initial hide/show state for the sub-groups (matches
// tplSelect's starting value, which is normally empty).
updateFieldVisibility();
return block;
},
/** Grows the sense list when the last mane textarea gets content. */
onDfnInput: function (stepDiv, block, textarea) {
var val = $.trim($(textarea).val());
var list = stepDiv.find("ol.wiktku-dfn-list");
var isLast = block.is(list.children("li:last-child"));
if (val && isLast) {
var newBlock = steps.dfn.buildSenseBlock(stepDiv);
list.append(newBlock);
// Give the new block's template selector the searchable picker.
initSelects(newBlock);
}
refresh();
},
/** Grows a sub-list (nimûne/formên alternatîv/hevmane/dijmane/termên koordîne) on input. */
onSubInput: function (list, input, rows, narrow) {
var val = $.trim($(input).val());
var item = $(input).parent();
var isLast = item.is(list.children("li:last-child"));
if (val && isLast) {
var next = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-sub-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", rows)
.attr("class", "wiktku-dfn-subfield" + (narrow ? " wiktku-start-narrow" : ""));
next.on("input", function () {
steps.dfn.onSubInput(list, this, rows, narrow);
});
list.append($("<li></li>").append(next));
}
},
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (tplDefs, posExamples, jederDefs).
tplDefs: {},
posExamples: {},
jederDefs: {},
build: function (stepDiv) {
if (stepDiv.find("ol.wiktku-dfn-list").length) return null;
var list = $("<ol class='wiktku-dfn-list'></ol>");
list.append(steps.dfn.buildSenseBlock(stepDiv));
stepDiv.append(list);
return null;
},
/** Reads all sense blocks from the DOM and returns an array of sense objects. */
getSenses: function (stepDiv) {
var senses = [];
stepDiv.find("li.wiktku-dfn-sense").each(function () {
var block = $(this);
var tplSel = block.find("select.wiktku-dfn-tpl-select");
var tpl = tplSel.val() || "";
// noLang: template already encodes the language — don't add |lang| param.
var tplNoLang = tpl
? tplSel.find("option[value='" + tpl + "']").attr("data-nolang") === "1"
: false;
var tplTitle = $.trim(block.find("input.wiktku-dfn-tpl-title").val());
var mane = $.trim(block.find("textarea.wiktku-dfn-mane").val());
function readList(cls) {
var vals = [];
block.find("." + cls + "-list textarea").each(function () {
var v = $.trim($(this).val());
if (v) vals.push(v);
});
return vals;
}
// Nimûne items are compound: { text, tr?, t? }
function readNimuneList() {
var items = [];
block.find(".wiktku-dfn-nimune-list li.wiktku-dfn-nimune-li").each(function () {
var text = $.trim($(this).find(".wiktku-dfn-nimune-text").val());
if (!text) return;
var obj = { text: text };
var tr = $.trim($(this).find(".wiktku-dfn-nimune-tr").val());
var t = $.trim($(this).find(".wiktku-dfn-nimune-t").val());
if (tr) obj.tr = tr;
if (t) obj.t = t;
items.push(obj);
});
return items;
}
// Jêder is a growing list of citations, one per li — mirrors readNimuneList().
function readJederList() {
var items = [];
block.find(".wiktku-dfn-jeder-list li.wiktku-dfn-jeder-li").each(function () {
var li = $(this);
var quote = $.trim(li.find(".wiktku-dfn-nimune-quote").val());
if (!quote) return;
var obj = { quote: quote };
var qtr = $.trim(li.find(".wiktku-dfn-nimune-quote-tr").val());
var qt = $.trim(li.find(".wiktku-dfn-nimune-quote-t").val());
if (qtr) obj.quoteTr = qtr;
if (qt) obj.quoteT = qt;
var tplName = li.find(".wiktku-dfn-quote-src-sel").val();
if (tplName === "__manual__") {
var manual = $.trim(li.find(".wiktku-dfn-quote-src-manual").val());
if (manual) obj.jederManual = manual;
} else if (tplName === "__category__") {
// Reachable only if the user opened the category search but
// never picked a şablon — picking one switches the row to
// __manual__ (see selectCatTpl above), so there's nothing
// meaningful to save here.
} else if (tplName) {
obj.jederTpl = tplName;
var fields = {};
li.find(".wiktku-dfn-quote-src-input").each(function () {
var k = $(this).attr("data-field-key");
var v = $.trim($(this).val());
if (k && v) fields[k] = v;
});
obj.jêderFields = fields;
}
items.push(obj);
});
return items;
}
senses.push({
tpl: tpl,
tplNoLang: tplNoLang,
tplTitle: tplTitle,
mane: mane,
etiket: readList("wiktku-dfn-etiket"),
kategori: readList("wiktku-dfn-kategori"),
nimune: readNimuneList(),
jeder: readJederList(),
alternativ: readList("wiktku-dfn-alternativ"),
hevmane: readList("wiktku-dfn-hevmane"),
dijmane: readList("wiktku-dfn-dijmane"),
koordine: readList("wiktku-dfn-koordine"),
jornav: readList("wiktku-dfn-jornav"),
jernav: readList("wiktku-dfn-jernav")
});
});
return senses;
},
getOutput: function (values, callback) {
var stepDiv = $("#wiktku-start-dfn");
var senses = steps.dfn.getSenses(stepDiv);
var lang = values.lang;
// A sense counts as "filled" if it has a mane, a chosen template + title,
// or any other content (etîket/hevmane/nimûne/jêder…) worth keeping.
var hasMane = senses.some(function (s) {
return s.mane !== "" || (s.tpl && s.tplTitle) || senseHasExtraContent(s);
});
var defLines = []; // one entry per kept sense (goes to linkify)
var citeLines = []; // parallel — nimûne+jêder for that same sense
var izahLines = []; // parallel — raw îzah gloss for that same sense
// True only once some sense's *actual* dfn text (post tercime/îzah
// split) is non-empty.
var hasLinkableMane = false;
$.each(senses, function (_, sense) {
// — Template sense (e.g. {{guharto|ku|somepage}}) —
if (sense.tpl) {
if (!sense.tplTitle) return; // skip empty template senses
var tplKatTpl = buildSenseTpl(sense, "kategori", lang, "K");
var tplLabelTpl = buildSenseTpl(sense, "etiket", lang, "e");
var tplCall = sense.tplNoLang
? "{{" + sense.tpl + "|" + sense.tplTitle + "}}"
: "{{" + sense.tpl + "|" + lang + "|" + sense.tplTitle + "}}";
var idx = defLines.length;
var cite = buildCite(sense, lang);
defLines.push("# " + (tplKatTpl ? tplKatTpl + " " : "") + (tplLabelTpl ? tplLabelTpl + " " : "") + tplCall +
(cite ? "{{wiktku-cite-" + idx + "}}" : ""));
citeLines.push(cite);
izahLines.push(""); // template senses have no îzah
return;
}
// — Normal mane sense —
var dfn = sense.mane;
if (!dfn && !senseHasExtraContent(sense)) return; // truly empty
// Pull the îzah gloss (if any) out of the combined tercime+îzah
// string — it's spliced back in separately below, after its
// own linkify pass (see izahLines / the second linkifyText call).
var izahRaw = null;
var tercimeIzah = splitTercimeIzah(dfn);
if (tercimeIzah) {
dfn = tercimeIzah.tercime;
izahRaw = stripWikilinks(tercimeIzah.izah);
}
if (dfn) {
dfn = stripWikilinks(dfn);
// Sentence-case + trailing period are for ku definitions,
// which are written as full glosses.
if (lang === "ku") {
if (dfn[0] !== dfn[0].toUpperCase()) dfn = capitalize(dfn);
if (!dfn.match(/[.…?!)\]]$/)) dfn += ".";
}
} else if (izahRaw === null) {
dfn = lang === "ku" ? "{{mane?|" + lang + "}}" : "";
}
if (dfn) hasLinkableMane = true;
var katTpl = buildSenseTpl(sense, "kategori", lang, "K");
var labelTpl = buildSenseTpl(sense, "etiket", lang, "e");
var out = "# " + (katTpl ? katTpl + " " : "") + (labelTpl ? labelTpl + " " : "") + dfn;
var idx = defLines.length;
var hasThisIzah = izahRaw !== null && $.trim(izahRaw) !== "";
// Bare {{...}} token — like {{wiktku-cite-N}}, this survives
// linkify's first pass untouched (it treats template calls as
// opaque), then gets swapped for {{îzah|…}} once the actual
// gloss text has been linkified in its own separate pass.
if (hasThisIzah) {
out += (dfn ? " " : "") + "{{wiktku-izah-" + idx + "}}";
}
function wordLine(tpl, words) {
if (!words.length) return "";
return "\n#: {{" + tpl + "|" + lang + "|" + words.join("|") + "}}";
}
out += wordLine("alt-r", sense.alternativ);
out += wordLine("hevmane", sense.hevmane);
out += wordLine("dijmane", sense.dijmane);
out += wordLine("koordîne", sense.koordine);
out += wordLine("jornav", sense.jornav);
out += wordLine("jêrnav", sense.jernav);
var cite = buildCite(sense, lang);
defLines.push(out + (cite ? "{{wiktku-cite-" + idx + "}}" : ""));
citeLines.push(cite);
izahLines.push(hasThisIzah ? izahRaw : "");
});
// Splice citeLines back into a linkified string, replacing each
// {{wiktku-cite-N}} token with its stored nimûne/jêder block.
function restoreCites(t) {
return t.replace(/\{\{wiktku-cite-(\d+)\}\}/g, function (_, n) {
return citeLines[parseInt(n, 10)] || "";
});
}
// Runs text through the linkify gadget if it's loaded, otherwise
// just passes it through unchanged. Shared by both linkify passes
// below (main mane text, and — separately — îzah glosses).
function linkifyText(t, cb) {
if (typeof $.kuLinkify === "function") {
$.kuLinkify(t, cb);
} else {
cb(t);
}
}
var hasIzah = izahLines.some(function (t) { return t && $.trim(t) !== ""; });
var text = defLines.join("\n") + "\n";
if (!hasMane) {
// No definitions entered — emit {{mane?}} with nimûne?.
text = "# {{mane?|" + lang + "}}\n#* {{nimûne?|" + lang + "}}\n";
callback(text);
return;
}
// Runs the îzah-only linkify pass against `base` (either the raw
// text, when there's no linkable mane to run the main pass on
// first, or the already-linkified main text). Shared by both
// branches below so the token-splice logic only lives once.
function runIzahPass(base) {
var izahJoined = $.map(izahLines, function (raw, idx) {
if (!raw) return undefined;
return "{{wiktku-izah-open-" + idx + "}}" + raw + "{{wiktku-izah-close-" + idx + "}}";
}).join("\n");
linkifyText(izahJoined, function (izahLinked) {
var izahByIdx = {};
var re = /\{\{wiktku-izah-open-(\d+)\}\}([\s\S]*?)\{\{wiktku-izah-close-\1\}\}/g;
var m;
while ((m = re.exec(izahLinked)) !== null) {
izahByIdx[parseInt(m[1], 10)] = m[2];
}
var withIzah = base.replace(/\{\{wiktku-izah-(\d+)\}\}/g, function (_, n) {
var linked = izahByIdx[parseInt(n, 10)];
return linked !== undefined ? "{{îzah|" + linked + "}}" : "";
});
callback(restoreCites(withIzah));
});
}
if (!hasLinkableMane) {
if (!hasIzah) {
// All filled senses are template senses (or otherwise have
// no plain text at all) — nothing here needs linkify.
callback(restoreCites(text));
return;
}
// There's no plain mane text anywhere (e.g. tercime left blank
// with only îzah filled in), so every defLine is just a bare
// template call with nothing to word-link. Sending a line
// like "# {{wiktku-izah-0}}" through the main linkify pass
// gives it no plain words to work with, makes the linkify
// gadget hang — so skip that pass entirely and run only
// the îzah pass, splicing straight into the unlinkified text.
var loadIzahOnly = function () { runIzahPass(text); };
mw.loader.using("ext.gadget.linkify", loadIzahOnly, loadIzahOnly);
return;
}
var didTryToLoad = function () {
// First pass: the main definition text (mane), same as before.
linkifyText(text, function (mainLinked) {
if (!hasIzah) {
callback(restoreCites(mainLinked));
return;
}
// Second pass: îzah glosses, linkified via their own
// separate call. Each gloss is wrapped in its own
// {{wiktku-izah-open/close-N}} pair; like the existing
// {{wiktku-cite-N}} tokens, these sit inside double
// braces so linkify leaves the tokens themselves alone —
// only the raw gloss text between each pair gets linked.
runIzahPass(mainLinked);
});
};
mw.loader.using("ext.gadget.linkify", didTryToLoad, didTryToLoad);
}
},
je: makeWordListStep("je", "jê", "Kelîmeyên jê çêbûyî binivîse"),
tekildar: makeWordListStep("tekildar", "têkildar", "Kelîmeyên ji aliyê etîmolojiyê ve têkildarî vê kelîmeyê binivîse"),
binereherwiha: makeWordListStep("binereherwiha", "binêre herwiha", "Kelîmeyên din ên eleqedar binivîse"),
etym: {
id: "etym",
name: "etîmolojî",
question_fmt: "Etîmolojiya kelîmeyê binivîse",
// etymTpls populated from data.json
etymTpls: {},
visible: function (values) {
return values.lang && values.pos;
},
// Fills the insert-dropdown from the current etymTpls object.
refreshTplSelect: function () {
var sel = $("#wiktku-start-etym .wiktku-tpl-insert-select");
if (!sel.length) return;
sel.find("option[value!='']").remove();
$.each(steps.etym.etymTpls, function (name, tpl) {
sel.append($("<option></option>").val(tpl.snippet).text(name + " — " + tpl.desc));
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-etym-wrap").length) return null;
var wrap = $("<div class='wiktku-etym-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-etym-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-etym-text")
.attr("rows", 4)
.attr("placeholder", "Ji {{ji|en|ku|apple}}. yan rasterast binivîse…");
// Template insert dropdown — options also refreshed after data.json loads.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike…");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
$.each(steps.etym.etymTpls, function (name, tpl) {
sel.append($("<option></option>").val(tpl.snippet).text(name + " — " + tpl.desc));
});
sel.on("change", function () {
var snippet = $(this).val();
if (!snippet) return;
var lang = getValues().lang || "";
snippet = snippet.replace(/CODE/g, lang).replace(/SOURCELANG/g, "?");
insertAtCursor(ta[0], snippet);
$(this).val("");
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel);
wrap.append(ta);
stepDiv.append(wrap);
initSelects(wrap);
return ta;
},
output: function (values) {
var text = $.trim($("#wiktku-start-etym .wiktku-etym-text").val());
if (text) {
return "\n==== Etîmolojî ====\n" + text + "\n";
}
// No etymology entered — emit {{ji?|lang}} as a placeholder.
// Skip it only when every filled sense is a şablon sense
// a completely empty entry with no şablon chosen still gets the placeholder
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasFilledTplSense = dfnSenses.some(function (s) {
return !!s.tpl && !!s.tplTitle;
});
var hasRegularMane = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
if (hasFilledTplSense && !hasRegularMane) return "";
return "\n==== Etîmolojî ====\n{{ji?|" + values.lang + "}}\n";
} },
dunde: {
id: "dunde",
name: "dûnde",
question_fmt: "Eger ev kelîme ji vî zimanî ketibe zimanekî din, vî zimanî û kelîmeya wî binivîse",
visible: function (values) {
return !!values.pos;
},
disabledKeys: function (values) {
return {"navz": true, [values.lang]: true}
},
// Language dropdown + growing word-input list; a new row appends
// when the dropdown gets a value. Mirrors steps.trans, but flat.
buildRow: function (stepDiv) {
var row = $("<li class='wiktku-dunde-row wiktku-lang-row'></li>");
// Language selector — the searchable picker is applied after insertion into DOM.
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zimanekî bigere");
populateMenus(langSel, steps.dunde.keys || [], steps.dunde.disabledKeys);
// When a language is chosen, ensure a next empty row exists.
langSel.on("change", function () {
steps.dunde.onLangChange(stepDiv, row);
});
// Word list for this language.
var wordList = $("<ul class='wiktku-dunde-words wiktku-lang-row-words'></ul>");
var firstWord = steps.dunde.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
// The searchable picker is attached by initSelects() once the row
// is in the DOM (see onLangChange/build below).
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-dunde-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Kelîme…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-dunde-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.dunde.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (stepDiv, row) {
var list = stepDiv.find("ul.wiktku-dunde-list");
var isLast = row.is(list.children("li.wiktku-dunde-row:last-child"));
if (isLast) {
var newRow = steps.dunde.buildRow(stepDiv);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
// Keep disabled keys in sync across all lang selectors.
steps.dunde.syncDisabledKeys(stepDiv);
},
/** Disables already-selected languages in all other dropdowns. */
syncDisabledKeys: function (stepDiv) {
var taken = $.extend({}, steps.dunde.disabledKeys);
stepDiv.find("li.wiktku-dunde-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
stepDiv.find("li.wiktku-dunde-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
build: function (stepDiv) {
if (stepDiv.find("ul.wiktku-dunde-list").length) return null;
var list = $("<ul class='wiktku-dunde-list wiktku-lang-row-list'></ul>");
list.append(steps.dunde.buildRow(stepDiv));
stepDiv.append(list);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return null;
},
/** Reads all [langcode, words[]] rows from the DOM. */
getRows: function (stepDiv) {
var result = [];
stepDiv.find("li.wiktku-dunde-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-dunde-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
output: function () {
var stepDiv = $("#wiktku-start-dunde");
var rows = steps.dunde.getRows(stepDiv);
if (!rows.length) return "";
var lines = $.map(rows, function (row) {
var lang = row[0], words = row[1];
return "* {{dû|" + lang + "|" + words.join("|") + "}}";
});
return "\n==== Dûnde ====\n" + lines.join("\n") + "\n";
}
},
zarava: {
id: "zarava",
name: "bi zaravayên din",
question_fmt: "'"+ pageName + "' di zaravayên din de çawa tê gotin?",
visible: function (values) {
return steps.trans.visible(values);
},
disabledKeys: {},
buildRow: function (group) {
var row = $("<li class='wiktku-zarava-row wiktku-lang-row'></li>");
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zaravayekî bigere");
populateMenus(langSel, steps.zarava.keys || [], steps.zarava.disabledKeys);
langSel.on("change", function () {
steps.zarava.onLangChange(group, row);
});
var wordList = $("<ul class='wiktku-zarava-words wiktku-lang-row-words'></ul>");
var firstWord = steps.zarava.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-zarava-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Tercime…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-zarava-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.zarava.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (group, row) {
var list = group.find("ul.wiktku-zarava-list");
var isLast = row.is(list.children("li.wiktku-zarava-row:last-child"));
if (isLast) {
var newRow = steps.zarava.buildRow(group);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
steps.zarava.syncDisabledKeys(group);
},
/** Disables already-selected dialects in all other dropdowns within one group. */
syncDisabledKeys: function (group) {
var taken = $.extend({}, steps.zarava.disabledKeys);
group.find("li.wiktku-zarava-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
group.find("li.wiktku-zarava-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
/** Builds (or fetches) the .wiktku-zarava-group for one gloss. */
buildGroup: function (stepDiv, gi) {
var group = $("<div class='wiktku-zarava-group'></div>").attr("data-gloss-pos", gi);
var list = $("<ul class='wiktku-zarava-list wiktku-lang-row-list'></ul>");
list.append(steps.zarava.buildRow(group));
group.append(list);
stepDiv.append(group);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return group;
},
/** Syncs one .wiktku-zarava-group per current gloss (same logic as steps.trans.build). */
build: function (stepDiv) {
var glosses = steps.trans.glossList();
if (!glosses.length) {
stepDiv.find(".wiktku-zarava-group").remove();
return null;
}
var existingGroups = stepDiv.find(".wiktku-zarava-group");
if (existingGroups.length > glosses.length) {
existingGroups.slice(glosses.length).remove();
}
$.each(glosses, function (gi, gloss) {
var group = stepDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
if (!group.length) group = steps.zarava.buildGroup(stepDiv, gi);
var label = group.find(".wiktku-zarava-group-label");
if (glosses.length > 1) {
if (!label.length) {
label = $("<div class='wiktku-zarava-group-label'></div>");
group.prepend(label);
}
label.text(gloss.index + " " + gloss.text);
} else if (label.length) {
label.remove();
}
});
return null;
},
/** Reads the dialect rows for a single gloss group. */
getGroupTranslations: function (group) {
var result = [];
group.find("li.wiktku-zarava-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-zarava-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
/** Reads all rows from the DOM, grouped by gloss position. */
getTranslations: function (stepDiv) {
var result = [];
stepDiv.find(".wiktku-zarava-group").each(function () {
result.push(steps.zarava.getGroupTranslations($(this)));
});
return result;
},
output: function (values) {
if (values.lang !== "ku") return "";
var stepDiv = $("#wiktku-start-zarava");
var glosses = steps.trans.glossList();
if (!glosses.length) return "";
var blocks = $.map(glosses, function (gloss, gi) {
var group = stepDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
var rows = group.length ? steps.zarava.getGroupTranslations(group) : [];
if (!gloss.text && !rows.length) return undefined;
if (rows.length) {
rows.sort(function (a, b) {
var aLang = langsByCode[a[0]] || {};
var bLang = langsByCode[b[0]] || {};
return (aLang.sortKey || "").localeCompare(bLang.sortKey || "", "ku");
});
}
var wordLines = $.map(rows, function (row) {
var lang = row[0];
var words = row[1];
var wikiWords = words.map(function (w) {
return "{{W|" + lang + "|" + w + "}}";
}).join(", ");
return "* {{Z|" + lang + "}}: " + wikiWords;
}).join("\n");
if (!wordLines) return undefined;
var block = "{{werger-ser|" + (gloss.text || "?") + "|" + gloss.index + "}}";
block += "\n" + wordLines;
block += "\n{{werger-bin}}";
return block;
});
if (!blocks.length) return "";
return "\n==== Bi zaravayên din ====\n" + blocks.join("\n") + "\n";
}
},
trans: {
id: "trans",
name: "werger",
question_fmt: "Tercimeyên vê maneyê bi zimanên din binivîse",
visible: function (values) {
if (!(values.lang === "ku" && values.pos)) return false;
// Hide only when every sense is a filled template sense (no plain
// gloss to attach translations to). A mix, or nothing filled in
// yet, still shows Werger.
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasRealSense = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
var hasFilledTplSense = dfnSenses.some(function (s) {
return s.tpl && s.tplTitle;
});
return hasRealSense || !hasFilledTplSense;
},
disabledKeys: {
"navz": true,
"ku": true,
"ckb": true,
"sdh": true,
"lki": true,
"hac": true,
"zza": true },
// Language dropdown + growing word-input list, scoped to one gloss's
// group (each gloss has its own group and row list).
buildRow: function (group) {
var row = $("<li class='wiktku-trans-row wiktku-lang-row'></li>");
// Language selector — the searchable picker is applied after insertion into DOM.
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zimanekî bigere");
populateMenus(langSel, steps.trans.keys || [], steps.trans.disabledKeys);
// When a language is chosen, ensure a next empty row exists.
langSel.on("change", function () {
steps.trans.onLangChange(group, row);
});
// Word list for this language.
var wordList = $("<ul class='wiktku-trans-words wiktku-lang-row-words'></ul>");
var firstWord = steps.trans.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
// The searchable picker is attached by initSelects() once the row
// is in the DOM (see onLangChange/buildGroup below).
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-trans-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Tercime…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-trans-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.trans.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (group, row) {
var list = group.find("ul.wiktku-trans-list");
var isLast = row.is(list.children("li.wiktku-trans-row:last-child"));
if (isLast) {
var newRow = steps.trans.buildRow(group);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
// Keep disabled keys in sync across this gloss's lang selectors
// only — the same language can be used for different senses.
steps.trans.syncDisabledKeys(group);
},
/** Disables already-selected languages in all other dropdowns within one group. */
syncDisabledKeys: function (group) {
var taken = $.extend({}, steps.trans.disabledKeys);
group.find("li.wiktku-trans-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
group.find("li.wiktku-trans-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
// Builds (or fetches) the .wiktku-trans-group for one gloss.
buildGroup: function (stepDiv, gi) {
var group = $("<div class='wiktku-trans-group'></div>").attr("data-gloss-pos", gi);
var list = $("<ul class='wiktku-trans-list wiktku-lang-row-list'></ul>");
list.append(steps.trans.buildRow(group));
group.append(list);
stepDiv.append(group);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return group;
},
// Syncs one .wiktku-trans-group per current gloss, keyed by
// data-gloss-pos so groups stay matched across rebuilds.
build: function (stepDiv) {
var glosses = steps.trans.glossList();
if (!glosses.length) {
stepDiv.find(".wiktku-trans-group").remove();
return null;
}
// Drop groups for glosses that no longer exist (always from the
// tail — groups are only ever appended in gloss order below).
var existingGroups = stepDiv.find(".wiktku-trans-group");
if (existingGroups.length > glosses.length) {
existingGroups.slice(glosses.length).remove();
}
$.each(glosses, function (gi, gloss) {
var group = stepDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
if (!group.length) group = steps.trans.buildGroup(stepDiv, gi);
// Only label groups when there's more than one gloss to
// distinguish between — a single gloss needs no caption.
var label = group.find(".wiktku-trans-group-label");
if (glosses.length > 1) {
if (!label.length) {
label = $("<div class='wiktku-trans-group-label'></div>");
group.prepend(label);
}
label.text(gloss.index + " " + gloss.text);
} else if (label.length) {
label.remove();
}
});
return null;
},
/** Reads the translation rows for a single gloss group. */
getGroupTranslations: function (group) {
var result = [];
group.find("li.wiktku-trans-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-trans-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
// Reads all translation rows, grouped by gloss position.
getTranslations: function (stepDiv) {
var result = [];
stepDiv.find(".wiktku-trans-group").each(function () {
result.push(steps.trans.getGroupTranslations($(this)));
});
return result;
},
// Builds the numbered "{ index, gloss }" list, one per dfn sense
// with a real mane (skips template senses). index is 1-based and
// matches the sense's position in the "#" definition list.
// When nothing's filled in, returns one placeholder entry so
// Werger still has a group to attach to; when every sense is a
// filled template sense, stays empty (matches trans.visible()).
glossList: function () {
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var glosses = [];
var hasFilledTplSense = false;
$.each(dfnSenses, function (i, s) {
if (s.tpl) {
if (s.tplTitle) hasFilledTplSense = true;
return; // template sense — no gloss to caption with
}
var dfn = s.mane;
if (!dfn) {
// No mane, but other fields are filled — still gets a
// gloss group since dfn.getOutput() emits {{mane?}} for it.
if (senseHasExtraContent(s)) glosses.push({ index: i + 1, text: "" });
return;
}
if (dfn[0] !== dfn[0].toLowerCase()) dfn = decapitalize(dfn);
dfn = stripWikilinks(dfn).replace(/[.…?!)\]،؟]+$/, "");
glosses.push({ index: i + 1, text: dfn });
});
if (!glosses.length && !hasFilledTplSense) {
glosses.push({ index: 1, text: "" });
}
return glosses;
},
output: function (values) {
if (values.lang !== "ku") return "";
var stepDiv = $("#wiktku-start-trans");
var glosses = steps.trans.glossList();
// Every sense is a template sense — there's no real gloss
// anywhere and no group in the DOM either (glossList() only
// returns empty in that case), so skip the section entirely.
if (!glosses.length) return "";
// A completely empty entry (nothing filled in dfn at all, no
// şablon chosen either) still gets a placeholder Werger section
// to fill in later. Only
// skip an individual placeholder gloss below when some other
// sense actually has real content, making that particular
// placeholder redundant.
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasRegularMane = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
// Each gloss now has its own group of translation rows —
// attach every gloss's own words under its own werger-ser/-bin
// pair instead of dumping everything under the first one.
var blocks = $.map(glosses, function (gloss, gi) {
var group = stepDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
var rows = group.length ? steps.trans.getGroupTranslations(group) : [];
// Placeholder gloss (no real mane entered yet) with nothing
// translated into it. If some other sense already has real
// content, this placeholder is redundant — skip it. If the
// whole entry is empty, keep it so Werger still gets a
// section to fill in.
if (!gloss.text && !rows.length && hasRegularMane) return undefined;
if (rows.length) {
// Sort by Kurdish sort key.
rows.sort(function (a, b) {
var aLang = langsByCode[a[0]] || {};
var bLang = langsByCode[b[0]] || {};
return (aLang.sortKey || "").localeCompare(bLang.sortKey || "", "ku");
});
}
var wordLines = $.map(rows, function (row) {
var lang = row[0];
var words = row[1];
var wikiWords = words.map(function (w) {
return "{{W|" + lang + "|" + w + "}}";
}).join(", ");
return "* {{Z|" + lang + "}}: " + wikiWords;
}).join("\n");
var block = "{{werger-ser|" + (gloss.text || "?") + "|" + gloss.index + "}}";
if (wordLines) block += "\n" + wordLines;
block += "\n{{werger-bin}}";
return block;
});
if (!blocks.length) return "";
return "\n==== Werger ====\n" + blocks.join("\n") + "\n";
}
},
cavkani: {
id: "cavkani",
name: "çavkanî",
question_fmt: "Çavkaniyên din (ne jêgirtin) lê zêde bike",
visible: function (values) {
return !!values.pos;
},
// Fills the insert-dropdown from the members of [[Kategorî:Çavkanî]].
refreshTplSelect: function () {
var sel = $("#wiktku-start-cavkani .wiktku-tpl-insert-select");
if (!sel.length) return;
sel.find("option[value!='']").remove();
$.each(catSrcTemplates || [], function (_, name) {
sel.append($("<option></option>").val(name).text(name));
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-cavkani-wrap").length) return null;
var wrap = $("<div class='wiktku-cavkani-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-cavkani-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-cavkani-text")
.attr("rows", 4)
.attr("placeholder", "Şablonekî ji jêrê hilbijêre an rasterast binivîse…");
// Template insert dropdown, populated from [[Kategorî:Çavkanî]] —
// options refreshed once the category members are fetched.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike…");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
var status = $("<span class='wiktku-cavkani-status'></span>");
sel.on("change", function () {
var name = $(this).val();
if (!name) return;
insertAtCursor(ta[0], "\n* {{" + name + "}}");
$(this).val("");
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel);
wrap.append(status).append(ta);
stepDiv.append(wrap);
// build() runs again for every new beş (see the "+ Beş zêde bike"
// handler), after the initial page-wide pass — so this select needs
// its own init or it stays a plain, unsearchable native <select>.
initSelects(wrap);
// Populate only now: refreshTplSelect() looks the select up by id
// under #wiktku-start-cavkani, so running it before the wrap was
// appended found nothing and bailed out — which left the dropdown
// empty on every beş after the first, once the category members
// were already cached.
if (catSrcTemplates) {
steps.cavkani.refreshTplSelect();
} else {
status.text("Şablon tên barkirin…");
fetchCatSrcTemplates().then(function () {
steps.cavkani.refreshTplSelect();
status.text("");
}, function () {
status.text("Şablon nehatin barkirin.");
});
}
return ta;
},
output: function () {
var text = $.trim($("#wiktku-start-cavkani .wiktku-cavkani-text").val());
if (!text) return "";
return "\n==== Çavkanî ====\n" + text + "\n";
}
},
};
steps.trans.keys = steps.lang.choices;
steps.dunde.keys = steps.lang.choices;
steps.zarava.keys = getZaravaKeys(steps.lang.choices);
var ordered_steps = [
steps.lang, steps.pron, steps.pos, steps.cinsiyet, steps.lektur, steps.tr,
steps.dfn, steps.je, steps.tekildar,
steps.etym, steps.dunde, steps.binereherwiha, steps.zarava, steps.trans, steps.cavkani];
// Step ids that belong to each section (not shared across sections).
var PER_SECTION_STEP_IDS = [
"pos", "cinsiyet", "lektur", "tr",
"dfn", "je", "tekildar", "etym", "dunde", "binereherwiha", "zarava", "trans", "cavkani"
];
// ── Multi-section state ──────────────────────────────────────────────────
// Each entry is a plain snapshot: { pos, cinsiyet, lektur, tr, dfn (senses[]),
// je, tekildar, binereherwiha, trans (rows[]) }.
var sections = [{}]; // section 0 starts empty (DOM is the truth)
var activeSection = 0;
function snapshotDfn() {
return steps.dfn.getSenses($("#wiktku-start-dfn"));
}
// Rebuilds the dfn DOM from a previously snapshotted senses array.
function restoreDfn(senses) {
var stepDiv = $("#wiktku-start-dfn");
// Tear down the existing list so build() recreates it cleanly.
stepDiv.find("ol.wiktku-dfn-list").remove();
steps.dfn.build(stepDiv);
var list = stepDiv.find("ol.wiktku-dfn-list");
$.each(senses, function (i, sense) {
// Ensure enough blocks exist (build() seeds one).
var blocks = list.find("li.wiktku-dfn-sense");
var block = blocks.eq(i);
if (!block.length) {
var nb = steps.dfn.buildSenseBlock(stepDiv);
list.append(nb);
block = list.find("li.wiktku-dfn-sense").last();
}
// Template selector.
block.find("select.wiktku-dfn-tpl-select").val(sense.tpl || "");
if (sense.tpl) {
block.find("textarea.wiktku-dfn-mane").hide();
block.find("input.wiktku-dfn-tpl-title").val(sense.tplTitle || "").show();
} else {
block.find("textarea.wiktku-dfn-mane").val(sense.mane || "").show();
block.find("input.wiktku-dfn-tpl-title").hide().val("");
}
// dfnArea is the only thing actually saved, so split it back into
// tercime/îzah for editing (mirrors syncNonKuToMane's join format).
var maneParts = splitTercimeIzah(sense.mane);
block.find(".wiktku-dfn-tercime").val(maneParts ? maneParts.tercime : (sense.mane || ""));
block.find(".wiktku-dfn-izah").val(maneParts ? maneParts.izah : "");
// Re-sync the formên alternatîv/hevmane/… hide state now that
// tplSelect's value was set (its own "change"
// handler doesn't fire from .val(), so this doesn't happen otherwise).
var updateVis = block.data("updateFieldVisibility");
if (updateVis) updateVis();
// Same for the mane-box mode (plain vs tercime+îzah), since this
// also depends on tplSelect's (and lang's) value.
var updateMane = block.data("updateManeMode");
if (updateMane) updateMane();
// Restore a sub-list (etiket, formên alternatîv, hevmane …) from a values array.
function restoreSubList(cls, values) {
if (!values || !values.length) return;
var groupDiv = block.find("." + cls + "-group");
var subList = groupDiv.find("ol, ul").first();
if (!subList.length) return; // group not found
// Fill existing items, append new ones as needed.
$.each(values, function (j, val) {
var items = subList.find("li");
if (j < items.length) {
items.eq(j).find("textarea").val(val);
} else {
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-restore-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.val(val);
ta.on("input", function () {
steps.dfn.onSubInput(subList, this, 1, true);
});
subList.append($("<li></li>").append(ta));
}
});
}
// Reveal and populate lazy groups that have data.
var lazyMap = {
"wiktku-dfn-etiket": sense.etiket,
"wiktku-dfn-kategori": sense.kategori,
"wiktku-dfn-alternativ": sense.alternativ,
"wiktku-dfn-hevmane": sense.hevmane,
"wiktku-dfn-dijmane": sense.dijmane,
"wiktku-dfn-koordine": sense.koordine,
"wiktku-dfn-jornav": sense.jornav,
"wiktku-dfn-jernav": sense.jernav
};
$.each(lazyMap, function (cls, vals) {
if (vals && vals.length) restoreSubList(cls, vals);
});
// Nimûne items are objects { text, tr?, t? } — restore using the builder.
if (sense.nimune && sense.nimune.length) {
var nimuneGroupDiv = block.find(".wiktku-dfn-nimune-group");
var nimuneList = nimuneGroupDiv.find("ol.wiktku-dfn-nimune-list");
var buildFn = nimuneGroupDiv.data("buildNimuneLi");
nimuneList.empty();
$.each(sense.nimune, function (_, n) {
var text = typeof n === "object" ? (n.text || "") : n;
if (!text) return;
var li = buildFn ? buildFn() : $("<li class='wiktku-dfn-nimune-li'></li>");
li.find(".wiktku-dfn-nimune-text").val(text).each(function () { highlightLinebreak(this); });
if (n.tr) li.find(".wiktku-dfn-nimune-tr").val(n.tr);
if (n.t) li.find(".wiktku-dfn-nimune-t").val(n.t);
nimuneList.append(li);
});
// Always leave a blank trailing item.
if (buildFn) nimuneList.append(buildFn());
}
// Restore jêder entries — accepts current array shape or a legacy
// single object (older saved sections) for backwards compat.
var jederArr = $.isArray(sense.jeder) ? sense.jeder : (sense.jeder ? [sense.jeder] : []);
if (jederArr.length) {
var jederGroupDiv = block.find(".wiktku-dfn-jeder-group");
var jederList = jederGroupDiv.find("ol.wiktku-dfn-jeder-list");
var buildJederFn = jederGroupDiv.data("buildJederLi");
jederList.empty();
$.each(jederArr, function (_, j) {
if (!j || !j.quote) return;
var li = buildJederFn ? buildJederFn() : $("<li class='wiktku-dfn-jeder-li'></li>");
li.find(".wiktku-dfn-nimune-quote").val(j.quote).each(function () { highlightLinebreak(this); });
if (j.quoteTr) li.find(".wiktku-dfn-nimune-quote-tr").val(j.quoteTr);
if (j.quoteT) li.find(".wiktku-dfn-nimune-quote-t").val(j.quoteT);
if (j.jederManual) {
var manualSel = li.find(".wiktku-dfn-quote-src-sel");
manualSel.val("__manual__").trigger("change");
li.find(".wiktku-dfn-quote-src-manual").val(j.jederManual);
} else if (j.jederCatTpl) {
// Legacy format from before the şablon search switched rows to
// manual mode directly — convert it the same way now, so it's
// editable like any other free-form source.
var catSelEl = li.find(".wiktku-dfn-quote-src-sel");
catSelEl.val("__manual__").trigger("change");
li.find(".wiktku-dfn-quote-src-manual").val("{{" + j.jederCatTpl + "}}");
} else if (j.jederTpl) {
var srcSel = li.find(".wiktku-dfn-quote-src-sel");
srcSel.val(j.jederTpl).trigger("change");
if (j.jêderFields) {
$.each(j.jêderFields, function (key, val) {
li.find(".wiktku-dfn-quote-src-input[data-field-key='" + key + "']").val(val);
});
}
}
jederList.append(li);
});
// Always leave a blank trailing item, same as Nimûne.
if (buildJederFn) jederList.append(buildJederFn());
}
});
}
// Snapshots simple (non-dfn) per-section steps from the DOM into obj.
function saveCurrentSection() {
var snap = {};
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
snap.dfn = snapshotDfn();
return;
}
if (id === "etym") {
snap.etym = $.trim($("#wiktku-start-etym .wiktku-etym-text").val());
return;
}
if (id === "cavkani") {
snap.cavkani = $.trim($("#wiktku-start-cavkani .wiktku-cavkani-text").val());
return;
}
var step = steps[id];
if (!step) return;
var stepDiv = $("#wiktku-start-" + id);
if (id === "trans") {
snap.trans = steps.trans.getTranslations(stepDiv);
return;
}
if (id === "zarava") {
snap.zarava = steps.zarava.getTranslations(stepDiv);
return;
}
if (id === "dunde") {
snap.dunde = steps.dunde.getRows(stepDiv);
return;
}
// Generic: read all step fields.
var fields = stepDiv.find(".wiktku-start-step-field");
if (step.multiple) {
snap[id] = fields.map(function () { return $(this).val(); }).get();
} else {
snap[id] = fields.val();
}
});
sections[activeSection] = snap;
}
// Restores a previously saved snapshot into the form DOM.
function restoreSection(snap) {
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
restoreDfn(snap.dfn || []);
return;
}
if (id === "etym") {
$("#wiktku-start-etym .wiktku-etym-wrap").remove();
steps.etym.build($("#wiktku-start-etym"));
$("#wiktku-start-etym .wiktku-etym-text").val(snap.etym || "");
return;
}
if (id === "cavkani") {
$("#wiktku-start-cavkani .wiktku-cavkani-wrap").remove();
steps.cavkani.build($("#wiktku-start-cavkani"));
$("#wiktku-start-cavkani .wiktku-cavkani-text").val(snap.cavkani || "");
return;
}
if (id === "trans") {
// Rebuild trans groups (dfn must already be restored by this
// point in the $.each loop, so glossList() reflects it).
var transDiv = $("#wiktku-start-trans");
transDiv.find(".wiktku-trans-group").remove();
steps.trans.build(transDiv);
var groupsSnap = snap.trans || [];
$.each(groupsSnap, function (gi, rows) {
var group = transDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
if (!group.length) return; // gloss no longer exists — drop its rows
var list = group.find("ul.wiktku-trans-list");
$.each(rows, function (j, row) {
var lang = row[0], words = row[1];
var lastRow = list.find("li.wiktku-trans-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-trans-words");
$.each(words, function (k, word) {
var wordItems = wordList.find("li");
if (k < wordItems.length) {
wordItems.eq(k).find("textarea").val(word);
} else {
// .val() below doesn't fire "input", so the normal
// auto-grow never runs — append a matching item
// ourselves instead of silently dropping the word.
var extraInput = steps.trans.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
// Leave one trailing empty field so the row can still grow
// when the user types, matching a freshly-built row.
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.trans.makeWordInput()));
}
});
});
return;
}
if (id === "zarava") {
// Rebuild zarava groups (dfn must already be restored by this
// point in the $.each loop, so glossList() reflects it).
var zaravaDiv = $("#wiktku-start-zarava");
zaravaDiv.find(".wiktku-zarava-group").remove();
steps.zarava.build(zaravaDiv);
var zaravaGroupsSnap = snap.zarava || [];
$.each(zaravaGroupsSnap, function (gi, rows) {
var group = zaravaDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
if (!group.length) return; // gloss no longer exists — drop its rows
var list = group.find("ul.wiktku-zarava-list");
$.each(rows, function (j, row) {
var lang = row[0], words = row[1];
var lastRow = list.find("li.wiktku-zarava-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-zarava-words");
$.each(words, function (k, word) {
var wordItems = wordList.find("li");
if (k < wordItems.length) {
wordItems.eq(k).find("textarea").val(word);
} else {
var extraInput = steps.zarava.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.zarava.makeWordInput()));
}
});
});
return;
}
if (id === "dunde") {
// Rebuild dunde rows.
var dundeDiv = $("#wiktku-start-dunde");
dundeDiv.find("ul.wiktku-dunde-list").remove();
steps.dunde.build(dundeDiv);
var dundeRows = snap.dunde || [];
$.each(dundeRows, function (i, row) {
var lang = row[0], words = row[1];
var list = dundeDiv.find("ul.wiktku-dunde-list");
var lastRow = list.find("li.wiktku-dunde-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-dunde-words");
$.each(words, function (j, word) {
var wordItems = wordList.find("li");
if (j < wordItems.length) {
wordItems.eq(j).find("textarea").val(word);
} else {
// .val() below doesn't fire "input", so the normal
// auto-grow never runs — append a matching item
// ourselves instead of silently dropping the word.
var extraInput = steps.dunde.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
// Leave one trailing empty field so the row can still grow
// when the user types, matching a freshly-built row.
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.dunde.makeWordInput()));
}
});
return;
}
var step = steps[id];
if (!step) return;
var stepDiv = $("#wiktku-start-" + id);
var fields = stepDiv.find(".wiktku-start-step-field");
var val = snap[id];
if (val === undefined || val === null) return;
if (step.multiple) {
var arr = val;
fields.each(function (i) {
if (i < arr.length) $(this).val(arr[i]);
});
} else {
fields.val(val);
}
// Tell the pickers about the programmatic value change.
fields.filter("select").trigger("wiktku:refresh");
});
}
function getWikitextForCurrentSection(callback) {
var values = getValues();
var entry = steps.pos.output(values);
steps.dfn.getOutput(values, function (output) {
entry += output;
entry += steps.je.output(values);
entry += steps.tekildar.output(values);
entry += steps.etym.output(values);
entry += steps.dunde.output(values);
entry += steps.binereherwiha.output(values);
entry += steps.zarava.output(values);
entry += steps.trans.output(values);
entry += steps.cavkani.output(values);
callback(entry, values);
});
}
function getWikitextAllSections(callback) {
saveCurrentSection();
var results = new Array(sections.length);
var sharedValues = getValues(); // lang/pron are shared
function processSection(i) {
if (i >= sections.length) {
// All done — restore original active section.
restoreSection(sections[activeSection]);
refresh();
callback(results, sharedValues);
return;
}
restoreSection(sections[i]);
refresh();
getWikitextForCurrentSection(function (sectionText) {
results[i] = sectionText;
processSection(i + 1);
});
}
processSection(0);
}
// Assembles wikitext for all sections plus the shared lang/pron header.
function getWikitext(callback) {
getWikitextAllSections(function (sectionTexts, sharedValues) {
var entry = steps.lang.output(sharedValues);
entry += steps.pron.output(sharedValues);
entry += sectionTexts.join("\n");
// Edit summary uses section 0's values. Read from the saved snapshot
// (not the live DOM) so it doesn't mix section 0's pos with whichever
// section happens to be active/restored at this point.
var dfnSenses = (sections[0] && sections[0].dfn) || [];
var dfnSummary = dfnSenses.map(function (s) {
if (s.mane) return s.mane;
// Template sense (e.g. {{guharto|ku|somepage}}) — same
// construction as the tplCall built in getOutput, so the
// summary shows what actually gets written to the entry
// instead of going blank.
if (s.tpl && s.tplTitle) {
return s.tplNoLang
? "{{" + s.tpl + "|" + s.tplTitle + "}}"
: "{{" + s.tpl + "|" + sharedValues.lang + "|" + s.tplTitle + "}}";
}
return "";
}).filter(Boolean).join("; ");
var summary = "([[Mediawiki:Gadget-start.js|WF:NÛ]] v.2.0) +" +
sharedValues.lang + ":" + sections[0].pos + ":" + dfnSummary;
var summaryField = document.getElementById("wpSummary");
if (addLangMode && summaryField.value) {
summary = summaryField.value + " " + summary;
}
summaryField.value = summary;
callback(entry);
});
}
var continueBtn;
function getValuesForStep(stepId) {
var fields = $("#wiktku-start-" + stepId + " .wiktku-start-step-field");
var step = steps[stepId];
if (step.keys) {
var values = {};
fields.each(function (i, field) {
var key = $(field).prevAll(".wiktku-start-step-keyfield").val();
if (key) values[key] = $(field).val();
});
return values;
}
else if (step.multiple) {
return fields.map(function () {
return $(this).val();
}).get();
}
return fields.val();
}
function getValues() {
var values = {};
$.each(steps, function (stepId) {
values[stepId] = getValuesForStep(stepId);
});
return values;
}
function populateMenus(inputs, choices, disabledValues, placeholderText) {
if (!disabledValues) disabledValues = {};
var vals = inputs.map(function (i, input) {
return $(input).val();
});
inputs.empty();
inputs.append($("<option></option>").text(placeholderText || ""));
$.each(choices, function (j, choice) {
// Append the language code in parentheses so that typing a code
// (e.g. "ku") in the search box still finds the language name.
var displayText = capitalize(choice.label);
if (choice.sortKey !== undefined) {
// This is a language choice {code, label, sortKey} — show code.
displayText = capitalize(choice.label) + " (" + choice.code + ")";
}
var option = $(mw.html.element("option", {
value: choice.code }, displayText));
if (disabledValues[choice.code]) option.prop("disabled", true);
inputs.append(option);
});
inputs.val(function (i) {
return vals[i];
});
}
// Keys to disable for a key menu: already-taken or explicitly disabled.
function getDisabledKeys(step) {
var occupiedKeys = {};
$("#wiktku-start-" + step.id + " .wiktku-start-step-keyfield").each(function () {
occupiedKeys[$(this).val()] = true;
});
if (step.disabledKeys) $.extend(occupiedKeys, step.disabledKeys);
return occupiedKeys;
}
function buildKeyInput(step) {
if (!step.keys) return undefined;
var input = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
input.attr("data-placeholder", "Hilbijêre " + step.keyName);
populateMenus(input, step.keys, getDisabledKeys(step));
// Keep the key menus mutually exclusive: whatever one row selects is
// disabled in every other row. Recomputed from the DOM on each change.
input.on("change", function () {
var all = $("#wiktku-start-" + step.id + " .wiktku-start-step-keyfield");
var taken = {};
all.each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
all.not(this).each(function () {
var self = $(this), own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (code) $(this).prop("disabled", !!taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
});
// Return the wrapper; the select lives inside it and still fires change.
return wrapNativeSelect(input);
}
// Adds another text field to the list if the last one now has text.
function refreshForTextField(currentInput, step) {
currentInput = $(currentInput);
var value = currentInput.val();
var item = currentInput.parent();
if (value && !item.next("li").length) {
var nextInput = $("<textarea></textarea>")
.attr("name", "wiktku-field-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", currentInput.attr("class"))
.attr("rows", currentInput.attr("rows") || 1);
if (step.placeholder) nextInput.attr("placeholder", step.placeholder);
nextInput.on("input", function (evt) {
refreshForTextField(evt.target, step);
});
var nextKeyInput = buildKeyInput(step);
var nextItem = $("<li></li>").append(nextKeyInput).append(nextInput);
item.parent().append(nextItem);
if (nextKeyInput) initSelects(nextItem);
}
var canContinue = !continueBtn.isDisabled();
if ((value && !canContinue) || (!value && canContinue)) {
refresh(step);
}
}
function prepareInput(input, step) {
if (!input) return;
if (step.required) input.prop('required', true);
input.change(step, refresh);
}
// Shows/hides steps based on whether their prerequisites are met, and
// updates placeholders where applicable.
function refresh(evt) {
var values = getValues();
var changedStep = evt && evt.data;
var didFocus = false;
var canContinue = true;
// Re-filter template options in every sense block whenever lang changes.
$("#wiktku-start-dfn .wiktku-dfn-tpl-select").each(function () {
var fn = $(this).data("updateOptions");
if (typeof fn === "function") fn();
});
// Re-filter pronunciation and etymology template dropdowns when language changes.
steps.pron.refreshTplSelect();
steps.etym.refreshTplSelect();
steps.cavkani.refreshTplSelect();
// Re-render any step's question label that depends on current values
// (e.g. dfn's Werger-section reminder, which only applies to ku).
$.each(steps, function (stepId, step) {
if (typeof step.question_fmt === "function") {
$("#wiktku-start-" + stepId + " .wiktku-start-step-question")
.text(step.question_fmt(values));
}
});
// Sync every sense block's mane-box mode (plain mane vs tercime+îzah)
// to the current language, in case lang changes after blocks exist.
$("#wiktku-start-dfn li.wiktku-dfn-sense").each(function () {
var updateMane = $(this).data("updateManeMode");
if (updateMane) updateMane();
});
// Sync tr/t sub-fields in every nimûne item to the current language.
// tr shown when language needs transliteration; t shown when lang !== "ku".
(function () {
var lang = values.lang || "";
var showTr = needsTransliteration(lang);
var showT = lang && lang !== "ku";
$("#wiktku-start-dfn .wiktku-dfn-nimune-list li.wiktku-dfn-nimune-li").each(function () {
var li = $(this);
// Ensure the sub-wrapper exists when we need it.
var subWrap = li.find(".wiktku-dfn-nimune-sub");
// tr field
var trTa = li.find(".wiktku-dfn-nimune-tr");
if (showTr && !trTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
li.append(subWrap);
}
trTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-tr")
.attr("placeholder", "Transliterasyon…");
subWrap.prepend(trTa);
} else if (!showTr && trTa.length) {
trTa.remove();
}
// t field
var tTa = li.find(".wiktku-dfn-nimune-t");
if (showT && !tTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
li.append(subWrap);
}
tTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-t")
.attr("placeholder", "Tercimeya nimûneyê bi kurmancî…");
subWrap.append(tTa);
} else if (!showT && tTa.length) {
tTa.remove();
}
// Remove the wrapper if it ended up empty.
subWrap = li.find(".wiktku-dfn-nimune-sub");
if (subWrap.length && !subWrap.children().length) subWrap.remove();
});
}());
// Sync tr/t sub-fields in every jêder citation to the current language.
// tr shown when language needs transliteration; t shown when lang !== "ku".
(function () {
var lang = values.lang || "";
var showTr = needsTransliteration(lang);
var showT = lang && lang !== "ku";
$("#wiktku-start-dfn .wiktku-dfn-jeder-list li.wiktku-dfn-jeder-li").each(function () {
var li = $(this);
// Ensure the sub-wrapper exists when we need it. It must sit right
// after the quote textarea and before the source selector.
var subWrap = li.find(".wiktku-dfn-quote-sub");
// tr field
var trTa = li.find(".wiktku-dfn-nimune-quote-tr");
if (showTr && !trTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
// Insert after the quote textarea's resize-wrap (if the manual
// resize handle has already been attached to it), not after the
// bare textarea -- otherwise this lands *inside* that wrap,
// between the textarea and its own grip, breaking jêgirtin's
// handle and nesting the tr/t boxes inside it.
var quoteTa = li.find(".wiktku-dfn-nimune-quote");
var quoteResizeWrap = quoteTa.closest(".wiktku-resize-wrap");
(quoteResizeWrap.length ? quoteResizeWrap : quoteTa).after(subWrap);
}
trTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-tr")
.attr("placeholder", "Transliterasyona jêgirtinê…");
subWrap.prepend(trTa);
} else if (!showTr && trTa.length) {
trTa.remove();
}
// t field
var tTa = li.find(".wiktku-dfn-nimune-quote-t");
if (showT && !tTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
// See the tr-field branch above for why this targets the
// resize-wrap instead of the bare textarea.
var quoteTa2 = li.find(".wiktku-dfn-nimune-quote");
var quoteResizeWrap2 = quoteTa2.closest(".wiktku-resize-wrap");
(quoteResizeWrap2.length ? quoteResizeWrap2 : quoteTa2).after(subWrap);
}
tTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-t")
.attr("placeholder", "Tercimeya jêgirtinê bi kurmancî…");
subWrap.append(tTa);
} else if (!showT && tTa.length) {
tTa.remove();
}
// Remove the wrapper if it ended up empty.
subWrap = li.find(".wiktku-dfn-quote-sub");
if (subWrap.length && !subWrap.children().length) subWrap.remove();
});
}());
$.each(steps, function (stepId, step) {
if (typeof(step.visible) === "function" && !step.visible(values)) {
$("#wiktku-start-" + stepId).slideUp();
}
else {
var stepDiv = $("#wiktku-start-" + stepId);
if (changedStep !== step && typeof(step.build) === "function") {
prepareInput(step.build(stepDiv, values), step);
}
var input = stepDiv.find(".wiktku-start-step-field");
if (typeof(step.example) === "function") {
// .find() above already reaches nested fields (e.g. the dfn
// step's mane textareas inside each sense block), so one
// assignment covers every step; dfn keeps its own fallback.
var exampleText = step.example(values) || (step.id === "dfn" ? "Mane…" : "");
input.attr("placeholder", exampleText);
}
var didSlideDown;
if (!didFocus && stepDiv.css("display") === "none" && step.required) {
// Skip scrolling for the first section (ziman) since it's
// always at the top of the page.
if (step.id !== "lang") {
didSlideDown = function (evt) {
var stepEl = stepDiv.get(0);
if (stepEl && typeof stepEl.scrollIntoView === "function") {
stepEl.scrollIntoView({ behavior: "smooth", block: "start" });
}
};
}
didFocus = true;
}
stepDiv.slideDown(didSlideDown);
}
if (step.required &&
(values[stepId] === "" ||
(step.multiple && values[stepId].join("") === ""))) {
canContinue = false;
}
});
continueBtn.setDisabled(!canContinue);
}
function destroy() {
$("#wiktku-start-form, .noafterwizard").slideUp(function () {
$(this).remove();
});
$(".noarticletext .nowizard, #editform").slideDown();
$("#ca-edit").removeClass("selected");
$("#ca-wiktku-nowizard").addClass("selected");
}
// Priority order for Kurdish dialects and navz.
// Codes listed here come before all other languages; unlisted codes
// are sorted alphabetically by their display name via localeCompare.
var LANG_PRIORITY = ["navz", "ku", "hac", "sdh", "lki", "ckb", "zza"];
// Inserts a new "== {{ziman|code}} ==" section at the correct sorted
// position: navz, then ku/hac/sdh/lki/ckb/zza, then alphabetical by name.
function insertNewLangSection(existing, wikitext) {
var newCodeMatch = wikitext.match(new RegExp("^" + langHeaderSource("[^}]+")));
var newCode = newCodeMatch ? newCodeMatch[1] : "";
var sections = [];
var preamble = "";
var anyHeaderSrc = langHeaderSource("[^}]+");
var firstMatch = new RegExp("^" + anyHeaderSrc, "m").exec(existing);
if (!firstMatch) {
// No existing lang sections at all — just append.
var sep = existing && !/\n\s*$/.test(existing) ? "\n\n" : "";
return existing + sep + wikitext;
}
// Everything before the first == {{ziman|...}} == is the preamble.
var firstSectionStart = firstMatch.index;
// Walk back to the start of that line.
var lineStart = existing.lastIndexOf("\n", firstSectionStart - 1);
var preambleEnd = lineStart !== -1 ? lineStart + 1 : 0;
preamble = existing.slice(0, preambleEnd);
// Parse each language section: header line + everything until the next header.
var body = existing.slice(preambleEnd);
// (?![\s\S]) matches only true end-of-string, since a bare "$" with
// /m would stop at the section's first line break instead.
var langSectionRe = new RegExp(
"^(" + anyHeaderSrc + "\\n?)([\\s\\S]*?)(?=\\n" + anyHeaderSrc + "|(?![\\s\\S]))",
"gm"
);
var m;
while ((m = langSectionRe.exec(body)) !== null) {
sections.push({
code: m[2],
content: m[0] // full text of this section including header
});
}
// Determine sort rank: priority list first (by index), then alphabetical.
function getLangName(code) {
var entry = langsByCode[code];
return entry ? entry.label : code;
}
function sortRank(code) {
var idx = LANG_PRIORITY.indexOf(code);
return idx !== -1 ? idx : LANG_PRIORITY.length;
}
function compareLangs(a, b) {
var ra = sortRank(a), rb = sortRank(b);
if (ra !== rb) return ra - rb;
// Both are outside priority list — sort by display name.
return getLangName(a).localeCompare(getLangName(b), userLang);
}
// Insert the new section into the sorted list.
var newSection = { code: newCode, content: wikitext };
var inserted = false;
for (var i = 0; i < sections.length; i++) {
if (compareLangs(newCode, sections[i].code) < 0) {
sections.splice(i, 0, newSection);
inserted = true;
break;
}
}
if (!inserted) sections.push(newSection);
// Re-join: preamble + sections separated by newlines.
var joined = sections.map(function (s) {
// Ensure each section ends with exactly one newline before the next.
return s.content.replace(/\n+$/, "");
}).join("\n");
return preamble + joined + "\n";
}
function build() {
$(".nowizard, .nowizard .noafterwizard").hide();
var callToAction = $("#wiktku-calltoaction");
var origCallToActionText = callToAction.text();
$(mw.util.addPortletLink("p-views", "#", "Edîtora çavkaniyê veke",
"ca-wiktku-nowizard", "Vê rûpelê bi edîtora çavkaniyê çêke",
undefined, "#ca-watch")).click(function (evt) {
evt.preventDefault();
callToAction.text(origCallToActionText);
destroy();
});
if (callToAction.length) {
callToAction.text(origCallToActionText +
" Forma li jêr ji bo çêkirina madeyeke nû bi kar bîne.");
}
var startForm = $("<form id='wiktku-start-form'></form>");
var clearPageCheck = null;
if (addLangMode) {
startForm.append($("<p class='wiktku-addlang-notice'></p>").html(
"Bi vê formê tu yê zimanekî nû li rûpelê îlawe bikî. Eger ev ziman jixwe hebe, beşa nû li dawiya vî zimanî dê were îlawekirin. " +
"Ji kerema xwe netîceya dawî kontrol bike, eger problemek derkeve, li <a href='" +
mw.util.getUrl('Mediawiki talk:Gadget-start.js') +
"'>nîqaşa vê amûrê</a> problemê ragihîne."
));
clearPageCheck = $("<input type='checkbox' id='wiktku-clear-page-check'>");
var clearPageLabel = $("<label for='wiktku-clear-page-check'></label>")
.text(" Muhtewaya rûpelê paqij bike (her tiştî jê bibe û rûpelê ji nû ve binivîse)");
startForm.append(
$("<p class='wiktku-addlang-notice'></p>")
.append(clearPageCheck)
.append(clearPageLabel)
);
// Re-evaluate step visibility (e.g. the pron step) whenever this
// is toggled, since it changes what counts as "existing content".
clearPageCheck.on("change", function () {
refresh();
});
}
var spinner;
// Tab bar for switching between POS sections.
var sectionTabsDiv = $("<div id='wiktku-section-tabs'></div>");
startForm.submit(function (evt) {
evt.preventDefault();
continueBtn.setDisabled(true);
continueBtn.$element.addClass("wiktku-btn-sending");
spinner.show();
getWikitext(function (wikitext) {
if (addLangMode && clearPageCheck && clearPageCheck.prop("checked")) {
// User asked to wipe the page and start fresh — just
// write the newly generated wikitext as the full content.
$("#wpTextbox1").val(wikitext);
} else if (addLangMode) {
var textbox = $("#wpTextbox1");
var existing = textbox.val() || "";
// If this language's section already exists (whitespace
// differences aside), merge into it; otherwise insert new.
var langHeaderMatch = wikitext.match(new RegExp("^(" + langHeaderSource("[^}]+") + "\\n)"));
if (langHeaderMatch) {
var langHeader = langHeaderMatch[1]; // e.g. "== {{ziman|ku}} ==\n"
var newCode = langHeaderMatch[2];
var existingHeader = findLangHeader(existing, newCode);
if (existingHeader) {
// Strip the header from the new output.
var newContent = wikitext.slice(langHeader.length);
// Find the insertion point: end of the existing lang section.
// A new L2 heading marks the start of the next language block.
var searchFrom = existingHeader.index + existingHeader.match.length;
// Find the next == … == heading after this section's start.
var nextL2 = existing.indexOf("\n== ", searchFrom);
var insertAt = nextL2 !== -1 ? nextL2 : existing.length;
// Ensure there's a blank line before the inserted block.
var before = existing.slice(0, insertAt);
var after = existing.slice(insertAt);
var sep = /\n\s*$/.test(before) ? "" : "\n";
textbox.val(before + sep + newContent + after);
} else {
// New language — insert at the correct sorted position.
textbox.val(insertNewLangSection(existing, wikitext));
}
} else {
// Unexpected format — insert at sorted position anyway.
textbox.val(insertNewLangSection(existing, wikitext));
}
} else {
$("#wpTextbox1").val(wikitext);
}
$("html, body").animate({scrollTop: 0});
callToAction.text("Hindik ma!");
$("#wiktku-preview-container").remove();
destroy();
});
});
$.each(ordered_steps, function (i, step) {
var stepDiv = $(mw.html.element("div", {
"class": "wiktku-start-step",
id: "wiktku-start-" + step.id }));
var name = capitalize(step.name);
stepDiv.append($(mw.html.element("h3", {
"class": "wiktku-start-step-name" }, new mw.html.Raw(mw.html.element("label", {
"for": "wiktku-start-" + step.id + "-field" }, name)))));
if (step.question_fmt) {
// question_fmt can be a plain string, or a function of the
// current values (used by steps whose question text depends
// on e.g. the chosen language) — refresh() keeps it in sync
// afterwards via the .wiktku-start-step-question class.
var questionText = typeof step.question_fmt === "function"
? step.question_fmt(getValues())
: step.question_fmt;
stepDiv.append($(mw.html.element("label", {
"class": "wiktku-start-step-question",
"for": "wiktku-start-" + step.id + "-field" }, questionText)));
if (step.question_br) stepDiv.append($("<br>"));
}
var input;
if (step.choices) {
input = $(mw.html.element("select", {
"class": "wiktku-start-step-field",
id: "wiktku-start-" + step.id + "-field" }));
input.attr("data-placeholder",
capitalize(step.name) + " hilbijêre ");
populateMenus(input, step.choices);
if (step.multiple) input.attr("multiple", true);
// initSelects() runs over the whole form once it is in the DOM.
stepDiv.append(input);
} else if (typeof(step.build) === "function") {
input = step.build(stepDiv);
} else {
input = $("<textarea></textarea>")
.attr("class", "wiktku-start-step-field")
.attr("id", "wiktku-start-" + step.id + "-field")
.attr("rows", step.rows || 2);
if (step.narrow) input.addClass("wiktku-start-narrow");
if (step.placeholder) input.attr("placeholder", step.placeholder);
if (step.multiple) {
input.on("input", function (evt) {
refreshForTextField(evt.target, step);
});
var keyInput = buildKeyInput(step);
var list = $(step.ordered ? "<ol></ol>" : "<ul></ul>")
.append($("<li></li>").append(keyInput).append(input));
stepDiv.append(list);
}
else stepDiv.append(input);
}
prepareInput(input, step);
stepDiv.hide();
// Insert tab bar just before the first per-section step.
if (step.id === "pos") startForm.append(sectionTabsDiv);
startForm.append(stepDiv);
});
// ── Section tab helpers ──────────────────────────────────────────────
// ── Add-section button — lives in the tab bar, disabled until pos chosen ──
var addSectionBtn = new OO.ui.ButtonWidget({
label: "+ Beş zêde bike",
disabled: true
});
addSectionBtn.on("click", function () {
saveCurrentSection();
sections.push({});
activeSection = sections.length - 1;
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
var stepDiv = $("#wiktku-start-dfn");
stepDiv.find("ol.wiktku-dfn-list").remove();
steps.dfn.build(stepDiv);
return;
}
if (id === "etym") {
$("#wiktku-start-etym .wiktku-etym-wrap").remove();
steps.etym.build($("#wiktku-start-etym"));
return;
}
if (id === "cavkani") {
$("#wiktku-start-cavkani .wiktku-cavkani-wrap").remove();
steps.cavkani.build($("#wiktku-start-cavkani"));
return;
}
if (id === "trans") {
var transDiv = $("#wiktku-start-trans");
transDiv.find(".wiktku-trans-group").remove();
return;
}
if (id === "zarava") {
var zaravaDiv = $("#wiktku-start-zarava");
zaravaDiv.find(".wiktku-zarava-group").remove();
return;
}
if (id === "dunde") {
var dundeDiv = $("#wiktku-start-dunde");
dundeDiv.find("ul.wiktku-dunde-list").remove();
return;
}
var stepDiv = $("#wiktku-start-" + id);
stepDiv.find(".wiktku-start-step-field").val("");
stepDiv.find("select.wiktku-start-step-field").trigger("wiktku:refresh");
});
renderSectionTabs();
refresh();
$("html, body").animate({ scrollTop: sectionTabsDiv.offset().top - 20 }, 300);
});
/** Re-render the tab bar to reflect current sections[] and activeSection. */
function renderSectionTabs() {
// Detach (not remove) the button first: .empty() strips bound
// event data from any children left inside it, which would
// silently kill addSectionBtn's click handler on every re-render.
addSectionBtn.$element.detach();
sectionTabsDiv.empty();
var lang = getValues().lang || "";
if (!lang) {
sectionTabsDiv.hide();
return;
}
sectionTabsDiv.show();
$.each(sections, function (i) {
var posVal = sections[i].pos || "";
var tabLabel = posVal ? capitalize(posVal) : ("Beş " + (i + 1));
var tab = $("<span></span>")
.addClass("wiktku-section-tab")
.text(tabLabel)
.toggleClass("wiktku-tab-active", i === activeSection);
(function (idx) {
tab.on("click", function () {
if (idx === activeSection) return;
saveCurrentSection();
activeSection = idx;
restoreSection(sections[activeSection]);
refresh();
renderSectionTabs();
});
}(i));
sectionTabsDiv.append(tab);
});
// Enable "Beş zêde bike" only when the active section has a pos chosen.
var activePos = sections[activeSection] && sections[activeSection].pos
? sections[activeSection].pos
: getValues().pos;
addSectionBtn.setDisabled(!activePos);
sectionTabsDiv.append(addSectionBtn.$element);
}
renderSectionTabs();
/**
* Restores a full cached draft: shared lang/pron fields, then every
* section (via the same restoreSection()/refresh()/renderSectionTabs()
* sequence already used when switching tabs).
* @param cached {{lang: string, pron: string, sections: Array, activeSection: number}}
*/
function restoreFromCache(cached) {
if (cached.lang) {
$("#wiktku-start-lang-field").val(cached.lang);
$("#wiktku-start-lang-field").trigger("wiktku:refresh");
}
// Rebuild dependent steps (pos, pron wrap, etc.) now that lang is set.
refresh();
if (cached.pron !== undefined) {
$("#wiktku-start-pron .wiktku-pron-text").val(cached.pron);
}
sections = (cached.sections && cached.sections.length) ? cached.sections : [{}];
activeSection = (typeof cached.activeSection === "number" &&
cached.activeSection >= 0 && cached.activeSection < sections.length)
? cached.activeSection : 0;
restoreSection(sections[activeSection]);
refresh();
renderSectionTabs();
mw.notify("Danûstandina berê ya qeydkirî ji cache hate barkirin.",
{ type: "info", tag: "wiktku-cache-restore" });
}
// Update the active tab's label whenever pos changes.
startForm.on("change", "#wiktku-start-pos-field", function () {
renderSectionTabs();
});
// Show the tab bar as soon as a language is selected.
startForm.on("change", "#wiktku-start-lang-field", function () {
renderSectionTabs();
});
var footer = $("<div id='wiktku-start-footer'></div>");
spinner = $(mw.html.element("img", {
id: "wiktku-start-spinner",
src: "//upload.wikimedia.org/wikipedia/commons/d/de/Ajax-loader.gif",
alt: "Tê barkirin…",
title: "Tê barkirin…" }));
footer.append(spinner.hide());
continueBtn = new OO.ui.ButtonWidget({
id: "wiktku-unhide-editform",
label: "Bişîne",
flags: [ "primary", "progressive" ]
});
continueBtn.on("click", function () {
// Immediate feedback that the click registered
continueBtn.$element.addClass("wiktku-btn-flash");
setTimeout(function () {
continueBtn.$element.removeClass("wiktku-btn-flash");
}, 500);
mw.notify("Tê şandin…", { type: "info", tag: "wiktku-submit" });
startForm.trigger("submit");
});
footer.append(continueBtn.$element);
// "Edîtora çavkaniyê veke" button — inline fallback for the portlet link
var sourceEditorBtn = new OO.ui.ButtonWidget({
flags: [ "destructive" ],
label: "Edîtora çavkaniyê veke"
});
sourceEditorBtn.on("click", function () {
destroy();
});
footer.append(sourceEditorBtn.$element);
// ── Cache save/clear buttons ─────────────────────────────────────────
// Manual, page-scoped save of the entire wizard (all sections, not
// just the active one) via [[MediaWiki:Gadget-StorageUtils.js]]'s
// ObjectStorage. Restoring happens silently on load at the end of
// build(), once the full language list is available.
var saveCacheBtn = new OO.ui.ButtonWidget({
label: "Li cache qeyd bike",
title: "Halê vê formê yê niha (ziman, bilêvkirin û hemû beş) li cache (localStorage) qeyd bike, da ku eger rûpel bêyî xwestin were girtin an ji nû ve were barkirin, tu karibî berdewam bikî."
});
saveCacheBtn.on("click", function () {
saveCurrentSection();
var snapshot = {
lang: getValues().lang || "",
pron: $("#wiktku-start-pron .wiktku-pron-text").val() || "",
sections: sections,
activeSection: activeSection
};
// ObjectStorage.Set() doesn't return a success/failure value, so
// the only way to detect a real failure (storage blocked, quota
// exceeded, JSON.stringify choking on something unexpected) is to
// catch it here rather than inspect a (nonexistent) return value.
try {
formCache.Set(snapshot);
mw.notify("Halê formê li cache hate qeydkirin.", { type: "success", tag: "wiktku-cache-save" });
} catch (e) {
mw.notify("Qeydkirina li cache bi ser neket.", { type: "error", tag: "wiktku-cache-save" });
}
});
footer.append(saveCacheBtn.$element);
var clearCacheBtn = new OO.ui.ButtonWidget({
label: "Cache paqij bike",
flags: [ "destructive" ],
title: "Datayên qeydkirî yên vê rûpelê ji cache jê bibe (forma ku niha xuya dike naguherîne)."
});
clearCacheBtn.on("click", function () {
formCache.Set({});
mw.notify("Cache hate paqijkirin.", { type: "success", tag: "wiktku-cache-clear" });
});
footer.append(clearCacheBtn.$element);
// ── Preview checkboxes ───────────────────────────────────────────────
// Wikitext preview (raw text panel)
var previewCheck = $("<input type='checkbox' id='wiktku-preview-toggle'>");
var previewLabel = $("<label for='wiktku-preview-toggle'></label>")
.text(" Pêşdîtina wîkîtekstê");
var previewPanel = $("<pre id='wiktku-preview-panel'></pre>").hide();
// Live rendered preview (parsed HTML panel, same logic as AjaxEdit).
// Not available on mobile — API polling causes too many problems on small screens.
var livePreviewCheck = null;
var livePreviewPanel = null;
if (!isMobile) {
livePreviewCheck = $("<input type='checkbox' id='wiktku-live-preview-toggle'>");
livePreviewPanel = $("<div id='wiktku-live-preview-panel'></div>").hide();
}
// Container that holds both panels and switches between stacked / side-by-side.
var previewContainer = $("<div id='wiktku-preview-container'></div>");
previewContainer.append(previewPanel);
if (!isMobile) previewContainer.append(livePreviewPanel);
var previewTimer = null;
var livePreviewIntervalId = -1;
var livePreviewActive = false; // guards in-flight fetches after uncheck
/** Rebuilds wikitext preview if its checkbox is checked. */
function schedulePreview() {
if (!previewCheck.prop("checked")) return;
clearTimeout(previewTimer);
// Debounce: wait 400 ms after the last keystroke before rebuilding.
previewTimer = setTimeout(function () {
getWikitext(function (wikitext) {
previewPanel.text(wikitext).show();
updatePanelLayout();
});
}, 400);
}
/** Fetches parsed HTML and populates the live preview panel. */
function loadLivePreview() {
getWikitext(function (wikitext) {
new mw.Api().parse(wikitext, { title: mw.config.get("wgPageName") }).done(function (html) {
// Discard result if the user unchecked while the fetch was in flight.
if (!livePreviewActive) return;
livePreviewPanel.html(html).show();
updatePanelLayout();
});
});
}
/** Adjusts panel widths depending on which previews are visible. */
function updatePanelLayout() {
var wikitextVisible = previewCheck.prop("checked");
var liveVisible = livePreviewCheck && livePreviewCheck.prop("checked");
if (wikitextVisible && liveVisible) {
// Side by side — each panel takes roughly half the available width.
previewPanel.css({ "flex": "1 1 45%", "min-width": "280px" });
livePreviewPanel.css({ "flex": "1 1 45%", "min-width": "280px" });
} else {
// Full width for whichever is visible — only touch panels that are
// actually shown so that setting flex doesn't override display:none.
if (wikitextVisible) previewPanel.css({ "flex": "1 1 100%", "min-width": "" });
if (liveVisible && livePreviewPanel) livePreviewPanel.css({ "flex": "1 1 100%", "min-width": "" });
}
}
previewCheck.on("change", function () {
if ($(this).prop("checked")) {
schedulePreview();
} else {
clearTimeout(previewTimer);
previewPanel.hide();
updatePanelLayout();
}
});
if (!isMobile) {
livePreviewCheck.on("change", function () {
if ($(this).prop("checked")) {
livePreviewActive = true;
livePreviewPanel.show();
loadLivePreview();
livePreviewIntervalId = setInterval(loadLivePreview, 500);
} else {
livePreviewActive = false;
clearInterval(livePreviewIntervalId);
livePreviewIntervalId = -1;
livePreviewPanel.hide().empty();
updatePanelLayout();
}
});
}
// Listen on all input/change events on the form and update both previews.
startForm.on("input change", function () {
schedulePreview();
});
footer.append($("<span style='margin-left:1em'></span>")
.append(previewCheck).append(previewLabel));
if (!isMobile) {
var livePreviewLabel = $("<label for='wiktku-live-preview-toggle'></label>")
.text(" Pêşdîtina zindî");
footer.append($("<span style='margin-left:1em'></span>")
.append(livePreviewCheck).append(livePreviewLabel));
}
startForm.append(footer);
$("#editform").hide().before(startForm);
// Insert preview container (holds both panels) after the form.
startForm.after(previewContainer);
// One pass over the whole form: every select that hasn't already been
// initialised, and isn't opted out with .wiktku-plain-select, gets
// the searchable picker.
initSelects(startForm);
refresh();
// Give every draggable textarea a custom resize grip (works
// consistently on Safari/iOS, unlike the native corner grip — see
// the "Manual drag-to-resize handle" comment in styles.css), and
// keep applying it to textareas added later on (new sense blocks,
// quote-source fields, nimûne rows, …).
wiktkuInitManualResize(startForm);
new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
$(mutation.addedNodes).each(function () {
if (this.nodeType !== 1) return;
wiktkuInitManualResize(this);
});
});
}).observe(startForm[0], { childList: true, subtree: true });
// Now that the full language list is loaded, silently restore any
// draft the editor previously saved for this page.
var cachedDraft = formCache.Get();
if (cachedDraft && cachedDraft.sections && cachedDraft.sections.length) {
restoreFromCache(cachedDraft);
}
}
mw.loader.using(["oojs-ui-core"], function () {
// Load metadata, langChoices, posChoices and tplDefs from the companion
// data page so they can be updated without touching this script.
// (Request was already fired via metaApiPromise above, in parallel
// with this module load — we're just picking up the result here.)
metaApiPromise.then(function (data) {
var page = data.query.pages[0];
var content = page &&
page.revisions &&
page.revisions[0].slots.main.content;
var d;
try { d = JSON.parse(content); } catch (e) { d = {}; }
// Populate metadata.
if (d.metadata) $.extend(metadata, d.metadata);
// Populate gender labels.
if (d.genderLabels) $.extend(GENDER_BASE_LABELS, d.genderLabels);
// Populate lang choices (pinned list).
if (d.langChoices) steps.lang.choices = choicesFromObject(d.langChoices, true);
// Populate langsByCode and merge full language list from d.ziman.
// d.ziman is a {code: name} object with all known languages.
$.each(steps.lang.choices, function (i, choice) {
if (choice.sortKey === undefined) choice.sortKey = choice.label;
langsByCode[choice.code] = choice;
});
if (d.ziman) {
var pinnedCodes = {};
$.each(steps.lang.choices, function (i, c) { pinnedCodes[c.code] = true; });
var extraChoices = [];
$.each(d.ziman, function (code, name) {
if (/-pro$/i.test(code)) return;
if (/ziman[eê]\s+destan/i.test(name)) return;
if (pinnedCodes[code]) return;
var choice = { code: code, label: name, sortKey: name };
extraChoices.push(choice);
langsByCode[code] = choice;
});
extraChoices.sort(function (a, b) {
return a.sortKey.localeCompare(b.sortKey, userLang);
});
steps.lang.choices = steps.lang.choices.concat(extraChoices);
}
// Populate POS choices — also a plain {code: label} object in data.json.
if (d.posChoices) steps.pos.choices = choicesFromObject(d.posChoices, false);
// Populate template definitions for the dfn sense-block builder.
if (d.tplDefs) steps.dfn.tplDefs = d.tplDefs;
// Populate pos placeholder examples.
if (d.posExamples) steps.dfn.posExamples = d.posExamples;
// Populate citation template definitions for the quote widget.
if (d.jederDefs) steps.dfn.jederDefs = d.jederDefs;
// Populate pronunciation and etymology template insert lists.
if (d.pronTpls) {
steps.pron.pronTpls = d.pronTpls;
steps.pron.refreshTplSelect();
}
if (d.etymTpls) {
steps.etym.etymTpls = d.etymTpls;
steps.etym.refreshTplSelect();
}
// Sync trans/dunde/zarava keys with the full language list.
steps.trans.keys = steps.lang.choices;
steps.dunde.keys = steps.lang.choices;
steps.zarava.keys = getZaravaKeys(steps.lang.choices);
}).always(build);
});
});
//</nowiki>
l2w54ew8kqwyi7n1m32z69vf81kco7a
6292089
6292086
2026-07-29T21:44:49Z
Wikihez
7344
6292089
javascript
text/javascript
// Li ser [[vi:MediaWiki:Gadget-start.js]] hatiye refaktorkirin.
// implicit dependencies: StorageUtils (ObjectStorage)
//<nowiki>
$(function () {
if (window.location.href.includes("editintro=User:Wikihez/creation/intro")) {
return; // Do not run the script wextê WF:Bilez dişuxile
}
var ns = mw.config.get("wgNamespaceNumber");
if (ns &&
!(ns === 2 && mw.config.get("wgPageName").match(/\/ceribandin$|\/test$/))) {
return;
}
var action = mw.config.get("wgAction");
var pageExists = !!mw.config.get("wgArticleId");
var addLangMode = pageExists && mw.util.getParamValue("wiktkuaddlang") === "1";
if (action === "view" && pageExists) {
var targetContainer;
var skin = mw.config.get('skin');
if (skin === 'vector-2022') {
targetContainer = 'p-cactions';
} else if (skin === 'vector') {
targetContainer = 'p-tb';
} else {
targetContainer = 'p-views';
}
mw.util.addPortletLink(targetContainer,
mw.util.getUrl(mw.config.get("wgPageName"), { action: "submit", wiktkuaddlang: "1" }),
"+Ziman/beşeke din", "ca-wiktku-addlang",
"Ji vê rûpelê re ziman an jî beşeke nû zêde bike");
return;
}
if (!(action === "edit" || action === "submit")) {
return;
}
if (!addLangMode && !$(".mw-newarticletext, .mw-newarticletextanon").length) {
return;
}
mw.notify(
"Amûr dest pê dike, hinek bisekinin.\nNot: jkx Sentaks (Syntax highlighting) neaktîv bikin",
{ type: "info", tag: "wiktku-start-notice", autoHide: true, autoHideSeconds: 10 }
);
var dataJsonPromise;
var metaApiPromise = mw.loader.using("mediawiki.api").then(function () {
var metaApi = new mw.Api();
dataJsonPromise = metaApi.get({
action: "query",
prop: "revisions",
titles: "MediaWiki:Gadget-start.js/data.json",
rvprop: "content",
rvslots: "main",
formatversion: 2
});
return dataJsonPromise;
});
function capitalize(str) {
if (!str) return str;
return str[0].toUpperCase() + str.substr(1);
}
function decapitalize(str) {
if (!str) return str;
return str[0].toLowerCase() + str.substr(1);
}
function escapeRegExp(str) {
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
function langHeaderSource(codePattern) {
return "\n?==\\s*\\{\\{\\s*ziman\\s*\\|\\s*(" + codePattern + ")\\s*\\}\\}\\s*==";
}
function findLangHeader(text, code) {
var m = new RegExp(langHeaderSource(escapeRegExp(code))).exec(text);
return m ? { index: m.index, match: m[0] } : null;
}
function stripWikilinks(str) {
return str.replace(/\[\[([^\]|]+)(?:\|([^\]]+))?\]\]/g, function (m, target, display) {
return display || target;
});
}
function splitTercimeIzah(mane) {
var m = /^([\s\S]*?)\s*\{\{îzah\|([\s\S]*)\}\}\s*$/.exec(mane || "");
return m ? { tercime: m[1], izah: m[2] } : null;
}
function insertAtCursor(el, text) {
var start = el.selectionStart;
var end = el.selectionEnd;
var val = el.value;
el.value = val.slice(0, start) + text + val.slice(end);
var pos = start + text.length;
el.selectionStart = el.selectionEnd = pos;
}
var catSrcTemplates = null;
var catSrcTemplatesPromise = null;
function fetchCatSrcTemplates() {
if (catSrcTemplatesPromise) return catSrcTemplatesPromise;
catSrcTemplatesPromise = new mw.Api().get({
action: "query",
list: "categorymembers",
cmtitle: "Kategorî:Çavkanî",
cmnamespace: 10,
cmlimit: "max",
formatversion: 2
}).then(function (data) {
var members = (data.query && data.query.categorymembers) || [];
catSrcTemplates = $.map(members, function (m) {
// Pêşgira navî ya "Şablon:" rake.
return m.title.replace(/^[^:]+:/, "");
});
catSrcTemplates.sort(function (a, b) { return a.localeCompare(b, userLang); });
return catSrcTemplates;
}, function () {
catSrcTemplates = [];
return catSrcTemplates;
});
return catSrcTemplatesPromise;
}
var pageName = mw.config.get("wgPageName").replaceAll(/_/g, " ");
if (ns) pageName = pageName.replace(/.*\//, "");
var pageNameRe = escapeRegExp(pageName);
var userLang = mw.config.get("wgUserLanguage");
var formCache = new ObjectStorage("wiktku_start_draft_" + mw.config.get("wgPageName"), 1);
var isMobile = !!mw.config.get("wgMFMode") || window.matchMedia("(pointer: coarse)").matches;
var FOLD_EXTRA = {
"ı": "i", // dotless i
"ø": "o", // o with stroke
"đ": "d", // d with stroke
"ð": "d", // eth
"ə": "e", // schwa
"ħ": "h", // h with stroke
"ł": "l", // l with stroke
"ŋ": "n", // eng
"ʉ": "u", // u bar
"ɨ": "i", // i bar
"ʒ": "z", // ezh
"ɛ": "e", // open e
"ɔ": "o", // open o
"æ": "ae",
"œ": "oe",
"ß": "ss",
"þ": "th" };
function foldDiacritics(str) {
if (str === null || str === undefined) return "";
var s = String(str).toLowerCase();
if (typeof s.normalize === "function") {
// Split "î" into "i" + combining circumflex, then drop the accent.
s = s.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
}
return s.replace(/[^\u0000-\u007f]/g, function (ch) {
return Object.prototype.hasOwnProperty.call(FOLD_EXTRA, ch) ? FOLD_EXTRA[ch] : ch;
});
}
var WIKTKU_RESIZE_STORAGE_PREFIX = "wiktku_resize_height_";
/** Textareas of the same "kind" (e.g. every Nimûne box, every Tercime
* box) share a class list even though each individual box is a fresh
* DOM node built on the fly (new sense blocks, quote fields, …) with
* no stable id of its own. That class list is what we key the cached
* height on, so a size chosen for one Nimûne box is reused for every
* Nimûne box, on this page and on the next one. */
function wiktkuResizeStorageKey(textarea) {
var cls = (textarea.attr("class") || "").trim().replace(/\s+/g, "_");
return WIKTKU_RESIZE_STORAGE_PREFIX + cls;
}
function wiktkuSaveResizeHeight(textarea, height) {
if (!(window.mw && mw.storage)) return;
try {
mw.storage.set(wiktkuResizeStorageKey(textarea), String(Math.round(height)));
} catch (e) { /* localStorage unavailable (private mode, quota, …) — skip caching */ }
}
function wiktkuLoadResizeHeight(textarea) {
if (!(window.mw && mw.storage)) return null;
try {
var v = mw.storage.get(wiktkuResizeStorageKey(textarea));
return v ? parseFloat(v) : null;
} catch (e) {
return null;
}
}
/** Replaces a textarea's native corner resize grip with a small custom
* drag handle (see the "Manual drag-to-resize handle" comment and
* .wiktku-resize-wrap / .wiktku-resize-grip in styles.css). Needed
* because iOS Safari never implements the native grip at all and
* desktop Safari's own version is inconsistent, so we replace it
* everywhere for uniform behaviour. One-line fields (.wiktku-start-narrow)
* are meant to stay a fixed height and are left untouched. Safe to call
* more than once on the same textarea. */
function wiktkuMakeManualResizable(textarea) {
textarea = $(textarea);
if (!textarea.is("textarea") || textarea.hasClass("wiktku-start-narrow")) return;
if (textarea.data("wiktkuResizableDone")) return;
textarea.data("wiktkuResizableDone", true);
textarea.wrap("<div class='wiktku-resize-wrap'></div>");
var grip = $("<div class='wiktku-resize-grip'></div>");
textarea.after(grip);
// Restore a previously chosen height for this kind of field, if any.
var cachedHeight = wiktkuLoadResizeHeight(textarea);
if (cachedHeight) {
var minHeightInit = parseFloat(textarea.css("min-height")) || 0;
textarea.css("height", Math.max(cachedHeight, minHeightInit) + "px");
}
var dragging = false, startY = 0, startHeight = 0;
function onPointerMove(e) {
if (!dragging) return;
var oe = e.originalEvent || e;
var minHeight = parseFloat(textarea.css("min-height")) || 0;
var newHeight = startHeight + (oe.clientY - startY);
textarea.css("height", Math.max(newHeight, minHeight) + "px");
}
function onPointerUp(e) {
if (!dragging) return;
dragging = false;
var oe = e.originalEvent || e;
try { grip[0].releasePointerCapture(oe.pointerId); } catch (err) { /* ignore */ }
$(document).off("pointermove", onPointerMove);
$(document).off("pointerup pointercancel", onPointerUp);
wiktkuSaveResizeHeight(textarea, textarea.outerHeight());
}
grip.on("pointerdown", function (e) {
var oe = e.originalEvent || e;
if (oe.button !== undefined && oe.button !== 0) return; // primary contact only
e.preventDefault();
dragging = true;
startY = oe.clientY;
startHeight = textarea.outerHeight();
try { grip[0].setPointerCapture(oe.pointerId); } catch (err) { /* ignore */ }
$(document).on("pointermove", onPointerMove);
$(document).on("pointerup pointercancel", onPointerUp);
});
}
/** Applies wiktkuMakeManualResizable to every eligible textarea already
* inside `context` (context itself, if it is a textarea, or any of its
* descendants). Used both for the initial form render and, via the
* MutationObserver set up in build(), for textareas added later on
* (new sense blocks, quote-source fields, nimûne rows, …). */
function wiktkuInitManualResize(context) {
var $context = $(context);
var $textareas = $context.is("textarea") ? $context : $context.find("textarea");
$textareas.each(function () {
wiktkuMakeManualResizable(this);
});
}
function wrapNativeSelect(select) {
var wrapper = $("<span class='wiktku-native-select-wrap'></span>");
if (select.prop("multiple")) {
return wrapper.append(select);
}
var placeholder = select.attr("data-placeholder") || "Lê bigere...";
select.hide();
var textInput = $("<input type='search' autocomplete='off'>")
.attr("placeholder", placeholder)
.attr("role", "combobox")
.attr("aria-autocomplete", "list")
.attr("aria-expanded", "false")
.addClass("wiktku-start-narrow wiktku-ac-input");
var resultsList = $("<ul class='wiktku-ac-results' role='listbox'></ul>").hide();
var allOptions = [];
var shown = [];
var activeIndex = -1;
function cacheOptions() {
allOptions = [];
select.find("option").each(function () {
var v = $(this).val();
var text = $(this).text();
// A blank value with no label (most selects' placeholder) is
// never a real choice, so skip it. But a blank value WITH a
// label -- e.g. tplSelect's "— yan jî şablonek hilbijêre —" --
// is a meaningful "clear the selection" choice, so keep it
// searchable/selectable like any other option.
if (!v && !text) return;
// Language options read "Name (code)" -- score the name on its own
// so the trailing code doesn't also count as a name match.
var name = text.replace(/\s*\([^()]*\)\s*$/, "");
allOptions.push({
value: v,
text: text,
disabled: $(this).prop("disabled"),
foldCode: foldDiacritics(v),
foldName: foldDiacritics(name),
foldText: foldDiacritics(text)
});
});
}
cacheOptions();
// True if `q` starts a word inside `name` ("kevn" in "ingiliziya kevn").
function startsWord(name, q) {
var from = 0, at;
while ((at = name.indexOf(q, from)) !== -1) {
if (at === 0 || /[\s\-\u2013\u2014(/,.]/.test(name.charAt(at - 1))) return true;
from = at + 1;
}
return false;
}
// Lower rank = better match.
// a code that *is* the query, or begins with it, always outranks a name
// that merely contains it -- so "ang" lists "Îngilîziya kevn (ang)"
// first instead of burying it among every name containing "ang".
var RANK_NONE = 99;
function rankOption(o, q) {
var code = o.foldCode, name = o.foldName;
if (code === q) return 0; // exact code
if (code.indexOf(q) === 0) return 1; // code prefix
if (name === q) return 2; // exact name
if (name.indexOf(q) === 0) return 3; // name prefix
if (startsWord(name, q)) return 4; // starts a word in the name
if (name.indexOf(q) !== -1) return 5; // name substring
if (code.indexOf(q) !== -1) return 6; // code substring
if (o.foldText.indexOf(q) !== -1) return 7; // anywhere else in the label
return RANK_NONE;
}
function positionList() {
// Position the list above or below depending on viewport space.
var inputRect = textInput[0].getBoundingClientRect();
var viewportH = window.innerHeight;
var spaceBelow = viewportH - inputRect.bottom - 8;
var spaceAbove = inputRect.top - 8;
var maxH = Math.min(224, Math.max(spaceBelow, spaceAbove)); // 224px = 14em
resultsList.css({
"max-height": maxH + "px",
"top": spaceBelow >= spaceAbove ? "100%" : "auto",
"bottom": spaceBelow >= spaceAbove ? "auto" : "100%"
});
}
function closeList() {
resultsList.hide();
textInput.attr("aria-expanded", "false");
activeIndex = -1;
}
function showResults(query) {
var q = foldDiacritics($.trim(query || ""));
resultsList.empty();
activeIndex = -1;
var matched = [];
if (q) {
$.each(allOptions, function (i, o) {
if (o.disabled) return;
var rank = rankOption(o, q);
if (rank !== RANK_NONE) matched.push({ opt: o, rank: rank, i: i });
});
if (!matched.length && q.indexOf(" ") !== -1) {
var tokens = q.split(/\s+/);
$.each(allOptions, function (i, o) {
if (o.disabled) return;
var all = true;
$.each(tokens, function (_, t) {
if (o.foldText.indexOf(t) === -1) { all = false; return false; }
});
if (all) matched.push({ opt: o, rank: 8, i: i });
});
}
matched.sort(function (a, b) {
if (a.rank !== b.rank) return a.rank - b.rank;
// Inside the code tiers the shorter code is the better hit:
// "an" -> "an" before "ang" before "ang-x-...".
if (a.rank <= 1 && a.opt.foldCode.length !== b.opt.foldCode.length) {
return a.opt.foldCode.length - b.opt.foldCode.length;
}
// Otherwise keep the menu's own order (pinned languages first).
return a.i - b.i;
});
} else {
$.each(allOptions, function (i, o) {
if (!o.disabled) matched.push({ opt: o, rank: 0, i: i });
});
}
shown = $.map(matched.slice(0, 50), function (m) { return m.opt; });
if (!shown.length) {
closeList();
return;
}
$.each(shown, function (idx, opt) {
var li = $("<li role='option'></li>")
.text(opt.text)
.attr("data-value", opt.value)
.attr("aria-selected", "false");
// touchend (not touchstart) so a scroll doesn't trigger a select.
var touchMoved = false;
li.on("touchstart", function () {
touchMoved = false;
});
li.on("touchmove", function () {
touchMoved = true;
});
li.on("touchend", function (e) {
if (touchMoved) return; // was a scroll, not a tap
e.preventDefault();
selectOption(opt.value, opt.text);
});
// mousedown (not click) so it beats the input's blur handler.
li.on("mousedown", function (e) {
e.preventDefault();
selectOption(opt.value, opt.text);
});
li.on("mouseenter", function () {
// Hovered items are already in view -- don't scroll the list
// under the mouse, or the shift can trigger the next item's
// mouseenter and cascade into a runaway scroll.
setActive(idx, /* scrollIntoView */ false);
});
resultsList.append(li);
});
positionList();
resultsList.show();
resultsList[0].scrollTop = 0;
textInput.attr("aria-expanded", "true");
}
function setActive(idx, scrollIntoView) {
var items = resultsList.children("li");
if (!items.length) return;
if (idx < 0) idx = items.length - 1;
if (idx >= items.length) idx = 0;
activeIndex = idx;
items.removeClass("wiktku-ac-active").attr("aria-selected", "false");
var li = items.eq(idx).addClass("wiktku-ac-active").attr("aria-selected", "true");
if (scrollIntoView === false) return;
// Keep the cursor visible inside the scrollable list -- only for
// keyboard navigation. A mouse-hovered item is already visible, so
// scrolling here would shift the list under a stationary pointer
// and cascade into further mouseenter events.
var ul = resultsList[0], el = li[0];
if (el.offsetTop < ul.scrollTop) {
ul.scrollTop = el.offsetTop;
} else if (el.offsetTop + el.offsetHeight > ul.scrollTop + ul.clientHeight) {
ul.scrollTop = el.offsetTop + el.offsetHeight - ul.clientHeight;
}
}
/** Puts the currently selected option's label back in the text box. */
function syncInputToSelect() {
var cur = select.val();
var match = null;
if (cur) {
$.each(allOptions, function (_, o) {
if (o.value === cur) { match = o; return false; }
});
}
textInput.val(match ? match.text : "");
}
function selectOption(value, text) {
textInput.val(text);
select.val(value);
closeList();
select.trigger("change");
}
textInput.on("input", function () {
showResults($(this).val());
});
textInput.on("focus", function () {
// Select the current label so typing replaces it, and open the full list
this.select();
showResults("");
});
textInput.on("click", function () {
if (!resultsList.is(":visible")) showResults($(this).val());
});
textInput.on("keydown", function (e) {
var open = resultsList.is(":visible");
switch (e.which) {
case 40: // Down
e.preventDefault();
if (!open) { showResults($(this).val()); setActive(0); }
else setActive(activeIndex + 1);
break;
case 38: // Up
e.preventDefault();
if (!open) { showResults($(this).val()); setActive(-1); }
else setActive(activeIndex - 1);
break;
case 13: // Enter -- must never submit the form while the list is open
if (open) {
e.preventDefault();
if (activeIndex >= 0 && shown[activeIndex]) {
selectOption(shown[activeIndex].value, shown[activeIndex].text);
} else if (shown.length === 1) {
selectOption(shown[0].value, shown[0].text);
}
}
break;
case 27: // Esc -- abandon the search, restore the real value
if (open) {
e.preventDefault();
closeList();
syncInputToSelect();
}
break;
case 9: // Tab -- commit the highlighted row on the way out
if (open && activeIndex >= 0 && shown[activeIndex]) {
selectOption(shown[activeIndex].value, shown[activeIndex].text);
}
closeList();
break;
}
});
textInput.on("blur", function () {
// Short delay so a touchstart/mousedown on a result fires first.
setTimeout(function () {
closeList();
// Half-typed text that never became a selection would otherwise sit
// in the box looking like a choice -- put the real value back.
syncInputToSelect();
}, 200);
});
// Re-caches the option list. Fired after the full language list loads, after
// options are enabled/disabled, and after programmatic .val() changes.
select.on("wiktku:refresh", function () {
cacheOptions();
syncInputToSelect();
if (resultsList.is(":visible")) showResults(textInput.val());
});
wrapper.append(textInput).append(resultsList).append(select);
return wrapper;
}
/**
* Gives every plain <select> under `root` the searchable picker. Selects
* marked .wiktku-plain-select opt out, and the call is idempotent, so it is
* safe to re-run after new rows or sense blocks are inserted.
*/
function initSelects(root) {
$(root).find("select").addBack("select").not(".wiktku-plain-select").each(function () {
var sel = $(this);
if (sel.prop("multiple")) return;
if (sel.closest(".wiktku-native-select-wrap").length) return; // already wrapped
var marker = $("<span></span>").insertBefore(sel);
marker.replaceWith(wrapNativeSelect(sel));
});
}
var langsByCode = {};
// Populated from [[MediaWiki:Gadget-start.js/data.json]] at runtime.
var metadata = {};
var ZARAVA_LANG_CODES = ["ckb", "sdh", "lki", "hac", "zza"];
// Converts a {code: label} object (langChoices/posChoices in data.json)
// into the {code, label[, sortKey]} array the rest of the script uses.
// isLang: true adds a sortKey and shows "(code)" after the label —
// language choices only.
function choicesFromObject(obj, isLang) {
var result = [];
$.each(obj || {}, function (code, label) {
var choice = { code: code, label: label };
if (isLang) choice.sortKey = label;
result.push(choice);
});
return result;
}
function getZaravaKeys(choices) {
var byCode = {};
$.each(choices || [], function (_, c) { byCode[c.code] = c; });
var result = [];
$.each(ZARAVA_LANG_CODES, function (_, code) {
if (byCode[code]) result.push(byCode[code]);
});
return result;
}
function needsTransliteration(langCode) {
var meta = metadata[langCode];
if (!meta || !meta.sc) return false;
var scripts = Array.isArray(meta.sc) ? meta.sc : [meta.sc];
return scripts.length > 0 && scripts[0] !== "Latn";
}
// Kodên cinsiyetê yên di metadata.g de — ji data.json tê dagirtin
var GENDER_BASE_LABELS = {};
// Sub-lists that only make sense for a plain (non-şablon) sense — hidden
// when a şablon (e.g. {{guharto|…}}) is chosen for that sense
var HIDDEN_ON_TPL_GROUPS = [
"wiktku-dfn-alternativ",
"wiktku-dfn-hevmane",
"wiktku-dfn-dijmane",
"wiktku-dfn-koordine",
"wiktku-dfn-jornav",
"wiktku-dfn-jernav"
];
function genderLabel(code) {
if (code === "p") return "Pirjimar";
var pluralMatch = code.match(/^(.+)-p$/);
if (pluralMatch && GENDER_BASE_LABELS[pluralMatch[1]]) {
return GENDER_BASE_LABELS[pluralMatch[1]] + " (pirjimar)";
}
return GENDER_BASE_LABELS[code] || code;
}
// True if a sense has content beyond mane worth keeping (etîket, word
// lists, nimûne, jêder) — so it's still emitted with {{mane?}} if empty.
function senseHasExtraContent(s) {
if (s.etiket && $.grep(s.etiket, function (e) { return $.trim(e) !== ""; }).length) return true;
if (s.kategori && $.grep(s.kategori, function (k) { return $.trim(k) !== ""; }).length) return true;
if (s.alternativ.length || s.hevmane.length || s.dijmane.length ||
s.koordine.length || s.jornav.length || s.jernav.length) return true;
if (s.nimune && $.grep(s.nimune, function (n) {
return (typeof n === "object" ? n.text : n) !== "";
}).length > 0) return true;
if (senseHasJeder(s)) return true;
return false;
}
// Bolds the *first* occurrence of the page name (plus any letters
// glued directly onto it, e.g. a plural "s") inside nimûne/jêgirtin
// text — "apple"/"Apple"/"apples"/"Apples" all match (case-insensitive),
// but only the first hit is wrapped, not every one in the text.
function boldPageNameOnce(text) {
if (!text || !pageNameRe) return text;
var re = new RegExp("(" + pageNameRe + "([^( |,|;|\\?|\\.|\\!)]+)?)", "i");
return text.replace(re, "'''$1'''");
}
// Converts literal line breaks typed into a nimûne/jêgirtin box into
// wikitext <br> tags, so a pasted/typed newline doesn't break the
// surrounding "#:"/"#*" wikitext list syntax on output.
function nlToBr(text) {
return text ? text.replace(/\r\n|\r|\n/g, "<br>") : text;
}
function escapeHtmlForBackdrop(str) {
return String(str)
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">");
}
// Mirrors a textarea's text, with a small highlighted marker placed
// right after each line that's followed by an actual typed/pasted
// linebreak. Rendered into a transparent backdrop layer behind the
// textarea (see ensureLinebreakBackdrop()), so only the point of the
// break is marked instead of the whole box.
function buildLinebreakBackdropHtml(text) {
var lines = text.split(/\r\n|\r|\n/);
return $.map(lines, function (line, i) {
var isLast = i === lines.length - 1;
return escapeHtmlForBackdrop(line) +
(isLast ? "" : "<mark class='wiktku-linebreak-mark'>↵</mark>\n");
}).join("");
}
// Copies the metrics that affect where text wraps/lands (font, line
// height, padding, border) from the real textarea onto its backdrop,
// via computed style rather than shared CSS classes — most of the
// box's own rules are written as "textarea.foo", which a <div> with
// the same class wouldn't match. Re-run on every update in case a
// responsive breakpoint changed the textarea's own font-size.
function syncLinebreakBackdropMetrics(textarea, backdrop) {
var cs = window.getComputedStyle(textarea[0]);
backdrop.css({
"box-sizing": cs.boxSizing,
"padding-top": cs.paddingTop,
"padding-right": cs.paddingRight,
"padding-bottom": cs.paddingBottom,
"padding-left": cs.paddingLeft,
"border-width": cs.borderWidth,
"border-style": "solid",
"font-family": cs.fontFamily,
"font-size": cs.fontSize,
"font-weight": cs.fontWeight,
"line-height": cs.lineHeight,
"letter-spacing": cs.letterSpacing
});
}
// Lazily wraps a textarea in its own positioning anchor (independent
// of .wiktku-resize-wrap, so this doesn't depend on load order versus
// wiktkuMakeManualResizable) and inserts the transparent backdrop
// layer used to mark the exact point of a linebreak. Safe to call
// more than once on the same textarea — the backdrop is cached.
function ensureLinebreakBackdrop(textarea) {
var existing = textarea.data("wiktkuLinebreakBackdrop");
if (existing) return existing;
textarea.wrap("<div class='wiktku-linebreak-wrap'></div>");
var backdrop = $("<div aria-hidden='true'></div>").addClass("wiktku-linebreak-backdrop");
textarea.before(backdrop);
textarea.data("wiktkuLinebreakBackdrop", backdrop);
textarea.on("scroll.wiktkuLinebreak", function () {
backdrop.scrollTop(textarea.scrollTop()).scrollLeft(textarea.scrollLeft());
});
return backdrop;
}
// Flags a nimûne/jêgirtin textarea (via CSS class, for the border
// tint + tooltip) while it contains a typed/pasted linebreak, so the
// user notices before it's silently turned into <br> on output.
// Marks only the exact point of the break via a mirrored backdrop,
// rather than tinting the whole box.
function highlightLinebreak(el) {
var textarea = $(el);
var text = textarea.val();
var hasBreak = /\r|\n/.test(text);
textarea
.toggleClass("wiktku-has-linebreak", hasBreak)
.attr("title", hasBreak ? "Xeta nû dê wek <br> bê nivîsandin" : "");
if (!hasBreak) {
var cached = textarea.data("wiktkuLinebreakBackdrop");
if (cached) cached.hide();
textarea.removeClass("wiktku-has-linebreak-source");
return;
}
var backdrop = ensureLinebreakBackdrop(textarea);
textarea.addClass("wiktku-has-linebreak-source");
syncLinebreakBackdropMetrics(textarea, backdrop);
backdrop.html(buildLinebreakBackdropHtml(text)).show();
backdrop.scrollTop(textarea.scrollTop()).scrollLeft(textarea.scrollLeft());
}
// Each nimûne item can be { text, tr, t }: text, transliteration, translation.
function formatNimune(nimunes, lang, hasJeder) {
var hasNimune = nimunes && $.grep(nimunes, function (n) {
return (typeof n === "object" ? n.text : n) !== "";
}).length > 0;
if (!hasNimune) {
return hasJeder ? "" : "\n#* {{nimûne?|" + lang + "}}";
}
return $.map(nimunes, function (n) {
var text = typeof n === "object" ? n.text : n;
if (!text) return undefined;
var bolded = nlToBr(boldPageNameOnce(text));
var tpl = "\n#: {{nm|" + lang + "|" + bolded;
if (typeof n === "object") {
if (n.tr) tpl += "|tr=" + nlToBr(n.tr);
// Translation as third positional param (no key needed).
if (n.t) tpl += "|" + nlToBr(n.t);
}
// Short examples fit on one line together with their translation.
// rêz=1 is not used for ku — definitions are shown on separate lines there.
if (text.length < 60 && lang !== "ku") tpl += "|rêz=1";
tpl += "}}";
return tpl;
}).join("");
}
// Formats jêder (citation) entries into "#* {{jêder…|…}}" lines; skips
// entries with no quote text. Falls back to the generic {{jêder}}
// template when no specific template was chosen.
function formatJeder(jederList, lang) {
if (!jederList || !jederList.length) return "";
return $.map(jederList, function (jeder) {
if (!jeder || !jeder.quote) return undefined;
var quote = nlToBr(boldPageNameOnce(jeder.quote));
var quoteTr = nlToBr(jeder.quoteTr);
var quoteT = nlToBr(jeder.quoteT);
if (jeder.jederTpl) {
var cite = "\n#* {{" + jeder.jederTpl + "|" + lang;
cite += "|jêgirtin=" + quote;
if (quoteTr) cite += "|tr=" + quoteTr;
if (quoteT) cite += "|tercime=" + quoteT;
$.each(jeder.jêderFields || {}, function (key, val) {
if (val) cite += "|" + key + "=" + val;
});
cite += "}}";
return cite;
}
var out = "\n#* {{jêder|" + lang + "|jêgirtin=" + quote;
if (quoteTr) out += "|tr=" + quoteTr;
if (quoteT) out += "|tercime=" + quoteT;
// A şablon picked from Kategorî:Çavkanî is transcluded as the
// source param (e.g. |{{Kovara X}}); manual text is used as-is.
var srcParam = jeder.jederCatTpl ? ("{{" + jeder.jederCatTpl + "}}") :
(jeder.jederManual ? jeder.jederManual : "çavkanî?");
// A positional param containing "=" gets parsed as its own key=value
// pair by MediaWiki and breaks the template, so force it to be
// explicitly named (|2=) whenever that's the case.
out += (srcParam.indexOf("=") !== -1 ? "|2=" : "|") + srcParam;
out += "}}";
return out;
}).join("");
}
// True if a sense has at least one jêder entry with quote text.
function senseHasJeder(sense) {
return !!(sense.jeder && $.grep(sense.jeder, function (j) {
return j && j.quote;
}).length > 0);
}
// Builds "{{tplName|lang|part1|part2|…}}" from a sense field (kategori,
// etiket), wrapped inline (" {{…}} ") or on its own line ("\n#: {{…}}").
function buildSenseTpl(sense, field, lang, tplName) {
if (!sense[field] || !sense[field].length) return "";
var parts = sense[field].map(function (p) { return $.trim(p); })
.filter(function (p) { return p !== ""; });
if (!parts.length) return "";
var call = "{{" + tplName + "|" + lang + "|" + parts.join("|") + "}}";
return call
}
/**
* Assembles the nimûne + jêder wikitext block for a sense. Shared by
* both the template-sense and normal-mane-sense branches below.
*/
function buildCite(sense, lang) {
return formatNimune(sense.nimune, lang, senseHasJeder(sense)) +
formatJeder(sense.jeder, lang);
}
function makeWordListStep(id, name, question_fmt) {
return {
id: id,
name: name,
question_fmt: question_fmt,
multiple: true,
narrow: true,
placeholder: "Kelîme…",
visible: function (values) {
return values.lang && values.pos;
},
output: function (values) {
var words = $.grep(values[id] || [], function (w) { return !!w; });
var header = capitalize(name);
if (!words.length) return "";
var lang = values.lang;
var section = "\n==== " + header + " ====\n";
var params = "cure=" + header + "\n" +
$.map(words, function (w) {
return "|" + w;
}).join("\n");
return section +
"{{kol3|" + lang + "|" + params + "\n}}\n";
} };
}
var steps = {
lang: {
id: "lang",
required: true,
name: "ziman",
question_fmt: '"' + pageName + '" bi çi zimanî ye?',
question_br: true,
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (langChoices).
choices: [],
output: function (values) {
if (addLangMode){
return "\n== {{ziman|" + values.lang + "}} ==\n";
}else {
return "== {{ziman|" + values.lang + "}} ==\n";
}
} },
pron: {
id: "pron",
name: "bilêvkirin",
question_fmt: '"' + pageName + '" çawa tê telafûzkirin?',
// pronTpls populated from data.json
pronTpls: {},
visible: function (values) {
if (!values.lang) return false;
// addLangMode: skip pron only if this lang already has a section.
if (addLangMode) {
// Clearing the page makes existing content irrelevant.
var clearPageCheck = $("#wiktku-clear-page-check");
if (clearPageCheck.length && clearPageCheck.prop("checked")) {
return true;
}
var existing = $("#wpTextbox1").val() || "";
return !findLangHeader(existing, values.lang);
}
return true;
},
// Fills the insert-dropdown from pronTpls, filtered by language.
refreshTplSelect: function () {
var sel = $("#wiktku-start-pron .wiktku-tpl-insert-select");
if (!sel.length) return;
var lang = getValues().lang || "";
sel.find("option[value!='']").remove();
$.each(steps.pron.pronTpls, function (name, tpl) {
// Filter: if tpl.langs exists, only show if lang is in that list; otherwise show always
var allowed = !tpl.langs || tpl.langs.indexOf(lang) !== -1;
if (allowed) {
sel.append($("<option></option>")
.val(tpl.snippet)
.text(name + " — " + tpl.desc)
.attr("data-nolang", tpl.noLang ? "1" : ""));
}
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-pron-wrap").length) return null;
var wrap = $("<div class='wiktku-pron-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-pron-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-pron-text")
.attr("rows", 4)
.attr("placeholder", "Nimûne: {{IPA|ku|/pɛɪ̯n/}} yan {{kîte|ku|he|ce|ki|rin}}");
// Template insert dropdown — filtered by language.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike ");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
var lang = getValues().lang || "";
$.each(steps.pron.pronTpls, function (name, tpl) {
// Filter: if tpl.langs exists, only show if lang is in that list; otherwise show always
var allowed = !tpl.langs || tpl.langs.indexOf(lang) !== -1;
if (allowed) {
sel.append($("<option></option>")
.val(tpl.snippet)
.text(name + " — " + tpl.desc)
.attr("data-nolang", tpl.noLang ? "1" : ""));
}
});
sel.on("change", function () {
var snippet = $(this).val();
if (!snippet) return;
var lang = getValues().lang || "";
// Check if the selected option has noLang flag
var selectedOption = sel.find("option:selected");
var hasNoLang = selectedOption.attr("data-nolang") === "1";
if (!hasNoLang) {
snippet = snippet.replace(/CODE/g, lang).replace(/SOURCELANG/g, "?");
}
insertAtCursor(ta[0], snippet);
$(this).val("");
// Clear the picker's search box
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel).append(ta);
stepDiv.append(wrap);
initSelects(wrap);
return ta;
},
output: function () {
var text = $.trim($("#wiktku-start-pron .wiktku-pron-text").val());
if (!text) return "";
var lines = text.split("\n");
var out = $.map(lines, function (line) {
line = $.trim(line);
if (!line) return undefined;
return line;
}).join("\n");
return "\n=== Bilêvkirin ===\n" + out + "\n";
} },
pos: {
id: "pos",
required: true,
name: "Cureyê rêzimanî",
question_fmt: 'Cureyê rêzimanî yê "' + pageName + '" çi ye?',
visible: function (values) {
return values.lang;
},
question_br: true,
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (posChoices).
choices: [],
output: function (values) {
var pos = values.pos || "";
var cinsiyet = values.cinsiyet || ""; // from the cinsiyet step
var lekTur = values.lektur || ""; // from the lêker transitivity step
var capitalizedPos = capitalize(pos);
var outputString = "\n=== " + capitalizedPos + " ===\n";
outputString += "{{" + pos + "|" + values.lang;
if (pos === "navdêr" || pos === "serenav") {
if (cinsiyet) {
outputString += "|c=" + cinsiyet;
} else if (values.lang === "ku") {
outputString += "|c=?";
}
} else if (/^lêker/.test(pos) && lekTur) {
outputString += "|c=" + lekTur;
}
if (values.tr) {
outputString += "|tr=" + values.tr;
}
outputString += "}}\n";
return outputString;
}
},
// cinsiyet (gender) — shown for navdêr/serenav only, with choices built
// from metadata[lang].g since not every language has grammatical gender.
cinsiyet: {
id: "cinsiyet",
name: "cinsiyet",
question_fmt: 'Cinsiyeta "' + pageName + '" çi ye?',
question_br: true,
visible: function (values) {
var meta = metadata[values.lang];
return !!(values.lang && (values.pos === "navdêr" || values.pos === "serenav") &&
meta && meta.g && meta.g.length);
},
build: function (stepDiv, values) {
var select = stepDiv.find("select.wiktku-start-step-field");
if (!select.length) {
select = $(mw.html.element("select", {
"class": "wiktku-start-step-field wiktku-plain-select",
id: "wiktku-start-cinsiyet-field" }));
stepDiv.append(select);
}
if (!values) return select;
var meta = metadata[values.lang];
var codes = (meta && meta.g) || [];
var prevVal = select.val();
var choices = $.map(codes, function (code) {
return [{ code: code, label: genderLabel(code) }];
});
populateMenus(select, choices, null, "Cinsiyetê hilbijêre");
if ($.grep(choices, function (c) { return c.code === prevVal; }).length) {
select.val(prevVal);
}
return select;
},
output: function () { return ""; } // consumed by pos.output
},
// Lêker transitivity
lektur: {
id: "lektur",
name: "Cureyê lêkerê (fiîlê)",
question_fmt: "Cureyê lêkerê (fiîlê) çi ye?",
question_br: true,
visible: function (values) {
return values.lang && values.pos && /^lêker/.test(values.pos);
},
choices: [
{ code: "gh", label: "gerguhêz" },
{ code: "x-gh", label: "xwerû-gerguhêz" },
{ code: "p-gh", label: "pêkhatî-gerguhêz" },
{ code: "h-gh", label: "hevedudanî-gerguhêz" },
{ code: "b-gh", label: "biwêjî-gerguhêz" },
{ code: "ngh", label: "negerguhêz" },
{ code: "x-ngh", label: "xwerû-negerguhêz" },
{ code: "p-ngh", label: "pêkhatî-negerguhêz" },
{ code: "h-ngh", label: "hevedudanî-negerguhêz" },
{ code: "b-ngh", label: "biwêjî-negerguhêz" } ],
output: function () { return ""; } // consumed by pos.output
},
tr: {
id: "tr",
name: "transliterasyon",
question_fmt: "Transliterasyona vê kelîmeyê",
multiple: false,
narrow: true,
visible: function (values) {
return values.lang && values.pos && needsTransliteration(values.lang);
} },
dfn: {
id: "dfn",
name: "Mane",
question_fmt: function (values) {
var base = "Maneya kelîmeyê binivîse. Mane otomatîk tê lînkkirin!";
if (values.lang === "ku") {
return base + " Ji bo tercimeyan beşa 'Werger' bi kar bîne!";
}
return base;
},
multiple: true,
ordered: true,
rows: 3,
visible: function (values) {
return values.lang && values.pos;
},
example: function (values) {
// posExamples loaded from [[MediaWiki:Gadget-start.js/data.json]].
var examples = steps.dfn.posExamples || {};
var full = values.pos || "";
return examples[full] || "";
},
// Builds one sense block (<li>): mane textarea, nimûne list, and
// sub-lists for alternatîv/hevmane/dijmane/etc.
buildSenseBlock: function (stepDiv) {
var block = $("<li class='wiktku-dfn-sense'></li>");
// — Mane textarea (declared first so the template handler can reference it) —
var dfnArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-mane-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-start-step-field wiktku-dfn-mane")
.attr("rows", 6)
.attr("placeholder", "Mane…");
dfnArea.on("input", function () {
steps.dfn.onDfnInput(stepDiv, block, this);
});
// — Tercime + Îzah boxes (non-ku alternative to the plain mane box) —
// Non-ku entries get a direct translation plus a {{îzah|…}}-wrapped
// gloss instead of a Kurdish-style gloss. Rather than teach every
// consumer (getSenses/getOutput/linkify) a second data shape, these
// boxes just write their combined text into dfnArea and re-fire its
// "input" event, so dfnArea stays the single source of truth.
var tercimeArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-tercime-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-dfn-subfield wiktku-dfn-tercime")
.attr("rows", 2)
.attr("placeholder", "Tercimeyên rasterast ên kurmancî… Ji bo school-a îngilîzî li vir 'mekteb, medrese' binivîse");
var izahArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-izah-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-dfn-subfield wiktku-dfn-izah")
.attr("rows", 3)
.attr("placeholder", "Îzaha kurmancî… Ji bo school-a îngilîzî li vir 'cihê tehsîlgirtinê' binivîse");
var nonKuWrap = $("<div class='wiktku-dfn-nonku-wrap'></div>")
.append(tercimeArea).append(izahArea)
.hide();
function syncNonKuToMane() {
var t = $.trim(tercimeArea.val());
var iz = $.trim(izahArea.val());
// if tercime is blank, use îzah as definition
var combined = t ? (iz ? t + " {{îzah|" + iz + "}}" : t) : iz;
dfnArea.val(combined);
// Re-fires onDfnInput so the sense list still grows and
// refresh() still runs, exactly as if this were typed
// directly into the mane textarea.
dfnArea.trigger("input");
}
tercimeArea.on("input", syncNonKuToMane);
izahArea.on("input", syncNonKuToMane);
// Switches between the plain mane box and the tercime+îzah pair —
// only for non-ku entries with no tplSelect selected.
function updateManeMode() {
var lang = getValues().lang || "";
var isTpl = !!tplSelect.val();
if (lang && lang !== "ku" && !isTpl) {
dfnArea.hide();
nonKuWrap.show();
} else {
nonKuWrap.hide();
if (!isTpl) dfnArea.show();
}
}
// Store on the block so refresh() can re-sync every block when
// lang changes, and restoreDfn() can re-sync after restoring.
block.data("updateManeMode", updateManeMode);
// — Template selector (optional — replaces mane when chosen) —
// Template definitions loaded from [[MediaWiki:Gadget-start.js/data.json]].
var tplDefs = steps.dfn.tplDefs || {};
// Cache of all non-placeholder option elements, so updateTplOptions
// can detach/re-attach them without losing the full list.
var _allTplOptions = [];
var tplSelect = $(mw.html.element("select", { "class": "wiktku-dfn-tpl-select" }));
tplSelect.attr("data-placeholder", "Li şablonekê bigere");
tplSelect.append($("<option value=''>— yan jî şablonek hilbijêre —</option>"));
$.each(tplDefs, function (name, tpl) {
var opt = $("<option></option>")
.val(name)
.text(name)
.attr("data-langs", tpl.langs ? tpl.langs.join(",") : "")
.attr("data-nolang", tpl.noLang ? "1" : "");
tplSelect.append(opt);
_allTplOptions.push(opt[0]);
});
function updateTplOptions() {
var lang = getValues().lang || "";
var currentVal = tplSelect.val();
var currentStillValid = false;
// Detach all non-placeholder options, then re-attach only the visible
// ones — native <select> won't reliably hide options any other way.
tplSelect.find("option[value!='']").detach();
$.each(_allTplOptions, function (_, opt) {
var allowed = $(opt).attr("data-langs");
var visible = !allowed || allowed.split(",").indexOf(lang) !== -1;
if (visible) {
tplSelect.append(opt);
if ($(opt).val() === currentVal) currentStillValid = true;
}
});
tplSelect.trigger("wiktku:refresh");
if (currentVal && !currentStillValid) {
tplSelect.val("");
tplTitleInput.hide().val("");
updateManeMode();
}
}
// Store updater on the element so refresh() can call it for all blocks.
tplSelect.data("updateOptions", updateTplOptions);
var tplTitleInput = $("<input type='text'>")
.addClass("wiktku-dfn-tpl-title wiktku-start-narrow")
.attr("placeholder", "Navê rûpela hedefê…")
.hide();
// Grow the sense list when the title field of the last block gets content,
// mirroring what onDfnInput does for the plain mane textarea.
tplTitleInput.on("input", function () {
steps.dfn.onDfnInput(stepDiv, block, this);
});
// Şablon senses have no plain gloss, so hide alternatîv/hevmane/
// dijmane/etc. Etîket, Nimûne and Jêgirtin stay visible either way.
function updateFieldVisibility() {
var isTpl = !!tplSelect.val();
$.each(HIDDEN_ON_TPL_GROUPS, function (_, cls) {
block.find("." + cls + "-group").toggle(!isTpl);
});
}
// Store on the block so restoreDfn() can re-sync visibility
// after setting tplSelect's value.
block.data("updateFieldVisibility", updateFieldVisibility);
tplSelect.on("change", function () {
var chosen = $(this).val();
if (chosen) {
dfnArea.hide();
nonKuWrap.hide();
tplTitleInput.show().focus();
} else {
tplTitleInput.hide().val("");
updateManeMode();
}
updateFieldVisibility();
// Re-run refresh so the Werger step visibility updates.
refresh();
});
var tplRow = $("<div></div>").addClass("wiktku-dfn-tpl-row")
.append(tplSelect).append(" ").append(tplTitleInput);
block.append(tplRow);
block.append(dfnArea);
block.append(nonKuWrap);
// Apply lang filter on initial build.
updateTplOptions();
updateManeMode();
// — Sub-field groups are always visible with a placeholder textarea.
var allGroups = [
{ cls: "wiktku-dfn-etiket", label: "Etîket", rows: 1, narrow: true, izah: "xisûsen, Mêrdîn, anatomî, Badînî" },
{ cls: "wiktku-dfn-kategori", label: "Kategorî", rows: 1, narrow: true, izah: "wekî etîket lê xuya nabe tenê kategorîze dike" },
{ cls: "wiktku-dfn-alternativ", label: "Formên alternatîv", rows: 1, narrow: true, izah: "Varyantên vê kelîmeyê" },
{ cls: "wiktku-dfn-hevmane", label: "Hevmane", rows: 1, narrow: true, izah: "Spehî hevmaneya Bedew e." },
{ cls: "wiktku-dfn-dijmane", label: "Dijmane", rows: 1, narrow: true, izah: "Zengîn dijmaneya feqîr e." },
{ cls: "wiktku-dfn-koordine", label: "Termên koordîne", rows: 1, narrow: true, izah: "Pisîk û kûçik termên koordîne ne çunkî Jornavên wan gelek in" },
{ cls: "wiktku-dfn-jornav", label: "Jornav", rows: 1, narrow: true, izah: "Heywan jornavê guhandar e" },
{ cls: "wiktku-dfn-jernav", label: "Jêrnav", rows: 1, narrow: true, izah: "Guhandar jêrnavê heywan e" },
{ cls: "wiktku-dfn-nimune", label: "Nimûne", rows: 2, narrow: false }
];
$.each(allGroups, function (_, g) {
var groupDiv = $("<div></div>").addClass("wiktku-dfn-subgroup " + g.cls + "-group");
function buildNimuneLi() {
var lang = getValues().lang || "";
var li = $("<li></li>").addClass("wiktku-dfn-nimune-li");
var mainTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-text-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", g.rows)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-text")
.attr("placeholder", "Nimûneya emilandina kelîmeyê tu bi xwe binivîse…");
mainTa.on("input", function () {
highlightLinebreak(this);
var val = $.trim($(this).val());
var isLast = li.is(list.children("li:last-child"));
if (val && isLast) {
list.append(buildNimuneLi());
}
});
li.append(mainTa);
var subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
if (needsTransliteration(lang)) {
subWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-tr")
.attr("placeholder", "Transliterasyona bi alfabeya latînî")
);
}
if (lang && lang !== "ku") {
subWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-t")
.attr("placeholder", "Tercimeya nimûneyê bi kurmancî")
);
}
if (subWrap.children().length) li.append(subWrap);
return li;
}
if (g.cls === "wiktku-dfn-nimune") {
// Nimûne — compound widget with tr/t sub-fields.
var lbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text(g.label))
.append(": ");
var list = $("<ol></ol>").addClass("wiktku-dfn-sublist " + g.cls + "-list");
groupDiv.data("buildNimuneLi", buildNimuneLi);
list.append(buildNimuneLi());
groupDiv.append(lbl).append(list);
block.append(groupDiv);
} else {
// Regular always-visible group — label + growing textarea list.
var lbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text(g.label))
.append(": ")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-hint").text(g.izah));
var list = $("<ol></ol>").addClass("wiktku-dfn-sublist " + g.cls + "-list");
var firstInput = $("<textarea></textarea>")
.attr("name", g.cls + "-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", g.rows)
.attr("class", "wiktku-dfn-subfield" + (g.narrow ? " wiktku-start-narrow" : ""))
.attr("placeholder", g.label + "…");
firstInput.on("input", function () {
steps.dfn.onSubInput(list, this, g.rows, g.narrow);
});
list.append($("<li></li>").append(firstInput));
groupDiv.append(lbl).append(list);
block.append(groupDiv);
}
});
// — Jêder group — growing list, same structure as Nimûne. —
(function () {
var jederGroupDiv = $("<div></div>").addClass("wiktku-dfn-subgroup wiktku-dfn-jeder-group");
var jederLbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text("Jêgirtin"))
.append(": ");
var jederList = $("<ol></ol>").addClass("wiktku-dfn-sublist wiktku-dfn-jeder-list");
function buildJederLi() {
var lang = getValues().lang || "";
var li = $("<li></li>").addClass("wiktku-dfn-jeder-li");
// Quote text textarea
var quoteTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote")
.attr("placeholder", "Nimûneya emilandinê ji kitêb an çavkaniyeke din binivîse");
quoteTa.on("input", function () {
highlightLinebreak(this);
var val = $.trim($(this).val());
var isLast = li.is(jederList.children("li:last-child"));
if (val && isLast) {
jederList.append(buildJederLi());
}
});
li.append(quoteTa);
// tr/t sub-fields for the quote — shown as needed for the language.
var quoteSubWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
if (needsTransliteration(lang)) {
quoteSubWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-tr")
.attr("placeholder", "Transliterasyona jêgirtinê…")
);
}
if (lang && lang !== "ku") {
quoteSubWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-t")
.attr("placeholder", "Tercimeya jêgirtinê bi kurmancî")
);
}
if (quoteSubWrap.children().length) li.append(quoteSubWrap);
// Citoid auto-fill: fetch citation data from a URL, DOI or ISBN and
// prefill the source şablon + fields below (see Gadget-citoid-helper.js).
var citoidWrap = $("<div></div>").addClass("wiktku-dfn-quote-citoid");
var citoidInput = $("<textarea></textarea>")
.addClass("wiktku-dfn-subfield wiktku-dfn-quote-citoid-input")
.attr("rows", 1)
.attr("placeholder", "URL, DOI an ISBN binivîse ku otomatîk were tijekirin…");
var citoidBtn = new OO.ui.ButtonWidget({
label: "Bi Citoidê bîne",
classes: [ "wiktku-dfn-quote-citoid-btn" ]
});
var citoidStatus = $("<span></span>").addClass("wiktku-dfn-quote-citoid-status");
// Fetches citation data from Citoid and fills this citation's
// şablon + fields — only rebuilds fields on template change,
// and never overwrites values the user already typed.
function runCitoidFetch() {
var query = $.trim(citoidInput.val());
if (!query) {
mw.notify("Ji kerema xwe re pêşî URL, DOI an ISBNyekê binivîse.");
return;
}
citoidBtn.setDisabled(true);
citoidStatus.text("Tê anîn…");
wikt.citoidHelper.ensure().then(function () {
return wikt.citoid.fetchJederFields(query);
}).then(function (result) {
var jederKey = result.jederKey;
var hasTpl = !!jederKey && srcSel.find("option[value='" + jederKey + "']").length > 0;
var targetVal = hasTpl ? jederKey : "__manual__";
// Only rebuild if switching şablon, so a repeat fetch
// doesn't clear fields already filled in by hand.
if (srcSel.val() !== targetVal) {
srcSel.val(targetVal).trigger("change");
}
if (hasTpl) {
// Tenê qadên vala tijî bike.
$.each(result.fields, function (key, val) {
var input = srcFields.find("[data-field-key='" + key + "']");
if (input.length && !$.trim(input.val())) {
input.val(val);
}
});
} else {
// Şablonek nehat naskirin ji bo vê itemType — rêzikeke
// çavkaniyê ya bi destan a ji qadên Citoid tê çêkirin,
// lê tenê ger qada destan vala be.
var manualField = srcFields.find(".wiktku-dfn-quote-src-manual");
if (!$.trim(manualField.val())) {
var parts = [];
$.each(["nivîskar", "sernav", "websîte", "kovar", "weşanxane", "sal", "url"], function (_, k) {
if (result.fields[k]) parts.push(result.fields[k]);
});
manualField.val(parts.join(", "));
}
}
citoidStatus.text("");
}, function (errorMsg) {
citoidStatus.text(typeof errorMsg === "string" ? errorMsg : "Nehat dîtin. Kontrol bike ka URL/DOI/ISBN rast e.");
}).always(function () {
citoidBtn.setDisabled(false);
});
}
citoidBtn.on("click", runCitoidFetch);
citoidInput.on("keydown", function (e) {
if (e.which === 13) { // Enter
e.preventDefault();
runCitoidFetch();
}
});
citoidWrap.append(citoidInput).append(citoidBtn.$element).append(citoidStatus);
// Source template selector, specific to this citation.
var srcSel = $("<select></select>").addClass("wiktku-dfn-quote-src-sel wiktku-plain-select");
srcSel.append($("<option value=''>— Çavkaniyê hilbijêre —</option>"));
srcSel.append($("<option></option>").val("__manual__").text("Bi destê xwe binivîsim"));
srcSel.append($("<option></option>").val("__category__").text("Ji Kategorî:Çavkanî şablonekê hilbijêre"));
var jederDefs = steps.dfn.jederDefs || {};
$.each(jederDefs, function (tplName, def) {
srcSel.append($("<option></option>").val(tplName).text(def.label));
});
// Dynamic source fields container.
var srcFields = $("<div></div>").addClass("wiktku-dfn-quote-src-fields");
srcSel.on("change", function () {
srcFields.empty();
var chosen = $(this).val();
if (!chosen) return;
if (chosen === "__manual__") {
// Freeform source, written by the user — becomes the 2nd
// positional param of {{jêder|lang|…}} instead of çavkanî?.
srcFields.append(
$("<textarea></textarea>")
.attr("rows", 4)
.addClass("wiktku-dfn-subfield wiktku-dfn-quote-src-manual")
.attr("placeholder", "Çavkaniyê bi destê xwe binivîse…")
);
return;
}
if (chosen === "__category__") {
// Search widget over the members of [[Kategorî:Çavkanî]].
// Picking a şablon here immediately switches the row to
// "Bi destê xwe binivîsim" mode with {{Şablon}} pre-filled,
var catWrap = $("<span></span>").addClass("wiktku-native-select-wrap wiktku-dfn-quote-src-cat");
var catInput = $("<input type='search' autocomplete='off'>")
.addClass("wiktku-start-narrow wiktku-dfn-quote-src-cat-input")
.attr("placeholder", "Li navê şablonê bigere…");
var catResults = $("<ul></ul>").addClass("wiktku-ac-results wiktku-dfn-quote-src-cat-results").hide();
var catStatus = $("<span></span>").addClass("wiktku-dfn-quote-src-cat-status").text("Şablon tên barkirin…");
var showCatResults = function (query) {
var q = $.trim(query).toLowerCase();
catResults.empty();
var list = catSrcTemplates || [];
var matched = q ?
$.grep(list, function (name) { return name.toLowerCase().indexOf(q) !== -1; }) :
list;
if (!matched.length) {
catResults.hide();
return;
}
$.each(matched.slice(0, 50), function (_, name) {
var li = $("<li></li>").text(name).attr("data-value", name);
var touchMoved = false;
li.on("touchstart", function () { touchMoved = false; });
li.on("touchmove", function () { touchMoved = true; });
li.on("touchend", function (e) {
if (touchMoved) return;
e.preventDefault();
selectCatTpl(name);
});
li.on("mousedown", function (e) {
e.preventDefault();
selectCatTpl(name);
});
catResults.append(li);
});
catResults.show();
};
// Wraps the chosen şablon as {{Name}}, drops it into the
// manual textarea, and switches the row into manual mode
// so the user can keep editing it (add params, etc.).
var selectCatTpl = function (name) {
catResults.hide();
srcSel.val("__manual__");
srcSel.trigger("change");
srcFields.find(".wiktku-dfn-quote-src-manual")
.val("{{" + name + "}}")
.trigger("focus");
};
catInput.on("input", function () {
showCatResults($(this).val());
});
catInput.on("focus", function () {
showCatResults($(this).val());
});
catInput.on("blur", function () {
setTimeout(function () { catResults.hide(); }, 200);
});
catWrap.append(catInput).append(catResults).append(catStatus);
srcFields.append(catWrap);
fetchCatSrcTemplates().then(function () {
catStatus.text("");
}, function () {
catStatus.text("Şablon nehatin barkirin.");
});
return;
}
var def = (steps.dfn.jederDefs || {})[chosen];
if (!def) return;
$.each(def.fields, function (key, label) {
var row = $("<div></div>").addClass("wiktku-dfn-quote-src-row");
var fieldLbl = $("<label></label>").text(label + ": ");
var inp = $("<textarea></textarea>")
.attr("rows", 2)
.addClass("wiktku-dfn-quote-src-input wiktku-start-narrow")
.attr("data-field-key", key)
.attr("placeholder", label + "…");
// "Sernav" / "Sernavê orjînal" (title fields, e.g. for
// kitêb/kovar/malper) get a taller, draggable box; every
// other field in the template stays as-is. Field labels
// come from the on-wiki jederDefs data, so match on the
// (diacritic-folded) label text rather than a fixed key.
var foldedLabel = foldDiacritics(label);
if (/^sernav$/.test(foldedLabel) || /orjin/.test(foldedLabel)) {
inp.addClass("wiktku-dfn-quote-src-input--title");
}
row.append(fieldLbl).append(inp);
srcFields.append(row);
});
});
li.append(citoidWrap).append(srcSel).append(srcFields);
return li;
}
jederGroupDiv.data("buildJederLi", buildJederLi);
jederList.append(buildJederLi());
jederGroupDiv.append(jederLbl).append(jederList);
block.append(jederGroupDiv);
}());
// Apply the initial hide/show state for the sub-groups (matches
// tplSelect's starting value, which is normally empty).
updateFieldVisibility();
return block;
},
/** Grows the sense list when the last mane textarea gets content. */
onDfnInput: function (stepDiv, block, textarea) {
var val = $.trim($(textarea).val());
var list = stepDiv.find("ol.wiktku-dfn-list");
var isLast = block.is(list.children("li:last-child"));
if (val && isLast) {
var newBlock = steps.dfn.buildSenseBlock(stepDiv);
list.append(newBlock);
// Give the new block's template selector the searchable picker.
initSelects(newBlock);
}
refresh();
},
/** Grows a sub-list (nimûne/formên alternatîv/hevmane/dijmane/termên koordîne) on input. */
onSubInput: function (list, input, rows, narrow) {
var val = $.trim($(input).val());
var item = $(input).parent();
var isLast = item.is(list.children("li:last-child"));
if (val && isLast) {
var next = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-sub-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", rows)
.attr("class", "wiktku-dfn-subfield" + (narrow ? " wiktku-start-narrow" : ""));
next.on("input", function () {
steps.dfn.onSubInput(list, this, rows, narrow);
});
list.append($("<li></li>").append(next));
}
},
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (tplDefs, posExamples, jederDefs).
tplDefs: {},
posExamples: {},
jederDefs: {},
build: function (stepDiv) {
if (stepDiv.find("ol.wiktku-dfn-list").length) return null;
var list = $("<ol class='wiktku-dfn-list'></ol>");
list.append(steps.dfn.buildSenseBlock(stepDiv));
stepDiv.append(list);
return null;
},
/** Reads all sense blocks from the DOM and returns an array of sense objects. */
getSenses: function (stepDiv) {
var senses = [];
stepDiv.find("li.wiktku-dfn-sense").each(function () {
var block = $(this);
var tplSel = block.find("select.wiktku-dfn-tpl-select");
var tpl = tplSel.val() || "";
// noLang: template already encodes the language — don't add |lang| param.
var tplNoLang = tpl
? tplSel.find("option[value='" + tpl + "']").attr("data-nolang") === "1"
: false;
var tplTitle = $.trim(block.find("input.wiktku-dfn-tpl-title").val());
var mane = $.trim(block.find("textarea.wiktku-dfn-mane").val());
function readList(cls) {
var vals = [];
block.find("." + cls + "-list textarea").each(function () {
var v = $.trim($(this).val());
if (v) vals.push(v);
});
return vals;
}
// Nimûne items are compound: { text, tr?, t? }
function readNimuneList() {
var items = [];
block.find(".wiktku-dfn-nimune-list li.wiktku-dfn-nimune-li").each(function () {
var text = $.trim($(this).find(".wiktku-dfn-nimune-text").val());
if (!text) return;
var obj = { text: text };
var tr = $.trim($(this).find(".wiktku-dfn-nimune-tr").val());
var t = $.trim($(this).find(".wiktku-dfn-nimune-t").val());
if (tr) obj.tr = tr;
if (t) obj.t = t;
items.push(obj);
});
return items;
}
// Jêder is a growing list of citations, one per li — mirrors readNimuneList().
function readJederList() {
var items = [];
block.find(".wiktku-dfn-jeder-list li.wiktku-dfn-jeder-li").each(function () {
var li = $(this);
var quote = $.trim(li.find(".wiktku-dfn-nimune-quote").val());
if (!quote) return;
var obj = { quote: quote };
var qtr = $.trim(li.find(".wiktku-dfn-nimune-quote-tr").val());
var qt = $.trim(li.find(".wiktku-dfn-nimune-quote-t").val());
if (qtr) obj.quoteTr = qtr;
if (qt) obj.quoteT = qt;
var tplName = li.find(".wiktku-dfn-quote-src-sel").val();
if (tplName === "__manual__") {
var manual = $.trim(li.find(".wiktku-dfn-quote-src-manual").val());
if (manual) obj.jederManual = manual;
} else if (tplName === "__category__") {
// Reachable only if the user opened the category search but
// never picked a şablon — picking one switches the row to
// __manual__ (see selectCatTpl above), so there's nothing
// meaningful to save here.
} else if (tplName) {
obj.jederTpl = tplName;
var fields = {};
li.find(".wiktku-dfn-quote-src-input").each(function () {
var k = $(this).attr("data-field-key");
var v = $.trim($(this).val());
if (k && v) fields[k] = v;
});
obj.jêderFields = fields;
}
items.push(obj);
});
return items;
}
senses.push({
tpl: tpl,
tplNoLang: tplNoLang,
tplTitle: tplTitle,
mane: mane,
etiket: readList("wiktku-dfn-etiket"),
kategori: readList("wiktku-dfn-kategori"),
nimune: readNimuneList(),
jeder: readJederList(),
alternativ: readList("wiktku-dfn-alternativ"),
hevmane: readList("wiktku-dfn-hevmane"),
dijmane: readList("wiktku-dfn-dijmane"),
koordine: readList("wiktku-dfn-koordine"),
jornav: readList("wiktku-dfn-jornav"),
jernav: readList("wiktku-dfn-jernav")
});
});
return senses;
},
getOutput: function (values, callback) {
var stepDiv = $("#wiktku-start-dfn");
var senses = steps.dfn.getSenses(stepDiv);
var lang = values.lang;
// A sense counts as "filled" if it has a mane, a chosen template + title,
// or any other content (etîket/hevmane/nimûne/jêder…) worth keeping.
var hasMane = senses.some(function (s) {
return s.mane !== "" || (s.tpl && s.tplTitle) || senseHasExtraContent(s);
});
var defLines = []; // one entry per kept sense (goes to linkify)
var citeLines = []; // parallel — nimûne+jêder for that same sense
var izahLines = []; // parallel — raw îzah gloss for that same sense
// True only once some sense's *actual* dfn text (post tercime/îzah
// split) is non-empty.
var hasLinkableMane = false;
$.each(senses, function (_, sense) {
// — Template sense (e.g. {{guharto|ku|somepage}}) —
if (sense.tpl) {
if (!sense.tplTitle) return; // skip empty template senses
var tplKatTpl = buildSenseTpl(sense, "kategori", lang, "K");
var tplLabelTpl = buildSenseTpl(sense, "etiket", lang, "e");
var tplCall = sense.tplNoLang
? "{{" + sense.tpl + "|" + sense.tplTitle + "}}"
: "{{" + sense.tpl + "|" + lang + "|" + sense.tplTitle + "}}";
var idx = defLines.length;
var cite = buildCite(sense, lang);
defLines.push("# " + (tplKatTpl ? tplKatTpl + " " : "") + (tplLabelTpl ? tplLabelTpl + " " : "") + tplCall +
(cite ? "{{wiktku-cite-" + idx + "}}" : ""));
citeLines.push(cite);
izahLines.push(""); // template senses have no îzah
return;
}
// — Normal mane sense —
var dfn = sense.mane;
if (!dfn && !senseHasExtraContent(sense)) return; // truly empty
// Pull the îzah gloss (if any) out of the combined tercime+îzah
// string — it's spliced back in separately below, after its
// own linkify pass (see izahLines / the second linkifyText call).
var izahRaw = null;
var tercimeIzah = splitTercimeIzah(dfn);
if (tercimeIzah) {
dfn = tercimeIzah.tercime;
izahRaw = stripWikilinks(tercimeIzah.izah);
}
if (dfn) {
dfn = stripWikilinks(dfn);
// Sentence-case + trailing period are for ku definitions,
// which are written as full glosses.
if (lang === "ku") {
if (dfn[0] !== dfn[0].toUpperCase()) dfn = capitalize(dfn);
if (!dfn.match(/[.…?!)\]]$/)) dfn += ".";
}
} else if (izahRaw === null) {
dfn = lang === "ku" ? "{{mane?|" + lang + "}}" : "";
}
if (dfn) hasLinkableMane = true;
var katTpl = buildSenseTpl(sense, "kategori", lang, "K");
var labelTpl = buildSenseTpl(sense, "etiket", lang, "e");
var out = "# " + (katTpl ? katTpl + " " : "") + (labelTpl ? labelTpl + " " : "") + dfn;
var idx = defLines.length;
var hasThisIzah = izahRaw !== null && $.trim(izahRaw) !== "";
// Bare {{...}} token — like {{wiktku-cite-N}}, this survives
// linkify's first pass untouched (it treats template calls as
// opaque), then gets swapped for {{îzah|…}} once the actual
// gloss text has been linkified in its own separate pass.
if (hasThisIzah) {
out += (dfn ? " " : "") + "{{wiktku-izah-" + idx + "}}";
}
function wordLine(tpl, words) {
if (!words.length) return "";
return "\n#: {{" + tpl + "|" + lang + "|" + words.join("|") + "}}";
}
out += wordLine("alt-r", sense.alternativ);
out += wordLine("hevmane", sense.hevmane);
out += wordLine("dijmane", sense.dijmane);
out += wordLine("koordîne", sense.koordine);
out += wordLine("jornav", sense.jornav);
out += wordLine("jêrnav", sense.jernav);
var cite = buildCite(sense, lang);
defLines.push(out + (cite ? "{{wiktku-cite-" + idx + "}}" : ""));
citeLines.push(cite);
izahLines.push(hasThisIzah ? izahRaw : "");
});
// Splice citeLines back into a linkified string, replacing each
// {{wiktku-cite-N}} token with its stored nimûne/jêder block.
function restoreCites(t) {
return t.replace(/\{\{wiktku-cite-(\d+)\}\}/g, function (_, n) {
return citeLines[parseInt(n, 10)] || "";
});
}
// Runs text through the linkify gadget if it's loaded, otherwise
// just passes it through unchanged. Shared by both linkify passes
// below (main mane text, and — separately — îzah glosses).
function linkifyText(t, cb) {
if (typeof $.kuLinkify === "function") {
$.kuLinkify(t, cb);
} else {
cb(t);
}
}
var hasIzah = izahLines.some(function (t) { return t && $.trim(t) !== ""; });
var text = defLines.join("\n") + "\n";
if (!hasMane) {
// No definitions entered — emit {{mane?}} with nimûne?.
text = "# {{mane?|" + lang + "}}\n#* {{nimûne?|" + lang + "}}\n";
callback(text);
return;
}
// Runs the îzah-only linkify pass against `base` (either the raw
// text, when there's no linkable mane to run the main pass on
// first, or the already-linkified main text). Shared by both
// branches below so the token-splice logic only lives once.
function runIzahPass(base) {
var izahJoined = $.map(izahLines, function (raw, idx) {
if (!raw) return undefined;
return "{{wiktku-izah-open-" + idx + "}}" + raw + "{{wiktku-izah-close-" + idx + "}}";
}).join("\n");
linkifyText(izahJoined, function (izahLinked) {
var izahByIdx = {};
var re = /\{\{wiktku-izah-open-(\d+)\}\}([\s\S]*?)\{\{wiktku-izah-close-\1\}\}/g;
var m;
while ((m = re.exec(izahLinked)) !== null) {
izahByIdx[parseInt(m[1], 10)] = m[2];
}
var withIzah = base.replace(/\{\{wiktku-izah-(\d+)\}\}/g, function (_, n) {
var linked = izahByIdx[parseInt(n, 10)];
return linked !== undefined ? "{{îzah|" + linked + "}}" : "";
});
callback(restoreCites(withIzah));
});
}
if (!hasLinkableMane) {
if (!hasIzah) {
// All filled senses are template senses (or otherwise have
// no plain text at all) — nothing here needs linkify.
callback(restoreCites(text));
return;
}
// There's no plain mane text anywhere (e.g. tercime left blank
// with only îzah filled in), so every defLine is just a bare
// template call with nothing to word-link. Sending a line
// like "# {{wiktku-izah-0}}" through the main linkify pass
// gives it no plain words to work with, makes the linkify
// gadget hang — so skip that pass entirely and run only
// the îzah pass, splicing straight into the unlinkified text.
var loadIzahOnly = function () { runIzahPass(text); };
mw.loader.using("ext.gadget.linkify", loadIzahOnly, loadIzahOnly);
return;
}
var didTryToLoad = function () {
// First pass: the main definition text (mane), same as before.
linkifyText(text, function (mainLinked) {
if (!hasIzah) {
callback(restoreCites(mainLinked));
return;
}
// Second pass: îzah glosses, linkified via their own
// separate call. Each gloss is wrapped in its own
// {{wiktku-izah-open/close-N}} pair; like the existing
// {{wiktku-cite-N}} tokens, these sit inside double
// braces so linkify leaves the tokens themselves alone —
// only the raw gloss text between each pair gets linked.
runIzahPass(mainLinked);
});
};
mw.loader.using("ext.gadget.linkify", didTryToLoad, didTryToLoad);
}
},
tewandin: {
id: "tewandin",
name: "tewandin",
question_fmt: 'Tewandina "' + pageName + '" binivîse',
visible: function (values) {
return values.lang && values.pos;
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-tewandin-wrap").length) return null;
var wrap = $("<div class='wiktku-tewandin-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-tewandin-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-tewandin-text")
.attr("rows", 4)
.attr("placeholder", "{{ku-tewîn-nav|" + pageName + "|n}}");
wrap.append(ta);
stepDiv.append(wrap);
return ta;
},
output: function (values) {
var cinsiyet = values.cinsiyet || "";
var pos = values.pos || "";
var manualText = $.trim($("#wiktku-start-tewandin .wiktku-tewandin-text").val());
if (!manualText && !pageName.includes(" ") && cinsiyet &&
GENDER_BASE_LABELS[cinsiyet] &&
(pos === "navdêr" || pos === "serenav") && values.lang === "ku") {
var out = "{{ku-tewîn-nav|" + pageName + "|" + GENDER_BASE_LABELS[cinsiyet];
if (pos === "serenav") out += "|y";
out += "}}";
return "\n==== Tewandin ====\n" + out + "\n";
}
if (manualText) {
return "\n==== Tewandin ====\n" + manualText + "\n";
}
return "";
}
},
je: makeWordListStep("je", "jê", "Kelîmeyên jê çêbûyî binivîse"),
tekildar: makeWordListStep("tekildar", "têkildar", "Kelîmeyên ji aliyê etîmolojiyê ve têkildarî vê kelîmeyê binivîse"),
binereherwiha: makeWordListStep("binereherwiha", "binêre herwiha", "Kelîmeyên din ên eleqedar binivîse"),
etym: {
id: "etym",
name: "etîmolojî",
question_fmt: "Etîmolojiya kelîmeyê binivîse",
// etymTpls populated from data.json
etymTpls: {},
visible: function (values) {
return values.lang && values.pos;
},
// Fills the insert-dropdown from the current etymTpls object.
refreshTplSelect: function () {
var sel = $("#wiktku-start-etym .wiktku-tpl-insert-select");
if (!sel.length) return;
sel.find("option[value!='']").remove();
$.each(steps.etym.etymTpls, function (name, tpl) {
sel.append($("<option></option>").val(tpl.snippet).text(name + " — " + tpl.desc));
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-etym-wrap").length) return null;
var wrap = $("<div class='wiktku-etym-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-etym-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-etym-text")
.attr("rows", 4)
.attr("placeholder", "Ji {{ji|en|ku|apple}}. yan rasterast binivîse…");
// Template insert dropdown — options also refreshed after data.json loads.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike…");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
$.each(steps.etym.etymTpls, function (name, tpl) {
sel.append($("<option></option>").val(tpl.snippet).text(name + " — " + tpl.desc));
});
sel.on("change", function () {
var snippet = $(this).val();
if (!snippet) return;
var lang = getValues().lang || "";
snippet = snippet.replace(/CODE/g, lang).replace(/SOURCELANG/g, "?");
insertAtCursor(ta[0], snippet);
$(this).val("");
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel);
wrap.append(ta);
stepDiv.append(wrap);
initSelects(wrap);
return ta;
},
output: function (values) {
var text = $.trim($("#wiktku-start-etym .wiktku-etym-text").val());
if (text) {
return "\n==== Etîmolojî ====\n" + text + "\n";
}
// No etymology entered — emit {{ji?|lang}} as a placeholder.
// Skip it only when every filled sense is a şablon sense
// a completely empty entry with no şablon chosen still gets the placeholder
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasFilledTplSense = dfnSenses.some(function (s) {
return !!s.tpl && !!s.tplTitle;
});
var hasRegularMane = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
if (hasFilledTplSense && !hasRegularMane) return "";
return "\n==== Etîmolojî ====\n{{ji?|" + values.lang + "}}\n";
} },
dunde: {
id: "dunde",
name: "dûnde",
question_fmt: "Eger ev kelîme ji vî zimanî ketibe zimanekî din, vî zimanî û kelîmeya wî binivîse",
visible: function (values) {
return !!values.pos;
},
disabledKeys: function (values) {
return {"navz": true, [values.lang]: true}
},
// Language dropdown + growing word-input list; a new row appends
// when the dropdown gets a value. Mirrors steps.trans, but flat.
buildRow: function (stepDiv) {
var row = $("<li class='wiktku-dunde-row wiktku-lang-row'></li>");
// Language selector — the searchable picker is applied after insertion into DOM.
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zimanekî bigere");
populateMenus(langSel, steps.dunde.keys || [], steps.dunde.disabledKeys);
// When a language is chosen, ensure a next empty row exists.
langSel.on("change", function () {
steps.dunde.onLangChange(stepDiv, row);
});
// Word list for this language.
var wordList = $("<ul class='wiktku-dunde-words wiktku-lang-row-words'></ul>");
var firstWord = steps.dunde.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
// The searchable picker is attached by initSelects() once the row
// is in the DOM (see onLangChange/build below).
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-dunde-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Kelîme…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-dunde-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.dunde.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (stepDiv, row) {
var list = stepDiv.find("ul.wiktku-dunde-list");
var isLast = row.is(list.children("li.wiktku-dunde-row:last-child"));
if (isLast) {
var newRow = steps.dunde.buildRow(stepDiv);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
// Keep disabled keys in sync across all lang selectors.
steps.dunde.syncDisabledKeys(stepDiv);
},
/** Disables already-selected languages in all other dropdowns. */
syncDisabledKeys: function (stepDiv) {
var taken = $.extend({}, steps.dunde.disabledKeys);
stepDiv.find("li.wiktku-dunde-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
stepDiv.find("li.wiktku-dunde-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
build: function (stepDiv) {
if (stepDiv.find("ul.wiktku-dunde-list").length) return null;
var list = $("<ul class='wiktku-dunde-list wiktku-lang-row-list'></ul>");
list.append(steps.dunde.buildRow(stepDiv));
stepDiv.append(list);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return null;
},
/** Reads all [langcode, words[]] rows from the DOM. */
getRows: function (stepDiv) {
var result = [];
stepDiv.find("li.wiktku-dunde-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-dunde-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
output: function () {
var stepDiv = $("#wiktku-start-dunde");
var rows = steps.dunde.getRows(stepDiv);
if (!rows.length) return "";
var lines = $.map(rows, function (row) {
var lang = row[0], words = row[1];
return "* {{dû|" + lang + "|" + words.join("|") + "}}";
});
return "\n==== Dûnde ====\n" + lines.join("\n") + "\n";
}
},
zarava: {
id: "zarava",
name: "bi zaravayên din",
question_fmt: "'"+ pageName + "' di zaravayên din de çawa tê gotin?",
visible: function (values) {
return steps.trans.visible(values);
},
disabledKeys: {},
buildRow: function (group) {
var row = $("<li class='wiktku-zarava-row wiktku-lang-row'></li>");
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zaravayekî bigere");
populateMenus(langSel, steps.zarava.keys || [], steps.zarava.disabledKeys);
langSel.on("change", function () {
steps.zarava.onLangChange(group, row);
});
var wordList = $("<ul class='wiktku-zarava-words wiktku-lang-row-words'></ul>");
var firstWord = steps.zarava.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-zarava-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Tercime…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-zarava-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.zarava.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (group, row) {
var list = group.find("ul.wiktku-zarava-list");
var isLast = row.is(list.children("li.wiktku-zarava-row:last-child"));
if (isLast) {
var newRow = steps.zarava.buildRow(group);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
steps.zarava.syncDisabledKeys(group);
},
/** Disables already-selected dialects in all other dropdowns within one group. */
syncDisabledKeys: function (group) {
var taken = $.extend({}, steps.zarava.disabledKeys);
group.find("li.wiktku-zarava-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
group.find("li.wiktku-zarava-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
/** Builds (or fetches) the .wiktku-zarava-group for one gloss. */
buildGroup: function (stepDiv, gi) {
var group = $("<div class='wiktku-zarava-group'></div>").attr("data-gloss-pos", gi);
var list = $("<ul class='wiktku-zarava-list wiktku-lang-row-list'></ul>");
list.append(steps.zarava.buildRow(group));
group.append(list);
stepDiv.append(group);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return group;
},
/** Syncs one .wiktku-zarava-group per current gloss (same logic as steps.trans.build). */
build: function (stepDiv) {
var glosses = steps.trans.glossList();
if (!glosses.length) {
stepDiv.find(".wiktku-zarava-group").remove();
return null;
}
var existingGroups = stepDiv.find(".wiktku-zarava-group");
if (existingGroups.length > glosses.length) {
existingGroups.slice(glosses.length).remove();
}
$.each(glosses, function (gi, gloss) {
var group = stepDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
if (!group.length) group = steps.zarava.buildGroup(stepDiv, gi);
var label = group.find(".wiktku-zarava-group-label");
if (glosses.length > 1) {
if (!label.length) {
label = $("<div class='wiktku-zarava-group-label'></div>");
group.prepend(label);
}
label.text(gloss.index + " " + gloss.text);
} else if (label.length) {
label.remove();
}
});
return null;
},
/** Reads the dialect rows for a single gloss group. */
getGroupTranslations: function (group) {
var result = [];
group.find("li.wiktku-zarava-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-zarava-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
/** Reads all rows from the DOM, grouped by gloss position. */
getTranslations: function (stepDiv) {
var result = [];
stepDiv.find(".wiktku-zarava-group").each(function () {
result.push(steps.zarava.getGroupTranslations($(this)));
});
return result;
},
output: function (values) {
if (values.lang !== "ku") return "";
var stepDiv = $("#wiktku-start-zarava");
var glosses = steps.trans.glossList();
if (!glosses.length) return "";
var blocks = $.map(glosses, function (gloss, gi) {
var group = stepDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
var rows = group.length ? steps.zarava.getGroupTranslations(group) : [];
if (!gloss.text && !rows.length) return undefined;
if (rows.length) {
rows.sort(function (a, b) {
var aLang = langsByCode[a[0]] || {};
var bLang = langsByCode[b[0]] || {};
return (aLang.sortKey || "").localeCompare(bLang.sortKey || "", "ku");
});
}
var wordLines = $.map(rows, function (row) {
var lang = row[0];
var words = row[1];
var wikiWords = words.map(function (w) {
return "{{W|" + lang + "|" + w + "}}";
}).join(", ");
return "* {{Z|" + lang + "}}: " + wikiWords;
}).join("\n");
if (!wordLines) return undefined;
var block = "{{werger-ser|" + (gloss.text || "?") + "|" + gloss.index + "}}";
block += "\n" + wordLines;
block += "\n{{werger-bin}}";
return block;
});
if (!blocks.length) return "";
return "\n==== Bi zaravayên din ====\n" + blocks.join("\n") + "\n";
}
},
trans: {
id: "trans",
name: "werger",
question_fmt: "Tercimeyên vê maneyê bi zimanên din binivîse",
visible: function (values) {
if (!(values.lang === "ku" && values.pos)) return false;
// Hide only when every sense is a filled template sense (no plain
// gloss to attach translations to). A mix, or nothing filled in
// yet, still shows Werger.
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasRealSense = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
var hasFilledTplSense = dfnSenses.some(function (s) {
return s.tpl && s.tplTitle;
});
return hasRealSense || !hasFilledTplSense;
},
disabledKeys: {
"navz": true,
"ku": true,
"ckb": true,
"sdh": true,
"lki": true,
"hac": true,
"zza": true },
// Language dropdown + growing word-input list, scoped to one gloss's
// group (each gloss has its own group and row list).
buildRow: function (group) {
var row = $("<li class='wiktku-trans-row wiktku-lang-row'></li>");
// Language selector — the searchable picker is applied after insertion into DOM.
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zimanekî bigere");
populateMenus(langSel, steps.trans.keys || [], steps.trans.disabledKeys);
// When a language is chosen, ensure a next empty row exists.
langSel.on("change", function () {
steps.trans.onLangChange(group, row);
});
// Word list for this language.
var wordList = $("<ul class='wiktku-trans-words wiktku-lang-row-words'></ul>");
var firstWord = steps.trans.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
// The searchable picker is attached by initSelects() once the row
// is in the DOM (see onLangChange/buildGroup below).
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-trans-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Tercime…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-trans-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.trans.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (group, row) {
var list = group.find("ul.wiktku-trans-list");
var isLast = row.is(list.children("li.wiktku-trans-row:last-child"));
if (isLast) {
var newRow = steps.trans.buildRow(group);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
// Keep disabled keys in sync across this gloss's lang selectors
// only — the same language can be used for different senses.
steps.trans.syncDisabledKeys(group);
},
/** Disables already-selected languages in all other dropdowns within one group. */
syncDisabledKeys: function (group) {
var taken = $.extend({}, steps.trans.disabledKeys);
group.find("li.wiktku-trans-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
group.find("li.wiktku-trans-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
// Builds (or fetches) the .wiktku-trans-group for one gloss.
buildGroup: function (stepDiv, gi) {
var group = $("<div class='wiktku-trans-group'></div>").attr("data-gloss-pos", gi);
var list = $("<ul class='wiktku-trans-list wiktku-lang-row-list'></ul>");
list.append(steps.trans.buildRow(group));
group.append(list);
stepDiv.append(group);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return group;
},
// Syncs one .wiktku-trans-group per current gloss, keyed by
// data-gloss-pos so groups stay matched across rebuilds.
build: function (stepDiv) {
var glosses = steps.trans.glossList();
if (!glosses.length) {
stepDiv.find(".wiktku-trans-group").remove();
return null;
}
// Drop groups for glosses that no longer exist (always from the
// tail — groups are only ever appended in gloss order below).
var existingGroups = stepDiv.find(".wiktku-trans-group");
if (existingGroups.length > glosses.length) {
existingGroups.slice(glosses.length).remove();
}
$.each(glosses, function (gi, gloss) {
var group = stepDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
if (!group.length) group = steps.trans.buildGroup(stepDiv, gi);
// Only label groups when there's more than one gloss to
// distinguish between — a single gloss needs no caption.
var label = group.find(".wiktku-trans-group-label");
if (glosses.length > 1) {
if (!label.length) {
label = $("<div class='wiktku-trans-group-label'></div>");
group.prepend(label);
}
label.text(gloss.index + " " + gloss.text);
} else if (label.length) {
label.remove();
}
});
return null;
},
/** Reads the translation rows for a single gloss group. */
getGroupTranslations: function (group) {
var result = [];
group.find("li.wiktku-trans-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-trans-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
// Reads all translation rows, grouped by gloss position.
getTranslations: function (stepDiv) {
var result = [];
stepDiv.find(".wiktku-trans-group").each(function () {
result.push(steps.trans.getGroupTranslations($(this)));
});
return result;
},
// Builds the numbered "{ index, gloss }" list, one per dfn sense
// with a real mane (skips template senses). index is 1-based and
// matches the sense's position in the "#" definition list.
// When nothing's filled in, returns one placeholder entry so
// Werger still has a group to attach to; when every sense is a
// filled template sense, stays empty (matches trans.visible()).
glossList: function () {
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var glosses = [];
var hasFilledTplSense = false;
$.each(dfnSenses, function (i, s) {
if (s.tpl) {
if (s.tplTitle) hasFilledTplSense = true;
return; // template sense — no gloss to caption with
}
var dfn = s.mane;
if (!dfn) {
// No mane, but other fields are filled — still gets a
// gloss group since dfn.getOutput() emits {{mane?}} for it.
if (senseHasExtraContent(s)) glosses.push({ index: i + 1, text: "" });
return;
}
if (dfn[0] !== dfn[0].toLowerCase()) dfn = decapitalize(dfn);
dfn = stripWikilinks(dfn).replace(/[.…?!)\]،؟]+$/, "");
glosses.push({ index: i + 1, text: dfn });
});
if (!glosses.length && !hasFilledTplSense) {
glosses.push({ index: 1, text: "" });
}
return glosses;
},
output: function (values) {
if (values.lang !== "ku") return "";
var stepDiv = $("#wiktku-start-trans");
var glosses = steps.trans.glossList();
// Every sense is a template sense — there's no real gloss
// anywhere and no group in the DOM either (glossList() only
// returns empty in that case), so skip the section entirely.
if (!glosses.length) return "";
// A completely empty entry (nothing filled in dfn at all, no
// şablon chosen either) still gets a placeholder Werger section
// to fill in later. Only
// skip an individual placeholder gloss below when some other
// sense actually has real content, making that particular
// placeholder redundant.
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasRegularMane = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
// Each gloss now has its own group of translation rows —
// attach every gloss's own words under its own werger-ser/-bin
// pair instead of dumping everything under the first one.
var blocks = $.map(glosses, function (gloss, gi) {
var group = stepDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
var rows = group.length ? steps.trans.getGroupTranslations(group) : [];
// Placeholder gloss (no real mane entered yet) with nothing
// translated into it. If some other sense already has real
// content, this placeholder is redundant — skip it. If the
// whole entry is empty, keep it so Werger still gets a
// section to fill in.
if (!gloss.text && !rows.length && hasRegularMane) return undefined;
if (rows.length) {
// Sort by Kurdish sort key.
rows.sort(function (a, b) {
var aLang = langsByCode[a[0]] || {};
var bLang = langsByCode[b[0]] || {};
return (aLang.sortKey || "").localeCompare(bLang.sortKey || "", "ku");
});
}
var wordLines = $.map(rows, function (row) {
var lang = row[0];
var words = row[1];
var wikiWords = words.map(function (w) {
return "{{W|" + lang + "|" + w + "}}";
}).join(", ");
return "* {{Z|" + lang + "}}: " + wikiWords;
}).join("\n");
var block = "{{werger-ser|" + (gloss.text || "?") + "|" + gloss.index + "}}";
if (wordLines) block += "\n" + wordLines;
block += "\n{{werger-bin}}";
return block;
});
if (!blocks.length) return "";
return "\n==== Werger ====\n" + blocks.join("\n") + "\n";
}
},
cavkani: {
id: "cavkani",
name: "çavkanî",
question_fmt: "Çavkaniyên din (ne jêgirtin) lê zêde bike",
visible: function (values) {
return !!values.pos;
},
// Fills the insert-dropdown from the members of [[Kategorî:Çavkanî]].
refreshTplSelect: function () {
var sel = $("#wiktku-start-cavkani .wiktku-tpl-insert-select");
if (!sel.length) return;
sel.find("option[value!='']").remove();
$.each(catSrcTemplates || [], function (_, name) {
sel.append($("<option></option>").val(name).text(name));
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-cavkani-wrap").length) return null;
var wrap = $("<div class='wiktku-cavkani-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-cavkani-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-cavkani-text")
.attr("rows", 4)
.attr("placeholder", "Şablonekî ji jêrê hilbijêre an rasterast binivîse…");
// Template insert dropdown, populated from [[Kategorî:Çavkanî]] —
// options refreshed once the category members are fetched.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike…");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
var status = $("<span class='wiktku-cavkani-status'></span>");
sel.on("change", function () {
var name = $(this).val();
if (!name) return;
insertAtCursor(ta[0], "\n* {{" + name + "}}");
$(this).val("");
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel);
wrap.append(status).append(ta);
stepDiv.append(wrap);
// build() runs again for every new beş (see the "+ Beş zêde bike"
// handler), after the initial page-wide pass — so this select needs
// its own init or it stays a plain, unsearchable native <select>.
initSelects(wrap);
// Populate only now: refreshTplSelect() looks the select up by id
// under #wiktku-start-cavkani, so running it before the wrap was
// appended found nothing and bailed out — which left the dropdown
// empty on every beş after the first, once the category members
// were already cached.
if (catSrcTemplates) {
steps.cavkani.refreshTplSelect();
} else {
status.text("Şablon tên barkirin…");
fetchCatSrcTemplates().then(function () {
steps.cavkani.refreshTplSelect();
status.text("");
}, function () {
status.text("Şablon nehatin barkirin.");
});
}
return ta;
},
output: function () {
var text = $.trim($("#wiktku-start-cavkani .wiktku-cavkani-text").val());
if (!text) return "";
return "\n==== Çavkanî ====\n" + text + "\n";
}
},
};
steps.trans.keys = steps.lang.choices;
steps.dunde.keys = steps.lang.choices;
steps.zarava.keys = getZaravaKeys(steps.lang.choices);
var ordered_steps = [
steps.lang, steps.pron, steps.pos, steps.cinsiyet, steps.lektur, steps.tr,
steps.dfn, steps.tewandin, steps.je, steps.tekildar,
steps.etym, steps.dunde, steps.binereherwiha, steps.zarava, steps.trans, steps.cavkani];
// Step ids that belong to each section (not shared across sections).
var PER_SECTION_STEP_IDS = [
"pos", "cinsiyet", "lektur", "tr",
"dfn", "tewandin", "je", "tekildar", "etym", "dunde", "binereherwiha", "zarava", "trans", "cavkani"
];
// ── Multi-section state ──────────────────────────────────────────────────
// Each entry is a plain snapshot: { pos, cinsiyet, lektur, tr, dfn (senses[]),
// je, tekildar, binereherwiha, trans (rows[]) }.
var sections = [{}]; // section 0 starts empty (DOM is the truth)
var activeSection = 0;
function snapshotDfn() {
return steps.dfn.getSenses($("#wiktku-start-dfn"));
}
// Rebuilds the dfn DOM from a previously snapshotted senses array.
function restoreDfn(senses) {
var stepDiv = $("#wiktku-start-dfn");
// Tear down the existing list so build() recreates it cleanly.
stepDiv.find("ol.wiktku-dfn-list").remove();
steps.dfn.build(stepDiv);
var list = stepDiv.find("ol.wiktku-dfn-list");
$.each(senses, function (i, sense) {
// Ensure enough blocks exist (build() seeds one).
var blocks = list.find("li.wiktku-dfn-sense");
var block = blocks.eq(i);
if (!block.length) {
var nb = steps.dfn.buildSenseBlock(stepDiv);
list.append(nb);
block = list.find("li.wiktku-dfn-sense").last();
}
// Template selector.
block.find("select.wiktku-dfn-tpl-select").val(sense.tpl || "");
if (sense.tpl) {
block.find("textarea.wiktku-dfn-mane").hide();
block.find("input.wiktku-dfn-tpl-title").val(sense.tplTitle || "").show();
} else {
block.find("textarea.wiktku-dfn-mane").val(sense.mane || "").show();
block.find("input.wiktku-dfn-tpl-title").hide().val("");
}
// dfnArea is the only thing actually saved, so split it back into
// tercime/îzah for editing (mirrors syncNonKuToMane's join format).
var maneParts = splitTercimeIzah(sense.mane);
block.find(".wiktku-dfn-tercime").val(maneParts ? maneParts.tercime : (sense.mane || ""));
block.find(".wiktku-dfn-izah").val(maneParts ? maneParts.izah : "");
// Re-sync the formên alternatîv/hevmane/… hide state now that
// tplSelect's value was set (its own "change"
// handler doesn't fire from .val(), so this doesn't happen otherwise).
var updateVis = block.data("updateFieldVisibility");
if (updateVis) updateVis();
// Same for the mane-box mode (plain vs tercime+îzah), since this
// also depends on tplSelect's (and lang's) value.
var updateMane = block.data("updateManeMode");
if (updateMane) updateMane();
// Restore a sub-list (etiket, formên alternatîv, hevmane …) from a values array.
function restoreSubList(cls, values) {
if (!values || !values.length) return;
var groupDiv = block.find("." + cls + "-group");
var subList = groupDiv.find("ol, ul").first();
if (!subList.length) return; // group not found
// Fill existing items, append new ones as needed.
$.each(values, function (j, val) {
var items = subList.find("li");
if (j < items.length) {
items.eq(j).find("textarea").val(val);
} else {
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-restore-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.val(val);
ta.on("input", function () {
steps.dfn.onSubInput(subList, this, 1, true);
});
subList.append($("<li></li>").append(ta));
}
});
}
// Reveal and populate lazy groups that have data.
var lazyMap = {
"wiktku-dfn-etiket": sense.etiket,
"wiktku-dfn-kategori": sense.kategori,
"wiktku-dfn-alternativ": sense.alternativ,
"wiktku-dfn-hevmane": sense.hevmane,
"wiktku-dfn-dijmane": sense.dijmane,
"wiktku-dfn-koordine": sense.koordine,
"wiktku-dfn-jornav": sense.jornav,
"wiktku-dfn-jernav": sense.jernav
};
$.each(lazyMap, function (cls, vals) {
if (vals && vals.length) restoreSubList(cls, vals);
});
// Nimûne items are objects { text, tr?, t? } — restore using the builder.
if (sense.nimune && sense.nimune.length) {
var nimuneGroupDiv = block.find(".wiktku-dfn-nimune-group");
var nimuneList = nimuneGroupDiv.find("ol.wiktku-dfn-nimune-list");
var buildFn = nimuneGroupDiv.data("buildNimuneLi");
nimuneList.empty();
$.each(sense.nimune, function (_, n) {
var text = typeof n === "object" ? (n.text || "") : n;
if (!text) return;
var li = buildFn ? buildFn() : $("<li class='wiktku-dfn-nimune-li'></li>");
li.find(".wiktku-dfn-nimune-text").val(text).each(function () { highlightLinebreak(this); });
if (n.tr) li.find(".wiktku-dfn-nimune-tr").val(n.tr);
if (n.t) li.find(".wiktku-dfn-nimune-t").val(n.t);
nimuneList.append(li);
});
// Always leave a blank trailing item.
if (buildFn) nimuneList.append(buildFn());
}
// Restore jêder entries — accepts current array shape or a legacy
// single object (older saved sections) for backwards compat.
var jederArr = $.isArray(sense.jeder) ? sense.jeder : (sense.jeder ? [sense.jeder] : []);
if (jederArr.length) {
var jederGroupDiv = block.find(".wiktku-dfn-jeder-group");
var jederList = jederGroupDiv.find("ol.wiktku-dfn-jeder-list");
var buildJederFn = jederGroupDiv.data("buildJederLi");
jederList.empty();
$.each(jederArr, function (_, j) {
if (!j || !j.quote) return;
var li = buildJederFn ? buildJederFn() : $("<li class='wiktku-dfn-jeder-li'></li>");
li.find(".wiktku-dfn-nimune-quote").val(j.quote).each(function () { highlightLinebreak(this); });
if (j.quoteTr) li.find(".wiktku-dfn-nimune-quote-tr").val(j.quoteTr);
if (j.quoteT) li.find(".wiktku-dfn-nimune-quote-t").val(j.quoteT);
if (j.jederManual) {
var manualSel = li.find(".wiktku-dfn-quote-src-sel");
manualSel.val("__manual__").trigger("change");
li.find(".wiktku-dfn-quote-src-manual").val(j.jederManual);
} else if (j.jederCatTpl) {
// Legacy format from before the şablon search switched rows to
// manual mode directly — convert it the same way now, so it's
// editable like any other free-form source.
var catSelEl = li.find(".wiktku-dfn-quote-src-sel");
catSelEl.val("__manual__").trigger("change");
li.find(".wiktku-dfn-quote-src-manual").val("{{" + j.jederCatTpl + "}}");
} else if (j.jederTpl) {
var srcSel = li.find(".wiktku-dfn-quote-src-sel");
srcSel.val(j.jederTpl).trigger("change");
if (j.jêderFields) {
$.each(j.jêderFields, function (key, val) {
li.find(".wiktku-dfn-quote-src-input[data-field-key='" + key + "']").val(val);
});
}
}
jederList.append(li);
});
// Always leave a blank trailing item, same as Nimûne.
if (buildJederFn) jederList.append(buildJederFn());
}
});
}
// Snapshots simple (non-dfn) per-section steps from the DOM into obj.
function saveCurrentSection() {
var snap = {};
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
snap.dfn = snapshotDfn();
return;
}
if (id === "etym") {
snap.etym = $.trim($("#wiktku-start-etym .wiktku-etym-text").val());
return;
}
if (id === "cavkani") {
snap.cavkani = $.trim($("#wiktku-start-cavkani .wiktku-cavkani-text").val());
return;
}
var step = steps[id];
if (!step) return;
var stepDiv = $("#wiktku-start-" + id);
if (id === "trans") {
snap.trans = steps.trans.getTranslations(stepDiv);
return;
}
if (id === "zarava") {
snap.zarava = steps.zarava.getTranslations(stepDiv);
return;
}
if (id === "dunde") {
snap.dunde = steps.dunde.getRows(stepDiv);
return;
}
// Generic: read all step fields.
var fields = stepDiv.find(".wiktku-start-step-field");
if (step.multiple) {
snap[id] = fields.map(function () { return $(this).val(); }).get();
} else {
snap[id] = fields.val();
}
});
sections[activeSection] = snap;
}
// Restores a previously saved snapshot into the form DOM.
function restoreSection(snap) {
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
restoreDfn(snap.dfn || []);
return;
}
if (id === "etym") {
$("#wiktku-start-etym .wiktku-etym-wrap").remove();
steps.etym.build($("#wiktku-start-etym"));
$("#wiktku-start-etym .wiktku-etym-text").val(snap.etym || "");
return;
}
if (id === "cavkani") {
$("#wiktku-start-cavkani .wiktku-cavkani-wrap").remove();
steps.cavkani.build($("#wiktku-start-cavkani"));
$("#wiktku-start-cavkani .wiktku-cavkani-text").val(snap.cavkani || "");
return;
}
if (id === "trans") {
// Rebuild trans groups (dfn must already be restored by this
// point in the $.each loop, so glossList() reflects it).
var transDiv = $("#wiktku-start-trans");
transDiv.find(".wiktku-trans-group").remove();
steps.trans.build(transDiv);
var groupsSnap = snap.trans || [];
$.each(groupsSnap, function (gi, rows) {
var group = transDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
if (!group.length) return; // gloss no longer exists — drop its rows
var list = group.find("ul.wiktku-trans-list");
$.each(rows, function (j, row) {
var lang = row[0], words = row[1];
var lastRow = list.find("li.wiktku-trans-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-trans-words");
$.each(words, function (k, word) {
var wordItems = wordList.find("li");
if (k < wordItems.length) {
wordItems.eq(k).find("textarea").val(word);
} else {
// .val() below doesn't fire "input", so the normal
// auto-grow never runs — append a matching item
// ourselves instead of silently dropping the word.
var extraInput = steps.trans.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
// Leave one trailing empty field so the row can still grow
// when the user types, matching a freshly-built row.
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.trans.makeWordInput()));
}
});
});
return;
}
if (id === "zarava") {
// Rebuild zarava groups (dfn must already be restored by this
// point in the $.each loop, so glossList() reflects it).
var zaravaDiv = $("#wiktku-start-zarava");
zaravaDiv.find(".wiktku-zarava-group").remove();
steps.zarava.build(zaravaDiv);
var zaravaGroupsSnap = snap.zarava || [];
$.each(zaravaGroupsSnap, function (gi, rows) {
var group = zaravaDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
if (!group.length) return; // gloss no longer exists — drop its rows
var list = group.find("ul.wiktku-zarava-list");
$.each(rows, function (j, row) {
var lang = row[0], words = row[1];
var lastRow = list.find("li.wiktku-zarava-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-zarava-words");
$.each(words, function (k, word) {
var wordItems = wordList.find("li");
if (k < wordItems.length) {
wordItems.eq(k).find("textarea").val(word);
} else {
var extraInput = steps.zarava.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.zarava.makeWordInput()));
}
});
});
return;
}
if (id === "dunde") {
// Rebuild dunde rows.
var dundeDiv = $("#wiktku-start-dunde");
dundeDiv.find("ul.wiktku-dunde-list").remove();
steps.dunde.build(dundeDiv);
var dundeRows = snap.dunde || [];
$.each(dundeRows, function (i, row) {
var lang = row[0], words = row[1];
var list = dundeDiv.find("ul.wiktku-dunde-list");
var lastRow = list.find("li.wiktku-dunde-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-dunde-words");
$.each(words, function (j, word) {
var wordItems = wordList.find("li");
if (j < wordItems.length) {
wordItems.eq(j).find("textarea").val(word);
} else {
// .val() below doesn't fire "input", so the normal
// auto-grow never runs — append a matching item
// ourselves instead of silently dropping the word.
var extraInput = steps.dunde.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
// Leave one trailing empty field so the row can still grow
// when the user types, matching a freshly-built row.
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.dunde.makeWordInput()));
}
});
return;
}
var step = steps[id];
if (!step) return;
var stepDiv = $("#wiktku-start-" + id);
var fields = stepDiv.find(".wiktku-start-step-field");
var val = snap[id];
if (val === undefined || val === null) return;
if (step.multiple) {
var arr = val;
fields.each(function (i) {
if (i < arr.length) $(this).val(arr[i]);
});
} else {
fields.val(val);
}
// Tell the pickers about the programmatic value change.
fields.filter("select").trigger("wiktku:refresh");
});
}
function getWikitextForCurrentSection(callback) {
var values = getValues();
var entry = steps.pos.output(values);
entry += steps.tewandin.output(values);
steps.dfn.getOutput(values, function (output) {
entry += output;
entry += steps.je.output(values);
entry += steps.tekildar.output(values);
entry += steps.etym.output(values);
entry += steps.dunde.output(values);
entry += steps.binereherwiha.output(values);
entry += steps.zarava.output(values);
entry += steps.trans.output(values);
entry += steps.cavkani.output(values);
callback(entry, values);
});
}
function getWikitextAllSections(callback) {
saveCurrentSection();
var results = new Array(sections.length);
var sharedValues = getValues(); // lang/pron are shared
function processSection(i) {
if (i >= sections.length) {
// All done — restore original active section.
restoreSection(sections[activeSection]);
refresh();
callback(results, sharedValues);
return;
}
restoreSection(sections[i]);
refresh();
getWikitextForCurrentSection(function (sectionText) {
results[i] = sectionText;
processSection(i + 1);
});
}
processSection(0);
}
// Assembles wikitext for all sections plus the shared lang/pron header.
function getWikitext(callback) {
getWikitextAllSections(function (sectionTexts, sharedValues) {
var entry = steps.lang.output(sharedValues);
entry += steps.pron.output(sharedValues);
entry += sectionTexts.join("\n");
// Edit summary uses section 0's values. Read from the saved snapshot
// (not the live DOM) so it doesn't mix section 0's pos with whichever
// section happens to be active/restored at this point.
var dfnSenses = (sections[0] && sections[0].dfn) || [];
var dfnSummary = dfnSenses.map(function (s) {
if (s.mane) return s.mane;
// Template sense (e.g. {{guharto|ku|somepage}}) — same
// construction as the tplCall built in getOutput, so the
// summary shows what actually gets written to the entry
// instead of going blank.
if (s.tpl && s.tplTitle) {
return s.tplNoLang
? "{{" + s.tpl + "|" + s.tplTitle + "}}"
: "{{" + s.tpl + "|" + sharedValues.lang + "|" + s.tplTitle + "}}";
}
return "";
}).filter(Boolean).join("; ");
var summary = "([[Mediawiki:Gadget-start.js|WF:NÛ]] v.2.0) +" +
sharedValues.lang + ":" + sections[0].pos + ":" + dfnSummary;
var summaryField = document.getElementById("wpSummary");
if (addLangMode && summaryField.value) {
summary = summaryField.value + " " + summary;
}
summaryField.value = summary;
callback(entry);
});
}
var continueBtn;
function getValuesForStep(stepId) {
var fields = $("#wiktku-start-" + stepId + " .wiktku-start-step-field");
var step = steps[stepId];
if (step.keys) {
var values = {};
fields.each(function (i, field) {
var key = $(field).prevAll(".wiktku-start-step-keyfield").val();
if (key) values[key] = $(field).val();
});
return values;
}
else if (step.multiple) {
return fields.map(function () {
return $(this).val();
}).get();
}
return fields.val();
}
function getValues() {
var values = {};
$.each(steps, function (stepId) {
values[stepId] = getValuesForStep(stepId);
});
return values;
}
function populateMenus(inputs, choices, disabledValues, placeholderText) {
if (!disabledValues) disabledValues = {};
var vals = inputs.map(function (i, input) {
return $(input).val();
});
inputs.empty();
inputs.append($("<option></option>").text(placeholderText || ""));
$.each(choices, function (j, choice) {
// Append the language code in parentheses so that typing a code
// (e.g. "ku") in the search box still finds the language name.
var displayText = capitalize(choice.label);
if (choice.sortKey !== undefined) {
// This is a language choice {code, label, sortKey} — show code.
displayText = capitalize(choice.label) + " (" + choice.code + ")";
}
var option = $(mw.html.element("option", {
value: choice.code }, displayText));
if (disabledValues[choice.code]) option.prop("disabled", true);
inputs.append(option);
});
inputs.val(function (i) {
return vals[i];
});
}
// Keys to disable for a key menu: already-taken or explicitly disabled.
function getDisabledKeys(step) {
var occupiedKeys = {};
$("#wiktku-start-" + step.id + " .wiktku-start-step-keyfield").each(function () {
occupiedKeys[$(this).val()] = true;
});
if (step.disabledKeys) $.extend(occupiedKeys, step.disabledKeys);
return occupiedKeys;
}
function buildKeyInput(step) {
if (!step.keys) return undefined;
var input = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
input.attr("data-placeholder", "Hilbijêre " + step.keyName);
populateMenus(input, step.keys, getDisabledKeys(step));
// Keep the key menus mutually exclusive: whatever one row selects is
// disabled in every other row. Recomputed from the DOM on each change.
input.on("change", function () {
var all = $("#wiktku-start-" + step.id + " .wiktku-start-step-keyfield");
var taken = {};
all.each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
all.not(this).each(function () {
var self = $(this), own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (code) $(this).prop("disabled", !!taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
});
// Return the wrapper; the select lives inside it and still fires change.
return wrapNativeSelect(input);
}
// Adds another text field to the list if the last one now has text.
function refreshForTextField(currentInput, step) {
currentInput = $(currentInput);
var value = currentInput.val();
var item = currentInput.parent();
if (value && !item.next("li").length) {
var nextInput = $("<textarea></textarea>")
.attr("name", "wiktku-field-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", currentInput.attr("class"))
.attr("rows", currentInput.attr("rows") || 1);
if (step.placeholder) nextInput.attr("placeholder", step.placeholder);
nextInput.on("input", function (evt) {
refreshForTextField(evt.target, step);
});
var nextKeyInput = buildKeyInput(step);
var nextItem = $("<li></li>").append(nextKeyInput).append(nextInput);
item.parent().append(nextItem);
if (nextKeyInput) initSelects(nextItem);
}
var canContinue = !continueBtn.isDisabled();
if ((value && !canContinue) || (!value && canContinue)) {
refresh(step);
}
}
function prepareInput(input, step) {
if (!input) return;
if (step.required) input.prop('required', true);
input.change(step, refresh);
}
// Shows/hides steps based on whether their prerequisites are met, and
// updates placeholders where applicable.
function refresh(evt) {
var values = getValues();
var changedStep = evt && evt.data;
var didFocus = false;
var canContinue = true;
// Re-filter template options in every sense block whenever lang changes.
$("#wiktku-start-dfn .wiktku-dfn-tpl-select").each(function () {
var fn = $(this).data("updateOptions");
if (typeof fn === "function") fn();
});
// Re-filter pronunciation and etymology template dropdowns when language changes.
steps.pron.refreshTplSelect();
steps.etym.refreshTplSelect();
steps.cavkani.refreshTplSelect();
// Re-render any step's question label that depends on current values
// (e.g. dfn's Werger-section reminder, which only applies to ku).
$.each(steps, function (stepId, step) {
if (typeof step.question_fmt === "function") {
$("#wiktku-start-" + stepId + " .wiktku-start-step-question")
.text(step.question_fmt(values));
}
});
// Sync every sense block's mane-box mode (plain mane vs tercime+îzah)
// to the current language, in case lang changes after blocks exist.
$("#wiktku-start-dfn li.wiktku-dfn-sense").each(function () {
var updateMane = $(this).data("updateManeMode");
if (updateMane) updateMane();
});
// Sync tr/t sub-fields in every nimûne item to the current language.
// tr shown when language needs transliteration; t shown when lang !== "ku".
(function () {
var lang = values.lang || "";
var showTr = needsTransliteration(lang);
var showT = lang && lang !== "ku";
$("#wiktku-start-dfn .wiktku-dfn-nimune-list li.wiktku-dfn-nimune-li").each(function () {
var li = $(this);
// Ensure the sub-wrapper exists when we need it.
var subWrap = li.find(".wiktku-dfn-nimune-sub");
// tr field
var trTa = li.find(".wiktku-dfn-nimune-tr");
if (showTr && !trTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
li.append(subWrap);
}
trTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-tr")
.attr("placeholder", "Transliterasyon…");
subWrap.prepend(trTa);
} else if (!showTr && trTa.length) {
trTa.remove();
}
// t field
var tTa = li.find(".wiktku-dfn-nimune-t");
if (showT && !tTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
li.append(subWrap);
}
tTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-t")
.attr("placeholder", "Tercimeya nimûneyê bi kurmancî…");
subWrap.append(tTa);
} else if (!showT && tTa.length) {
tTa.remove();
}
// Remove the wrapper if it ended up empty.
subWrap = li.find(".wiktku-dfn-nimune-sub");
if (subWrap.length && !subWrap.children().length) subWrap.remove();
});
}());
// Sync tr/t sub-fields in every jêder citation to the current language.
// tr shown when language needs transliteration; t shown when lang !== "ku".
(function () {
var lang = values.lang || "";
var showTr = needsTransliteration(lang);
var showT = lang && lang !== "ku";
$("#wiktku-start-dfn .wiktku-dfn-jeder-list li.wiktku-dfn-jeder-li").each(function () {
var li = $(this);
// Ensure the sub-wrapper exists when we need it. It must sit right
// after the quote textarea and before the source selector.
var subWrap = li.find(".wiktku-dfn-quote-sub");
// tr field
var trTa = li.find(".wiktku-dfn-nimune-quote-tr");
if (showTr && !trTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
// Insert after the quote textarea's resize-wrap (if the manual
// resize handle has already been attached to it), not after the
// bare textarea -- otherwise this lands *inside* that wrap,
// between the textarea and its own grip, breaking jêgirtin's
// handle and nesting the tr/t boxes inside it.
var quoteTa = li.find(".wiktku-dfn-nimune-quote");
var quoteResizeWrap = quoteTa.closest(".wiktku-resize-wrap");
(quoteResizeWrap.length ? quoteResizeWrap : quoteTa).after(subWrap);
}
trTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-tr")
.attr("placeholder", "Transliterasyona jêgirtinê…");
subWrap.prepend(trTa);
} else if (!showTr && trTa.length) {
trTa.remove();
}
// t field
var tTa = li.find(".wiktku-dfn-nimune-quote-t");
if (showT && !tTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
// See the tr-field branch above for why this targets the
// resize-wrap instead of the bare textarea.
var quoteTa2 = li.find(".wiktku-dfn-nimune-quote");
var quoteResizeWrap2 = quoteTa2.closest(".wiktku-resize-wrap");
(quoteResizeWrap2.length ? quoteResizeWrap2 : quoteTa2).after(subWrap);
}
tTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-t")
.attr("placeholder", "Tercimeya jêgirtinê bi kurmancî…");
subWrap.append(tTa);
} else if (!showT && tTa.length) {
tTa.remove();
}
// Remove the wrapper if it ended up empty.
subWrap = li.find(".wiktku-dfn-quote-sub");
if (subWrap.length && !subWrap.children().length) subWrap.remove();
});
}());
$.each(steps, function (stepId, step) {
if (typeof(step.visible) === "function" && !step.visible(values)) {
$("#wiktku-start-" + stepId).slideUp();
}
else {
var stepDiv = $("#wiktku-start-" + stepId);
if (changedStep !== step && typeof(step.build) === "function") {
prepareInput(step.build(stepDiv, values), step);
}
var input = stepDiv.find(".wiktku-start-step-field");
if (typeof(step.example) === "function") {
// .find() above already reaches nested fields (e.g. the dfn
// step's mane textareas inside each sense block), so one
// assignment covers every step; dfn keeps its own fallback.
var exampleText = step.example(values) || (step.id === "dfn" ? "Mane…" : "");
input.attr("placeholder", exampleText);
}
var didSlideDown;
if (!didFocus && stepDiv.css("display") === "none" && step.required) {
// Skip scrolling for the first section (ziman) since it's
// always at the top of the page.
if (step.id !== "lang") {
didSlideDown = function (evt) {
var stepEl = stepDiv.get(0);
if (stepEl && typeof stepEl.scrollIntoView === "function") {
stepEl.scrollIntoView({ behavior: "smooth", block: "start" });
}
};
}
didFocus = true;
}
stepDiv.slideDown(didSlideDown);
}
if (step.required &&
(values[stepId] === "" ||
(step.multiple && values[stepId].join("") === ""))) {
canContinue = false;
}
});
continueBtn.setDisabled(!canContinue);
}
function destroy() {
$("#wiktku-start-form, .noafterwizard").slideUp(function () {
$(this).remove();
});
$(".noarticletext .nowizard, #editform").slideDown();
$("#ca-edit").removeClass("selected");
$("#ca-wiktku-nowizard").addClass("selected");
}
// Priority order for Kurdish dialects and navz.
// Codes listed here come before all other languages; unlisted codes
// are sorted alphabetically by their display name via localeCompare.
var LANG_PRIORITY = ["navz", "ku", "hac", "sdh", "lki", "ckb", "zza"];
// Inserts a new "== {{ziman|code}} ==" section at the correct sorted
// position: navz, then ku/hac/sdh/lki/ckb/zza, then alphabetical by name.
function insertNewLangSection(existing, wikitext) {
var newCodeMatch = wikitext.match(new RegExp("^" + langHeaderSource("[^}]+")));
var newCode = newCodeMatch ? newCodeMatch[1] : "";
var sections = [];
var preamble = "";
var anyHeaderSrc = langHeaderSource("[^}]+");
var firstMatch = new RegExp("^" + anyHeaderSrc, "m").exec(existing);
if (!firstMatch) {
// No existing lang sections at all — just append.
var sep = existing && !/\n\s*$/.test(existing) ? "\n\n" : "";
return existing + sep + wikitext;
}
// Everything before the first == {{ziman|...}} == is the preamble.
var firstSectionStart = firstMatch.index;
// Walk back to the start of that line.
var lineStart = existing.lastIndexOf("\n", firstSectionStart - 1);
var preambleEnd = lineStart !== -1 ? lineStart + 1 : 0;
preamble = existing.slice(0, preambleEnd);
// Parse each language section: header line + everything until the next header.
var body = existing.slice(preambleEnd);
// (?![\s\S]) matches only true end-of-string, since a bare "$" with
// /m would stop at the section's first line break instead.
var langSectionRe = new RegExp(
"^(" + anyHeaderSrc + "\\n?)([\\s\\S]*?)(?=\\n" + anyHeaderSrc + "|(?![\\s\\S]))",
"gm"
);
var m;
while ((m = langSectionRe.exec(body)) !== null) {
sections.push({
code: m[2],
content: m[0] // full text of this section including header
});
}
// Determine sort rank: priority list first (by index), then alphabetical.
function getLangName(code) {
var entry = langsByCode[code];
return entry ? entry.label : code;
}
function sortRank(code) {
var idx = LANG_PRIORITY.indexOf(code);
return idx !== -1 ? idx : LANG_PRIORITY.length;
}
function compareLangs(a, b) {
var ra = sortRank(a), rb = sortRank(b);
if (ra !== rb) return ra - rb;
// Both are outside priority list — sort by display name.
return getLangName(a).localeCompare(getLangName(b), userLang);
}
// Insert the new section into the sorted list.
var newSection = { code: newCode, content: wikitext };
var inserted = false;
for (var i = 0; i < sections.length; i++) {
if (compareLangs(newCode, sections[i].code) < 0) {
sections.splice(i, 0, newSection);
inserted = true;
break;
}
}
if (!inserted) sections.push(newSection);
// Re-join: preamble + sections separated by newlines.
var joined = sections.map(function (s) {
// Ensure each section ends with exactly one newline before the next.
return s.content.replace(/\n+$/, "");
}).join("\n");
return preamble + joined + "\n";
}
function build() {
$(".nowizard, .nowizard .noafterwizard").hide();
var callToAction = $("#wiktku-calltoaction");
var origCallToActionText = callToAction.text();
$(mw.util.addPortletLink("p-views", "#", "Edîtora çavkaniyê veke",
"ca-wiktku-nowizard", "Vê rûpelê bi edîtora çavkaniyê çêke",
undefined, "#ca-watch")).click(function (evt) {
evt.preventDefault();
callToAction.text(origCallToActionText);
destroy();
});
if (callToAction.length) {
callToAction.text(origCallToActionText +
" Forma li jêr ji bo çêkirina madeyeke nû bi kar bîne.");
}
var startForm = $("<form id='wiktku-start-form'></form>");
var clearPageCheck = null;
if (addLangMode) {
startForm.append($("<p class='wiktku-addlang-notice'></p>").html(
"Bi vê formê tu yê zimanekî nû li rûpelê îlawe bikî. Eger ev ziman jixwe hebe, beşa nû li dawiya vî zimanî dê were îlawekirin. " +
"Ji kerema xwe netîceya dawî kontrol bike, eger problemek derkeve, li <a href='" +
mw.util.getUrl('Mediawiki talk:Gadget-start.js') +
"'>nîqaşa vê amûrê</a> problemê ragihîne."
));
clearPageCheck = $("<input type='checkbox' id='wiktku-clear-page-check'>");
var clearPageLabel = $("<label for='wiktku-clear-page-check'></label>")
.text(" Muhtewaya rûpelê paqij bike (her tiştî jê bibe û rûpelê ji nû ve binivîse)");
startForm.append(
$("<p class='wiktku-addlang-notice'></p>")
.append(clearPageCheck)
.append(clearPageLabel)
);
// Re-evaluate step visibility (e.g. the pron step) whenever this
// is toggled, since it changes what counts as "existing content".
clearPageCheck.on("change", function () {
refresh();
});
}
var spinner;
// Tab bar for switching between POS sections.
var sectionTabsDiv = $("<div id='wiktku-section-tabs'></div>");
startForm.submit(function (evt) {
evt.preventDefault();
continueBtn.setDisabled(true);
continueBtn.$element.addClass("wiktku-btn-sending");
spinner.show();
getWikitext(function (wikitext) {
if (addLangMode && clearPageCheck && clearPageCheck.prop("checked")) {
// User asked to wipe the page and start fresh — just
// write the newly generated wikitext as the full content.
$("#wpTextbox1").val(wikitext);
} else if (addLangMode) {
var textbox = $("#wpTextbox1");
var existing = textbox.val() || "";
// If this language's section already exists (whitespace
// differences aside), merge into it; otherwise insert new.
var langHeaderMatch = wikitext.match(new RegExp("^(" + langHeaderSource("[^}]+") + "\\n)"));
if (langHeaderMatch) {
var langHeader = langHeaderMatch[1]; // e.g. "== {{ziman|ku}} ==\n"
var newCode = langHeaderMatch[2];
var existingHeader = findLangHeader(existing, newCode);
if (existingHeader) {
// Strip the header from the new output.
var newContent = wikitext.slice(langHeader.length);
// Find the insertion point: end of the existing lang section.
// A new L2 heading marks the start of the next language block.
var searchFrom = existingHeader.index + existingHeader.match.length;
// Find the next == … == heading after this section's start.
var nextL2 = existing.indexOf("\n== ", searchFrom);
var insertAt = nextL2 !== -1 ? nextL2 : existing.length;
// Ensure there's a blank line before the inserted block.
var before = existing.slice(0, insertAt);
var after = existing.slice(insertAt);
var sep = /\n\s*$/.test(before) ? "" : "\n";
textbox.val(before + sep + newContent + after);
} else {
// New language — insert at the correct sorted position.
textbox.val(insertNewLangSection(existing, wikitext));
}
} else {
// Unexpected format — insert at sorted position anyway.
textbox.val(insertNewLangSection(existing, wikitext));
}
} else {
$("#wpTextbox1").val(wikitext);
}
$("html, body").animate({scrollTop: 0});
callToAction.text("Hindik ma!");
$("#wiktku-preview-container").remove();
destroy();
});
});
$.each(ordered_steps, function (i, step) {
var stepDiv = $(mw.html.element("div", {
"class": "wiktku-start-step",
id: "wiktku-start-" + step.id }));
var name = capitalize(step.name);
stepDiv.append($(mw.html.element("h3", {
"class": "wiktku-start-step-name" }, new mw.html.Raw(mw.html.element("label", {
"for": "wiktku-start-" + step.id + "-field" }, name)))));
if (step.question_fmt) {
// question_fmt can be a plain string, or a function of the
// current values (used by steps whose question text depends
// on e.g. the chosen language) — refresh() keeps it in sync
// afterwards via the .wiktku-start-step-question class.
var questionText = typeof step.question_fmt === "function"
? step.question_fmt(getValues())
: step.question_fmt;
stepDiv.append($(mw.html.element("label", {
"class": "wiktku-start-step-question",
"for": "wiktku-start-" + step.id + "-field" }, questionText)));
if (step.question_br) stepDiv.append($("<br>"));
}
var input;
if (step.choices) {
input = $(mw.html.element("select", {
"class": "wiktku-start-step-field",
id: "wiktku-start-" + step.id + "-field" }));
input.attr("data-placeholder",
capitalize(step.name) + " hilbijêre ");
populateMenus(input, step.choices);
if (step.multiple) input.attr("multiple", true);
// initSelects() runs over the whole form once it is in the DOM.
stepDiv.append(input);
} else if (typeof(step.build) === "function") {
input = step.build(stepDiv);
} else {
input = $("<textarea></textarea>")
.attr("class", "wiktku-start-step-field")
.attr("id", "wiktku-start-" + step.id + "-field")
.attr("rows", step.rows || 2);
if (step.narrow) input.addClass("wiktku-start-narrow");
if (step.placeholder) input.attr("placeholder", step.placeholder);
if (step.multiple) {
input.on("input", function (evt) {
refreshForTextField(evt.target, step);
});
var keyInput = buildKeyInput(step);
var list = $(step.ordered ? "<ol></ol>" : "<ul></ul>")
.append($("<li></li>").append(keyInput).append(input));
stepDiv.append(list);
}
else stepDiv.append(input);
}
prepareInput(input, step);
stepDiv.hide();
// Insert tab bar just before the first per-section step.
if (step.id === "pos") startForm.append(sectionTabsDiv);
startForm.append(stepDiv);
});
// ── Section tab helpers ──────────────────────────────────────────────
// ── Add-section button — lives in the tab bar, disabled until pos chosen ──
var addSectionBtn = new OO.ui.ButtonWidget({
label: "+ Beş zêde bike",
disabled: true
});
addSectionBtn.on("click", function () {
saveCurrentSection();
sections.push({});
activeSection = sections.length - 1;
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
var stepDiv = $("#wiktku-start-dfn");
stepDiv.find("ol.wiktku-dfn-list").remove();
steps.dfn.build(stepDiv);
return;
}
if (id === "etym") {
$("#wiktku-start-etym .wiktku-etym-wrap").remove();
steps.etym.build($("#wiktku-start-etym"));
return;
}
if (id === "cavkani") {
$("#wiktku-start-cavkani .wiktku-cavkani-wrap").remove();
steps.cavkani.build($("#wiktku-start-cavkani"));
return;
}
if (id === "trans") {
var transDiv = $("#wiktku-start-trans");
transDiv.find(".wiktku-trans-group").remove();
return;
}
if (id === "zarava") {
var zaravaDiv = $("#wiktku-start-zarava");
zaravaDiv.find(".wiktku-zarava-group").remove();
return;
}
if (id === "dunde") {
var dundeDiv = $("#wiktku-start-dunde");
dundeDiv.find("ul.wiktku-dunde-list").remove();
return;
}
var stepDiv = $("#wiktku-start-" + id);
stepDiv.find(".wiktku-start-step-field").val("");
stepDiv.find("select.wiktku-start-step-field").trigger("wiktku:refresh");
});
renderSectionTabs();
refresh();
$("html, body").animate({ scrollTop: sectionTabsDiv.offset().top - 20 }, 300);
});
/** Re-render the tab bar to reflect current sections[] and activeSection. */
function renderSectionTabs() {
// Detach (not remove) the button first: .empty() strips bound
// event data from any children left inside it, which would
// silently kill addSectionBtn's click handler on every re-render.
addSectionBtn.$element.detach();
sectionTabsDiv.empty();
var lang = getValues().lang || "";
if (!lang) {
sectionTabsDiv.hide();
return;
}
sectionTabsDiv.show();
$.each(sections, function (i) {
var posVal = sections[i].pos || "";
var tabLabel = posVal ? capitalize(posVal) : ("Beş " + (i + 1));
var tab = $("<span></span>")
.addClass("wiktku-section-tab")
.text(tabLabel)
.toggleClass("wiktku-tab-active", i === activeSection);
(function (idx) {
tab.on("click", function () {
if (idx === activeSection) return;
saveCurrentSection();
activeSection = idx;
restoreSection(sections[activeSection]);
refresh();
renderSectionTabs();
});
}(i));
sectionTabsDiv.append(tab);
});
// Enable "Beş zêde bike" only when the active section has a pos chosen.
var activePos = sections[activeSection] && sections[activeSection].pos
? sections[activeSection].pos
: getValues().pos;
addSectionBtn.setDisabled(!activePos);
sectionTabsDiv.append(addSectionBtn.$element);
}
renderSectionTabs();
/**
* Restores a full cached draft: shared lang/pron fields, then every
* section (via the same restoreSection()/refresh()/renderSectionTabs()
* sequence already used when switching tabs).
* @param cached {{lang: string, pron: string, sections: Array, activeSection: number}}
*/
function restoreFromCache(cached) {
if (cached.lang) {
$("#wiktku-start-lang-field").val(cached.lang);
$("#wiktku-start-lang-field").trigger("wiktku:refresh");
}
// Rebuild dependent steps (pos, pron wrap, etc.) now that lang is set.
refresh();
if (cached.pron !== undefined) {
$("#wiktku-start-pron .wiktku-pron-text").val(cached.pron);
}
sections = (cached.sections && cached.sections.length) ? cached.sections : [{}];
activeSection = (typeof cached.activeSection === "number" &&
cached.activeSection >= 0 && cached.activeSection < sections.length)
? cached.activeSection : 0;
restoreSection(sections[activeSection]);
refresh();
renderSectionTabs();
mw.notify("Danûstandina berê ya qeydkirî ji cache hate barkirin.",
{ type: "info", tag: "wiktku-cache-restore" });
}
// Update the active tab's label whenever pos changes.
startForm.on("change", "#wiktku-start-pos-field", function () {
renderSectionTabs();
});
// Show the tab bar as soon as a language is selected.
startForm.on("change", "#wiktku-start-lang-field", function () {
renderSectionTabs();
});
var footer = $("<div id='wiktku-start-footer'></div>");
spinner = $(mw.html.element("img", {
id: "wiktku-start-spinner",
src: "//upload.wikimedia.org/wikipedia/commons/d/de/Ajax-loader.gif",
alt: "Tê barkirin…",
title: "Tê barkirin…" }));
footer.append(spinner.hide());
continueBtn = new OO.ui.ButtonWidget({
id: "wiktku-unhide-editform",
label: "Bişîne",
flags: [ "primary", "progressive" ]
});
continueBtn.on("click", function () {
// Immediate feedback that the click registered
continueBtn.$element.addClass("wiktku-btn-flash");
setTimeout(function () {
continueBtn.$element.removeClass("wiktku-btn-flash");
}, 500);
mw.notify("Tê şandin…", { type: "info", tag: "wiktku-submit" });
startForm.trigger("submit");
});
footer.append(continueBtn.$element);
// "Edîtora çavkaniyê veke" button — inline fallback for the portlet link
var sourceEditorBtn = new OO.ui.ButtonWidget({
label: "Edîtora çavkaniyê veke"
});
sourceEditorBtn.on("click", function () {
destroy();
});
footer.append(sourceEditorBtn.$element);
// ── Cache save/clear buttons ─────────────────────────────────────────
// Manual, page-scoped save of the entire wizard (all sections, not
// just the active one) via [[MediaWiki:Gadget-StorageUtils.js]]'s
// ObjectStorage. Restoring happens silently on load at the end of
// build(), once the full language list is available.
var saveCacheBtn = new OO.ui.ButtonWidget({
label: "Li cache qeyd bike",
title: "Halê vê formê yê niha (ziman, bilêvkirin û hemû beş) li cache (localStorage) qeyd bike, da ku eger rûpel bêyî xwestin were girtin an ji nû ve were barkirin, tu karibî berdewam bikî."
});
saveCacheBtn.on("click", function () {
saveCurrentSection();
var snapshot = {
lang: getValues().lang || "",
pron: $("#wiktku-start-pron .wiktku-pron-text").val() || "",
sections: sections,
activeSection: activeSection
};
// ObjectStorage.Set() doesn't return a success/failure value, so
// the only way to detect a real failure (storage blocked, quota
// exceeded, JSON.stringify choking on something unexpected) is to
// catch it here rather than inspect a (nonexistent) return value.
try {
formCache.Set(snapshot);
mw.notify("Halê formê li cache hate qeydkirin.", { type: "success", tag: "wiktku-cache-save" });
} catch (e) {
mw.notify("Qeydkirina li cache bi ser neket.", { type: "error", tag: "wiktku-cache-save" });
}
});
footer.append(saveCacheBtn.$element);
var clearCacheBtn = new OO.ui.ButtonWidget({
label: "Cache paqij bike",
flags: [ "destructive" ],
title: "Datayên qeydkirî yên vê rûpelê ji cache jê bibe (forma ku niha xuya dike naguherîne)."
});
clearCacheBtn.on("click", function () {
formCache.Set({});
mw.notify("Cache hate paqijkirin.", { type: "success", tag: "wiktku-cache-clear" });
});
footer.append(clearCacheBtn.$element);
// ── Preview checkboxes ───────────────────────────────────────────────
// Wikitext preview (raw text panel)
var previewCheck = $("<input type='checkbox' id='wiktku-preview-toggle'>");
var previewLabel = $("<label for='wiktku-preview-toggle'></label>")
.text(" Pêşdîtina wîkîtekstê");
var previewPanel = $("<pre id='wiktku-preview-panel'></pre>").hide();
// Live rendered preview (parsed HTML panel, same logic as AjaxEdit).
// Not available on mobile — API polling causes too many problems on small screens.
var livePreviewCheck = null;
var livePreviewPanel = null;
if (!isMobile) {
livePreviewCheck = $("<input type='checkbox' id='wiktku-live-preview-toggle'>");
livePreviewPanel = $("<div id='wiktku-live-preview-panel'></div>").hide();
}
// Container that holds both panels and switches between stacked / side-by-side.
var previewContainer = $("<div id='wiktku-preview-container'></div>");
previewContainer.append(previewPanel);
if (!isMobile) previewContainer.append(livePreviewPanel);
var previewTimer = null;
var livePreviewIntervalId = -1;
var livePreviewActive = false; // guards in-flight fetches after uncheck
/** Rebuilds wikitext preview if its checkbox is checked. */
function schedulePreview() {
if (!previewCheck.prop("checked")) return;
clearTimeout(previewTimer);
// Debounce: wait 400 ms after the last keystroke before rebuilding.
previewTimer = setTimeout(function () {
getWikitext(function (wikitext) {
previewPanel.text(wikitext).show();
updatePanelLayout();
});
}, 400);
}
/** Fetches parsed HTML and populates the live preview panel. */
function loadLivePreview() {
getWikitext(function (wikitext) {
new mw.Api().parse(wikitext, { title: mw.config.get("wgPageName") }).done(function (html) {
// Discard result if the user unchecked while the fetch was in flight.
if (!livePreviewActive) return;
livePreviewPanel.html(html).show();
updatePanelLayout();
});
});
}
/** Adjusts panel widths depending on which previews are visible. */
function updatePanelLayout() {
var wikitextVisible = previewCheck.prop("checked");
var liveVisible = livePreviewCheck && livePreviewCheck.prop("checked");
if (wikitextVisible && liveVisible) {
// Side by side — each panel takes roughly half the available width.
previewPanel.css({ "flex": "1 1 45%", "min-width": "280px" });
livePreviewPanel.css({ "flex": "1 1 45%", "min-width": "280px" });
} else {
// Full width for whichever is visible — only touch panels that are
// actually shown so that setting flex doesn't override display:none.
if (wikitextVisible) previewPanel.css({ "flex": "1 1 100%", "min-width": "" });
if (liveVisible && livePreviewPanel) livePreviewPanel.css({ "flex": "1 1 100%", "min-width": "" });
}
}
previewCheck.on("change", function () {
if ($(this).prop("checked")) {
schedulePreview();
} else {
clearTimeout(previewTimer);
previewPanel.hide();
updatePanelLayout();
}
});
if (!isMobile) {
livePreviewCheck.on("change", function () {
if ($(this).prop("checked")) {
livePreviewActive = true;
livePreviewPanel.show();
loadLivePreview();
livePreviewIntervalId = setInterval(loadLivePreview, 500);
} else {
livePreviewActive = false;
clearInterval(livePreviewIntervalId);
livePreviewIntervalId = -1;
livePreviewPanel.hide().empty();
updatePanelLayout();
}
});
}
// Listen on all input/change events on the form and update both previews.
startForm.on("input change", function () {
schedulePreview();
});
footer.append($("<span style='margin-left:1em'></span>")
.append(previewCheck).append(previewLabel));
if (!isMobile) {
var livePreviewLabel = $("<label for='wiktku-live-preview-toggle'></label>")
.text(" Pêşdîtina zindî");
footer.append($("<span style='margin-left:1em'></span>")
.append(livePreviewCheck).append(livePreviewLabel));
}
startForm.append(footer);
$("#editform").hide().before(startForm);
// Insert preview container (holds both panels) after the form.
startForm.after(previewContainer);
// One pass over the whole form: every select that hasn't already been
// initialised, and isn't opted out with .wiktku-plain-select, gets
// the searchable picker.
initSelects(startForm);
refresh();
// Give every draggable textarea a custom resize grip (works
// consistently on Safari/iOS, unlike the native corner grip — see
// the "Manual drag-to-resize handle" comment in styles.css), and
// keep applying it to textareas added later on (new sense blocks,
// quote-source fields, nimûne rows, …).
wiktkuInitManualResize(startForm);
new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
$(mutation.addedNodes).each(function () {
if (this.nodeType !== 1) return;
wiktkuInitManualResize(this);
});
});
}).observe(startForm[0], { childList: true, subtree: true });
// Now that the full language list is loaded, silently restore any
// draft the editor previously saved for this page.
var cachedDraft = formCache.Get();
if (cachedDraft && cachedDraft.sections && cachedDraft.sections.length) {
restoreFromCache(cachedDraft);
}
}
mw.loader.using(["oojs-ui-core"], function () {
// Load metadata, langChoices, posChoices and tplDefs from the companion
// data page so they can be updated without touching this script.
// (Request was already fired via metaApiPromise above, in parallel
// with this module load — we're just picking up the result here.)
metaApiPromise.then(function (data) {
var page = data.query.pages[0];
var content = page &&
page.revisions &&
page.revisions[0].slots.main.content;
var d;
try { d = JSON.parse(content); } catch (e) { d = {}; }
// Populate metadata.
if (d.metadata) $.extend(metadata, d.metadata);
// Populate gender labels.
if (d.genderLabels) $.extend(GENDER_BASE_LABELS, d.genderLabels);
// Populate lang choices (pinned list).
if (d.langChoices) steps.lang.choices = choicesFromObject(d.langChoices, true);
// Populate langsByCode and merge full language list from d.ziman.
// d.ziman is a {code: name} object with all known languages.
$.each(steps.lang.choices, function (i, choice) {
if (choice.sortKey === undefined) choice.sortKey = choice.label;
langsByCode[choice.code] = choice;
});
if (d.ziman) {
var pinnedCodes = {};
$.each(steps.lang.choices, function (i, c) { pinnedCodes[c.code] = true; });
var extraChoices = [];
$.each(d.ziman, function (code, name) {
if (/-pro$/i.test(code)) return;
if (/ziman[eê]\s+destan/i.test(name)) return;
if (pinnedCodes[code]) return;
var choice = { code: code, label: name, sortKey: name };
extraChoices.push(choice);
langsByCode[code] = choice;
});
extraChoices.sort(function (a, b) {
return a.sortKey.localeCompare(b.sortKey, userLang);
});
steps.lang.choices = steps.lang.choices.concat(extraChoices);
}
// Populate POS choices — also a plain {code: label} object in data.json.
if (d.posChoices) steps.pos.choices = choicesFromObject(d.posChoices, false);
// Populate template definitions for the dfn sense-block builder.
if (d.tplDefs) steps.dfn.tplDefs = d.tplDefs;
// Populate pos placeholder examples.
if (d.posExamples) steps.dfn.posExamples = d.posExamples;
// Populate citation template definitions for the quote widget.
if (d.jederDefs) steps.dfn.jederDefs = d.jederDefs;
// Populate pronunciation and etymology template insert lists.
if (d.pronTpls) {
steps.pron.pronTpls = d.pronTpls;
steps.pron.refreshTplSelect();
}
if (d.etymTpls) {
steps.etym.etymTpls = d.etymTpls;
steps.etym.refreshTplSelect();
}
// Sync trans/dunde/zarava keys with the full language list.
steps.trans.keys = steps.lang.choices;
steps.dunde.keys = steps.lang.choices;
steps.zarava.keys = getZaravaKeys(steps.lang.choices);
}).always(build);
});
});
//</nowiki>
a862he8qz5ntd34jnpmyfprj3fu7ob9
6292091
6292089
2026-07-29T21:47:22Z
Wikihez
7344
6292091
javascript
text/javascript
// Li ser [[vi:MediaWiki:Gadget-start.js]] hatiye refaktorkirin.
// implicit dependencies: StorageUtils (ObjectStorage)
//<nowiki>
$(function () {
if (window.location.href.includes("editintro=User:Wikihez/creation/intro")) {
return; // Do not run the script wextê WF:Bilez dişuxile
}
var ns = mw.config.get("wgNamespaceNumber");
if (ns &&
!(ns === 2 && mw.config.get("wgPageName").match(/\/ceribandin$|\/test$/))) {
return;
}
var action = mw.config.get("wgAction");
var pageExists = !!mw.config.get("wgArticleId");
var addLangMode = pageExists && mw.util.getParamValue("wiktkuaddlang") === "1";
if (action === "view" && pageExists) {
var targetContainer;
var skin = mw.config.get('skin');
if (skin === 'vector-2022') {
targetContainer = 'p-cactions';
} else if (skin === 'vector') {
targetContainer = 'p-tb';
} else {
targetContainer = 'p-views';
}
mw.util.addPortletLink(targetContainer,
mw.util.getUrl(mw.config.get("wgPageName"), { action: "submit", wiktkuaddlang: "1" }),
"+Ziman/beşeke din", "ca-wiktku-addlang",
"Ji vê rûpelê re ziman an jî beşeke nû zêde bike");
return;
}
if (!(action === "edit" || action === "submit")) {
return;
}
if (!addLangMode && !$(".mw-newarticletext, .mw-newarticletextanon").length) {
return;
}
mw.notify(
"Amûr dest pê dike, hinek bisekinin.\nNot: jkx Sentaks (Syntax highlighting) neaktîv bikin",
{ type: "info", tag: "wiktku-start-notice", autoHide: true, autoHideSeconds: 10 }
);
var dataJsonPromise;
var metaApiPromise = mw.loader.using("mediawiki.api").then(function () {
var metaApi = new mw.Api();
dataJsonPromise = metaApi.get({
action: "query",
prop: "revisions",
titles: "MediaWiki:Gadget-start.js/data.json",
rvprop: "content",
rvslots: "main",
formatversion: 2
});
return dataJsonPromise;
});
function capitalize(str) {
if (!str) return str;
return str[0].toUpperCase() + str.substr(1);
}
function decapitalize(str) {
if (!str) return str;
return str[0].toLowerCase() + str.substr(1);
}
function escapeRegExp(str) {
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
function langHeaderSource(codePattern) {
return "\n?==\\s*\\{\\{\\s*ziman\\s*\\|\\s*(" + codePattern + ")\\s*\\}\\}\\s*==";
}
function findLangHeader(text, code) {
var m = new RegExp(langHeaderSource(escapeRegExp(code))).exec(text);
return m ? { index: m.index, match: m[0] } : null;
}
function stripWikilinks(str) {
return str.replace(/\[\[([^\]|]+)(?:\|([^\]]+))?\]\]/g, function (m, target, display) {
return display || target;
});
}
function splitTercimeIzah(mane) {
var m = /^([\s\S]*?)\s*\{\{îzah\|([\s\S]*)\}\}\s*$/.exec(mane || "");
return m ? { tercime: m[1], izah: m[2] } : null;
}
function insertAtCursor(el, text) {
var start = el.selectionStart;
var end = el.selectionEnd;
var val = el.value;
el.value = val.slice(0, start) + text + val.slice(end);
var pos = start + text.length;
el.selectionStart = el.selectionEnd = pos;
}
var catSrcTemplates = null;
var catSrcTemplatesPromise = null;
function fetchCatSrcTemplates() {
if (catSrcTemplatesPromise) return catSrcTemplatesPromise;
catSrcTemplatesPromise = new mw.Api().get({
action: "query",
list: "categorymembers",
cmtitle: "Kategorî:Çavkanî",
cmnamespace: 10,
cmlimit: "max",
formatversion: 2
}).then(function (data) {
var members = (data.query && data.query.categorymembers) || [];
catSrcTemplates = $.map(members, function (m) {
// Pêşgira navî ya "Şablon:" rake.
return m.title.replace(/^[^:]+:/, "");
});
catSrcTemplates.sort(function (a, b) { return a.localeCompare(b, userLang); });
return catSrcTemplates;
}, function () {
catSrcTemplates = [];
return catSrcTemplates;
});
return catSrcTemplatesPromise;
}
var pageName = mw.config.get("wgPageName").replaceAll(/_/g, " ");
if (ns) pageName = pageName.replace(/.*\//, "");
var pageNameRe = escapeRegExp(pageName);
var userLang = mw.config.get("wgUserLanguage");
var formCache = new ObjectStorage("wiktku_start_draft_" + mw.config.get("wgPageName"), 1);
var isMobile = !!mw.config.get("wgMFMode") || window.matchMedia("(pointer: coarse)").matches;
var FOLD_EXTRA = {
"ı": "i", // dotless i
"ø": "o", // o with stroke
"đ": "d", // d with stroke
"ð": "d", // eth
"ə": "e", // schwa
"ħ": "h", // h with stroke
"ł": "l", // l with stroke
"ŋ": "n", // eng
"ʉ": "u", // u bar
"ɨ": "i", // i bar
"ʒ": "z", // ezh
"ɛ": "e", // open e
"ɔ": "o", // open o
"æ": "ae",
"œ": "oe",
"ß": "ss",
"þ": "th" };
function foldDiacritics(str) {
if (str === null || str === undefined) return "";
var s = String(str).toLowerCase();
if (typeof s.normalize === "function") {
// Split "î" into "i" + combining circumflex, then drop the accent.
s = s.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
}
return s.replace(/[^\u0000-\u007f]/g, function (ch) {
return Object.prototype.hasOwnProperty.call(FOLD_EXTRA, ch) ? FOLD_EXTRA[ch] : ch;
});
}
var WIKTKU_RESIZE_STORAGE_PREFIX = "wiktku_resize_height_";
/** Textareas of the same "kind" (e.g. every Nimûne box, every Tercime
* box) share a class list even though each individual box is a fresh
* DOM node built on the fly (new sense blocks, quote fields, …) with
* no stable id of its own. That class list is what we key the cached
* height on, so a size chosen for one Nimûne box is reused for every
* Nimûne box, on this page and on the next one. */
function wiktkuResizeStorageKey(textarea) {
var cls = (textarea.attr("class") || "").trim().replace(/\s+/g, "_");
return WIKTKU_RESIZE_STORAGE_PREFIX + cls;
}
function wiktkuSaveResizeHeight(textarea, height) {
if (!(window.mw && mw.storage)) return;
try {
mw.storage.set(wiktkuResizeStorageKey(textarea), String(Math.round(height)));
} catch (e) { /* localStorage unavailable (private mode, quota, …) — skip caching */ }
}
function wiktkuLoadResizeHeight(textarea) {
if (!(window.mw && mw.storage)) return null;
try {
var v = mw.storage.get(wiktkuResizeStorageKey(textarea));
return v ? parseFloat(v) : null;
} catch (e) {
return null;
}
}
/** Replaces a textarea's native corner resize grip with a small custom
* drag handle (see the "Manual drag-to-resize handle" comment and
* .wiktku-resize-wrap / .wiktku-resize-grip in styles.css). Needed
* because iOS Safari never implements the native grip at all and
* desktop Safari's own version is inconsistent, so we replace it
* everywhere for uniform behaviour. One-line fields (.wiktku-start-narrow)
* are meant to stay a fixed height and are left untouched. Safe to call
* more than once on the same textarea. */
function wiktkuMakeManualResizable(textarea) {
textarea = $(textarea);
if (!textarea.is("textarea") || textarea.hasClass("wiktku-start-narrow")) return;
if (textarea.data("wiktkuResizableDone")) return;
textarea.data("wiktkuResizableDone", true);
textarea.wrap("<div class='wiktku-resize-wrap'></div>");
var grip = $("<div class='wiktku-resize-grip'></div>");
textarea.after(grip);
// Restore a previously chosen height for this kind of field, if any.
var cachedHeight = wiktkuLoadResizeHeight(textarea);
if (cachedHeight) {
var minHeightInit = parseFloat(textarea.css("min-height")) || 0;
textarea.css("height", Math.max(cachedHeight, minHeightInit) + "px");
}
var dragging = false, startY = 0, startHeight = 0;
function onPointerMove(e) {
if (!dragging) return;
var oe = e.originalEvent || e;
var minHeight = parseFloat(textarea.css("min-height")) || 0;
var newHeight = startHeight + (oe.clientY - startY);
textarea.css("height", Math.max(newHeight, minHeight) + "px");
}
function onPointerUp(e) {
if (!dragging) return;
dragging = false;
var oe = e.originalEvent || e;
try { grip[0].releasePointerCapture(oe.pointerId); } catch (err) { /* ignore */ }
$(document).off("pointermove", onPointerMove);
$(document).off("pointerup pointercancel", onPointerUp);
wiktkuSaveResizeHeight(textarea, textarea.outerHeight());
}
grip.on("pointerdown", function (e) {
var oe = e.originalEvent || e;
if (oe.button !== undefined && oe.button !== 0) return; // primary contact only
e.preventDefault();
dragging = true;
startY = oe.clientY;
startHeight = textarea.outerHeight();
try { grip[0].setPointerCapture(oe.pointerId); } catch (err) { /* ignore */ }
$(document).on("pointermove", onPointerMove);
$(document).on("pointerup pointercancel", onPointerUp);
});
}
/** Applies wiktkuMakeManualResizable to every eligible textarea already
* inside `context` (context itself, if it is a textarea, or any of its
* descendants). Used both for the initial form render and, via the
* MutationObserver set up in build(), for textareas added later on
* (new sense blocks, quote-source fields, nimûne rows, …). */
function wiktkuInitManualResize(context) {
var $context = $(context);
var $textareas = $context.is("textarea") ? $context : $context.find("textarea");
$textareas.each(function () {
wiktkuMakeManualResizable(this);
});
}
function wrapNativeSelect(select) {
var wrapper = $("<span class='wiktku-native-select-wrap'></span>");
if (select.prop("multiple")) {
return wrapper.append(select);
}
var placeholder = select.attr("data-placeholder") || "Lê bigere...";
select.hide();
var textInput = $("<input type='search' autocomplete='off'>")
.attr("placeholder", placeholder)
.attr("role", "combobox")
.attr("aria-autocomplete", "list")
.attr("aria-expanded", "false")
.addClass("wiktku-start-narrow wiktku-ac-input");
var resultsList = $("<ul class='wiktku-ac-results' role='listbox'></ul>").hide();
var allOptions = [];
var shown = [];
var activeIndex = -1;
function cacheOptions() {
allOptions = [];
select.find("option").each(function () {
var v = $(this).val();
var text = $(this).text();
// A blank value with no label (most selects' placeholder) is
// never a real choice, so skip it. But a blank value WITH a
// label -- e.g. tplSelect's "— yan jî şablonek hilbijêre —" --
// is a meaningful "clear the selection" choice, so keep it
// searchable/selectable like any other option.
if (!v && !text) return;
// Language options read "Name (code)" -- score the name on its own
// so the trailing code doesn't also count as a name match.
var name = text.replace(/\s*\([^()]*\)\s*$/, "");
allOptions.push({
value: v,
text: text,
disabled: $(this).prop("disabled"),
foldCode: foldDiacritics(v),
foldName: foldDiacritics(name),
foldText: foldDiacritics(text)
});
});
}
cacheOptions();
// True if `q` starts a word inside `name` ("kevn" in "ingiliziya kevn").
function startsWord(name, q) {
var from = 0, at;
while ((at = name.indexOf(q, from)) !== -1) {
if (at === 0 || /[\s\-\u2013\u2014(/,.]/.test(name.charAt(at - 1))) return true;
from = at + 1;
}
return false;
}
// Lower rank = better match.
// a code that *is* the query, or begins with it, always outranks a name
// that merely contains it -- so "ang" lists "Îngilîziya kevn (ang)"
// first instead of burying it among every name containing "ang".
var RANK_NONE = 99;
function rankOption(o, q) {
var code = o.foldCode, name = o.foldName;
if (code === q) return 0; // exact code
if (code.indexOf(q) === 0) return 1; // code prefix
if (name === q) return 2; // exact name
if (name.indexOf(q) === 0) return 3; // name prefix
if (startsWord(name, q)) return 4; // starts a word in the name
if (name.indexOf(q) !== -1) return 5; // name substring
if (code.indexOf(q) !== -1) return 6; // code substring
if (o.foldText.indexOf(q) !== -1) return 7; // anywhere else in the label
return RANK_NONE;
}
function positionList() {
// Position the list above or below depending on viewport space.
var inputRect = textInput[0].getBoundingClientRect();
var viewportH = window.innerHeight;
var spaceBelow = viewportH - inputRect.bottom - 8;
var spaceAbove = inputRect.top - 8;
var maxH = Math.min(224, Math.max(spaceBelow, spaceAbove)); // 224px = 14em
resultsList.css({
"max-height": maxH + "px",
"top": spaceBelow >= spaceAbove ? "100%" : "auto",
"bottom": spaceBelow >= spaceAbove ? "auto" : "100%"
});
}
function closeList() {
resultsList.hide();
textInput.attr("aria-expanded", "false");
activeIndex = -1;
}
function showResults(query) {
var q = foldDiacritics($.trim(query || ""));
resultsList.empty();
activeIndex = -1;
var matched = [];
if (q) {
$.each(allOptions, function (i, o) {
if (o.disabled) return;
var rank = rankOption(o, q);
if (rank !== RANK_NONE) matched.push({ opt: o, rank: rank, i: i });
});
if (!matched.length && q.indexOf(" ") !== -1) {
var tokens = q.split(/\s+/);
$.each(allOptions, function (i, o) {
if (o.disabled) return;
var all = true;
$.each(tokens, function (_, t) {
if (o.foldText.indexOf(t) === -1) { all = false; return false; }
});
if (all) matched.push({ opt: o, rank: 8, i: i });
});
}
matched.sort(function (a, b) {
if (a.rank !== b.rank) return a.rank - b.rank;
// Inside the code tiers the shorter code is the better hit:
// "an" -> "an" before "ang" before "ang-x-...".
if (a.rank <= 1 && a.opt.foldCode.length !== b.opt.foldCode.length) {
return a.opt.foldCode.length - b.opt.foldCode.length;
}
// Otherwise keep the menu's own order (pinned languages first).
return a.i - b.i;
});
} else {
$.each(allOptions, function (i, o) {
if (!o.disabled) matched.push({ opt: o, rank: 0, i: i });
});
}
shown = $.map(matched.slice(0, 50), function (m) { return m.opt; });
if (!shown.length) {
closeList();
return;
}
$.each(shown, function (idx, opt) {
var li = $("<li role='option'></li>")
.text(opt.text)
.attr("data-value", opt.value)
.attr("aria-selected", "false");
// touchend (not touchstart) so a scroll doesn't trigger a select.
var touchMoved = false;
li.on("touchstart", function () {
touchMoved = false;
});
li.on("touchmove", function () {
touchMoved = true;
});
li.on("touchend", function (e) {
if (touchMoved) return; // was a scroll, not a tap
e.preventDefault();
selectOption(opt.value, opt.text);
});
// mousedown (not click) so it beats the input's blur handler.
li.on("mousedown", function (e) {
e.preventDefault();
selectOption(opt.value, opt.text);
});
li.on("mouseenter", function () {
// Hovered items are already in view -- don't scroll the list
// under the mouse, or the shift can trigger the next item's
// mouseenter and cascade into a runaway scroll.
setActive(idx, /* scrollIntoView */ false);
});
resultsList.append(li);
});
positionList();
resultsList.show();
resultsList[0].scrollTop = 0;
textInput.attr("aria-expanded", "true");
}
function setActive(idx, scrollIntoView) {
var items = resultsList.children("li");
if (!items.length) return;
if (idx < 0) idx = items.length - 1;
if (idx >= items.length) idx = 0;
activeIndex = idx;
items.removeClass("wiktku-ac-active").attr("aria-selected", "false");
var li = items.eq(idx).addClass("wiktku-ac-active").attr("aria-selected", "true");
if (scrollIntoView === false) return;
// Keep the cursor visible inside the scrollable list -- only for
// keyboard navigation. A mouse-hovered item is already visible, so
// scrolling here would shift the list under a stationary pointer
// and cascade into further mouseenter events.
var ul = resultsList[0], el = li[0];
if (el.offsetTop < ul.scrollTop) {
ul.scrollTop = el.offsetTop;
} else if (el.offsetTop + el.offsetHeight > ul.scrollTop + ul.clientHeight) {
ul.scrollTop = el.offsetTop + el.offsetHeight - ul.clientHeight;
}
}
/** Puts the currently selected option's label back in the text box. */
function syncInputToSelect() {
var cur = select.val();
var match = null;
if (cur) {
$.each(allOptions, function (_, o) {
if (o.value === cur) { match = o; return false; }
});
}
textInput.val(match ? match.text : "");
}
function selectOption(value, text) {
textInput.val(text);
select.val(value);
closeList();
select.trigger("change");
}
textInput.on("input", function () {
showResults($(this).val());
});
textInput.on("focus", function () {
// Select the current label so typing replaces it, and open the full list
this.select();
showResults("");
});
textInput.on("click", function () {
if (!resultsList.is(":visible")) showResults($(this).val());
});
textInput.on("keydown", function (e) {
var open = resultsList.is(":visible");
switch (e.which) {
case 40: // Down
e.preventDefault();
if (!open) { showResults($(this).val()); setActive(0); }
else setActive(activeIndex + 1);
break;
case 38: // Up
e.preventDefault();
if (!open) { showResults($(this).val()); setActive(-1); }
else setActive(activeIndex - 1);
break;
case 13: // Enter -- must never submit the form while the list is open
if (open) {
e.preventDefault();
if (activeIndex >= 0 && shown[activeIndex]) {
selectOption(shown[activeIndex].value, shown[activeIndex].text);
} else if (shown.length === 1) {
selectOption(shown[0].value, shown[0].text);
}
}
break;
case 27: // Esc -- abandon the search, restore the real value
if (open) {
e.preventDefault();
closeList();
syncInputToSelect();
}
break;
case 9: // Tab -- commit the highlighted row on the way out
if (open && activeIndex >= 0 && shown[activeIndex]) {
selectOption(shown[activeIndex].value, shown[activeIndex].text);
}
closeList();
break;
}
});
textInput.on("blur", function () {
// Short delay so a touchstart/mousedown on a result fires first.
setTimeout(function () {
closeList();
// Half-typed text that never became a selection would otherwise sit
// in the box looking like a choice -- put the real value back.
syncInputToSelect();
}, 200);
});
// Re-caches the option list. Fired after the full language list loads, after
// options are enabled/disabled, and after programmatic .val() changes.
select.on("wiktku:refresh", function () {
cacheOptions();
syncInputToSelect();
if (resultsList.is(":visible")) showResults(textInput.val());
});
wrapper.append(textInput).append(resultsList).append(select);
return wrapper;
}
/**
* Gives every plain <select> under `root` the searchable picker. Selects
* marked .wiktku-plain-select opt out, and the call is idempotent, so it is
* safe to re-run after new rows or sense blocks are inserted.
*/
function initSelects(root) {
$(root).find("select").addBack("select").not(".wiktku-plain-select").each(function () {
var sel = $(this);
if (sel.prop("multiple")) return;
if (sel.closest(".wiktku-native-select-wrap").length) return; // already wrapped
var marker = $("<span></span>").insertBefore(sel);
marker.replaceWith(wrapNativeSelect(sel));
});
}
var langsByCode = {};
// Populated from [[MediaWiki:Gadget-start.js/data.json]] at runtime.
var metadata = {};
var ZARAVA_LANG_CODES = ["ckb", "sdh", "lki", "hac", "zza"];
// Converts a {code: label} object (langChoices/posChoices in data.json)
// into the {code, label[, sortKey]} array the rest of the script uses.
// isLang: true adds a sortKey and shows "(code)" after the label —
// language choices only.
function choicesFromObject(obj, isLang) {
var result = [];
$.each(obj || {}, function (code, label) {
var choice = { code: code, label: label };
if (isLang) choice.sortKey = label;
result.push(choice);
});
return result;
}
function getZaravaKeys(choices) {
var byCode = {};
$.each(choices || [], function (_, c) { byCode[c.code] = c; });
var result = [];
$.each(ZARAVA_LANG_CODES, function (_, code) {
if (byCode[code]) result.push(byCode[code]);
});
return result;
}
function needsTransliteration(langCode) {
var meta = metadata[langCode];
if (!meta || !meta.sc) return false;
var scripts = Array.isArray(meta.sc) ? meta.sc : [meta.sc];
return scripts.length > 0 && scripts[0] !== "Latn";
}
// Kodên cinsiyetê yên di metadata.g de — ji data.json tê dagirtin
var GENDER_BASE_LABELS = {};
// Sub-lists that only make sense for a plain (non-şablon) sense — hidden
// when a şablon (e.g. {{guharto|…}}) is chosen for that sense
var HIDDEN_ON_TPL_GROUPS = [
"wiktku-dfn-alternativ",
"wiktku-dfn-hevmane",
"wiktku-dfn-dijmane",
"wiktku-dfn-koordine",
"wiktku-dfn-jornav",
"wiktku-dfn-jernav"
];
function genderLabel(code) {
if (code === "p") return "Pirjimar";
var pluralMatch = code.match(/^(.+)-p$/);
if (pluralMatch && GENDER_BASE_LABELS[pluralMatch[1]]) {
return GENDER_BASE_LABELS[pluralMatch[1]] + " (pirjimar)";
}
return GENDER_BASE_LABELS[code] || code;
}
// True if a sense has content beyond mane worth keeping (etîket, word
// lists, nimûne, jêder) — so it's still emitted with {{mane?}} if empty.
function senseHasExtraContent(s) {
if (s.etiket && $.grep(s.etiket, function (e) { return $.trim(e) !== ""; }).length) return true;
if (s.kategori && $.grep(s.kategori, function (k) { return $.trim(k) !== ""; }).length) return true;
if (s.alternativ.length || s.hevmane.length || s.dijmane.length ||
s.koordine.length || s.jornav.length || s.jernav.length) return true;
if (s.nimune && $.grep(s.nimune, function (n) {
return (typeof n === "object" ? n.text : n) !== "";
}).length > 0) return true;
if (senseHasJeder(s)) return true;
return false;
}
// Bolds the *first* occurrence of the page name (plus any letters
// glued directly onto it, e.g. a plural "s") inside nimûne/jêgirtin
// text — "apple"/"Apple"/"apples"/"Apples" all match (case-insensitive),
// but only the first hit is wrapped, not every one in the text.
function boldPageNameOnce(text) {
if (!text || !pageNameRe) return text;
var re = new RegExp("(" + pageNameRe + "([^( |,|;|\\?|\\.|\\!)]+)?)", "i");
return text.replace(re, "'''$1'''");
}
// Converts literal line breaks typed into a nimûne/jêgirtin box into
// wikitext <br> tags, so a pasted/typed newline doesn't break the
// surrounding "#:"/"#*" wikitext list syntax on output.
function nlToBr(text) {
return text ? text.replace(/\r\n|\r|\n/g, "<br>") : text;
}
function escapeHtmlForBackdrop(str) {
return String(str)
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">");
}
// Mirrors a textarea's text, with a small highlighted marker placed
// right after each line that's followed by an actual typed/pasted
// linebreak. Rendered into a transparent backdrop layer behind the
// textarea (see ensureLinebreakBackdrop()), so only the point of the
// break is marked instead of the whole box.
function buildLinebreakBackdropHtml(text) {
var lines = text.split(/\r\n|\r|\n/);
return $.map(lines, function (line, i) {
var isLast = i === lines.length - 1;
return escapeHtmlForBackdrop(line) +
(isLast ? "" : "<mark class='wiktku-linebreak-mark'>↵</mark>\n");
}).join("");
}
// Copies the metrics that affect where text wraps/lands (font, line
// height, padding, border) from the real textarea onto its backdrop,
// via computed style rather than shared CSS classes — most of the
// box's own rules are written as "textarea.foo", which a <div> with
// the same class wouldn't match. Re-run on every update in case a
// responsive breakpoint changed the textarea's own font-size.
function syncLinebreakBackdropMetrics(textarea, backdrop) {
var cs = window.getComputedStyle(textarea[0]);
backdrop.css({
"box-sizing": cs.boxSizing,
"padding-top": cs.paddingTop,
"padding-right": cs.paddingRight,
"padding-bottom": cs.paddingBottom,
"padding-left": cs.paddingLeft,
"border-width": cs.borderWidth,
"border-style": "solid",
"font-family": cs.fontFamily,
"font-size": cs.fontSize,
"font-weight": cs.fontWeight,
"line-height": cs.lineHeight,
"letter-spacing": cs.letterSpacing
});
}
// Lazily wraps a textarea in its own positioning anchor (independent
// of .wiktku-resize-wrap, so this doesn't depend on load order versus
// wiktkuMakeManualResizable) and inserts the transparent backdrop
// layer used to mark the exact point of a linebreak. Safe to call
// more than once on the same textarea — the backdrop is cached.
function ensureLinebreakBackdrop(textarea) {
var existing = textarea.data("wiktkuLinebreakBackdrop");
if (existing) return existing;
textarea.wrap("<div class='wiktku-linebreak-wrap'></div>");
var backdrop = $("<div aria-hidden='true'></div>").addClass("wiktku-linebreak-backdrop");
textarea.before(backdrop);
textarea.data("wiktkuLinebreakBackdrop", backdrop);
textarea.on("scroll.wiktkuLinebreak", function () {
backdrop.scrollTop(textarea.scrollTop()).scrollLeft(textarea.scrollLeft());
});
return backdrop;
}
// Flags a nimûne/jêgirtin textarea (via CSS class, for the border
// tint + tooltip) while it contains a typed/pasted linebreak, so the
// user notices before it's silently turned into <br> on output.
// Marks only the exact point of the break via a mirrored backdrop,
// rather than tinting the whole box.
function highlightLinebreak(el) {
var textarea = $(el);
var text = textarea.val();
var hasBreak = /\r|\n/.test(text);
textarea
.toggleClass("wiktku-has-linebreak", hasBreak)
.attr("title", hasBreak ? "Xeta nû dê wek <br> bê nivîsandin" : "");
if (!hasBreak) {
var cached = textarea.data("wiktkuLinebreakBackdrop");
if (cached) cached.hide();
textarea.removeClass("wiktku-has-linebreak-source");
return;
}
var backdrop = ensureLinebreakBackdrop(textarea);
textarea.addClass("wiktku-has-linebreak-source");
syncLinebreakBackdropMetrics(textarea, backdrop);
backdrop.html(buildLinebreakBackdropHtml(text)).show();
backdrop.scrollTop(textarea.scrollTop()).scrollLeft(textarea.scrollLeft());
}
// Each nimûne item can be { text, tr, t }: text, transliteration, translation.
function formatNimune(nimunes, lang, hasJeder) {
var hasNimune = nimunes && $.grep(nimunes, function (n) {
return (typeof n === "object" ? n.text : n) !== "";
}).length > 0;
if (!hasNimune) {
return hasJeder ? "" : "\n#* {{nimûne?|" + lang + "}}";
}
return $.map(nimunes, function (n) {
var text = typeof n === "object" ? n.text : n;
if (!text) return undefined;
var bolded = nlToBr(boldPageNameOnce(text));
var tpl = "\n#: {{nm|" + lang + "|" + bolded;
if (typeof n === "object") {
if (n.tr) tpl += "|tr=" + nlToBr(n.tr);
// Translation as third positional param (no key needed).
if (n.t) tpl += "|" + nlToBr(n.t);
}
// Short examples fit on one line together with their translation.
// rêz=1 is not used for ku — definitions are shown on separate lines there.
if (text.length < 60 && lang !== "ku") tpl += "|rêz=1";
tpl += "}}";
return tpl;
}).join("");
}
// Formats jêder (citation) entries into "#* {{jêder…|…}}" lines; skips
// entries with no quote text. Falls back to the generic {{jêder}}
// template when no specific template was chosen.
function formatJeder(jederList, lang) {
if (!jederList || !jederList.length) return "";
return $.map(jederList, function (jeder) {
if (!jeder || !jeder.quote) return undefined;
var quote = nlToBr(boldPageNameOnce(jeder.quote));
var quoteTr = nlToBr(jeder.quoteTr);
var quoteT = nlToBr(jeder.quoteT);
if (jeder.jederTpl) {
var cite = "\n#* {{" + jeder.jederTpl + "|" + lang;
cite += "|jêgirtin=" + quote;
if (quoteTr) cite += "|tr=" + quoteTr;
if (quoteT) cite += "|tercime=" + quoteT;
$.each(jeder.jêderFields || {}, function (key, val) {
if (val) cite += "|" + key + "=" + val;
});
cite += "}}";
return cite;
}
var out = "\n#* {{jêder|" + lang + "|jêgirtin=" + quote;
if (quoteTr) out += "|tr=" + quoteTr;
if (quoteT) out += "|tercime=" + quoteT;
// A şablon picked from Kategorî:Çavkanî is transcluded as the
// source param (e.g. |{{Kovara X}}); manual text is used as-is.
var srcParam = jeder.jederCatTpl ? ("{{" + jeder.jederCatTpl + "}}") :
(jeder.jederManual ? jeder.jederManual : "çavkanî?");
// A positional param containing "=" gets parsed as its own key=value
// pair by MediaWiki and breaks the template, so force it to be
// explicitly named (|2=) whenever that's the case.
out += (srcParam.indexOf("=") !== -1 ? "|2=" : "|") + srcParam;
out += "}}";
return out;
}).join("");
}
// True if a sense has at least one jêder entry with quote text.
function senseHasJeder(sense) {
return !!(sense.jeder && $.grep(sense.jeder, function (j) {
return j && j.quote;
}).length > 0);
}
// Builds "{{tplName|lang|part1|part2|…}}" from a sense field (kategori,
// etiket), wrapped inline (" {{…}} ") or on its own line ("\n#: {{…}}").
function buildSenseTpl(sense, field, lang, tplName) {
if (!sense[field] || !sense[field].length) return "";
var parts = sense[field].map(function (p) { return $.trim(p); })
.filter(function (p) { return p !== ""; });
if (!parts.length) return "";
var call = "{{" + tplName + "|" + lang + "|" + parts.join("|") + "}}";
return call
}
/**
* Assembles the nimûne + jêder wikitext block for a sense. Shared by
* both the template-sense and normal-mane-sense branches below.
*/
function buildCite(sense, lang) {
return formatNimune(sense.nimune, lang, senseHasJeder(sense)) +
formatJeder(sense.jeder, lang);
}
function makeWordListStep(id, name, question_fmt) {
return {
id: id,
name: name,
question_fmt: question_fmt,
multiple: true,
narrow: true,
placeholder: "Kelîme…",
visible: function (values) {
return values.lang && values.pos;
},
output: function (values) {
var words = $.grep(values[id] || [], function (w) { return !!w; });
var header = capitalize(name);
if (!words.length) return "";
var lang = values.lang;
var section = "\n==== " + header + " ====\n";
var params = "cure=" + header + "\n" +
$.map(words, function (w) {
return "|" + w;
}).join("\n");
return section +
"{{kol3|" + lang + "|" + params + "\n}}\n";
} };
}
var steps = {
lang: {
id: "lang",
required: true,
name: "ziman",
question_fmt: '"' + pageName + '" bi çi zimanî ye?',
question_br: true,
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (langChoices).
choices: [],
output: function (values) {
if (addLangMode){
return "\n== {{ziman|" + values.lang + "}} ==\n";
}else {
return "== {{ziman|" + values.lang + "}} ==\n";
}
} },
pron: {
id: "pron",
name: "bilêvkirin",
question_fmt: '"' + pageName + '" çawa tê telafûzkirin?',
// pronTpls populated from data.json
pronTpls: {},
visible: function (values) {
if (!values.lang) return false;
// addLangMode: skip pron only if this lang already has a section.
if (addLangMode) {
// Clearing the page makes existing content irrelevant.
var clearPageCheck = $("#wiktku-clear-page-check");
if (clearPageCheck.length && clearPageCheck.prop("checked")) {
return true;
}
var existing = $("#wpTextbox1").val() || "";
return !findLangHeader(existing, values.lang);
}
return true;
},
// Fills the insert-dropdown from pronTpls, filtered by language.
refreshTplSelect: function () {
var sel = $("#wiktku-start-pron .wiktku-tpl-insert-select");
if (!sel.length) return;
var lang = getValues().lang || "";
sel.find("option[value!='']").remove();
$.each(steps.pron.pronTpls, function (name, tpl) {
// Filter: if tpl.langs exists, only show if lang is in that list; otherwise show always
var allowed = !tpl.langs || tpl.langs.indexOf(lang) !== -1;
if (allowed) {
sel.append($("<option></option>")
.val(tpl.snippet)
.text(name + " — " + tpl.desc)
.attr("data-nolang", tpl.noLang ? "1" : ""));
}
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-pron-wrap").length) return null;
var wrap = $("<div class='wiktku-pron-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-pron-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-pron-text")
.attr("rows", 4)
.attr("placeholder", "Nimûne: {{IPA|ku|/pɛɪ̯n/}} yan {{kîte|ku|he|ce|ki|rin}}");
// Template insert dropdown — filtered by language.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike ");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
var lang = getValues().lang || "";
$.each(steps.pron.pronTpls, function (name, tpl) {
// Filter: if tpl.langs exists, only show if lang is in that list; otherwise show always
var allowed = !tpl.langs || tpl.langs.indexOf(lang) !== -1;
if (allowed) {
sel.append($("<option></option>")
.val(tpl.snippet)
.text(name + " — " + tpl.desc)
.attr("data-nolang", tpl.noLang ? "1" : ""));
}
});
sel.on("change", function () {
var snippet = $(this).val();
if (!snippet) return;
var lang = getValues().lang || "";
// Check if the selected option has noLang flag
var selectedOption = sel.find("option:selected");
var hasNoLang = selectedOption.attr("data-nolang") === "1";
if (!hasNoLang) {
snippet = snippet.replace(/CODE/g, lang).replace(/SOURCELANG/g, "?");
}
insertAtCursor(ta[0], snippet);
$(this).val("");
// Clear the picker's search box
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel).append(ta);
stepDiv.append(wrap);
initSelects(wrap);
return ta;
},
output: function () {
var text = $.trim($("#wiktku-start-pron .wiktku-pron-text").val());
if (!text) return "";
var lines = text.split("\n");
var out = $.map(lines, function (line) {
line = $.trim(line);
if (!line) return undefined;
return line;
}).join("\n");
return "\n=== Bilêvkirin ===\n" + out + "\n";
} },
pos: {
id: "pos",
required: true,
name: "Cureyê rêzimanî",
question_fmt: 'Cureyê rêzimanî yê "' + pageName + '" çi ye?',
visible: function (values) {
return values.lang;
},
question_br: true,
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (posChoices).
choices: [],
output: function (values) {
var pos = values.pos || "";
var cinsiyet = values.cinsiyet || ""; // from the cinsiyet step
var lekTur = values.lektur || ""; // from the lêker transitivity step
var capitalizedPos = capitalize(pos);
var outputString = "\n=== " + capitalizedPos + " ===\n";
outputString += "{{" + pos + "|" + values.lang;
if (pos === "navdêr" || pos === "serenav") {
if (cinsiyet) {
outputString += "|c=" + cinsiyet;
} else if (values.lang === "ku") {
outputString += "|c=?";
}
} else if (/^lêker/.test(pos) && lekTur) {
outputString += "|c=" + lekTur;
}
if (values.tr) {
outputString += "|tr=" + values.tr;
}
outputString += "}}\n";
return outputString;
}
},
// cinsiyet (gender) — shown for navdêr/serenav only, with choices built
// from metadata[lang].g since not every language has grammatical gender.
cinsiyet: {
id: "cinsiyet",
name: "cinsiyet",
question_fmt: 'Cinsiyeta "' + pageName + '" çi ye?',
question_br: true,
visible: function (values) {
var meta = metadata[values.lang];
return !!(values.lang && (values.pos === "navdêr" || values.pos === "serenav") &&
meta && meta.g && meta.g.length);
},
build: function (stepDiv, values) {
var select = stepDiv.find("select.wiktku-start-step-field");
if (!select.length) {
select = $(mw.html.element("select", {
"class": "wiktku-start-step-field wiktku-plain-select",
id: "wiktku-start-cinsiyet-field" }));
stepDiv.append(select);
}
if (!values) return select;
var meta = metadata[values.lang];
var codes = (meta && meta.g) || [];
var prevVal = select.val();
var choices = $.map(codes, function (code) {
return [{ code: code, label: genderLabel(code) }];
});
populateMenus(select, choices, null, "Cinsiyetê hilbijêre");
if ($.grep(choices, function (c) { return c.code === prevVal; }).length) {
select.val(prevVal);
}
return select;
},
output: function () { return ""; } // consumed by pos.output
},
// Lêker transitivity
lektur: {
id: "lektur",
name: "Cureyê lêkerê (fiîlê)",
question_fmt: "Cureyê lêkerê (fiîlê) çi ye?",
question_br: true,
visible: function (values) {
return values.lang && values.pos && /^lêker/.test(values.pos);
},
choices: [
{ code: "gh", label: "gerguhêz" },
{ code: "x-gh", label: "xwerû-gerguhêz" },
{ code: "p-gh", label: "pêkhatî-gerguhêz" },
{ code: "h-gh", label: "hevedudanî-gerguhêz" },
{ code: "b-gh", label: "biwêjî-gerguhêz" },
{ code: "ngh", label: "negerguhêz" },
{ code: "x-ngh", label: "xwerû-negerguhêz" },
{ code: "p-ngh", label: "pêkhatî-negerguhêz" },
{ code: "h-ngh", label: "hevedudanî-negerguhêz" },
{ code: "b-ngh", label: "biwêjî-negerguhêz" } ],
output: function () { return ""; } // consumed by pos.output
},
tr: {
id: "tr",
name: "transliterasyon",
question_fmt: "Transliterasyona vê kelîmeyê",
multiple: false,
narrow: true,
visible: function (values) {
return values.lang && values.pos && needsTransliteration(values.lang);
} },
dfn: {
id: "dfn",
name: "Mane",
question_fmt: function (values) {
var base = "Maneya kelîmeyê binivîse. Mane otomatîk tê lînkkirin!";
if (values.lang === "ku") {
return base + " Ji bo tercimeyan beşa 'Werger' bi kar bîne!";
}
return base;
},
multiple: true,
ordered: true,
rows: 3,
visible: function (values) {
return values.lang && values.pos;
},
example: function (values) {
// posExamples loaded from [[MediaWiki:Gadget-start.js/data.json]].
var examples = steps.dfn.posExamples || {};
var full = values.pos || "";
return examples[full] || "";
},
// Builds one sense block (<li>): mane textarea, nimûne list, and
// sub-lists for alternatîv/hevmane/dijmane/etc.
buildSenseBlock: function (stepDiv) {
var block = $("<li class='wiktku-dfn-sense'></li>");
// — Mane textarea (declared first so the template handler can reference it) —
var dfnArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-mane-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-start-step-field wiktku-dfn-mane")
.attr("rows", 6)
.attr("placeholder", "Mane…");
dfnArea.on("input", function () {
steps.dfn.onDfnInput(stepDiv, block, this);
});
// — Tercime + Îzah boxes (non-ku alternative to the plain mane box) —
// Non-ku entries get a direct translation plus a {{îzah|…}}-wrapped
// gloss instead of a Kurdish-style gloss. Rather than teach every
// consumer (getSenses/getOutput/linkify) a second data shape, these
// boxes just write their combined text into dfnArea and re-fire its
// "input" event, so dfnArea stays the single source of truth.
var tercimeArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-tercime-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-dfn-subfield wiktku-dfn-tercime")
.attr("rows", 2)
.attr("placeholder", "Tercimeyên rasterast ên kurmancî… Ji bo school-a îngilîzî li vir 'mekteb, medrese' binivîse");
var izahArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-izah-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-dfn-subfield wiktku-dfn-izah")
.attr("rows", 3)
.attr("placeholder", "Îzaha kurmancî… Ji bo school-a îngilîzî li vir 'cihê tehsîlgirtinê' binivîse");
var nonKuWrap = $("<div class='wiktku-dfn-nonku-wrap'></div>")
.append(tercimeArea).append(izahArea)
.hide();
function syncNonKuToMane() {
var t = $.trim(tercimeArea.val());
var iz = $.trim(izahArea.val());
// if tercime is blank, use îzah as definition
var combined = t ? (iz ? t + " {{îzah|" + iz + "}}" : t) : iz;
dfnArea.val(combined);
// Re-fires onDfnInput so the sense list still grows and
// refresh() still runs, exactly as if this were typed
// directly into the mane textarea.
dfnArea.trigger("input");
}
tercimeArea.on("input", syncNonKuToMane);
izahArea.on("input", syncNonKuToMane);
// Switches between the plain mane box and the tercime+îzah pair —
// only for non-ku entries with no tplSelect selected.
function updateManeMode() {
var lang = getValues().lang || "";
var isTpl = !!tplSelect.val();
if (lang && lang !== "ku" && !isTpl) {
dfnArea.hide();
nonKuWrap.show();
} else {
nonKuWrap.hide();
if (!isTpl) dfnArea.show();
}
}
// Store on the block so refresh() can re-sync every block when
// lang changes, and restoreDfn() can re-sync after restoring.
block.data("updateManeMode", updateManeMode);
// — Template selector (optional — replaces mane when chosen) —
// Template definitions loaded from [[MediaWiki:Gadget-start.js/data.json]].
var tplDefs = steps.dfn.tplDefs || {};
// Cache of all non-placeholder option elements, so updateTplOptions
// can detach/re-attach them without losing the full list.
var _allTplOptions = [];
var tplSelect = $(mw.html.element("select", { "class": "wiktku-dfn-tpl-select" }));
tplSelect.attr("data-placeholder", "Li şablonekê bigere");
tplSelect.append($("<option value=''>— yan jî şablonek hilbijêre —</option>"));
$.each(tplDefs, function (name, tpl) {
var opt = $("<option></option>")
.val(name)
.text(name)
.attr("data-langs", tpl.langs ? tpl.langs.join(",") : "")
.attr("data-nolang", tpl.noLang ? "1" : "");
tplSelect.append(opt);
_allTplOptions.push(opt[0]);
});
function updateTplOptions() {
var lang = getValues().lang || "";
var currentVal = tplSelect.val();
var currentStillValid = false;
// Detach all non-placeholder options, then re-attach only the visible
// ones — native <select> won't reliably hide options any other way.
tplSelect.find("option[value!='']").detach();
$.each(_allTplOptions, function (_, opt) {
var allowed = $(opt).attr("data-langs");
var visible = !allowed || allowed.split(",").indexOf(lang) !== -1;
if (visible) {
tplSelect.append(opt);
if ($(opt).val() === currentVal) currentStillValid = true;
}
});
tplSelect.trigger("wiktku:refresh");
if (currentVal && !currentStillValid) {
tplSelect.val("");
tplTitleInput.hide().val("");
updateManeMode();
}
}
// Store updater on the element so refresh() can call it for all blocks.
tplSelect.data("updateOptions", updateTplOptions);
var tplTitleInput = $("<input type='text'>")
.addClass("wiktku-dfn-tpl-title wiktku-start-narrow")
.attr("placeholder", "Navê rûpela hedefê…")
.hide();
// Grow the sense list when the title field of the last block gets content,
// mirroring what onDfnInput does for the plain mane textarea.
tplTitleInput.on("input", function () {
steps.dfn.onDfnInput(stepDiv, block, this);
});
// Şablon senses have no plain gloss, so hide alternatîv/hevmane/
// dijmane/etc. Etîket, Nimûne and Jêgirtin stay visible either way.
function updateFieldVisibility() {
var isTpl = !!tplSelect.val();
$.each(HIDDEN_ON_TPL_GROUPS, function (_, cls) {
block.find("." + cls + "-group").toggle(!isTpl);
});
}
// Store on the block so restoreDfn() can re-sync visibility
// after setting tplSelect's value.
block.data("updateFieldVisibility", updateFieldVisibility);
tplSelect.on("change", function () {
var chosen = $(this).val();
if (chosen) {
dfnArea.hide();
nonKuWrap.hide();
tplTitleInput.show().focus();
} else {
tplTitleInput.hide().val("");
updateManeMode();
}
updateFieldVisibility();
// Re-run refresh so the Werger step visibility updates.
refresh();
});
var tplRow = $("<div></div>").addClass("wiktku-dfn-tpl-row")
.append(tplSelect).append(" ").append(tplTitleInput);
block.append(tplRow);
block.append(dfnArea);
block.append(nonKuWrap);
// Apply lang filter on initial build.
updateTplOptions();
updateManeMode();
// — Sub-field groups are always visible with a placeholder textarea.
var allGroups = [
{ cls: "wiktku-dfn-etiket", label: "Etîket", rows: 1, narrow: true, izah: "xisûsen, Mêrdîn, anatomî, Badînî" },
{ cls: "wiktku-dfn-kategori", label: "Kategorî", rows: 1, narrow: true, izah: "wekî etîket lê xuya nabe tenê kategorîze dike" },
{ cls: "wiktku-dfn-alternativ", label: "Formên alternatîv", rows: 1, narrow: true, izah: "Varyantên vê kelîmeyê" },
{ cls: "wiktku-dfn-hevmane", label: "Hevmane", rows: 1, narrow: true, izah: "Spehî hevmaneya Bedew e." },
{ cls: "wiktku-dfn-dijmane", label: "Dijmane", rows: 1, narrow: true, izah: "Zengîn dijmaneya feqîr e." },
{ cls: "wiktku-dfn-koordine", label: "Termên koordîne", rows: 1, narrow: true, izah: "Pisîk û kûçik termên koordîne ne çunkî Jornavên wan gelek in" },
{ cls: "wiktku-dfn-jornav", label: "Jornav", rows: 1, narrow: true, izah: "Heywan jornavê guhandar e" },
{ cls: "wiktku-dfn-jernav", label: "Jêrnav", rows: 1, narrow: true, izah: "Guhandar jêrnavê heywan e" },
{ cls: "wiktku-dfn-nimune", label: "Nimûne", rows: 2, narrow: false }
];
$.each(allGroups, function (_, g) {
var groupDiv = $("<div></div>").addClass("wiktku-dfn-subgroup " + g.cls + "-group");
function buildNimuneLi() {
var lang = getValues().lang || "";
var li = $("<li></li>").addClass("wiktku-dfn-nimune-li");
var mainTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-text-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", g.rows)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-text")
.attr("placeholder", "Nimûneya emilandina kelîmeyê tu bi xwe binivîse…");
mainTa.on("input", function () {
highlightLinebreak(this);
var val = $.trim($(this).val());
var isLast = li.is(list.children("li:last-child"));
if (val && isLast) {
list.append(buildNimuneLi());
}
});
li.append(mainTa);
var subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
if (needsTransliteration(lang)) {
subWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-tr")
.attr("placeholder", "Transliterasyona bi alfabeya latînî")
);
}
if (lang && lang !== "ku") {
subWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-t")
.attr("placeholder", "Tercimeya nimûneyê bi kurmancî")
);
}
if (subWrap.children().length) li.append(subWrap);
return li;
}
if (g.cls === "wiktku-dfn-nimune") {
// Nimûne — compound widget with tr/t sub-fields.
var lbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text(g.label))
.append(": ");
var list = $("<ol></ol>").addClass("wiktku-dfn-sublist " + g.cls + "-list");
groupDiv.data("buildNimuneLi", buildNimuneLi);
list.append(buildNimuneLi());
groupDiv.append(lbl).append(list);
block.append(groupDiv);
} else {
// Regular always-visible group — label + growing textarea list.
var lbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text(g.label))
.append(": ")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-hint").text(g.izah));
var list = $("<ol></ol>").addClass("wiktku-dfn-sublist " + g.cls + "-list");
var firstInput = $("<textarea></textarea>")
.attr("name", g.cls + "-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", g.rows)
.attr("class", "wiktku-dfn-subfield" + (g.narrow ? " wiktku-start-narrow" : ""))
.attr("placeholder", g.label + "…");
firstInput.on("input", function () {
steps.dfn.onSubInput(list, this, g.rows, g.narrow);
});
list.append($("<li></li>").append(firstInput));
groupDiv.append(lbl).append(list);
block.append(groupDiv);
}
});
// — Jêder group — growing list, same structure as Nimûne. —
(function () {
var jederGroupDiv = $("<div></div>").addClass("wiktku-dfn-subgroup wiktku-dfn-jeder-group");
var jederLbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text("Jêgirtin"))
.append(": ");
var jederList = $("<ol></ol>").addClass("wiktku-dfn-sublist wiktku-dfn-jeder-list");
function buildJederLi() {
var lang = getValues().lang || "";
var li = $("<li></li>").addClass("wiktku-dfn-jeder-li");
// Quote text textarea
var quoteTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote")
.attr("placeholder", "Nimûneya emilandinê ji kitêb an çavkaniyeke din binivîse");
quoteTa.on("input", function () {
highlightLinebreak(this);
var val = $.trim($(this).val());
var isLast = li.is(jederList.children("li:last-child"));
if (val && isLast) {
jederList.append(buildJederLi());
}
});
li.append(quoteTa);
// tr/t sub-fields for the quote — shown as needed for the language.
var quoteSubWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
if (needsTransliteration(lang)) {
quoteSubWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-tr")
.attr("placeholder", "Transliterasyona jêgirtinê…")
);
}
if (lang && lang !== "ku") {
quoteSubWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-t")
.attr("placeholder", "Tercimeya jêgirtinê bi kurmancî")
);
}
if (quoteSubWrap.children().length) li.append(quoteSubWrap);
// Citoid auto-fill: fetch citation data from a URL, DOI or ISBN and
// prefill the source şablon + fields below (see Gadget-citoid-helper.js).
var citoidWrap = $("<div></div>").addClass("wiktku-dfn-quote-citoid");
var citoidInput = $("<textarea></textarea>")
.addClass("wiktku-dfn-subfield wiktku-dfn-quote-citoid-input")
.attr("rows", 1)
.attr("placeholder", "URL, DOI an ISBN binivîse ku otomatîk were tijekirin…");
var citoidBtn = new OO.ui.ButtonWidget({
label: "Bi Citoidê bîne",
classes: [ "wiktku-dfn-quote-citoid-btn" ]
});
var citoidStatus = $("<span></span>").addClass("wiktku-dfn-quote-citoid-status");
// Fetches citation data from Citoid and fills this citation's
// şablon + fields — only rebuilds fields on template change,
// and never overwrites values the user already typed.
function runCitoidFetch() {
var query = $.trim(citoidInput.val());
if (!query) {
mw.notify("Ji kerema xwe re pêşî URL, DOI an ISBNyekê binivîse.");
return;
}
citoidBtn.setDisabled(true);
citoidStatus.text("Tê anîn…");
wikt.citoidHelper.ensure().then(function () {
return wikt.citoid.fetchJederFields(query);
}).then(function (result) {
var jederKey = result.jederKey;
var hasTpl = !!jederKey && srcSel.find("option[value='" + jederKey + "']").length > 0;
var targetVal = hasTpl ? jederKey : "__manual__";
// Only rebuild if switching şablon, so a repeat fetch
// doesn't clear fields already filled in by hand.
if (srcSel.val() !== targetVal) {
srcSel.val(targetVal).trigger("change");
}
if (hasTpl) {
// Tenê qadên vala tijî bike.
$.each(result.fields, function (key, val) {
var input = srcFields.find("[data-field-key='" + key + "']");
if (input.length && !$.trim(input.val())) {
input.val(val);
}
});
} else {
// Şablonek nehat naskirin ji bo vê itemType — rêzikeke
// çavkaniyê ya bi destan a ji qadên Citoid tê çêkirin,
// lê tenê ger qada destan vala be.
var manualField = srcFields.find(".wiktku-dfn-quote-src-manual");
if (!$.trim(manualField.val())) {
var parts = [];
$.each(["nivîskar", "sernav", "websîte", "kovar", "weşanxane", "sal", "url"], function (_, k) {
if (result.fields[k]) parts.push(result.fields[k]);
});
manualField.val(parts.join(", "));
}
}
citoidStatus.text("");
}, function (errorMsg) {
citoidStatus.text(typeof errorMsg === "string" ? errorMsg : "Nehat dîtin. Kontrol bike ka URL/DOI/ISBN rast e.");
}).always(function () {
citoidBtn.setDisabled(false);
});
}
citoidBtn.on("click", runCitoidFetch);
citoidInput.on("keydown", function (e) {
if (e.which === 13) { // Enter
e.preventDefault();
runCitoidFetch();
}
});
citoidWrap.append(citoidInput).append(citoidBtn.$element).append(citoidStatus);
// Source template selector, specific to this citation.
var srcSel = $("<select></select>").addClass("wiktku-dfn-quote-src-sel wiktku-plain-select");
srcSel.append($("<option value=''>— Çavkaniyê hilbijêre —</option>"));
srcSel.append($("<option></option>").val("__manual__").text("Bi destê xwe binivîsim"));
srcSel.append($("<option></option>").val("__category__").text("Ji Kategorî:Çavkanî şablonekê hilbijêre"));
var jederDefs = steps.dfn.jederDefs || {};
$.each(jederDefs, function (tplName, def) {
srcSel.append($("<option></option>").val(tplName).text(def.label));
});
// Dynamic source fields container.
var srcFields = $("<div></div>").addClass("wiktku-dfn-quote-src-fields");
srcSel.on("change", function () {
srcFields.empty();
var chosen = $(this).val();
if (!chosen) return;
if (chosen === "__manual__") {
// Freeform source, written by the user — becomes the 2nd
// positional param of {{jêder|lang|…}} instead of çavkanî?.
srcFields.append(
$("<textarea></textarea>")
.attr("rows", 4)
.addClass("wiktku-dfn-subfield wiktku-dfn-quote-src-manual")
.attr("placeholder", "Çavkaniyê bi destê xwe binivîse…")
);
return;
}
if (chosen === "__category__") {
// Search widget over the members of [[Kategorî:Çavkanî]].
// Picking a şablon here immediately switches the row to
// "Bi destê xwe binivîsim" mode with {{Şablon}} pre-filled,
var catWrap = $("<span></span>").addClass("wiktku-native-select-wrap wiktku-dfn-quote-src-cat");
var catInput = $("<input type='search' autocomplete='off'>")
.addClass("wiktku-start-narrow wiktku-dfn-quote-src-cat-input")
.attr("placeholder", "Li navê şablonê bigere…");
var catResults = $("<ul></ul>").addClass("wiktku-ac-results wiktku-dfn-quote-src-cat-results").hide();
var catStatus = $("<span></span>").addClass("wiktku-dfn-quote-src-cat-status").text("Şablon tên barkirin…");
var showCatResults = function (query) {
var q = $.trim(query).toLowerCase();
catResults.empty();
var list = catSrcTemplates || [];
var matched = q ?
$.grep(list, function (name) { return name.toLowerCase().indexOf(q) !== -1; }) :
list;
if (!matched.length) {
catResults.hide();
return;
}
$.each(matched.slice(0, 50), function (_, name) {
var li = $("<li></li>").text(name).attr("data-value", name);
var touchMoved = false;
li.on("touchstart", function () { touchMoved = false; });
li.on("touchmove", function () { touchMoved = true; });
li.on("touchend", function (e) {
if (touchMoved) return;
e.preventDefault();
selectCatTpl(name);
});
li.on("mousedown", function (e) {
e.preventDefault();
selectCatTpl(name);
});
catResults.append(li);
});
catResults.show();
};
// Wraps the chosen şablon as {{Name}}, drops it into the
// manual textarea, and switches the row into manual mode
// so the user can keep editing it (add params, etc.).
var selectCatTpl = function (name) {
catResults.hide();
srcSel.val("__manual__");
srcSel.trigger("change");
srcFields.find(".wiktku-dfn-quote-src-manual")
.val("{{" + name + "}}")
.trigger("focus");
};
catInput.on("input", function () {
showCatResults($(this).val());
});
catInput.on("focus", function () {
showCatResults($(this).val());
});
catInput.on("blur", function () {
setTimeout(function () { catResults.hide(); }, 200);
});
catWrap.append(catInput).append(catResults).append(catStatus);
srcFields.append(catWrap);
fetchCatSrcTemplates().then(function () {
catStatus.text("");
}, function () {
catStatus.text("Şablon nehatin barkirin.");
});
return;
}
var def = (steps.dfn.jederDefs || {})[chosen];
if (!def) return;
$.each(def.fields, function (key, label) {
var row = $("<div></div>").addClass("wiktku-dfn-quote-src-row");
var fieldLbl = $("<label></label>").text(label + ": ");
var inp = $("<textarea></textarea>")
.attr("rows", 2)
.addClass("wiktku-dfn-quote-src-input wiktku-start-narrow")
.attr("data-field-key", key)
.attr("placeholder", label + "…");
// "Sernav" / "Sernavê orjînal" (title fields, e.g. for
// kitêb/kovar/malper) get a taller, draggable box; every
// other field in the template stays as-is. Field labels
// come from the on-wiki jederDefs data, so match on the
// (diacritic-folded) label text rather than a fixed key.
var foldedLabel = foldDiacritics(label);
if (/^sernav$/.test(foldedLabel) || /orjin/.test(foldedLabel)) {
inp.addClass("wiktku-dfn-quote-src-input--title");
}
row.append(fieldLbl).append(inp);
srcFields.append(row);
});
});
li.append(citoidWrap).append(srcSel).append(srcFields);
return li;
}
jederGroupDiv.data("buildJederLi", buildJederLi);
jederList.append(buildJederLi());
jederGroupDiv.append(jederLbl).append(jederList);
block.append(jederGroupDiv);
}());
// Apply the initial hide/show state for the sub-groups (matches
// tplSelect's starting value, which is normally empty).
updateFieldVisibility();
return block;
},
/** Grows the sense list when the last mane textarea gets content. */
onDfnInput: function (stepDiv, block, textarea) {
var val = $.trim($(textarea).val());
var list = stepDiv.find("ol.wiktku-dfn-list");
var isLast = block.is(list.children("li:last-child"));
if (val && isLast) {
var newBlock = steps.dfn.buildSenseBlock(stepDiv);
list.append(newBlock);
// Give the new block's template selector the searchable picker.
initSelects(newBlock);
}
refresh();
},
/** Grows a sub-list (nimûne/formên alternatîv/hevmane/dijmane/termên koordîne) on input. */
onSubInput: function (list, input, rows, narrow) {
var val = $.trim($(input).val());
var item = $(input).parent();
var isLast = item.is(list.children("li:last-child"));
if (val && isLast) {
var next = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-sub-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", rows)
.attr("class", "wiktku-dfn-subfield" + (narrow ? " wiktku-start-narrow" : ""));
next.on("input", function () {
steps.dfn.onSubInput(list, this, rows, narrow);
});
list.append($("<li></li>").append(next));
}
},
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (tplDefs, posExamples, jederDefs).
tplDefs: {},
posExamples: {},
jederDefs: {},
build: function (stepDiv) {
if (stepDiv.find("ol.wiktku-dfn-list").length) return null;
var list = $("<ol class='wiktku-dfn-list'></ol>");
list.append(steps.dfn.buildSenseBlock(stepDiv));
stepDiv.append(list);
return null;
},
/** Reads all sense blocks from the DOM and returns an array of sense objects. */
getSenses: function (stepDiv) {
var senses = [];
stepDiv.find("li.wiktku-dfn-sense").each(function () {
var block = $(this);
var tplSel = block.find("select.wiktku-dfn-tpl-select");
var tpl = tplSel.val() || "";
// noLang: template already encodes the language — don't add |lang| param.
var tplNoLang = tpl
? tplSel.find("option[value='" + tpl + "']").attr("data-nolang") === "1"
: false;
var tplTitle = $.trim(block.find("input.wiktku-dfn-tpl-title").val());
var mane = $.trim(block.find("textarea.wiktku-dfn-mane").val());
function readList(cls) {
var vals = [];
block.find("." + cls + "-list textarea").each(function () {
var v = $.trim($(this).val());
if (v) vals.push(v);
});
return vals;
}
// Nimûne items are compound: { text, tr?, t? }
function readNimuneList() {
var items = [];
block.find(".wiktku-dfn-nimune-list li.wiktku-dfn-nimune-li").each(function () {
var text = $.trim($(this).find(".wiktku-dfn-nimune-text").val());
if (!text) return;
var obj = { text: text };
var tr = $.trim($(this).find(".wiktku-dfn-nimune-tr").val());
var t = $.trim($(this).find(".wiktku-dfn-nimune-t").val());
if (tr) obj.tr = tr;
if (t) obj.t = t;
items.push(obj);
});
return items;
}
// Jêder is a growing list of citations, one per li — mirrors readNimuneList().
function readJederList() {
var items = [];
block.find(".wiktku-dfn-jeder-list li.wiktku-dfn-jeder-li").each(function () {
var li = $(this);
var quote = $.trim(li.find(".wiktku-dfn-nimune-quote").val());
if (!quote) return;
var obj = { quote: quote };
var qtr = $.trim(li.find(".wiktku-dfn-nimune-quote-tr").val());
var qt = $.trim(li.find(".wiktku-dfn-nimune-quote-t").val());
if (qtr) obj.quoteTr = qtr;
if (qt) obj.quoteT = qt;
var tplName = li.find(".wiktku-dfn-quote-src-sel").val();
if (tplName === "__manual__") {
var manual = $.trim(li.find(".wiktku-dfn-quote-src-manual").val());
if (manual) obj.jederManual = manual;
} else if (tplName === "__category__") {
// Reachable only if the user opened the category search but
// never picked a şablon — picking one switches the row to
// __manual__ (see selectCatTpl above), so there's nothing
// meaningful to save here.
} else if (tplName) {
obj.jederTpl = tplName;
var fields = {};
li.find(".wiktku-dfn-quote-src-input").each(function () {
var k = $(this).attr("data-field-key");
var v = $.trim($(this).val());
if (k && v) fields[k] = v;
});
obj.jêderFields = fields;
}
items.push(obj);
});
return items;
}
senses.push({
tpl: tpl,
tplNoLang: tplNoLang,
tplTitle: tplTitle,
mane: mane,
etiket: readList("wiktku-dfn-etiket"),
kategori: readList("wiktku-dfn-kategori"),
nimune: readNimuneList(),
jeder: readJederList(),
alternativ: readList("wiktku-dfn-alternativ"),
hevmane: readList("wiktku-dfn-hevmane"),
dijmane: readList("wiktku-dfn-dijmane"),
koordine: readList("wiktku-dfn-koordine"),
jornav: readList("wiktku-dfn-jornav"),
jernav: readList("wiktku-dfn-jernav")
});
});
return senses;
},
getOutput: function (values, callback) {
var stepDiv = $("#wiktku-start-dfn");
var senses = steps.dfn.getSenses(stepDiv);
var lang = values.lang;
// A sense counts as "filled" if it has a mane, a chosen template + title,
// or any other content (etîket/hevmane/nimûne/jêder…) worth keeping.
var hasMane = senses.some(function (s) {
return s.mane !== "" || (s.tpl && s.tplTitle) || senseHasExtraContent(s);
});
var defLines = []; // one entry per kept sense (goes to linkify)
var citeLines = []; // parallel — nimûne+jêder for that same sense
var izahLines = []; // parallel — raw îzah gloss for that same sense
// True only once some sense's *actual* dfn text (post tercime/îzah
// split) is non-empty.
var hasLinkableMane = false;
$.each(senses, function (_, sense) {
// — Template sense (e.g. {{guharto|ku|somepage}}) —
if (sense.tpl) {
if (!sense.tplTitle) return; // skip empty template senses
var tplKatTpl = buildSenseTpl(sense, "kategori", lang, "K");
var tplLabelTpl = buildSenseTpl(sense, "etiket", lang, "e");
var tplCall = sense.tplNoLang
? "{{" + sense.tpl + "|" + sense.tplTitle + "}}"
: "{{" + sense.tpl + "|" + lang + "|" + sense.tplTitle + "}}";
var idx = defLines.length;
var cite = buildCite(sense, lang);
defLines.push("# " + (tplKatTpl ? tplKatTpl + " " : "") + (tplLabelTpl ? tplLabelTpl + " " : "") + tplCall +
(cite ? "{{wiktku-cite-" + idx + "}}" : ""));
citeLines.push(cite);
izahLines.push(""); // template senses have no îzah
return;
}
// — Normal mane sense —
var dfn = sense.mane;
if (!dfn && !senseHasExtraContent(sense)) return; // truly empty
// Pull the îzah gloss (if any) out of the combined tercime+îzah
// string — it's spliced back in separately below, after its
// own linkify pass (see izahLines / the second linkifyText call).
var izahRaw = null;
var tercimeIzah = splitTercimeIzah(dfn);
if (tercimeIzah) {
dfn = tercimeIzah.tercime;
izahRaw = stripWikilinks(tercimeIzah.izah);
}
if (dfn) {
dfn = stripWikilinks(dfn);
// Sentence-case + trailing period are for ku definitions,
// which are written as full glosses.
if (lang === "ku") {
if (dfn[0] !== dfn[0].toUpperCase()) dfn = capitalize(dfn);
if (!dfn.match(/[.…?!)\]]$/)) dfn += ".";
}
} else if (izahRaw === null) {
dfn = lang === "ku" ? "{{mane?|" + lang + "}}" : "";
}
if (dfn) hasLinkableMane = true;
var katTpl = buildSenseTpl(sense, "kategori", lang, "K");
var labelTpl = buildSenseTpl(sense, "etiket", lang, "e");
var out = "# " + (katTpl ? katTpl + " " : "") + (labelTpl ? labelTpl + " " : "") + dfn;
var idx = defLines.length;
var hasThisIzah = izahRaw !== null && $.trim(izahRaw) !== "";
// Bare {{...}} token — like {{wiktku-cite-N}}, this survives
// linkify's first pass untouched (it treats template calls as
// opaque), then gets swapped for {{îzah|…}} once the actual
// gloss text has been linkified in its own separate pass.
if (hasThisIzah) {
out += (dfn ? " " : "") + "{{wiktku-izah-" + idx + "}}";
}
function wordLine(tpl, words) {
if (!words.length) return "";
return "\n#: {{" + tpl + "|" + lang + "|" + words.join("|") + "}}";
}
out += wordLine("alt-r", sense.alternativ);
out += wordLine("hevmane", sense.hevmane);
out += wordLine("dijmane", sense.dijmane);
out += wordLine("koordîne", sense.koordine);
out += wordLine("jornav", sense.jornav);
out += wordLine("jêrnav", sense.jernav);
var cite = buildCite(sense, lang);
defLines.push(out + (cite ? "{{wiktku-cite-" + idx + "}}" : ""));
citeLines.push(cite);
izahLines.push(hasThisIzah ? izahRaw : "");
});
// Splice citeLines back into a linkified string, replacing each
// {{wiktku-cite-N}} token with its stored nimûne/jêder block.
function restoreCites(t) {
return t.replace(/\{\{wiktku-cite-(\d+)\}\}/g, function (_, n) {
return citeLines[parseInt(n, 10)] || "";
});
}
// Runs text through the linkify gadget if it's loaded, otherwise
// just passes it through unchanged. Shared by both linkify passes
// below (main mane text, and — separately — îzah glosses).
function linkifyText(t, cb) {
if (typeof $.kuLinkify === "function") {
$.kuLinkify(t, cb);
} else {
cb(t);
}
}
var hasIzah = izahLines.some(function (t) { return t && $.trim(t) !== ""; });
var text = defLines.join("\n") + "\n";
if (!hasMane) {
// No definitions entered — emit {{mane?}} with nimûne?.
text = "# {{mane?|" + lang + "}}\n#* {{nimûne?|" + lang + "}}\n";
callback(text);
return;
}
// Runs the îzah-only linkify pass against `base` (either the raw
// text, when there's no linkable mane to run the main pass on
// first, or the already-linkified main text). Shared by both
// branches below so the token-splice logic only lives once.
function runIzahPass(base) {
var izahJoined = $.map(izahLines, function (raw, idx) {
if (!raw) return undefined;
return "{{wiktku-izah-open-" + idx + "}}" + raw + "{{wiktku-izah-close-" + idx + "}}";
}).join("\n");
linkifyText(izahJoined, function (izahLinked) {
var izahByIdx = {};
var re = /\{\{wiktku-izah-open-(\d+)\}\}([\s\S]*?)\{\{wiktku-izah-close-\1\}\}/g;
var m;
while ((m = re.exec(izahLinked)) !== null) {
izahByIdx[parseInt(m[1], 10)] = m[2];
}
var withIzah = base.replace(/\{\{wiktku-izah-(\d+)\}\}/g, function (_, n) {
var linked = izahByIdx[parseInt(n, 10)];
return linked !== undefined ? "{{îzah|" + linked + "}}" : "";
});
callback(restoreCites(withIzah));
});
}
if (!hasLinkableMane) {
if (!hasIzah) {
// All filled senses are template senses (or otherwise have
// no plain text at all) — nothing here needs linkify.
callback(restoreCites(text));
return;
}
// There's no plain mane text anywhere (e.g. tercime left blank
// with only îzah filled in), so every defLine is just a bare
// template call with nothing to word-link. Sending a line
// like "# {{wiktku-izah-0}}" through the main linkify pass
// gives it no plain words to work with, makes the linkify
// gadget hang — so skip that pass entirely and run only
// the îzah pass, splicing straight into the unlinkified text.
var loadIzahOnly = function () { runIzahPass(text); };
mw.loader.using("ext.gadget.linkify", loadIzahOnly, loadIzahOnly);
return;
}
var didTryToLoad = function () {
// First pass: the main definition text (mane), same as before.
linkifyText(text, function (mainLinked) {
if (!hasIzah) {
callback(restoreCites(mainLinked));
return;
}
// Second pass: îzah glosses, linkified via their own
// separate call. Each gloss is wrapped in its own
// {{wiktku-izah-open/close-N}} pair; like the existing
// {{wiktku-cite-N}} tokens, these sit inside double
// braces so linkify leaves the tokens themselves alone —
// only the raw gloss text between each pair gets linked.
runIzahPass(mainLinked);
});
};
mw.loader.using("ext.gadget.linkify", didTryToLoad, didTryToLoad);
}
},
tewandin: {
id: "tewandin",
name: "tewandin",
question_fmt: 'Tewandina "' + pageName + '" binivîse',
visible: function (values) {
return values.lang && values.pos;
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-tewandin-wrap").length) return null;
var wrap = $("<div class='wiktku-tewandin-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-tewandin-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-tewandin-text")
.attr("rows", 4)
.attr("placeholder", "{{ku-tewîn-nav|" + pageName + "|n}}");
wrap.append(ta);
stepDiv.append(wrap);
return ta;
},
output: function (values) {
var cinsiyet = values.cinsiyet || "";
var pos = values.pos || "";
var manualText = $.trim($("#wiktku-start-tewandin .wiktku-tewandin-text").val());
if (!manualText && !pageName.includes(" ") && cinsiyet &&
GENDER_BASE_LABELS[cinsiyet] &&
(pos === "navdêr" || pos === "serenav") && values.lang === "ku") {
var out = "{{ku-tewîn-nav|" + pageName + "|" + GENDER_BASE_LABELS[cinsiyet];
if (pos === "serenav") out += "|y";
out += "}}";
return "\n==== Tewandin ====\n" + out + "\n";
}
if (manualText) {
return "\n==== Tewandin ====\n" + manualText + "\n";
}
return "";
}
},
je: makeWordListStep("je", "jê", "Kelîmeyên jê çêbûyî binivîse"),
tekildar: makeWordListStep("tekildar", "têkildar", "Kelîmeyên ji aliyê etîmolojiyê ve têkildarî vê kelîmeyê binivîse"),
binereherwiha: makeWordListStep("binereherwiha", "binêre herwiha", "Kelîmeyên din ên eleqedar binivîse"),
etym: {
id: "etym",
name: "etîmolojî",
question_fmt: "Etîmolojiya kelîmeyê binivîse",
// etymTpls populated from data.json
etymTpls: {},
visible: function (values) {
return values.lang && values.pos;
},
// Fills the insert-dropdown from the current etymTpls object.
refreshTplSelect: function () {
var sel = $("#wiktku-start-etym .wiktku-tpl-insert-select");
if (!sel.length) return;
sel.find("option[value!='']").remove();
$.each(steps.etym.etymTpls, function (name, tpl) {
sel.append($("<option></option>").val(tpl.snippet).text(name + " — " + tpl.desc));
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-etym-wrap").length) return null;
var wrap = $("<div class='wiktku-etym-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-etym-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-etym-text")
.attr("rows", 4)
.attr("placeholder", "Ji {{ji|en|ku|apple}}. yan rasterast binivîse…");
// Template insert dropdown — options also refreshed after data.json loads.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike…");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
$.each(steps.etym.etymTpls, function (name, tpl) {
sel.append($("<option></option>").val(tpl.snippet).text(name + " — " + tpl.desc));
});
sel.on("change", function () {
var snippet = $(this).val();
if (!snippet) return;
var lang = getValues().lang || "";
snippet = snippet.replace(/CODE/g, lang).replace(/SOURCELANG/g, "?");
insertAtCursor(ta[0], snippet);
$(this).val("");
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel);
wrap.append(ta);
stepDiv.append(wrap);
initSelects(wrap);
return ta;
},
output: function (values) {
var text = $.trim($("#wiktku-start-etym .wiktku-etym-text").val());
if (text) {
return "\n==== Etîmolojî ====\n" + text + "\n";
}
// No etymology entered — emit {{ji?|lang}} as a placeholder.
// Skip it only when every filled sense is a şablon sense
// a completely empty entry with no şablon chosen still gets the placeholder
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasFilledTplSense = dfnSenses.some(function (s) {
return !!s.tpl && !!s.tplTitle;
});
var hasRegularMane = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
if (hasFilledTplSense && !hasRegularMane) return "";
return "\n==== Etîmolojî ====\n{{ji?|" + values.lang + "}}\n";
} },
dunde: {
id: "dunde",
name: "dûnde",
question_fmt: "Eger ev kelîme ji vî zimanî ketibe zimanekî din, vî zimanî û kelîmeya wî binivîse",
visible: function (values) {
return !!values.pos;
},
disabledKeys: function (values) {
return {"navz": true, [values.lang]: true}
},
// Language dropdown + growing word-input list; a new row appends
// when the dropdown gets a value. Mirrors steps.trans, but flat.
buildRow: function (stepDiv) {
var row = $("<li class='wiktku-dunde-row wiktku-lang-row'></li>");
// Language selector — the searchable picker is applied after insertion into DOM.
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zimanekî bigere");
populateMenus(langSel, steps.dunde.keys || [], steps.dunde.disabledKeys);
// When a language is chosen, ensure a next empty row exists.
langSel.on("change", function () {
steps.dunde.onLangChange(stepDiv, row);
});
// Word list for this language.
var wordList = $("<ul class='wiktku-dunde-words wiktku-lang-row-words'></ul>");
var firstWord = steps.dunde.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
// The searchable picker is attached by initSelects() once the row
// is in the DOM (see onLangChange/build below).
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-dunde-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Kelîme…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-dunde-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.dunde.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (stepDiv, row) {
var list = stepDiv.find("ul.wiktku-dunde-list");
var isLast = row.is(list.children("li.wiktku-dunde-row:last-child"));
if (isLast) {
var newRow = steps.dunde.buildRow(stepDiv);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
// Keep disabled keys in sync across all lang selectors.
steps.dunde.syncDisabledKeys(stepDiv);
},
/** Disables already-selected languages in all other dropdowns. */
syncDisabledKeys: function (stepDiv) {
var taken = $.extend({}, steps.dunde.disabledKeys);
stepDiv.find("li.wiktku-dunde-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
stepDiv.find("li.wiktku-dunde-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
build: function (stepDiv) {
if (stepDiv.find("ul.wiktku-dunde-list").length) return null;
var list = $("<ul class='wiktku-dunde-list wiktku-lang-row-list'></ul>");
list.append(steps.dunde.buildRow(stepDiv));
stepDiv.append(list);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return null;
},
/** Reads all [langcode, words[]] rows from the DOM. */
getRows: function (stepDiv) {
var result = [];
stepDiv.find("li.wiktku-dunde-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-dunde-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
output: function () {
var stepDiv = $("#wiktku-start-dunde");
var rows = steps.dunde.getRows(stepDiv);
if (!rows.length) return "";
var lines = $.map(rows, function (row) {
var lang = row[0], words = row[1];
return "* {{dû|" + lang + "|" + words.join("|") + "}}";
});
return "\n==== Dûnde ====\n" + lines.join("\n") + "\n";
}
},
zarava: {
id: "zarava",
name: "bi zaravayên din",
question_fmt: "'"+ pageName + "' di zaravayên din de çawa tê gotin?",
visible: function (values) {
return steps.trans.visible(values);
},
disabledKeys: {},
buildRow: function (group) {
var row = $("<li class='wiktku-zarava-row wiktku-lang-row'></li>");
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zaravayekî bigere");
populateMenus(langSel, steps.zarava.keys || [], steps.zarava.disabledKeys);
langSel.on("change", function () {
steps.zarava.onLangChange(group, row);
});
var wordList = $("<ul class='wiktku-zarava-words wiktku-lang-row-words'></ul>");
var firstWord = steps.zarava.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-zarava-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Tercime…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-zarava-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.zarava.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (group, row) {
var list = group.find("ul.wiktku-zarava-list");
var isLast = row.is(list.children("li.wiktku-zarava-row:last-child"));
if (isLast) {
var newRow = steps.zarava.buildRow(group);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
steps.zarava.syncDisabledKeys(group);
},
/** Disables already-selected dialects in all other dropdowns within one group. */
syncDisabledKeys: function (group) {
var taken = $.extend({}, steps.zarava.disabledKeys);
group.find("li.wiktku-zarava-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
group.find("li.wiktku-zarava-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
/** Builds (or fetches) the .wiktku-zarava-group for one gloss. */
buildGroup: function (stepDiv, gi) {
var group = $("<div class='wiktku-zarava-group'></div>").attr("data-gloss-pos", gi);
var list = $("<ul class='wiktku-zarava-list wiktku-lang-row-list'></ul>");
list.append(steps.zarava.buildRow(group));
group.append(list);
stepDiv.append(group);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return group;
},
/** Syncs one .wiktku-zarava-group per current gloss (same logic as steps.trans.build). */
build: function (stepDiv) {
var glosses = steps.trans.glossList();
if (!glosses.length) {
stepDiv.find(".wiktku-zarava-group").remove();
return null;
}
var existingGroups = stepDiv.find(".wiktku-zarava-group");
if (existingGroups.length > glosses.length) {
existingGroups.slice(glosses.length).remove();
}
$.each(glosses, function (gi, gloss) {
var group = stepDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
if (!group.length) group = steps.zarava.buildGroup(stepDiv, gi);
var label = group.find(".wiktku-zarava-group-label");
if (glosses.length > 1) {
if (!label.length) {
label = $("<div class='wiktku-zarava-group-label'></div>");
group.prepend(label);
}
label.text(gloss.index + " " + gloss.text);
} else if (label.length) {
label.remove();
}
});
return null;
},
/** Reads the dialect rows for a single gloss group. */
getGroupTranslations: function (group) {
var result = [];
group.find("li.wiktku-zarava-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-zarava-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
/** Reads all rows from the DOM, grouped by gloss position. */
getTranslations: function (stepDiv) {
var result = [];
stepDiv.find(".wiktku-zarava-group").each(function () {
result.push(steps.zarava.getGroupTranslations($(this)));
});
return result;
},
output: function (values) {
if (values.lang !== "ku") return "";
var stepDiv = $("#wiktku-start-zarava");
var glosses = steps.trans.glossList();
if (!glosses.length) return "";
var blocks = $.map(glosses, function (gloss, gi) {
var group = stepDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
var rows = group.length ? steps.zarava.getGroupTranslations(group) : [];
if (!gloss.text && !rows.length) return undefined;
if (rows.length) {
rows.sort(function (a, b) {
var aLang = langsByCode[a[0]] || {};
var bLang = langsByCode[b[0]] || {};
return (aLang.sortKey || "").localeCompare(bLang.sortKey || "", "ku");
});
}
var wordLines = $.map(rows, function (row) {
var lang = row[0];
var words = row[1];
var wikiWords = words.map(function (w) {
return "{{W|" + lang + "|" + w + "}}";
}).join(", ");
return "* {{Z|" + lang + "}}: " + wikiWords;
}).join("\n");
if (!wordLines) return undefined;
var block = "{{werger-ser|" + (gloss.text || "?") + "|" + gloss.index + "}}";
block += "\n" + wordLines;
block += "\n{{werger-bin}}";
return block;
});
if (!blocks.length) return "";
return "\n==== Bi zaravayên din ====\n" + blocks.join("\n") + "\n";
}
},
trans: {
id: "trans",
name: "werger",
question_fmt: "Tercimeyên vê maneyê bi zimanên din binivîse",
visible: function (values) {
if (!(values.lang === "ku" && values.pos)) return false;
// Hide only when every sense is a filled template sense (no plain
// gloss to attach translations to). A mix, or nothing filled in
// yet, still shows Werger.
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasRealSense = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
var hasFilledTplSense = dfnSenses.some(function (s) {
return s.tpl && s.tplTitle;
});
return hasRealSense || !hasFilledTplSense;
},
disabledKeys: {
"navz": true,
"ku": true,
"ckb": true,
"sdh": true,
"lki": true,
"hac": true,
"zza": true },
// Language dropdown + growing word-input list, scoped to one gloss's
// group (each gloss has its own group and row list).
buildRow: function (group) {
var row = $("<li class='wiktku-trans-row wiktku-lang-row'></li>");
// Language selector — the searchable picker is applied after insertion into DOM.
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zimanekî bigere");
populateMenus(langSel, steps.trans.keys || [], steps.trans.disabledKeys);
// When a language is chosen, ensure a next empty row exists.
langSel.on("change", function () {
steps.trans.onLangChange(group, row);
});
// Word list for this language.
var wordList = $("<ul class='wiktku-trans-words wiktku-lang-row-words'></ul>");
var firstWord = steps.trans.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
// The searchable picker is attached by initSelects() once the row
// is in the DOM (see onLangChange/buildGroup below).
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-trans-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Tercime…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-trans-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.trans.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (group, row) {
var list = group.find("ul.wiktku-trans-list");
var isLast = row.is(list.children("li.wiktku-trans-row:last-child"));
if (isLast) {
var newRow = steps.trans.buildRow(group);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
// Keep disabled keys in sync across this gloss's lang selectors
// only — the same language can be used for different senses.
steps.trans.syncDisabledKeys(group);
},
/** Disables already-selected languages in all other dropdowns within one group. */
syncDisabledKeys: function (group) {
var taken = $.extend({}, steps.trans.disabledKeys);
group.find("li.wiktku-trans-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
group.find("li.wiktku-trans-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
// Builds (or fetches) the .wiktku-trans-group for one gloss.
buildGroup: function (stepDiv, gi) {
var group = $("<div class='wiktku-trans-group'></div>").attr("data-gloss-pos", gi);
var list = $("<ul class='wiktku-trans-list wiktku-lang-row-list'></ul>");
list.append(steps.trans.buildRow(group));
group.append(list);
stepDiv.append(group);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return group;
},
// Syncs one .wiktku-trans-group per current gloss, keyed by
// data-gloss-pos so groups stay matched across rebuilds.
build: function (stepDiv) {
var glosses = steps.trans.glossList();
if (!glosses.length) {
stepDiv.find(".wiktku-trans-group").remove();
return null;
}
// Drop groups for glosses that no longer exist (always from the
// tail — groups are only ever appended in gloss order below).
var existingGroups = stepDiv.find(".wiktku-trans-group");
if (existingGroups.length > glosses.length) {
existingGroups.slice(glosses.length).remove();
}
$.each(glosses, function (gi, gloss) {
var group = stepDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
if (!group.length) group = steps.trans.buildGroup(stepDiv, gi);
// Only label groups when there's more than one gloss to
// distinguish between — a single gloss needs no caption.
var label = group.find(".wiktku-trans-group-label");
if (glosses.length > 1) {
if (!label.length) {
label = $("<div class='wiktku-trans-group-label'></div>");
group.prepend(label);
}
label.text(gloss.index + " " + gloss.text);
} else if (label.length) {
label.remove();
}
});
return null;
},
/** Reads the translation rows for a single gloss group. */
getGroupTranslations: function (group) {
var result = [];
group.find("li.wiktku-trans-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-trans-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
// Reads all translation rows, grouped by gloss position.
getTranslations: function (stepDiv) {
var result = [];
stepDiv.find(".wiktku-trans-group").each(function () {
result.push(steps.trans.getGroupTranslations($(this)));
});
return result;
},
// Builds the numbered "{ index, gloss }" list, one per dfn sense
// with a real mane (skips template senses). index is 1-based and
// matches the sense's position in the "#" definition list.
// When nothing's filled in, returns one placeholder entry so
// Werger still has a group to attach to; when every sense is a
// filled template sense, stays empty (matches trans.visible()).
glossList: function () {
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var glosses = [];
var hasFilledTplSense = false;
$.each(dfnSenses, function (i, s) {
if (s.tpl) {
if (s.tplTitle) hasFilledTplSense = true;
return; // template sense — no gloss to caption with
}
var dfn = s.mane;
if (!dfn) {
// No mane, but other fields are filled — still gets a
// gloss group since dfn.getOutput() emits {{mane?}} for it.
if (senseHasExtraContent(s)) glosses.push({ index: i + 1, text: "" });
return;
}
if (dfn[0] !== dfn[0].toLowerCase()) dfn = decapitalize(dfn);
dfn = stripWikilinks(dfn).replace(/[.…?!)\]،؟]+$/, "");
glosses.push({ index: i + 1, text: dfn });
});
if (!glosses.length && !hasFilledTplSense) {
glosses.push({ index: 1, text: "" });
}
return glosses;
},
output: function (values) {
if (values.lang !== "ku") return "";
var stepDiv = $("#wiktku-start-trans");
var glosses = steps.trans.glossList();
// Every sense is a template sense — there's no real gloss
// anywhere and no group in the DOM either (glossList() only
// returns empty in that case), so skip the section entirely.
if (!glosses.length) return "";
// A completely empty entry (nothing filled in dfn at all, no
// şablon chosen either) still gets a placeholder Werger section
// to fill in later. Only
// skip an individual placeholder gloss below when some other
// sense actually has real content, making that particular
// placeholder redundant.
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasRegularMane = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
// Each gloss now has its own group of translation rows —
// attach every gloss's own words under its own werger-ser/-bin
// pair instead of dumping everything under the first one.
var blocks = $.map(glosses, function (gloss, gi) {
var group = stepDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
var rows = group.length ? steps.trans.getGroupTranslations(group) : [];
// Placeholder gloss (no real mane entered yet) with nothing
// translated into it. If some other sense already has real
// content, this placeholder is redundant — skip it. If the
// whole entry is empty, keep it so Werger still gets a
// section to fill in.
if (!gloss.text && !rows.length && hasRegularMane) return undefined;
if (rows.length) {
// Sort by Kurdish sort key.
rows.sort(function (a, b) {
var aLang = langsByCode[a[0]] || {};
var bLang = langsByCode[b[0]] || {};
return (aLang.sortKey || "").localeCompare(bLang.sortKey || "", "ku");
});
}
var wordLines = $.map(rows, function (row) {
var lang = row[0];
var words = row[1];
var wikiWords = words.map(function (w) {
return "{{W|" + lang + "|" + w + "}}";
}).join(", ");
return "* {{Z|" + lang + "}}: " + wikiWords;
}).join("\n");
var block = "{{werger-ser|" + (gloss.text || "?") + "|" + gloss.index + "}}";
if (wordLines) block += "\n" + wordLines;
block += "\n{{werger-bin}}";
return block;
});
if (!blocks.length) return "";
return "\n==== Werger ====\n" + blocks.join("\n") + "\n";
}
},
cavkani: {
id: "cavkani",
name: "çavkanî",
question_fmt: "Çavkaniyên din (ne jêgirtin) lê zêde bike",
visible: function (values) {
return !!values.pos;
},
// Fills the insert-dropdown from the members of [[Kategorî:Çavkanî]].
refreshTplSelect: function () {
var sel = $("#wiktku-start-cavkani .wiktku-tpl-insert-select");
if (!sel.length) return;
sel.find("option[value!='']").remove();
$.each(catSrcTemplates || [], function (_, name) {
sel.append($("<option></option>").val(name).text(name));
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-cavkani-wrap").length) return null;
var wrap = $("<div class='wiktku-cavkani-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-cavkani-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-cavkani-text")
.attr("rows", 4)
.attr("placeholder", "Şablonekî ji jêrê hilbijêre an rasterast binivîse…");
// Template insert dropdown, populated from [[Kategorî:Çavkanî]] —
// options refreshed once the category members are fetched.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike…");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
var status = $("<span class='wiktku-cavkani-status'></span>");
sel.on("change", function () {
var name = $(this).val();
if (!name) return;
insertAtCursor(ta[0], "\n* {{" + name + "}}");
$(this).val("");
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel);
wrap.append(status).append(ta);
stepDiv.append(wrap);
// build() runs again for every new beş (see the "+ Beş zêde bike"
// handler), after the initial page-wide pass — so this select needs
// its own init or it stays a plain, unsearchable native <select>.
initSelects(wrap);
// Populate only now: refreshTplSelect() looks the select up by id
// under #wiktku-start-cavkani, so running it before the wrap was
// appended found nothing and bailed out — which left the dropdown
// empty on every beş after the first, once the category members
// were already cached.
if (catSrcTemplates) {
steps.cavkani.refreshTplSelect();
} else {
status.text("Şablon tên barkirin…");
fetchCatSrcTemplates().then(function () {
steps.cavkani.refreshTplSelect();
status.text("");
}, function () {
status.text("Şablon nehatin barkirin.");
});
}
return ta;
},
output: function () {
var text = $.trim($("#wiktku-start-cavkani .wiktku-cavkani-text").val());
if (!text) return "";
return "\n==== Çavkanî ====\n" + text + "\n";
}
},
};
steps.trans.keys = steps.lang.choices;
steps.dunde.keys = steps.lang.choices;
steps.zarava.keys = getZaravaKeys(steps.lang.choices);
var ordered_steps = [
steps.lang, steps.pron, steps.pos, steps.cinsiyet, steps.lektur, steps.tr,
steps.dfn, steps.tewandin, steps.je, steps.tekildar,
steps.etym, steps.dunde, steps.binereherwiha, steps.zarava, steps.trans, steps.cavkani];
// Step ids that belong to each section (not shared across sections).
var PER_SECTION_STEP_IDS = [
"pos", "cinsiyet", "lektur", "tr",
"dfn", "tewandin", "je", "tekildar", "etym", "dunde", "binereherwiha", "zarava", "trans", "cavkani"
];
// ── Multi-section state ──────────────────────────────────────────────────
// Each entry is a plain snapshot: { pos, cinsiyet, lektur, tr, dfn (senses[]),
// je, tekildar, binereherwiha, trans (rows[]) }.
var sections = [{}]; // section 0 starts empty (DOM is the truth)
var activeSection = 0;
function snapshotDfn() {
return steps.dfn.getSenses($("#wiktku-start-dfn"));
}
// Rebuilds the dfn DOM from a previously snapshotted senses array.
function restoreDfn(senses) {
var stepDiv = $("#wiktku-start-dfn");
// Tear down the existing list so build() recreates it cleanly.
stepDiv.find("ol.wiktku-dfn-list").remove();
steps.dfn.build(stepDiv);
var list = stepDiv.find("ol.wiktku-dfn-list");
$.each(senses, function (i, sense) {
// Ensure enough blocks exist (build() seeds one).
var blocks = list.find("li.wiktku-dfn-sense");
var block = blocks.eq(i);
if (!block.length) {
var nb = steps.dfn.buildSenseBlock(stepDiv);
list.append(nb);
block = list.find("li.wiktku-dfn-sense").last();
}
// Template selector.
block.find("select.wiktku-dfn-tpl-select").val(sense.tpl || "");
if (sense.tpl) {
block.find("textarea.wiktku-dfn-mane").hide();
block.find("input.wiktku-dfn-tpl-title").val(sense.tplTitle || "").show();
} else {
block.find("textarea.wiktku-dfn-mane").val(sense.mane || "").show();
block.find("input.wiktku-dfn-tpl-title").hide().val("");
}
// dfnArea is the only thing actually saved, so split it back into
// tercime/îzah for editing (mirrors syncNonKuToMane's join format).
var maneParts = splitTercimeIzah(sense.mane);
block.find(".wiktku-dfn-tercime").val(maneParts ? maneParts.tercime : (sense.mane || ""));
block.find(".wiktku-dfn-izah").val(maneParts ? maneParts.izah : "");
// Re-sync the formên alternatîv/hevmane/… hide state now that
// tplSelect's value was set (its own "change"
// handler doesn't fire from .val(), so this doesn't happen otherwise).
var updateVis = block.data("updateFieldVisibility");
if (updateVis) updateVis();
// Same for the mane-box mode (plain vs tercime+îzah), since this
// also depends on tplSelect's (and lang's) value.
var updateMane = block.data("updateManeMode");
if (updateMane) updateMane();
// Restore a sub-list (etiket, formên alternatîv, hevmane …) from a values array.
function restoreSubList(cls, values) {
if (!values || !values.length) return;
var groupDiv = block.find("." + cls + "-group");
var subList = groupDiv.find("ol, ul").first();
if (!subList.length) return; // group not found
// Fill existing items, append new ones as needed.
$.each(values, function (j, val) {
var items = subList.find("li");
if (j < items.length) {
items.eq(j).find("textarea").val(val);
} else {
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-restore-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.val(val);
ta.on("input", function () {
steps.dfn.onSubInput(subList, this, 1, true);
});
subList.append($("<li></li>").append(ta));
}
});
}
// Reveal and populate lazy groups that have data.
var lazyMap = {
"wiktku-dfn-etiket": sense.etiket,
"wiktku-dfn-kategori": sense.kategori,
"wiktku-dfn-alternativ": sense.alternativ,
"wiktku-dfn-hevmane": sense.hevmane,
"wiktku-dfn-dijmane": sense.dijmane,
"wiktku-dfn-koordine": sense.koordine,
"wiktku-dfn-jornav": sense.jornav,
"wiktku-dfn-jernav": sense.jernav
};
$.each(lazyMap, function (cls, vals) {
if (vals && vals.length) restoreSubList(cls, vals);
});
// Nimûne items are objects { text, tr?, t? } — restore using the builder.
if (sense.nimune && sense.nimune.length) {
var nimuneGroupDiv = block.find(".wiktku-dfn-nimune-group");
var nimuneList = nimuneGroupDiv.find("ol.wiktku-dfn-nimune-list");
var buildFn = nimuneGroupDiv.data("buildNimuneLi");
nimuneList.empty();
$.each(sense.nimune, function (_, n) {
var text = typeof n === "object" ? (n.text || "") : n;
if (!text) return;
var li = buildFn ? buildFn() : $("<li class='wiktku-dfn-nimune-li'></li>");
li.find(".wiktku-dfn-nimune-text").val(text).each(function () { highlightLinebreak(this); });
if (n.tr) li.find(".wiktku-dfn-nimune-tr").val(n.tr);
if (n.t) li.find(".wiktku-dfn-nimune-t").val(n.t);
nimuneList.append(li);
});
// Always leave a blank trailing item.
if (buildFn) nimuneList.append(buildFn());
}
// Restore jêder entries — accepts current array shape or a legacy
// single object (older saved sections) for backwards compat.
var jederArr = $.isArray(sense.jeder) ? sense.jeder : (sense.jeder ? [sense.jeder] : []);
if (jederArr.length) {
var jederGroupDiv = block.find(".wiktku-dfn-jeder-group");
var jederList = jederGroupDiv.find("ol.wiktku-dfn-jeder-list");
var buildJederFn = jederGroupDiv.data("buildJederLi");
jederList.empty();
$.each(jederArr, function (_, j) {
if (!j || !j.quote) return;
var li = buildJederFn ? buildJederFn() : $("<li class='wiktku-dfn-jeder-li'></li>");
li.find(".wiktku-dfn-nimune-quote").val(j.quote).each(function () { highlightLinebreak(this); });
if (j.quoteTr) li.find(".wiktku-dfn-nimune-quote-tr").val(j.quoteTr);
if (j.quoteT) li.find(".wiktku-dfn-nimune-quote-t").val(j.quoteT);
if (j.jederManual) {
var manualSel = li.find(".wiktku-dfn-quote-src-sel");
manualSel.val("__manual__").trigger("change");
li.find(".wiktku-dfn-quote-src-manual").val(j.jederManual);
} else if (j.jederCatTpl) {
// Legacy format from before the şablon search switched rows to
// manual mode directly — convert it the same way now, so it's
// editable like any other free-form source.
var catSelEl = li.find(".wiktku-dfn-quote-src-sel");
catSelEl.val("__manual__").trigger("change");
li.find(".wiktku-dfn-quote-src-manual").val("{{" + j.jederCatTpl + "}}");
} else if (j.jederTpl) {
var srcSel = li.find(".wiktku-dfn-quote-src-sel");
srcSel.val(j.jederTpl).trigger("change");
if (j.jêderFields) {
$.each(j.jêderFields, function (key, val) {
li.find(".wiktku-dfn-quote-src-input[data-field-key='" + key + "']").val(val);
});
}
}
jederList.append(li);
});
// Always leave a blank trailing item, same as Nimûne.
if (buildJederFn) jederList.append(buildJederFn());
}
});
}
// Snapshots simple (non-dfn) per-section steps from the DOM into obj.
function saveCurrentSection() {
var snap = {};
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
snap.dfn = snapshotDfn();
return;
}
if (id === "etym") {
snap.etym = $.trim($("#wiktku-start-etym .wiktku-etym-text").val());
return;
}
if (id === "cavkani") {
snap.cavkani = $.trim($("#wiktku-start-cavkani .wiktku-cavkani-text").val());
return;
}
var step = steps[id];
if (!step) return;
var stepDiv = $("#wiktku-start-" + id);
if (id === "trans") {
snap.trans = steps.trans.getTranslations(stepDiv);
return;
}
if (id === "zarava") {
snap.zarava = steps.zarava.getTranslations(stepDiv);
return;
}
if (id === "dunde") {
snap.dunde = steps.dunde.getRows(stepDiv);
return;
}
// Generic: read all step fields.
var fields = stepDiv.find(".wiktku-start-step-field");
if (step.multiple) {
snap[id] = fields.map(function () { return $(this).val(); }).get();
} else {
snap[id] = fields.val();
}
});
sections[activeSection] = snap;
}
// Restores a previously saved snapshot into the form DOM.
function restoreSection(snap) {
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
restoreDfn(snap.dfn || []);
return;
}
if (id === "etym") {
$("#wiktku-start-etym .wiktku-etym-wrap").remove();
steps.etym.build($("#wiktku-start-etym"));
$("#wiktku-start-etym .wiktku-etym-text").val(snap.etym || "");
return;
}
if (id === "cavkani") {
$("#wiktku-start-cavkani .wiktku-cavkani-wrap").remove();
steps.cavkani.build($("#wiktku-start-cavkani"));
$("#wiktku-start-cavkani .wiktku-cavkani-text").val(snap.cavkani || "");
return;
}
if (id === "trans") {
// Rebuild trans groups (dfn must already be restored by this
// point in the $.each loop, so glossList() reflects it).
var transDiv = $("#wiktku-start-trans");
transDiv.find(".wiktku-trans-group").remove();
steps.trans.build(transDiv);
var groupsSnap = snap.trans || [];
$.each(groupsSnap, function (gi, rows) {
var group = transDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
if (!group.length) return; // gloss no longer exists — drop its rows
var list = group.find("ul.wiktku-trans-list");
$.each(rows, function (j, row) {
var lang = row[0], words = row[1];
var lastRow = list.find("li.wiktku-trans-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-trans-words");
$.each(words, function (k, word) {
var wordItems = wordList.find("li");
if (k < wordItems.length) {
wordItems.eq(k).find("textarea").val(word);
} else {
// .val() below doesn't fire "input", so the normal
// auto-grow never runs — append a matching item
// ourselves instead of silently dropping the word.
var extraInput = steps.trans.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
// Leave one trailing empty field so the row can still grow
// when the user types, matching a freshly-built row.
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.trans.makeWordInput()));
}
});
});
return;
}
if (id === "zarava") {
// Rebuild zarava groups (dfn must already be restored by this
// point in the $.each loop, so glossList() reflects it).
var zaravaDiv = $("#wiktku-start-zarava");
zaravaDiv.find(".wiktku-zarava-group").remove();
steps.zarava.build(zaravaDiv);
var zaravaGroupsSnap = snap.zarava || [];
$.each(zaravaGroupsSnap, function (gi, rows) {
var group = zaravaDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
if (!group.length) return; // gloss no longer exists — drop its rows
var list = group.find("ul.wiktku-zarava-list");
$.each(rows, function (j, row) {
var lang = row[0], words = row[1];
var lastRow = list.find("li.wiktku-zarava-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-zarava-words");
$.each(words, function (k, word) {
var wordItems = wordList.find("li");
if (k < wordItems.length) {
wordItems.eq(k).find("textarea").val(word);
} else {
var extraInput = steps.zarava.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.zarava.makeWordInput()));
}
});
});
return;
}
if (id === "dunde") {
// Rebuild dunde rows.
var dundeDiv = $("#wiktku-start-dunde");
dundeDiv.find("ul.wiktku-dunde-list").remove();
steps.dunde.build(dundeDiv);
var dundeRows = snap.dunde || [];
$.each(dundeRows, function (i, row) {
var lang = row[0], words = row[1];
var list = dundeDiv.find("ul.wiktku-dunde-list");
var lastRow = list.find("li.wiktku-dunde-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-dunde-words");
$.each(words, function (j, word) {
var wordItems = wordList.find("li");
if (j < wordItems.length) {
wordItems.eq(j).find("textarea").val(word);
} else {
// .val() below doesn't fire "input", so the normal
// auto-grow never runs — append a matching item
// ourselves instead of silently dropping the word.
var extraInput = steps.dunde.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
// Leave one trailing empty field so the row can still grow
// when the user types, matching a freshly-built row.
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.dunde.makeWordInput()));
}
});
return;
}
var step = steps[id];
if (!step) return;
var stepDiv = $("#wiktku-start-" + id);
var fields = stepDiv.find(".wiktku-start-step-field");
var val = snap[id];
if (val === undefined || val === null) return;
if (step.multiple) {
var arr = val;
fields.each(function (i) {
if (i < arr.length) $(this).val(arr[i]);
});
} else {
fields.val(val);
}
// Tell the pickers about the programmatic value change.
fields.filter("select").trigger("wiktku:refresh");
});
}
function getWikitextForCurrentSection(callback) {
var values = getValues();
var entry = steps.pos.output(values);
steps.dfn.getOutput(values, function (output) {
entry += output;
entry += steps.tewandin.output(values);
entry += steps.je.output(values);
entry += steps.tekildar.output(values);
entry += steps.etym.output(values);
entry += steps.dunde.output(values);
entry += steps.binereherwiha.output(values);
entry += steps.zarava.output(values);
entry += steps.trans.output(values);
entry += steps.cavkani.output(values);
callback(entry, values);
});
}
function getWikitextAllSections(callback) {
saveCurrentSection();
var results = new Array(sections.length);
var sharedValues = getValues(); // lang/pron are shared
function processSection(i) {
if (i >= sections.length) {
// All done — restore original active section.
restoreSection(sections[activeSection]);
refresh();
callback(results, sharedValues);
return;
}
restoreSection(sections[i]);
refresh();
getWikitextForCurrentSection(function (sectionText) {
results[i] = sectionText;
processSection(i + 1);
});
}
processSection(0);
}
// Assembles wikitext for all sections plus the shared lang/pron header.
function getWikitext(callback) {
getWikitextAllSections(function (sectionTexts, sharedValues) {
var entry = steps.lang.output(sharedValues);
entry += steps.pron.output(sharedValues);
entry += sectionTexts.join("\n");
// Edit summary uses section 0's values. Read from the saved snapshot
// (not the live DOM) so it doesn't mix section 0's pos with whichever
// section happens to be active/restored at this point.
var dfnSenses = (sections[0] && sections[0].dfn) || [];
var dfnSummary = dfnSenses.map(function (s) {
if (s.mane) return s.mane;
// Template sense (e.g. {{guharto|ku|somepage}}) — same
// construction as the tplCall built in getOutput, so the
// summary shows what actually gets written to the entry
// instead of going blank.
if (s.tpl && s.tplTitle) {
return s.tplNoLang
? "{{" + s.tpl + "|" + s.tplTitle + "}}"
: "{{" + s.tpl + "|" + sharedValues.lang + "|" + s.tplTitle + "}}";
}
return "";
}).filter(Boolean).join("; ");
var summary = "([[Mediawiki:Gadget-start.js|WF:NÛ]] v.2.0) +" +
sharedValues.lang + ":" + sections[0].pos + ":" + dfnSummary;
var summaryField = document.getElementById("wpSummary");
if (addLangMode && summaryField.value) {
summary = summaryField.value + " " + summary;
}
summaryField.value = summary;
callback(entry);
});
}
var continueBtn;
function getValuesForStep(stepId) {
var fields = $("#wiktku-start-" + stepId + " .wiktku-start-step-field");
var step = steps[stepId];
if (step.keys) {
var values = {};
fields.each(function (i, field) {
var key = $(field).prevAll(".wiktku-start-step-keyfield").val();
if (key) values[key] = $(field).val();
});
return values;
}
else if (step.multiple) {
return fields.map(function () {
return $(this).val();
}).get();
}
return fields.val();
}
function getValues() {
var values = {};
$.each(steps, function (stepId) {
values[stepId] = getValuesForStep(stepId);
});
return values;
}
function populateMenus(inputs, choices, disabledValues, placeholderText) {
if (!disabledValues) disabledValues = {};
var vals = inputs.map(function (i, input) {
return $(input).val();
});
inputs.empty();
inputs.append($("<option></option>").text(placeholderText || ""));
$.each(choices, function (j, choice) {
// Append the language code in parentheses so that typing a code
// (e.g. "ku") in the search box still finds the language name.
var displayText = capitalize(choice.label);
if (choice.sortKey !== undefined) {
// This is a language choice {code, label, sortKey} — show code.
displayText = capitalize(choice.label) + " (" + choice.code + ")";
}
var option = $(mw.html.element("option", {
value: choice.code }, displayText));
if (disabledValues[choice.code]) option.prop("disabled", true);
inputs.append(option);
});
inputs.val(function (i) {
return vals[i];
});
}
// Keys to disable for a key menu: already-taken or explicitly disabled.
function getDisabledKeys(step) {
var occupiedKeys = {};
$("#wiktku-start-" + step.id + " .wiktku-start-step-keyfield").each(function () {
occupiedKeys[$(this).val()] = true;
});
if (step.disabledKeys) $.extend(occupiedKeys, step.disabledKeys);
return occupiedKeys;
}
function buildKeyInput(step) {
if (!step.keys) return undefined;
var input = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
input.attr("data-placeholder", "Hilbijêre " + step.keyName);
populateMenus(input, step.keys, getDisabledKeys(step));
// Keep the key menus mutually exclusive: whatever one row selects is
// disabled in every other row. Recomputed from the DOM on each change.
input.on("change", function () {
var all = $("#wiktku-start-" + step.id + " .wiktku-start-step-keyfield");
var taken = {};
all.each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
all.not(this).each(function () {
var self = $(this), own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (code) $(this).prop("disabled", !!taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
});
// Return the wrapper; the select lives inside it and still fires change.
return wrapNativeSelect(input);
}
// Adds another text field to the list if the last one now has text.
function refreshForTextField(currentInput, step) {
currentInput = $(currentInput);
var value = currentInput.val();
var item = currentInput.parent();
if (value && !item.next("li").length) {
var nextInput = $("<textarea></textarea>")
.attr("name", "wiktku-field-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", currentInput.attr("class"))
.attr("rows", currentInput.attr("rows") || 1);
if (step.placeholder) nextInput.attr("placeholder", step.placeholder);
nextInput.on("input", function (evt) {
refreshForTextField(evt.target, step);
});
var nextKeyInput = buildKeyInput(step);
var nextItem = $("<li></li>").append(nextKeyInput).append(nextInput);
item.parent().append(nextItem);
if (nextKeyInput) initSelects(nextItem);
}
var canContinue = !continueBtn.isDisabled();
if ((value && !canContinue) || (!value && canContinue)) {
refresh(step);
}
}
function prepareInput(input, step) {
if (!input) return;
if (step.required) input.prop('required', true);
input.change(step, refresh);
}
// Shows/hides steps based on whether their prerequisites are met, and
// updates placeholders where applicable.
function refresh(evt) {
var values = getValues();
var changedStep = evt && evt.data;
var didFocus = false;
var canContinue = true;
// Re-filter template options in every sense block whenever lang changes.
$("#wiktku-start-dfn .wiktku-dfn-tpl-select").each(function () {
var fn = $(this).data("updateOptions");
if (typeof fn === "function") fn();
});
// Re-filter pronunciation and etymology template dropdowns when language changes.
steps.pron.refreshTplSelect();
steps.etym.refreshTplSelect();
steps.cavkani.refreshTplSelect();
// Re-render any step's question label that depends on current values
// (e.g. dfn's Werger-section reminder, which only applies to ku).
$.each(steps, function (stepId, step) {
if (typeof step.question_fmt === "function") {
$("#wiktku-start-" + stepId + " .wiktku-start-step-question")
.text(step.question_fmt(values));
}
});
// Sync every sense block's mane-box mode (plain mane vs tercime+îzah)
// to the current language, in case lang changes after blocks exist.
$("#wiktku-start-dfn li.wiktku-dfn-sense").each(function () {
var updateMane = $(this).data("updateManeMode");
if (updateMane) updateMane();
});
// Sync tr/t sub-fields in every nimûne item to the current language.
// tr shown when language needs transliteration; t shown when lang !== "ku".
(function () {
var lang = values.lang || "";
var showTr = needsTransliteration(lang);
var showT = lang && lang !== "ku";
$("#wiktku-start-dfn .wiktku-dfn-nimune-list li.wiktku-dfn-nimune-li").each(function () {
var li = $(this);
// Ensure the sub-wrapper exists when we need it.
var subWrap = li.find(".wiktku-dfn-nimune-sub");
// tr field
var trTa = li.find(".wiktku-dfn-nimune-tr");
if (showTr && !trTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
li.append(subWrap);
}
trTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-tr")
.attr("placeholder", "Transliterasyon…");
subWrap.prepend(trTa);
} else if (!showTr && trTa.length) {
trTa.remove();
}
// t field
var tTa = li.find(".wiktku-dfn-nimune-t");
if (showT && !tTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
li.append(subWrap);
}
tTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-t")
.attr("placeholder", "Tercimeya nimûneyê bi kurmancî…");
subWrap.append(tTa);
} else if (!showT && tTa.length) {
tTa.remove();
}
// Remove the wrapper if it ended up empty.
subWrap = li.find(".wiktku-dfn-nimune-sub");
if (subWrap.length && !subWrap.children().length) subWrap.remove();
});
}());
// Sync tr/t sub-fields in every jêder citation to the current language.
// tr shown when language needs transliteration; t shown when lang !== "ku".
(function () {
var lang = values.lang || "";
var showTr = needsTransliteration(lang);
var showT = lang && lang !== "ku";
$("#wiktku-start-dfn .wiktku-dfn-jeder-list li.wiktku-dfn-jeder-li").each(function () {
var li = $(this);
// Ensure the sub-wrapper exists when we need it. It must sit right
// after the quote textarea and before the source selector.
var subWrap = li.find(".wiktku-dfn-quote-sub");
// tr field
var trTa = li.find(".wiktku-dfn-nimune-quote-tr");
if (showTr && !trTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
// Insert after the quote textarea's resize-wrap (if the manual
// resize handle has already been attached to it), not after the
// bare textarea -- otherwise this lands *inside* that wrap,
// between the textarea and its own grip, breaking jêgirtin's
// handle and nesting the tr/t boxes inside it.
var quoteTa = li.find(".wiktku-dfn-nimune-quote");
var quoteResizeWrap = quoteTa.closest(".wiktku-resize-wrap");
(quoteResizeWrap.length ? quoteResizeWrap : quoteTa).after(subWrap);
}
trTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-tr")
.attr("placeholder", "Transliterasyona jêgirtinê…");
subWrap.prepend(trTa);
} else if (!showTr && trTa.length) {
trTa.remove();
}
// t field
var tTa = li.find(".wiktku-dfn-nimune-quote-t");
if (showT && !tTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
// See the tr-field branch above for why this targets the
// resize-wrap instead of the bare textarea.
var quoteTa2 = li.find(".wiktku-dfn-nimune-quote");
var quoteResizeWrap2 = quoteTa2.closest(".wiktku-resize-wrap");
(quoteResizeWrap2.length ? quoteResizeWrap2 : quoteTa2).after(subWrap);
}
tTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-t")
.attr("placeholder", "Tercimeya jêgirtinê bi kurmancî…");
subWrap.append(tTa);
} else if (!showT && tTa.length) {
tTa.remove();
}
// Remove the wrapper if it ended up empty.
subWrap = li.find(".wiktku-dfn-quote-sub");
if (subWrap.length && !subWrap.children().length) subWrap.remove();
});
}());
$.each(steps, function (stepId, step) {
if (typeof(step.visible) === "function" && !step.visible(values)) {
$("#wiktku-start-" + stepId).slideUp();
}
else {
var stepDiv = $("#wiktku-start-" + stepId);
if (changedStep !== step && typeof(step.build) === "function") {
prepareInput(step.build(stepDiv, values), step);
}
var input = stepDiv.find(".wiktku-start-step-field");
if (typeof(step.example) === "function") {
// .find() above already reaches nested fields (e.g. the dfn
// step's mane textareas inside each sense block), so one
// assignment covers every step; dfn keeps its own fallback.
var exampleText = step.example(values) || (step.id === "dfn" ? "Mane…" : "");
input.attr("placeholder", exampleText);
}
var didSlideDown;
if (!didFocus && stepDiv.css("display") === "none" && step.required) {
// Skip scrolling for the first section (ziman) since it's
// always at the top of the page.
if (step.id !== "lang") {
didSlideDown = function (evt) {
var stepEl = stepDiv.get(0);
if (stepEl && typeof stepEl.scrollIntoView === "function") {
stepEl.scrollIntoView({ behavior: "smooth", block: "start" });
}
};
}
didFocus = true;
}
stepDiv.slideDown(didSlideDown);
}
if (step.required &&
(values[stepId] === "" ||
(step.multiple && values[stepId].join("") === ""))) {
canContinue = false;
}
});
continueBtn.setDisabled(!canContinue);
}
function destroy() {
$("#wiktku-start-form, .noafterwizard").slideUp(function () {
$(this).remove();
});
$(".noarticletext .nowizard, #editform").slideDown();
$("#ca-edit").removeClass("selected");
$("#ca-wiktku-nowizard").addClass("selected");
}
// Priority order for Kurdish dialects and navz.
// Codes listed here come before all other languages; unlisted codes
// are sorted alphabetically by their display name via localeCompare.
var LANG_PRIORITY = ["navz", "ku", "hac", "sdh", "lki", "ckb", "zza"];
// Inserts a new "== {{ziman|code}} ==" section at the correct sorted
// position: navz, then ku/hac/sdh/lki/ckb/zza, then alphabetical by name.
function insertNewLangSection(existing, wikitext) {
var newCodeMatch = wikitext.match(new RegExp("^" + langHeaderSource("[^}]+")));
var newCode = newCodeMatch ? newCodeMatch[1] : "";
var sections = [];
var preamble = "";
var anyHeaderSrc = langHeaderSource("[^}]+");
var firstMatch = new RegExp("^" + anyHeaderSrc, "m").exec(existing);
if (!firstMatch) {
// No existing lang sections at all — just append.
var sep = existing && !/\n\s*$/.test(existing) ? "\n\n" : "";
return existing + sep + wikitext;
}
// Everything before the first == {{ziman|...}} == is the preamble.
var firstSectionStart = firstMatch.index;
// Walk back to the start of that line.
var lineStart = existing.lastIndexOf("\n", firstSectionStart - 1);
var preambleEnd = lineStart !== -1 ? lineStart + 1 : 0;
preamble = existing.slice(0, preambleEnd);
// Parse each language section: header line + everything until the next header.
var body = existing.slice(preambleEnd);
// (?![\s\S]) matches only true end-of-string, since a bare "$" with
// /m would stop at the section's first line break instead.
var langSectionRe = new RegExp(
"^(" + anyHeaderSrc + "\\n?)([\\s\\S]*?)(?=\\n" + anyHeaderSrc + "|(?![\\s\\S]))",
"gm"
);
var m;
while ((m = langSectionRe.exec(body)) !== null) {
sections.push({
code: m[2],
content: m[0] // full text of this section including header
});
}
// Determine sort rank: priority list first (by index), then alphabetical.
function getLangName(code) {
var entry = langsByCode[code];
return entry ? entry.label : code;
}
function sortRank(code) {
var idx = LANG_PRIORITY.indexOf(code);
return idx !== -1 ? idx : LANG_PRIORITY.length;
}
function compareLangs(a, b) {
var ra = sortRank(a), rb = sortRank(b);
if (ra !== rb) return ra - rb;
// Both are outside priority list — sort by display name.
return getLangName(a).localeCompare(getLangName(b), userLang);
}
// Insert the new section into the sorted list.
var newSection = { code: newCode, content: wikitext };
var inserted = false;
for (var i = 0; i < sections.length; i++) {
if (compareLangs(newCode, sections[i].code) < 0) {
sections.splice(i, 0, newSection);
inserted = true;
break;
}
}
if (!inserted) sections.push(newSection);
// Re-join: preamble + sections separated by newlines.
var joined = sections.map(function (s) {
// Ensure each section ends with exactly one newline before the next.
return s.content.replace(/\n+$/, "");
}).join("\n");
return preamble + joined + "\n";
}
function build() {
$(".nowizard, .nowizard .noafterwizard").hide();
var callToAction = $("#wiktku-calltoaction");
var origCallToActionText = callToAction.text();
$(mw.util.addPortletLink("p-views", "#", "Edîtora çavkaniyê veke",
"ca-wiktku-nowizard", "Vê rûpelê bi edîtora çavkaniyê çêke",
undefined, "#ca-watch")).click(function (evt) {
evt.preventDefault();
callToAction.text(origCallToActionText);
destroy();
});
if (callToAction.length) {
callToAction.text(origCallToActionText +
" Forma li jêr ji bo çêkirina madeyeke nû bi kar bîne.");
}
var startForm = $("<form id='wiktku-start-form'></form>");
var clearPageCheck = null;
if (addLangMode) {
startForm.append($("<p class='wiktku-addlang-notice'></p>").html(
"Bi vê formê tu yê zimanekî nû li rûpelê îlawe bikî. Eger ev ziman jixwe hebe, beşa nû li dawiya vî zimanî dê were îlawekirin. " +
"Ji kerema xwe netîceya dawî kontrol bike, eger problemek derkeve, li <a href='" +
mw.util.getUrl('Mediawiki talk:Gadget-start.js') +
"'>nîqaşa vê amûrê</a> problemê ragihîne."
));
clearPageCheck = $("<input type='checkbox' id='wiktku-clear-page-check'>");
var clearPageLabel = $("<label for='wiktku-clear-page-check'></label>")
.text(" Muhtewaya rûpelê paqij bike (her tiştî jê bibe û rûpelê ji nû ve binivîse)");
startForm.append(
$("<p class='wiktku-addlang-notice'></p>")
.append(clearPageCheck)
.append(clearPageLabel)
);
// Re-evaluate step visibility (e.g. the pron step) whenever this
// is toggled, since it changes what counts as "existing content".
clearPageCheck.on("change", function () {
refresh();
});
}
var spinner;
// Tab bar for switching between POS sections.
var sectionTabsDiv = $("<div id='wiktku-section-tabs'></div>");
startForm.submit(function (evt) {
evt.preventDefault();
continueBtn.setDisabled(true);
continueBtn.$element.addClass("wiktku-btn-sending");
spinner.show();
getWikitext(function (wikitext) {
if (addLangMode && clearPageCheck && clearPageCheck.prop("checked")) {
// User asked to wipe the page and start fresh — just
// write the newly generated wikitext as the full content.
$("#wpTextbox1").val(wikitext);
} else if (addLangMode) {
var textbox = $("#wpTextbox1");
var existing = textbox.val() || "";
// If this language's section already exists (whitespace
// differences aside), merge into it; otherwise insert new.
var langHeaderMatch = wikitext.match(new RegExp("^(" + langHeaderSource("[^}]+") + "\\n)"));
if (langHeaderMatch) {
var langHeader = langHeaderMatch[1]; // e.g. "== {{ziman|ku}} ==\n"
var newCode = langHeaderMatch[2];
var existingHeader = findLangHeader(existing, newCode);
if (existingHeader) {
// Strip the header from the new output.
var newContent = wikitext.slice(langHeader.length);
// Find the insertion point: end of the existing lang section.
// A new L2 heading marks the start of the next language block.
var searchFrom = existingHeader.index + existingHeader.match.length;
// Find the next == … == heading after this section's start.
var nextL2 = existing.indexOf("\n== ", searchFrom);
var insertAt = nextL2 !== -1 ? nextL2 : existing.length;
// Ensure there's a blank line before the inserted block.
var before = existing.slice(0, insertAt);
var after = existing.slice(insertAt);
var sep = /\n\s*$/.test(before) ? "" : "\n";
textbox.val(before + sep + newContent + after);
} else {
// New language — insert at the correct sorted position.
textbox.val(insertNewLangSection(existing, wikitext));
}
} else {
// Unexpected format — insert at sorted position anyway.
textbox.val(insertNewLangSection(existing, wikitext));
}
} else {
$("#wpTextbox1").val(wikitext);
}
$("html, body").animate({scrollTop: 0});
callToAction.text("Hindik ma!");
$("#wiktku-preview-container").remove();
destroy();
});
});
$.each(ordered_steps, function (i, step) {
var stepDiv = $(mw.html.element("div", {
"class": "wiktku-start-step",
id: "wiktku-start-" + step.id }));
var name = capitalize(step.name);
stepDiv.append($(mw.html.element("h3", {
"class": "wiktku-start-step-name" }, new mw.html.Raw(mw.html.element("label", {
"for": "wiktku-start-" + step.id + "-field" }, name)))));
if (step.question_fmt) {
// question_fmt can be a plain string, or a function of the
// current values (used by steps whose question text depends
// on e.g. the chosen language) — refresh() keeps it in sync
// afterwards via the .wiktku-start-step-question class.
var questionText = typeof step.question_fmt === "function"
? step.question_fmt(getValues())
: step.question_fmt;
stepDiv.append($(mw.html.element("label", {
"class": "wiktku-start-step-question",
"for": "wiktku-start-" + step.id + "-field" }, questionText)));
if (step.question_br) stepDiv.append($("<br>"));
}
var input;
if (step.choices) {
input = $(mw.html.element("select", {
"class": "wiktku-start-step-field",
id: "wiktku-start-" + step.id + "-field" }));
input.attr("data-placeholder",
capitalize(step.name) + " hilbijêre ");
populateMenus(input, step.choices);
if (step.multiple) input.attr("multiple", true);
// initSelects() runs over the whole form once it is in the DOM.
stepDiv.append(input);
} else if (typeof(step.build) === "function") {
input = step.build(stepDiv);
} else {
input = $("<textarea></textarea>")
.attr("class", "wiktku-start-step-field")
.attr("id", "wiktku-start-" + step.id + "-field")
.attr("rows", step.rows || 2);
if (step.narrow) input.addClass("wiktku-start-narrow");
if (step.placeholder) input.attr("placeholder", step.placeholder);
if (step.multiple) {
input.on("input", function (evt) {
refreshForTextField(evt.target, step);
});
var keyInput = buildKeyInput(step);
var list = $(step.ordered ? "<ol></ol>" : "<ul></ul>")
.append($("<li></li>").append(keyInput).append(input));
stepDiv.append(list);
}
else stepDiv.append(input);
}
prepareInput(input, step);
stepDiv.hide();
// Insert tab bar just before the first per-section step.
if (step.id === "pos") startForm.append(sectionTabsDiv);
startForm.append(stepDiv);
});
// ── Section tab helpers ──────────────────────────────────────────────
// ── Add-section button — lives in the tab bar, disabled until pos chosen ──
var addSectionBtn = new OO.ui.ButtonWidget({
label: "+ Beş zêde bike",
disabled: true
});
addSectionBtn.on("click", function () {
saveCurrentSection();
sections.push({});
activeSection = sections.length - 1;
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
var stepDiv = $("#wiktku-start-dfn");
stepDiv.find("ol.wiktku-dfn-list").remove();
steps.dfn.build(stepDiv);
return;
}
if (id === "etym") {
$("#wiktku-start-etym .wiktku-etym-wrap").remove();
steps.etym.build($("#wiktku-start-etym"));
return;
}
if (id === "cavkani") {
$("#wiktku-start-cavkani .wiktku-cavkani-wrap").remove();
steps.cavkani.build($("#wiktku-start-cavkani"));
return;
}
if (id === "trans") {
var transDiv = $("#wiktku-start-trans");
transDiv.find(".wiktku-trans-group").remove();
return;
}
if (id === "zarava") {
var zaravaDiv = $("#wiktku-start-zarava");
zaravaDiv.find(".wiktku-zarava-group").remove();
return;
}
if (id === "dunde") {
var dundeDiv = $("#wiktku-start-dunde");
dundeDiv.find("ul.wiktku-dunde-list").remove();
return;
}
var stepDiv = $("#wiktku-start-" + id);
stepDiv.find(".wiktku-start-step-field").val("");
stepDiv.find("select.wiktku-start-step-field").trigger("wiktku:refresh");
});
renderSectionTabs();
refresh();
$("html, body").animate({ scrollTop: sectionTabsDiv.offset().top - 20 }, 300);
});
/** Re-render the tab bar to reflect current sections[] and activeSection. */
function renderSectionTabs() {
// Detach (not remove) the button first: .empty() strips bound
// event data from any children left inside it, which would
// silently kill addSectionBtn's click handler on every re-render.
addSectionBtn.$element.detach();
sectionTabsDiv.empty();
var lang = getValues().lang || "";
if (!lang) {
sectionTabsDiv.hide();
return;
}
sectionTabsDiv.show();
$.each(sections, function (i) {
var posVal = sections[i].pos || "";
var tabLabel = posVal ? capitalize(posVal) : ("Beş " + (i + 1));
var tab = $("<span></span>")
.addClass("wiktku-section-tab")
.text(tabLabel)
.toggleClass("wiktku-tab-active", i === activeSection);
(function (idx) {
tab.on("click", function () {
if (idx === activeSection) return;
saveCurrentSection();
activeSection = idx;
restoreSection(sections[activeSection]);
refresh();
renderSectionTabs();
});
}(i));
sectionTabsDiv.append(tab);
});
// Enable "Beş zêde bike" only when the active section has a pos chosen.
var activePos = sections[activeSection] && sections[activeSection].pos
? sections[activeSection].pos
: getValues().pos;
addSectionBtn.setDisabled(!activePos);
sectionTabsDiv.append(addSectionBtn.$element);
}
renderSectionTabs();
/**
* Restores a full cached draft: shared lang/pron fields, then every
* section (via the same restoreSection()/refresh()/renderSectionTabs()
* sequence already used when switching tabs).
* @param cached {{lang: string, pron: string, sections: Array, activeSection: number}}
*/
function restoreFromCache(cached) {
if (cached.lang) {
$("#wiktku-start-lang-field").val(cached.lang);
$("#wiktku-start-lang-field").trigger("wiktku:refresh");
}
// Rebuild dependent steps (pos, pron wrap, etc.) now that lang is set.
refresh();
if (cached.pron !== undefined) {
$("#wiktku-start-pron .wiktku-pron-text").val(cached.pron);
}
sections = (cached.sections && cached.sections.length) ? cached.sections : [{}];
activeSection = (typeof cached.activeSection === "number" &&
cached.activeSection >= 0 && cached.activeSection < sections.length)
? cached.activeSection : 0;
restoreSection(sections[activeSection]);
refresh();
renderSectionTabs();
mw.notify("Danûstandina berê ya qeydkirî ji cache hate barkirin.",
{ type: "info", tag: "wiktku-cache-restore" });
}
// Update the active tab's label whenever pos changes.
startForm.on("change", "#wiktku-start-pos-field", function () {
renderSectionTabs();
});
// Show the tab bar as soon as a language is selected.
startForm.on("change", "#wiktku-start-lang-field", function () {
renderSectionTabs();
});
var footer = $("<div id='wiktku-start-footer'></div>");
spinner = $(mw.html.element("img", {
id: "wiktku-start-spinner",
src: "//upload.wikimedia.org/wikipedia/commons/d/de/Ajax-loader.gif",
alt: "Tê barkirin…",
title: "Tê barkirin…" }));
footer.append(spinner.hide());
continueBtn = new OO.ui.ButtonWidget({
id: "wiktku-unhide-editform",
label: "Bişîne",
flags: [ "primary", "progressive" ]
});
continueBtn.on("click", function () {
// Immediate feedback that the click registered
continueBtn.$element.addClass("wiktku-btn-flash");
setTimeout(function () {
continueBtn.$element.removeClass("wiktku-btn-flash");
}, 500);
mw.notify("Tê şandin…", { type: "info", tag: "wiktku-submit" });
startForm.trigger("submit");
});
footer.append(continueBtn.$element);
// "Edîtora çavkaniyê veke" button — inline fallback for the portlet link
var sourceEditorBtn = new OO.ui.ButtonWidget({
label: "Edîtora çavkaniyê veke"
});
sourceEditorBtn.on("click", function () {
destroy();
});
footer.append(sourceEditorBtn.$element);
// ── Cache save/clear buttons ─────────────────────────────────────────
// Manual, page-scoped save of the entire wizard (all sections, not
// just the active one) via [[MediaWiki:Gadget-StorageUtils.js]]'s
// ObjectStorage. Restoring happens silently on load at the end of
// build(), once the full language list is available.
var saveCacheBtn = new OO.ui.ButtonWidget({
label: "Li cache qeyd bike",
title: "Halê vê formê yê niha (ziman, bilêvkirin û hemû beş) li cache (localStorage) qeyd bike, da ku eger rûpel bêyî xwestin were girtin an ji nû ve were barkirin, tu karibî berdewam bikî."
});
saveCacheBtn.on("click", function () {
saveCurrentSection();
var snapshot = {
lang: getValues().lang || "",
pron: $("#wiktku-start-pron .wiktku-pron-text").val() || "",
sections: sections,
activeSection: activeSection
};
// ObjectStorage.Set() doesn't return a success/failure value, so
// the only way to detect a real failure (storage blocked, quota
// exceeded, JSON.stringify choking on something unexpected) is to
// catch it here rather than inspect a (nonexistent) return value.
try {
formCache.Set(snapshot);
mw.notify("Halê formê li cache hate qeydkirin.", { type: "success", tag: "wiktku-cache-save" });
} catch (e) {
mw.notify("Qeydkirina li cache bi ser neket.", { type: "error", tag: "wiktku-cache-save" });
}
});
footer.append(saveCacheBtn.$element);
var clearCacheBtn = new OO.ui.ButtonWidget({
label: "Cache paqij bike",
flags: [ "destructive" ],
title: "Datayên qeydkirî yên vê rûpelê ji cache jê bibe (forma ku niha xuya dike naguherîne)."
});
clearCacheBtn.on("click", function () {
formCache.Set({});
mw.notify("Cache hate paqijkirin.", { type: "success", tag: "wiktku-cache-clear" });
});
footer.append(clearCacheBtn.$element);
// ── Preview checkboxes ───────────────────────────────────────────────
// Wikitext preview (raw text panel)
var previewCheck = $("<input type='checkbox' id='wiktku-preview-toggle'>");
var previewLabel = $("<label for='wiktku-preview-toggle'></label>")
.text(" Pêşdîtina wîkîtekstê");
var previewPanel = $("<pre id='wiktku-preview-panel'></pre>").hide();
// Live rendered preview (parsed HTML panel, same logic as AjaxEdit).
// Not available on mobile — API polling causes too many problems on small screens.
var livePreviewCheck = null;
var livePreviewPanel = null;
if (!isMobile) {
livePreviewCheck = $("<input type='checkbox' id='wiktku-live-preview-toggle'>");
livePreviewPanel = $("<div id='wiktku-live-preview-panel'></div>").hide();
}
// Container that holds both panels and switches between stacked / side-by-side.
var previewContainer = $("<div id='wiktku-preview-container'></div>");
previewContainer.append(previewPanel);
if (!isMobile) previewContainer.append(livePreviewPanel);
var previewTimer = null;
var livePreviewIntervalId = -1;
var livePreviewActive = false; // guards in-flight fetches after uncheck
/** Rebuilds wikitext preview if its checkbox is checked. */
function schedulePreview() {
if (!previewCheck.prop("checked")) return;
clearTimeout(previewTimer);
// Debounce: wait 400 ms after the last keystroke before rebuilding.
previewTimer = setTimeout(function () {
getWikitext(function (wikitext) {
previewPanel.text(wikitext).show();
updatePanelLayout();
});
}, 400);
}
/** Fetches parsed HTML and populates the live preview panel. */
function loadLivePreview() {
getWikitext(function (wikitext) {
new mw.Api().parse(wikitext, { title: mw.config.get("wgPageName") }).done(function (html) {
// Discard result if the user unchecked while the fetch was in flight.
if (!livePreviewActive) return;
livePreviewPanel.html(html).show();
updatePanelLayout();
});
});
}
/** Adjusts panel widths depending on which previews are visible. */
function updatePanelLayout() {
var wikitextVisible = previewCheck.prop("checked");
var liveVisible = livePreviewCheck && livePreviewCheck.prop("checked");
if (wikitextVisible && liveVisible) {
// Side by side — each panel takes roughly half the available width.
previewPanel.css({ "flex": "1 1 45%", "min-width": "280px" });
livePreviewPanel.css({ "flex": "1 1 45%", "min-width": "280px" });
} else {
// Full width for whichever is visible — only touch panels that are
// actually shown so that setting flex doesn't override display:none.
if (wikitextVisible) previewPanel.css({ "flex": "1 1 100%", "min-width": "" });
if (liveVisible && livePreviewPanel) livePreviewPanel.css({ "flex": "1 1 100%", "min-width": "" });
}
}
previewCheck.on("change", function () {
if ($(this).prop("checked")) {
schedulePreview();
} else {
clearTimeout(previewTimer);
previewPanel.hide();
updatePanelLayout();
}
});
if (!isMobile) {
livePreviewCheck.on("change", function () {
if ($(this).prop("checked")) {
livePreviewActive = true;
livePreviewPanel.show();
loadLivePreview();
livePreviewIntervalId = setInterval(loadLivePreview, 500);
} else {
livePreviewActive = false;
clearInterval(livePreviewIntervalId);
livePreviewIntervalId = -1;
livePreviewPanel.hide().empty();
updatePanelLayout();
}
});
}
// Listen on all input/change events on the form and update both previews.
startForm.on("input change", function () {
schedulePreview();
});
footer.append($("<span style='margin-left:1em'></span>")
.append(previewCheck).append(previewLabel));
if (!isMobile) {
var livePreviewLabel = $("<label for='wiktku-live-preview-toggle'></label>")
.text(" Pêşdîtina zindî");
footer.append($("<span style='margin-left:1em'></span>")
.append(livePreviewCheck).append(livePreviewLabel));
}
startForm.append(footer);
$("#editform").hide().before(startForm);
// Insert preview container (holds both panels) after the form.
startForm.after(previewContainer);
// One pass over the whole form: every select that hasn't already been
// initialised, and isn't opted out with .wiktku-plain-select, gets
// the searchable picker.
initSelects(startForm);
refresh();
// Give every draggable textarea a custom resize grip (works
// consistently on Safari/iOS, unlike the native corner grip — see
// the "Manual drag-to-resize handle" comment in styles.css), and
// keep applying it to textareas added later on (new sense blocks,
// quote-source fields, nimûne rows, …).
wiktkuInitManualResize(startForm);
new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
$(mutation.addedNodes).each(function () {
if (this.nodeType !== 1) return;
wiktkuInitManualResize(this);
});
});
}).observe(startForm[0], { childList: true, subtree: true });
// Now that the full language list is loaded, silently restore any
// draft the editor previously saved for this page.
var cachedDraft = formCache.Get();
if (cachedDraft && cachedDraft.sections && cachedDraft.sections.length) {
restoreFromCache(cachedDraft);
}
}
mw.loader.using(["oojs-ui-core"], function () {
// Load metadata, langChoices, posChoices and tplDefs from the companion
// data page so they can be updated without touching this script.
// (Request was already fired via metaApiPromise above, in parallel
// with this module load — we're just picking up the result here.)
metaApiPromise.then(function (data) {
var page = data.query.pages[0];
var content = page &&
page.revisions &&
page.revisions[0].slots.main.content;
var d;
try { d = JSON.parse(content); } catch (e) { d = {}; }
// Populate metadata.
if (d.metadata) $.extend(metadata, d.metadata);
// Populate gender labels.
if (d.genderLabels) $.extend(GENDER_BASE_LABELS, d.genderLabels);
// Populate lang choices (pinned list).
if (d.langChoices) steps.lang.choices = choicesFromObject(d.langChoices, true);
// Populate langsByCode and merge full language list from d.ziman.
// d.ziman is a {code: name} object with all known languages.
$.each(steps.lang.choices, function (i, choice) {
if (choice.sortKey === undefined) choice.sortKey = choice.label;
langsByCode[choice.code] = choice;
});
if (d.ziman) {
var pinnedCodes = {};
$.each(steps.lang.choices, function (i, c) { pinnedCodes[c.code] = true; });
var extraChoices = [];
$.each(d.ziman, function (code, name) {
if (/-pro$/i.test(code)) return;
if (/ziman[eê]\s+destan/i.test(name)) return;
if (pinnedCodes[code]) return;
var choice = { code: code, label: name, sortKey: name };
extraChoices.push(choice);
langsByCode[code] = choice;
});
extraChoices.sort(function (a, b) {
return a.sortKey.localeCompare(b.sortKey, userLang);
});
steps.lang.choices = steps.lang.choices.concat(extraChoices);
}
// Populate POS choices — also a plain {code: label} object in data.json.
if (d.posChoices) steps.pos.choices = choicesFromObject(d.posChoices, false);
// Populate template definitions for the dfn sense-block builder.
if (d.tplDefs) steps.dfn.tplDefs = d.tplDefs;
// Populate pos placeholder examples.
if (d.posExamples) steps.dfn.posExamples = d.posExamples;
// Populate citation template definitions for the quote widget.
if (d.jederDefs) steps.dfn.jederDefs = d.jederDefs;
// Populate pronunciation and etymology template insert lists.
if (d.pronTpls) {
steps.pron.pronTpls = d.pronTpls;
steps.pron.refreshTplSelect();
}
if (d.etymTpls) {
steps.etym.etymTpls = d.etymTpls;
steps.etym.refreshTplSelect();
}
// Sync trans/dunde/zarava keys with the full language list.
steps.trans.keys = steps.lang.choices;
steps.dunde.keys = steps.lang.choices;
steps.zarava.keys = getZaravaKeys(steps.lang.choices);
}).always(build);
});
});
//</nowiki>
mpm4wammi95u3wgggg3unaee1p21lta
6292093
6292091
2026-07-29T21:53:09Z
Wikihez
7344
6292093
javascript
text/javascript
// Li ser [[vi:MediaWiki:Gadget-start.js]] hatiye refaktorkirin.
// implicit dependencies: StorageUtils (ObjectStorage)
//<nowiki>
$(function () {
if (window.location.href.includes("editintro=User:Wikihez/creation/intro")) {
return; // Do not run the script wextê WF:Bilez dişuxile
}
var ns = mw.config.get("wgNamespaceNumber");
if (ns &&
!(ns === 2 && mw.config.get("wgPageName").match(/\/ceribandin$|\/test$/))) {
return;
}
var action = mw.config.get("wgAction");
var pageExists = !!mw.config.get("wgArticleId");
var addLangMode = pageExists && mw.util.getParamValue("wiktkuaddlang") === "1";
if (action === "view" && pageExists) {
var targetContainer;
var skin = mw.config.get('skin');
if (skin === 'vector-2022') {
targetContainer = 'p-cactions';
} else if (skin === 'vector') {
targetContainer = 'p-tb';
} else {
targetContainer = 'p-views';
}
mw.util.addPortletLink(targetContainer,
mw.util.getUrl(mw.config.get("wgPageName"), { action: "submit", wiktkuaddlang: "1" }),
"+Ziman/beşeke din", "ca-wiktku-addlang",
"Ji vê rûpelê re ziman an jî beşeke nû zêde bike");
return;
}
if (!(action === "edit" || action === "submit")) {
return;
}
if (!addLangMode && !$(".mw-newarticletext, .mw-newarticletextanon").length) {
return;
}
mw.notify(
"Amûr dest pê dike, hinek bisekinin.\nNot: jkx Sentaks (Syntax highlighting) neaktîv bikin",
{ type: "info", tag: "wiktku-start-notice", autoHide: true, autoHideSeconds: 10 }
);
var dataJsonPromise;
var metaApiPromise = mw.loader.using("mediawiki.api").then(function () {
var metaApi = new mw.Api();
dataJsonPromise = metaApi.get({
action: "query",
prop: "revisions",
titles: "MediaWiki:Gadget-start.js/data.json",
rvprop: "content",
rvslots: "main",
formatversion: 2
});
return dataJsonPromise;
});
function capitalize(str) {
if (!str) return str;
return str[0].toUpperCase() + str.substr(1);
}
function decapitalize(str) {
if (!str) return str;
return str[0].toLowerCase() + str.substr(1);
}
function escapeRegExp(str) {
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
function langHeaderSource(codePattern) {
return "\n?==\\s*\\{\\{\\s*ziman\\s*\\|\\s*(" + codePattern + ")\\s*\\}\\}\\s*==";
}
function findLangHeader(text, code) {
var m = new RegExp(langHeaderSource(escapeRegExp(code))).exec(text);
return m ? { index: m.index, match: m[0] } : null;
}
function stripWikilinks(str) {
return str.replace(/\[\[([^\]|]+)(?:\|([^\]]+))?\]\]/g, function (m, target, display) {
return display || target;
});
}
function splitTercimeIzah(mane) {
var m = /^([\s\S]*?)\s*\{\{îzah\|([\s\S]*)\}\}\s*$/.exec(mane || "");
return m ? { tercime: m[1], izah: m[2] } : null;
}
function insertAtCursor(el, text) {
var start = el.selectionStart;
var end = el.selectionEnd;
var val = el.value;
el.value = val.slice(0, start) + text + val.slice(end);
var pos = start + text.length;
el.selectionStart = el.selectionEnd = pos;
}
var catSrcTemplates = null;
var catSrcTemplatesPromise = null;
function fetchCatSrcTemplates() {
if (catSrcTemplatesPromise) return catSrcTemplatesPromise;
catSrcTemplatesPromise = new mw.Api().get({
action: "query",
list: "categorymembers",
cmtitle: "Kategorî:Çavkanî",
cmnamespace: 10,
cmlimit: "max",
formatversion: 2
}).then(function (data) {
var members = (data.query && data.query.categorymembers) || [];
catSrcTemplates = $.map(members, function (m) {
// Pêşgira navî ya "Şablon:" rake.
return m.title.replace(/^[^:]+:/, "");
});
catSrcTemplates.sort(function (a, b) { return a.localeCompare(b, userLang); });
return catSrcTemplates;
}, function () {
catSrcTemplates = [];
return catSrcTemplates;
});
return catSrcTemplatesPromise;
}
var pageName = mw.config.get("wgPageName").replaceAll(/_/g, " ");
if (ns) pageName = pageName.replace(/.*\//, "");
var pageNameRe = escapeRegExp(pageName);
var userLang = mw.config.get("wgUserLanguage");
var formCache = new ObjectStorage("wiktku_start_draft_" + mw.config.get("wgPageName"), 1);
var isMobile = !!mw.config.get("wgMFMode") || window.matchMedia("(pointer: coarse)").matches;
var FOLD_EXTRA = {
"ı": "i", // dotless i
"ø": "o", // o with stroke
"đ": "d", // d with stroke
"ð": "d", // eth
"ə": "e", // schwa
"ħ": "h", // h with stroke
"ł": "l", // l with stroke
"ŋ": "n", // eng
"ʉ": "u", // u bar
"ɨ": "i", // i bar
"ʒ": "z", // ezh
"ɛ": "e", // open e
"ɔ": "o", // open o
"æ": "ae",
"œ": "oe",
"ß": "ss",
"þ": "th" };
function foldDiacritics(str) {
if (str === null || str === undefined) return "";
var s = String(str).toLowerCase();
if (typeof s.normalize === "function") {
// Split "î" into "i" + combining circumflex, then drop the accent.
s = s.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
}
return s.replace(/[^\u0000-\u007f]/g, function (ch) {
return Object.prototype.hasOwnProperty.call(FOLD_EXTRA, ch) ? FOLD_EXTRA[ch] : ch;
});
}
var WIKTKU_RESIZE_STORAGE_PREFIX = "wiktku_resize_height_";
/** Textareas of the same "kind" (e.g. every Nimûne box, every Tercime
* box) share a class list even though each individual box is a fresh
* DOM node built on the fly (new sense blocks, quote fields, …) with
* no stable id of its own. That class list is what we key the cached
* height on, so a size chosen for one Nimûne box is reused for every
* Nimûne box, on this page and on the next one. */
function wiktkuResizeStorageKey(textarea) {
var cls = (textarea.attr("class") || "").trim().replace(/\s+/g, "_");
return WIKTKU_RESIZE_STORAGE_PREFIX + cls;
}
function wiktkuSaveResizeHeight(textarea, height) {
if (!(window.mw && mw.storage)) return;
try {
mw.storage.set(wiktkuResizeStorageKey(textarea), String(Math.round(height)));
} catch (e) { /* localStorage unavailable (private mode, quota, …) — skip caching */ }
}
function wiktkuLoadResizeHeight(textarea) {
if (!(window.mw && mw.storage)) return null;
try {
var v = mw.storage.get(wiktkuResizeStorageKey(textarea));
return v ? parseFloat(v) : null;
} catch (e) {
return null;
}
}
/** Replaces a textarea's native corner resize grip with a small custom
* drag handle (see the "Manual drag-to-resize handle" comment and
* .wiktku-resize-wrap / .wiktku-resize-grip in styles.css). Needed
* because iOS Safari never implements the native grip at all and
* desktop Safari's own version is inconsistent, so we replace it
* everywhere for uniform behaviour. One-line fields (.wiktku-start-narrow)
* are meant to stay a fixed height and are left untouched. Safe to call
* more than once on the same textarea. */
function wiktkuMakeManualResizable(textarea) {
textarea = $(textarea);
if (!textarea.is("textarea") || textarea.hasClass("wiktku-start-narrow")) return;
if (textarea.data("wiktkuResizableDone")) return;
textarea.data("wiktkuResizableDone", true);
textarea.wrap("<div class='wiktku-resize-wrap'></div>");
var grip = $("<div class='wiktku-resize-grip'></div>");
textarea.after(grip);
// Restore a previously chosen height for this kind of field, if any.
var cachedHeight = wiktkuLoadResizeHeight(textarea);
if (cachedHeight) {
var minHeightInit = parseFloat(textarea.css("min-height")) || 0;
textarea.css("height", Math.max(cachedHeight, minHeightInit) + "px");
}
var dragging = false, startY = 0, startHeight = 0;
function onPointerMove(e) {
if (!dragging) return;
var oe = e.originalEvent || e;
var minHeight = parseFloat(textarea.css("min-height")) || 0;
var newHeight = startHeight + (oe.clientY - startY);
textarea.css("height", Math.max(newHeight, minHeight) + "px");
}
function onPointerUp(e) {
if (!dragging) return;
dragging = false;
var oe = e.originalEvent || e;
try { grip[0].releasePointerCapture(oe.pointerId); } catch (err) { /* ignore */ }
$(document).off("pointermove", onPointerMove);
$(document).off("pointerup pointercancel", onPointerUp);
wiktkuSaveResizeHeight(textarea, textarea.outerHeight());
}
grip.on("pointerdown", function (e) {
var oe = e.originalEvent || e;
if (oe.button !== undefined && oe.button !== 0) return; // primary contact only
e.preventDefault();
dragging = true;
startY = oe.clientY;
startHeight = textarea.outerHeight();
try { grip[0].setPointerCapture(oe.pointerId); } catch (err) { /* ignore */ }
$(document).on("pointermove", onPointerMove);
$(document).on("pointerup pointercancel", onPointerUp);
});
}
/** Applies wiktkuMakeManualResizable to every eligible textarea already
* inside `context` (context itself, if it is a textarea, or any of its
* descendants). Used both for the initial form render and, via the
* MutationObserver set up in build(), for textareas added later on
* (new sense blocks, quote-source fields, nimûne rows, …). */
function wiktkuInitManualResize(context) {
var $context = $(context);
var $textareas = $context.is("textarea") ? $context : $context.find("textarea");
$textareas.each(function () {
wiktkuMakeManualResizable(this);
});
}
function wrapNativeSelect(select) {
var wrapper = $("<span class='wiktku-native-select-wrap'></span>");
if (select.prop("multiple")) {
return wrapper.append(select);
}
var placeholder = select.attr("data-placeholder") || "Lê bigere...";
select.hide();
var textInput = $("<input type='search' autocomplete='off'>")
.attr("placeholder", placeholder)
.attr("role", "combobox")
.attr("aria-autocomplete", "list")
.attr("aria-expanded", "false")
.addClass("wiktku-start-narrow wiktku-ac-input");
var resultsList = $("<ul class='wiktku-ac-results' role='listbox'></ul>").hide();
var allOptions = [];
var shown = [];
var activeIndex = -1;
function cacheOptions() {
allOptions = [];
select.find("option").each(function () {
var v = $(this).val();
var text = $(this).text();
// A blank value with no label (most selects' placeholder) is
// never a real choice, so skip it. But a blank value WITH a
// label -- e.g. tplSelect's "— yan jî şablonek hilbijêre —" --
// is a meaningful "clear the selection" choice, so keep it
// searchable/selectable like any other option.
if (!v && !text) return;
// Language options read "Name (code)" -- score the name on its own
// so the trailing code doesn't also count as a name match.
var name = text.replace(/\s*\([^()]*\)\s*$/, "");
allOptions.push({
value: v,
text: text,
disabled: $(this).prop("disabled"),
foldCode: foldDiacritics(v),
foldName: foldDiacritics(name),
foldText: foldDiacritics(text)
});
});
}
cacheOptions();
// True if `q` starts a word inside `name` ("kevn" in "ingiliziya kevn").
function startsWord(name, q) {
var from = 0, at;
while ((at = name.indexOf(q, from)) !== -1) {
if (at === 0 || /[\s\-\u2013\u2014(/,.]/.test(name.charAt(at - 1))) return true;
from = at + 1;
}
return false;
}
// Lower rank = better match.
// a code that *is* the query, or begins with it, always outranks a name
// that merely contains it -- so "ang" lists "Îngilîziya kevn (ang)"
// first instead of burying it among every name containing "ang".
var RANK_NONE = 99;
function rankOption(o, q) {
var code = o.foldCode, name = o.foldName;
if (code === q) return 0; // exact code
if (code.indexOf(q) === 0) return 1; // code prefix
if (name === q) return 2; // exact name
if (name.indexOf(q) === 0) return 3; // name prefix
if (startsWord(name, q)) return 4; // starts a word in the name
if (name.indexOf(q) !== -1) return 5; // name substring
if (code.indexOf(q) !== -1) return 6; // code substring
if (o.foldText.indexOf(q) !== -1) return 7; // anywhere else in the label
return RANK_NONE;
}
function positionList() {
// Position the list above or below depending on viewport space.
var inputRect = textInput[0].getBoundingClientRect();
var viewportH = window.innerHeight;
var spaceBelow = viewportH - inputRect.bottom - 8;
var spaceAbove = inputRect.top - 8;
var maxH = Math.min(224, Math.max(spaceBelow, spaceAbove)); // 224px = 14em
resultsList.css({
"max-height": maxH + "px",
"top": spaceBelow >= spaceAbove ? "100%" : "auto",
"bottom": spaceBelow >= spaceAbove ? "auto" : "100%"
});
}
function closeList() {
resultsList.hide();
textInput.attr("aria-expanded", "false");
activeIndex = -1;
}
function showResults(query) {
var q = foldDiacritics($.trim(query || ""));
resultsList.empty();
activeIndex = -1;
var matched = [];
if (q) {
$.each(allOptions, function (i, o) {
if (o.disabled) return;
var rank = rankOption(o, q);
if (rank !== RANK_NONE) matched.push({ opt: o, rank: rank, i: i });
});
if (!matched.length && q.indexOf(" ") !== -1) {
var tokens = q.split(/\s+/);
$.each(allOptions, function (i, o) {
if (o.disabled) return;
var all = true;
$.each(tokens, function (_, t) {
if (o.foldText.indexOf(t) === -1) { all = false; return false; }
});
if (all) matched.push({ opt: o, rank: 8, i: i });
});
}
matched.sort(function (a, b) {
if (a.rank !== b.rank) return a.rank - b.rank;
// Inside the code tiers the shorter code is the better hit:
// "an" -> "an" before "ang" before "ang-x-...".
if (a.rank <= 1 && a.opt.foldCode.length !== b.opt.foldCode.length) {
return a.opt.foldCode.length - b.opt.foldCode.length;
}
// Otherwise keep the menu's own order (pinned languages first).
return a.i - b.i;
});
} else {
$.each(allOptions, function (i, o) {
if (!o.disabled) matched.push({ opt: o, rank: 0, i: i });
});
}
shown = $.map(matched.slice(0, 50), function (m) { return m.opt; });
if (!shown.length) {
closeList();
return;
}
$.each(shown, function (idx, opt) {
var li = $("<li role='option'></li>")
.text(opt.text)
.attr("data-value", opt.value)
.attr("aria-selected", "false");
// touchend (not touchstart) so a scroll doesn't trigger a select.
var touchMoved = false;
li.on("touchstart", function () {
touchMoved = false;
});
li.on("touchmove", function () {
touchMoved = true;
});
li.on("touchend", function (e) {
if (touchMoved) return; // was a scroll, not a tap
e.preventDefault();
selectOption(opt.value, opt.text);
});
// mousedown (not click) so it beats the input's blur handler.
li.on("mousedown", function (e) {
e.preventDefault();
selectOption(opt.value, opt.text);
});
li.on("mouseenter", function () {
// Hovered items are already in view -- don't scroll the list
// under the mouse, or the shift can trigger the next item's
// mouseenter and cascade into a runaway scroll.
setActive(idx, /* scrollIntoView */ false);
});
resultsList.append(li);
});
positionList();
resultsList.show();
resultsList[0].scrollTop = 0;
textInput.attr("aria-expanded", "true");
}
function setActive(idx, scrollIntoView) {
var items = resultsList.children("li");
if (!items.length) return;
if (idx < 0) idx = items.length - 1;
if (idx >= items.length) idx = 0;
activeIndex = idx;
items.removeClass("wiktku-ac-active").attr("aria-selected", "false");
var li = items.eq(idx).addClass("wiktku-ac-active").attr("aria-selected", "true");
if (scrollIntoView === false) return;
// Keep the cursor visible inside the scrollable list -- only for
// keyboard navigation. A mouse-hovered item is already visible, so
// scrolling here would shift the list under a stationary pointer
// and cascade into further mouseenter events.
var ul = resultsList[0], el = li[0];
if (el.offsetTop < ul.scrollTop) {
ul.scrollTop = el.offsetTop;
} else if (el.offsetTop + el.offsetHeight > ul.scrollTop + ul.clientHeight) {
ul.scrollTop = el.offsetTop + el.offsetHeight - ul.clientHeight;
}
}
/** Puts the currently selected option's label back in the text box. */
function syncInputToSelect() {
var cur = select.val();
var match = null;
if (cur) {
$.each(allOptions, function (_, o) {
if (o.value === cur) { match = o; return false; }
});
}
textInput.val(match ? match.text : "");
}
function selectOption(value, text) {
textInput.val(text);
select.val(value);
closeList();
select.trigger("change");
}
textInput.on("input", function () {
showResults($(this).val());
});
textInput.on("focus", function () {
// Select the current label so typing replaces it, and open the full list
this.select();
showResults("");
});
textInput.on("click", function () {
if (!resultsList.is(":visible")) showResults($(this).val());
});
textInput.on("keydown", function (e) {
var open = resultsList.is(":visible");
switch (e.which) {
case 40: // Down
e.preventDefault();
if (!open) { showResults($(this).val()); setActive(0); }
else setActive(activeIndex + 1);
break;
case 38: // Up
e.preventDefault();
if (!open) { showResults($(this).val()); setActive(-1); }
else setActive(activeIndex - 1);
break;
case 13: // Enter -- must never submit the form while the list is open
if (open) {
e.preventDefault();
if (activeIndex >= 0 && shown[activeIndex]) {
selectOption(shown[activeIndex].value, shown[activeIndex].text);
} else if (shown.length === 1) {
selectOption(shown[0].value, shown[0].text);
}
}
break;
case 27: // Esc -- abandon the search, restore the real value
if (open) {
e.preventDefault();
closeList();
syncInputToSelect();
}
break;
case 9: // Tab -- commit the highlighted row on the way out
if (open && activeIndex >= 0 && shown[activeIndex]) {
selectOption(shown[activeIndex].value, shown[activeIndex].text);
}
closeList();
break;
}
});
textInput.on("blur", function () {
// Short delay so a touchstart/mousedown on a result fires first.
setTimeout(function () {
closeList();
// Half-typed text that never became a selection would otherwise sit
// in the box looking like a choice -- put the real value back.
syncInputToSelect();
}, 200);
});
// Re-caches the option list. Fired after the full language list loads, after
// options are enabled/disabled, and after programmatic .val() changes.
select.on("wiktku:refresh", function () {
cacheOptions();
syncInputToSelect();
if (resultsList.is(":visible")) showResults(textInput.val());
});
wrapper.append(textInput).append(resultsList).append(select);
return wrapper;
}
/**
* Gives every plain <select> under `root` the searchable picker. Selects
* marked .wiktku-plain-select opt out, and the call is idempotent, so it is
* safe to re-run after new rows or sense blocks are inserted.
*/
function initSelects(root) {
$(root).find("select").addBack("select").not(".wiktku-plain-select").each(function () {
var sel = $(this);
if (sel.prop("multiple")) return;
if (sel.closest(".wiktku-native-select-wrap").length) return; // already wrapped
var marker = $("<span></span>").insertBefore(sel);
marker.replaceWith(wrapNativeSelect(sel));
});
}
var langsByCode = {};
// Populated from [[MediaWiki:Gadget-start.js/data.json]] at runtime.
var metadata = {};
var ZARAVA_LANG_CODES = ["ckb", "sdh", "lki", "hac", "zza"];
// Converts a {code: label} object (langChoices/posChoices in data.json)
// into the {code, label[, sortKey]} array the rest of the script uses.
// isLang: true adds a sortKey and shows "(code)" after the label —
// language choices only.
function choicesFromObject(obj, isLang) {
var result = [];
$.each(obj || {}, function (code, label) {
var choice = { code: code, label: label };
if (isLang) choice.sortKey = label;
result.push(choice);
});
return result;
}
function getZaravaKeys(choices) {
var byCode = {};
$.each(choices || [], function (_, c) { byCode[c.code] = c; });
var result = [];
$.each(ZARAVA_LANG_CODES, function (_, code) {
if (byCode[code]) result.push(byCode[code]);
});
return result;
}
function needsTransliteration(langCode) {
var meta = metadata[langCode];
if (!meta || !meta.sc) return false;
var scripts = Array.isArray(meta.sc) ? meta.sc : [meta.sc];
return scripts.length > 0 && scripts[0] !== "Latn";
}
// Kodên cinsiyetê yên di metadata.g de — ji data.json tê dagirtin
var GENDER_BASE_LABELS = {};
// Sub-lists that only make sense for a plain (non-şablon) sense — hidden
// when a şablon (e.g. {{guharto|…}}) is chosen for that sense
var HIDDEN_ON_TPL_GROUPS = [
"wiktku-dfn-alternativ",
"wiktku-dfn-hevmane",
"wiktku-dfn-dijmane",
"wiktku-dfn-koordine",
"wiktku-dfn-jornav",
"wiktku-dfn-jernav"
];
function genderLabel(code) {
if (code === "p") return "Pirjimar";
var pluralMatch = code.match(/^(.+)-p$/);
if (pluralMatch && GENDER_BASE_LABELS[pluralMatch[1]]) {
return GENDER_BASE_LABELS[pluralMatch[1]] + " (pirjimar)";
}
return GENDER_BASE_LABELS[code] || code;
}
// True if a sense has content beyond mane worth keeping (etîket, word
// lists, nimûne, jêder) — so it's still emitted with {{mane?}} if empty.
function senseHasExtraContent(s) {
if (s.etiket && $.grep(s.etiket, function (e) { return $.trim(e) !== ""; }).length) return true;
if (s.kategori && $.grep(s.kategori, function (k) { return $.trim(k) !== ""; }).length) return true;
if (s.alternativ.length || s.hevmane.length || s.dijmane.length ||
s.koordine.length || s.jornav.length || s.jernav.length) return true;
if (s.nimune && $.grep(s.nimune, function (n) {
return (typeof n === "object" ? n.text : n) !== "";
}).length > 0) return true;
if (senseHasJeder(s)) return true;
return false;
}
// Bolds the *first* occurrence of the page name (plus any letters
// glued directly onto it, e.g. a plural "s") inside nimûne/jêgirtin
// text — "apple"/"Apple"/"apples"/"Apples" all match (case-insensitive),
// but only the first hit is wrapped, not every one in the text.
function boldPageNameOnce(text) {
if (!text || !pageNameRe) return text;
var re = new RegExp("(" + pageNameRe + "([^( |,|;|\\?|\\.|\\!)]+)?)", "i");
return text.replace(re, "'''$1'''");
}
// Converts literal line breaks typed into a nimûne/jêgirtin box into
// wikitext <br> tags, so a pasted/typed newline doesn't break the
// surrounding "#:"/"#*" wikitext list syntax on output.
function nlToBr(text) {
return text ? text.replace(/\r\n|\r|\n/g, "<br>") : text;
}
function escapeHtmlForBackdrop(str) {
return String(str)
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">");
}
// Mirrors a textarea's text, with a small highlighted marker placed
// right after each line that's followed by an actual typed/pasted
// linebreak. Rendered into a transparent backdrop layer behind the
// textarea (see ensureLinebreakBackdrop()), so only the point of the
// break is marked instead of the whole box.
function buildLinebreakBackdropHtml(text) {
var lines = text.split(/\r\n|\r|\n/);
return $.map(lines, function (line, i) {
var isLast = i === lines.length - 1;
return escapeHtmlForBackdrop(line) +
(isLast ? "" : "<mark class='wiktku-linebreak-mark'>↵</mark>\n");
}).join("");
}
// Copies the metrics that affect where text wraps/lands (font, line
// height, padding, border) from the real textarea onto its backdrop,
// via computed style rather than shared CSS classes — most of the
// box's own rules are written as "textarea.foo", which a <div> with
// the same class wouldn't match. Re-run on every update in case a
// responsive breakpoint changed the textarea's own font-size.
function syncLinebreakBackdropMetrics(textarea, backdrop) {
var cs = window.getComputedStyle(textarea[0]);
backdrop.css({
"box-sizing": cs.boxSizing,
"padding-top": cs.paddingTop,
"padding-right": cs.paddingRight,
"padding-bottom": cs.paddingBottom,
"padding-left": cs.paddingLeft,
"border-width": cs.borderWidth,
"border-style": "solid",
"font-family": cs.fontFamily,
"font-size": cs.fontSize,
"font-weight": cs.fontWeight,
"line-height": cs.lineHeight,
"letter-spacing": cs.letterSpacing
});
}
// Lazily wraps a textarea in its own positioning anchor (independent
// of .wiktku-resize-wrap, so this doesn't depend on load order versus
// wiktkuMakeManualResizable) and inserts the transparent backdrop
// layer used to mark the exact point of a linebreak. Safe to call
// more than once on the same textarea — the backdrop is cached.
function ensureLinebreakBackdrop(textarea) {
var existing = textarea.data("wiktkuLinebreakBackdrop");
if (existing) return existing;
textarea.wrap("<div class='wiktku-linebreak-wrap'></div>");
var backdrop = $("<div aria-hidden='true'></div>").addClass("wiktku-linebreak-backdrop");
textarea.before(backdrop);
textarea.data("wiktkuLinebreakBackdrop", backdrop);
textarea.on("scroll.wiktkuLinebreak", function () {
backdrop.scrollTop(textarea.scrollTop()).scrollLeft(textarea.scrollLeft());
});
return backdrop;
}
// Flags a nimûne/jêgirtin textarea (via CSS class, for the border
// tint + tooltip) while it contains a typed/pasted linebreak, so the
// user notices before it's silently turned into <br> on output.
// Marks only the exact point of the break via a mirrored backdrop,
// rather than tinting the whole box.
function highlightLinebreak(el) {
var textarea = $(el);
var text = textarea.val();
var hasBreak = /\r|\n/.test(text);
textarea
.toggleClass("wiktku-has-linebreak", hasBreak)
.attr("title", hasBreak ? "Xeta nû dê wek <br> bê nivîsandin" : "");
if (!hasBreak) {
var cached = textarea.data("wiktkuLinebreakBackdrop");
if (cached) cached.hide();
textarea.removeClass("wiktku-has-linebreak-source");
return;
}
var backdrop = ensureLinebreakBackdrop(textarea);
textarea.addClass("wiktku-has-linebreak-source");
syncLinebreakBackdropMetrics(textarea, backdrop);
backdrop.html(buildLinebreakBackdropHtml(text)).show();
backdrop.scrollTop(textarea.scrollTop()).scrollLeft(textarea.scrollLeft());
}
// Each nimûne item can be { text, tr, t }: text, transliteration, translation.
function formatNimune(nimunes, lang, hasJeder) {
var hasNimune = nimunes && $.grep(nimunes, function (n) {
return (typeof n === "object" ? n.text : n) !== "";
}).length > 0;
if (!hasNimune) {
return hasJeder ? "" : "\n#* {{nimûne?|" + lang + "}}";
}
return $.map(nimunes, function (n) {
var text = typeof n === "object" ? n.text : n;
if (!text) return undefined;
var bolded = nlToBr(boldPageNameOnce(text));
var tpl = "\n#: {{nm|" + lang + "|" + bolded;
if (typeof n === "object") {
if (n.tr) tpl += "|tr=" + nlToBr(n.tr);
// Translation as third positional param (no key needed).
if (n.t) tpl += "|" + nlToBr(n.t);
}
// Short examples fit on one line together with their translation.
// rêz=1 is not used for ku — definitions are shown on separate lines there.
if (text.length < 60 && lang !== "ku") tpl += "|rêz=1";
tpl += "}}";
return tpl;
}).join("");
}
// Formats jêder (citation) entries into "#* {{jêder…|…}}" lines; skips
// entries with no quote text. Falls back to the generic {{jêder}}
// template when no specific template was chosen.
function formatJeder(jederList, lang) {
if (!jederList || !jederList.length) return "";
return $.map(jederList, function (jeder) {
if (!jeder || !jeder.quote) return undefined;
var quote = nlToBr(boldPageNameOnce(jeder.quote));
var quoteTr = nlToBr(jeder.quoteTr);
var quoteT = nlToBr(jeder.quoteT);
if (jeder.jederTpl) {
var cite = "\n#* {{" + jeder.jederTpl + "|" + lang;
cite += "|jêgirtin=" + quote;
if (quoteTr) cite += "|tr=" + quoteTr;
if (quoteT) cite += "|tercime=" + quoteT;
$.each(jeder.jêderFields || {}, function (key, val) {
if (val) cite += "|" + key + "=" + val;
});
cite += "}}";
return cite;
}
var out = "\n#* {{jêder|" + lang + "|jêgirtin=" + quote;
if (quoteTr) out += "|tr=" + quoteTr;
if (quoteT) out += "|tercime=" + quoteT;
// A şablon picked from Kategorî:Çavkanî is transcluded as the
// source param (e.g. |{{Kovara X}}); manual text is used as-is.
var srcParam = jeder.jederCatTpl ? ("{{" + jeder.jederCatTpl + "}}") :
(jeder.jederManual ? jeder.jederManual : "çavkanî?");
// A positional param containing "=" gets parsed as its own key=value
// pair by MediaWiki and breaks the template, so force it to be
// explicitly named (|2=) whenever that's the case.
out += (srcParam.indexOf("=") !== -1 ? "|2=" : "|") + srcParam;
out += "}}";
return out;
}).join("");
}
// True if a sense has at least one jêder entry with quote text.
function senseHasJeder(sense) {
return !!(sense.jeder && $.grep(sense.jeder, function (j) {
return j && j.quote;
}).length > 0);
}
// Builds "{{tplName|lang|part1|part2|…}}" from a sense field (kategori,
// etiket), wrapped inline (" {{…}} ") or on its own line ("\n#: {{…}}").
function buildSenseTpl(sense, field, lang, tplName) {
if (!sense[field] || !sense[field].length) return "";
var parts = sense[field].map(function (p) { return $.trim(p); })
.filter(function (p) { return p !== ""; });
if (!parts.length) return "";
var call = "{{" + tplName + "|" + lang + "|" + parts.join("|") + "}}";
return call
}
/**
* Assembles the nimûne + jêder wikitext block for a sense. Shared by
* both the template-sense and normal-mane-sense branches below.
*/
function buildCite(sense, lang) {
return formatNimune(sense.nimune, lang, senseHasJeder(sense)) +
formatJeder(sense.jeder, lang);
}
function makeWordListStep(id, name, question_fmt) {
return {
id: id,
name: name,
question_fmt: question_fmt,
multiple: true,
narrow: true,
placeholder: "Kelîme…",
visible: function (values) {
return values.lang && values.pos;
},
output: function (values) {
var words = $.grep(values[id] || [], function (w) { return !!w; });
var header = capitalize(name);
if (!words.length) return "";
var lang = values.lang;
var section = "\n==== " + header + " ====\n";
var params = "cure=" + header + "\n" +
$.map(words, function (w) {
return "|" + w;
}).join("\n");
return section +
"{{kol3|" + lang + "|" + params + "\n}}\n";
} };
}
var steps = {
lang: {
id: "lang",
required: true,
name: "ziman",
question_fmt: '"' + pageName + '" bi çi zimanî ye?',
question_br: true,
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (langChoices).
choices: [],
output: function (values) {
if (addLangMode){
return "\n== {{ziman|" + values.lang + "}} ==\n";
}else {
return "== {{ziman|" + values.lang + "}} ==\n";
}
} },
pron: {
id: "pron",
name: "bilêvkirin",
question_fmt: '"' + pageName + '" çawa tê telafûzkirin?',
// pronTpls populated from data.json
pronTpls: {},
visible: function (values) {
if (!values.lang) return false;
// addLangMode: skip pron only if this lang already has a section.
if (addLangMode) {
// Clearing the page makes existing content irrelevant.
var clearPageCheck = $("#wiktku-clear-page-check");
if (clearPageCheck.length && clearPageCheck.prop("checked")) {
return true;
}
var existing = $("#wpTextbox1").val() || "";
return !findLangHeader(existing, values.lang);
}
return true;
},
// Fills the insert-dropdown from pronTpls, filtered by language.
refreshTplSelect: function () {
var sel = $("#wiktku-start-pron .wiktku-tpl-insert-select");
if (!sel.length) return;
var lang = getValues().lang || "";
sel.find("option[value!='']").remove();
$.each(steps.pron.pronTpls, function (name, tpl) {
// Filter: if tpl.langs exists, only show if lang is in that list; otherwise show always
var allowed = !tpl.langs || tpl.langs.indexOf(lang) !== -1;
if (allowed) {
sel.append($("<option></option>")
.val(tpl.snippet)
.text(name + " — " + tpl.desc)
.attr("data-nolang", tpl.noLang ? "1" : ""));
}
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-pron-wrap").length) return null;
var wrap = $("<div class='wiktku-pron-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-pron-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-pron-text")
.attr("rows", 4)
.attr("placeholder", "Nimûne: {{IPA|ku|/pɛɪ̯n/}} yan {{kîte|ku|he|ce|ki|rin}}");
// Template insert dropdown — filtered by language.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike ");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
var lang = getValues().lang || "";
$.each(steps.pron.pronTpls, function (name, tpl) {
// Filter: if tpl.langs exists, only show if lang is in that list; otherwise show always
var allowed = !tpl.langs || tpl.langs.indexOf(lang) !== -1;
if (allowed) {
sel.append($("<option></option>")
.val(tpl.snippet)
.text(name + " — " + tpl.desc)
.attr("data-nolang", tpl.noLang ? "1" : ""));
}
});
sel.on("change", function () {
var snippet = $(this).val();
if (!snippet) return;
var lang = getValues().lang || "";
// Check if the selected option has noLang flag
var selectedOption = sel.find("option:selected");
var hasNoLang = selectedOption.attr("data-nolang") === "1";
if (!hasNoLang) {
snippet = snippet.replace(/CODE/g, lang).replace(/SOURCELANG/g, "?");
}
insertAtCursor(ta[0], snippet);
$(this).val("");
// Clear the picker's search box
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel).append(ta);
stepDiv.append(wrap);
initSelects(wrap);
return ta;
},
output: function () {
var text = $.trim($("#wiktku-start-pron .wiktku-pron-text").val());
if (!text) return "";
var lines = text.split("\n");
var out = $.map(lines, function (line) {
line = $.trim(line);
if (!line) return undefined;
return line;
}).join("\n");
return "\n=== Bilêvkirin ===\n" + out + "\n";
} },
pos: {
id: "pos",
required: true,
name: "Cureyê rêzimanî",
question_fmt: 'Cureyê rêzimanî yê "' + pageName + '" çi ye?',
visible: function (values) {
return values.lang;
},
question_br: true,
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (posChoices).
choices: [],
output: function (values) {
var pos = values.pos || "";
var cinsiyet = values.cinsiyet || ""; // from the cinsiyet step
var lekTur = values.lektur || ""; // from the lêker transitivity step
var capitalizedPos = capitalize(pos);
var outputString = "\n=== " + capitalizedPos + " ===\n";
outputString += "{{" + pos + "|" + values.lang;
if (pos === "navdêr" || pos === "serenav") {
if (cinsiyet) {
outputString += "|c=" + cinsiyet;
} else if (values.lang === "ku") {
outputString += "|c=?";
}
} else if (/^lêker/.test(pos) && lekTur) {
outputString += "|c=" + lekTur;
}
if (values.tr) {
outputString += "|tr=" + values.tr;
}
outputString += "}}\n";
return outputString;
}
},
// cinsiyet (gender) — shown for navdêr/serenav only, with choices built
// from metadata[lang].g since not every language has grammatical gender.
cinsiyet: {
id: "cinsiyet",
name: "cinsiyet",
question_fmt: 'Cinsiyeta "' + pageName + '" çi ye?',
question_br: true,
visible: function (values) {
var meta = metadata[values.lang];
return !!(values.lang && (values.pos === "navdêr" || values.pos === "serenav") &&
meta && meta.g && meta.g.length);
},
build: function (stepDiv, values) {
var select = stepDiv.find("select.wiktku-start-step-field");
if (!select.length) {
select = $(mw.html.element("select", {
"class": "wiktku-start-step-field wiktku-plain-select",
id: "wiktku-start-cinsiyet-field" }));
stepDiv.append(select);
}
if (!values) return select;
var meta = metadata[values.lang];
var codes = (meta && meta.g) || [];
var prevVal = select.val();
var choices = $.map(codes, function (code) {
return [{ code: code, label: genderLabel(code) }];
});
populateMenus(select, choices, null, "Cinsiyetê hilbijêre");
if ($.grep(choices, function (c) { return c.code === prevVal; }).length) {
select.val(prevVal);
}
return select;
},
output: function () { return ""; } // consumed by pos.output
},
// Lêker transitivity
lektur: {
id: "lektur",
name: "Cureyê lêkerê (fiîlê)",
question_fmt: "Cureyê lêkerê (fiîlê) çi ye?",
question_br: true,
visible: function (values) {
return values.lang && values.pos && /^lêker/.test(values.pos);
},
choices: [
{ code: "gh", label: "gerguhêz" },
{ code: "x-gh", label: "xwerû-gerguhêz" },
{ code: "p-gh", label: "pêkhatî-gerguhêz" },
{ code: "h-gh", label: "hevedudanî-gerguhêz" },
{ code: "b-gh", label: "biwêjî-gerguhêz" },
{ code: "ngh", label: "negerguhêz" },
{ code: "x-ngh", label: "xwerû-negerguhêz" },
{ code: "p-ngh", label: "pêkhatî-negerguhêz" },
{ code: "h-ngh", label: "hevedudanî-negerguhêz" },
{ code: "b-ngh", label: "biwêjî-negerguhêz" } ],
output: function () { return ""; } // consumed by pos.output
},
tr: {
id: "tr",
name: "transliterasyon",
question_fmt: "Transliterasyona vê kelîmeyê",
multiple: false,
narrow: true,
visible: function (values) {
return values.lang && values.pos && needsTransliteration(values.lang);
} },
dfn: {
id: "dfn",
name: "Mane",
question_fmt: function (values) {
var base = "Maneya kelîmeyê binivîse. Mane otomatîk tê lînkkirin!";
if (values.lang === "ku") {
return base + " Ji bo tercimeyan beşa 'Werger' bi kar bîne!";
}
return base;
},
multiple: true,
ordered: true,
rows: 3,
visible: function (values) {
return values.lang && values.pos;
},
example: function (values) {
// posExamples loaded from [[MediaWiki:Gadget-start.js/data.json]].
var examples = steps.dfn.posExamples || {};
var full = values.pos || "";
return examples[full] || "";
},
// Builds one sense block (<li>): mane textarea, nimûne list, and
// sub-lists for alternatîv/hevmane/dijmane/etc.
buildSenseBlock: function (stepDiv) {
var block = $("<li class='wiktku-dfn-sense'></li>");
// — Mane textarea (declared first so the template handler can reference it) —
var dfnArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-mane-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-start-step-field wiktku-dfn-mane")
.attr("rows", 6)
.attr("placeholder", "Mane…");
dfnArea.on("input", function () {
steps.dfn.onDfnInput(stepDiv, block, this);
});
// — Tercime + Îzah boxes (non-ku alternative to the plain mane box) —
// Non-ku entries get a direct translation plus a {{îzah|…}}-wrapped
// gloss instead of a Kurdish-style gloss. Rather than teach every
// consumer (getSenses/getOutput/linkify) a second data shape, these
// boxes just write their combined text into dfnArea and re-fire its
// "input" event, so dfnArea stays the single source of truth.
var tercimeArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-tercime-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-dfn-subfield wiktku-dfn-tercime")
.attr("rows", 2)
.attr("placeholder", "Tercimeyên rasterast ên kurmancî… Ji bo school-a îngilîzî li vir 'mekteb, medrese' binivîse");
var izahArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-izah-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-dfn-subfield wiktku-dfn-izah")
.attr("rows", 3)
.attr("placeholder", "Îzaha kurmancî… Ji bo school-a îngilîzî li vir 'cihê tehsîlgirtinê' binivîse");
var nonKuWrap = $("<div class='wiktku-dfn-nonku-wrap'></div>")
.append(tercimeArea).append(izahArea)
.hide();
function syncNonKuToMane() {
var t = $.trim(tercimeArea.val());
var iz = $.trim(izahArea.val());
// if tercime is blank, use îzah as definition
var combined = t ? (iz ? t + " {{îzah|" + iz + "}}" : t) : iz;
dfnArea.val(combined);
// Re-fires onDfnInput so the sense list still grows and
// refresh() still runs, exactly as if this were typed
// directly into the mane textarea.
dfnArea.trigger("input");
}
tercimeArea.on("input", syncNonKuToMane);
izahArea.on("input", syncNonKuToMane);
// Switches between the plain mane box and the tercime+îzah pair —
// only for non-ku entries with no tplSelect selected.
function updateManeMode() {
var lang = getValues().lang || "";
var isTpl = !!tplSelect.val();
if (lang && lang !== "ku" && !isTpl) {
dfnArea.hide();
nonKuWrap.show();
} else {
nonKuWrap.hide();
if (!isTpl) dfnArea.show();
}
}
// Store on the block so refresh() can re-sync every block when
// lang changes, and restoreDfn() can re-sync after restoring.
block.data("updateManeMode", updateManeMode);
// — Template selector (optional — replaces mane when chosen) —
// Template definitions loaded from [[MediaWiki:Gadget-start.js/data.json]].
var tplDefs = steps.dfn.tplDefs || {};
// Cache of all non-placeholder option elements, so updateTplOptions
// can detach/re-attach them without losing the full list.
var _allTplOptions = [];
var tplSelect = $(mw.html.element("select", { "class": "wiktku-dfn-tpl-select" }));
tplSelect.attr("data-placeholder", "Li şablonekê bigere");
tplSelect.append($("<option value=''>— yan jî şablonek hilbijêre —</option>"));
$.each(tplDefs, function (name, tpl) {
var opt = $("<option></option>")
.val(name)
.text(name)
.attr("data-langs", tpl.langs ? tpl.langs.join(",") : "")
.attr("data-nolang", tpl.noLang ? "1" : "");
tplSelect.append(opt);
_allTplOptions.push(opt[0]);
});
function updateTplOptions() {
var lang = getValues().lang || "";
var currentVal = tplSelect.val();
var currentStillValid = false;
// Detach all non-placeholder options, then re-attach only the visible
// ones — native <select> won't reliably hide options any other way.
tplSelect.find("option[value!='']").detach();
$.each(_allTplOptions, function (_, opt) {
var allowed = $(opt).attr("data-langs");
var visible = !allowed || allowed.split(",").indexOf(lang) !== -1;
if (visible) {
tplSelect.append(opt);
if ($(opt).val() === currentVal) currentStillValid = true;
}
});
tplSelect.trigger("wiktku:refresh");
if (currentVal && !currentStillValid) {
tplSelect.val("");
tplTitleInput.hide().val("");
updateManeMode();
}
}
// Store updater on the element so refresh() can call it for all blocks.
tplSelect.data("updateOptions", updateTplOptions);
var tplTitleInput = $("<input type='text'>")
.addClass("wiktku-dfn-tpl-title wiktku-start-narrow")
.attr("placeholder", "Navê rûpela hedefê…")
.hide();
// Grow the sense list when the title field of the last block gets content,
// mirroring what onDfnInput does for the plain mane textarea.
tplTitleInput.on("input", function () {
steps.dfn.onDfnInput(stepDiv, block, this);
});
// Şablon senses have no plain gloss, so hide alternatîv/hevmane/
// dijmane/etc. Etîket, Nimûne and Jêgirtin stay visible either way.
function updateFieldVisibility() {
var isTpl = !!tplSelect.val();
$.each(HIDDEN_ON_TPL_GROUPS, function (_, cls) {
block.find("." + cls + "-group").toggle(!isTpl);
});
}
// Store on the block so restoreDfn() can re-sync visibility
// after setting tplSelect's value.
block.data("updateFieldVisibility", updateFieldVisibility);
tplSelect.on("change", function () {
var chosen = $(this).val();
if (chosen) {
dfnArea.hide();
nonKuWrap.hide();
tplTitleInput.show().focus();
} else {
tplTitleInput.hide().val("");
updateManeMode();
}
updateFieldVisibility();
// Re-run refresh so the Werger step visibility updates.
refresh();
});
var tplRow = $("<div></div>").addClass("wiktku-dfn-tpl-row")
.append(tplSelect).append(" ").append(tplTitleInput);
block.append(tplRow);
block.append(dfnArea);
block.append(nonKuWrap);
// Apply lang filter on initial build.
updateTplOptions();
updateManeMode();
// — Sub-field groups are always visible with a placeholder textarea.
var allGroups = [
{ cls: "wiktku-dfn-etiket", label: "Etîket", rows: 1, narrow: true, izah: "xisûsen, Mêrdîn, anatomî, Badînî" },
{ cls: "wiktku-dfn-kategori", label: "Kategorî", rows: 1, narrow: true, izah: "wekî etîket lê xuya nabe tenê kategorîze dike" },
{ cls: "wiktku-dfn-alternativ", label: "Formên alternatîv", rows: 1, narrow: true, izah: "Varyantên vê kelîmeyê" },
{ cls: "wiktku-dfn-hevmane", label: "Hevmane", rows: 1, narrow: true, izah: "Spehî hevmaneya Bedew e." },
{ cls: "wiktku-dfn-dijmane", label: "Dijmane", rows: 1, narrow: true, izah: "Zengîn dijmaneya feqîr e." },
{ cls: "wiktku-dfn-koordine", label: "Termên koordîne", rows: 1, narrow: true, izah: "Pisîk û kûçik termên koordîne ne çunkî Jornavên wan gelek in" },
{ cls: "wiktku-dfn-jornav", label: "Jornav", rows: 1, narrow: true, izah: "Heywan jornavê guhandar e" },
{ cls: "wiktku-dfn-jernav", label: "Jêrnav", rows: 1, narrow: true, izah: "Guhandar jêrnavê heywan e" },
{ cls: "wiktku-dfn-nimune", label: "Nimûne", rows: 2, narrow: false }
];
$.each(allGroups, function (_, g) {
var groupDiv = $("<div></div>").addClass("wiktku-dfn-subgroup " + g.cls + "-group");
function buildNimuneLi() {
var lang = getValues().lang || "";
var li = $("<li></li>").addClass("wiktku-dfn-nimune-li");
var mainTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-text-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", g.rows)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-text")
.attr("placeholder", "Nimûneya emilandina kelîmeyê tu bi xwe binivîse…");
mainTa.on("input", function () {
highlightLinebreak(this);
var val = $.trim($(this).val());
var isLast = li.is(list.children("li:last-child"));
if (val && isLast) {
list.append(buildNimuneLi());
}
});
li.append(mainTa);
var subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
if (needsTransliteration(lang)) {
subWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-tr")
.attr("placeholder", "Transliterasyona bi alfabeya latînî")
);
}
if (lang && lang !== "ku") {
subWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-t")
.attr("placeholder", "Tercimeya nimûneyê bi kurmancî")
);
}
if (subWrap.children().length) li.append(subWrap);
return li;
}
if (g.cls === "wiktku-dfn-nimune") {
// Nimûne — compound widget with tr/t sub-fields.
var lbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text(g.label))
.append(": ");
var list = $("<ol></ol>").addClass("wiktku-dfn-sublist " + g.cls + "-list");
groupDiv.data("buildNimuneLi", buildNimuneLi);
list.append(buildNimuneLi());
groupDiv.append(lbl).append(list);
block.append(groupDiv);
} else {
// Regular always-visible group — label + growing textarea list.
var lbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text(g.label))
.append(": ")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-hint").text(g.izah));
var list = $("<ol></ol>").addClass("wiktku-dfn-sublist " + g.cls + "-list");
var firstInput = $("<textarea></textarea>")
.attr("name", g.cls + "-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", g.rows)
.attr("class", "wiktku-dfn-subfield" + (g.narrow ? " wiktku-start-narrow" : ""))
.attr("placeholder", g.label + "…");
firstInput.on("input", function () {
steps.dfn.onSubInput(list, this, g.rows, g.narrow);
});
list.append($("<li></li>").append(firstInput));
groupDiv.append(lbl).append(list);
block.append(groupDiv);
}
});
// — Jêder group — growing list, same structure as Nimûne. —
(function () {
var jederGroupDiv = $("<div></div>").addClass("wiktku-dfn-subgroup wiktku-dfn-jeder-group");
var jederLbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text("Jêgirtin"))
.append(": ");
var jederList = $("<ol></ol>").addClass("wiktku-dfn-sublist wiktku-dfn-jeder-list");
function buildJederLi() {
var lang = getValues().lang || "";
var li = $("<li></li>").addClass("wiktku-dfn-jeder-li");
// Quote text textarea
var quoteTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote")
.attr("placeholder", "Nimûneya emilandinê ji kitêb an çavkaniyeke din binivîse");
quoteTa.on("input", function () {
highlightLinebreak(this);
var val = $.trim($(this).val());
var isLast = li.is(jederList.children("li:last-child"));
if (val && isLast) {
jederList.append(buildJederLi());
}
});
li.append(quoteTa);
// tr/t sub-fields for the quote — shown as needed for the language.
var quoteSubWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
if (needsTransliteration(lang)) {
quoteSubWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-tr")
.attr("placeholder", "Transliterasyona jêgirtinê…")
);
}
if (lang && lang !== "ku") {
quoteSubWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-t")
.attr("placeholder", "Tercimeya jêgirtinê bi kurmancî")
);
}
if (quoteSubWrap.children().length) li.append(quoteSubWrap);
// Citoid auto-fill: fetch citation data from a URL, DOI or ISBN and
// prefill the source şablon + fields below (see Gadget-citoid-helper.js).
var citoidWrap = $("<div></div>").addClass("wiktku-dfn-quote-citoid");
var citoidInput = $("<textarea></textarea>")
.addClass("wiktku-dfn-subfield wiktku-dfn-quote-citoid-input")
.attr("rows", 1)
.attr("placeholder", "URL, DOI an ISBN binivîse ku otomatîk were tijekirin…");
var citoidBtn = new OO.ui.ButtonWidget({
label: "Bi Citoidê bîne",
classes: [ "wiktku-dfn-quote-citoid-btn" ]
});
var citoidStatus = $("<span></span>").addClass("wiktku-dfn-quote-citoid-status");
// Fetches citation data from Citoid and fills this citation's
// şablon + fields — only rebuilds fields on template change,
// and never overwrites values the user already typed.
function runCitoidFetch() {
var query = $.trim(citoidInput.val());
if (!query) {
mw.notify("Ji kerema xwe re pêşî URL, DOI an ISBNyekê binivîse.");
return;
}
citoidBtn.setDisabled(true);
citoidStatus.text("Tê anîn…");
wikt.citoidHelper.ensure().then(function () {
return wikt.citoid.fetchJederFields(query);
}).then(function (result) {
var jederKey = result.jederKey;
var hasTpl = !!jederKey && srcSel.find("option[value='" + jederKey + "']").length > 0;
var targetVal = hasTpl ? jederKey : "__manual__";
// Only rebuild if switching şablon, so a repeat fetch
// doesn't clear fields already filled in by hand.
if (srcSel.val() !== targetVal) {
srcSel.val(targetVal).trigger("change");
}
if (hasTpl) {
// Tenê qadên vala tijî bike.
$.each(result.fields, function (key, val) {
var input = srcFields.find("[data-field-key='" + key + "']");
if (input.length && !$.trim(input.val())) {
input.val(val);
}
});
} else {
// Şablonek nehat naskirin ji bo vê itemType — rêzikeke
// çavkaniyê ya bi destan a ji qadên Citoid tê çêkirin,
// lê tenê ger qada destan vala be.
var manualField = srcFields.find(".wiktku-dfn-quote-src-manual");
if (!$.trim(manualField.val())) {
var parts = [];
$.each(["nivîskar", "sernav", "websîte", "kovar", "weşanxane", "sal", "url"], function (_, k) {
if (result.fields[k]) parts.push(result.fields[k]);
});
manualField.val(parts.join(", "));
}
}
citoidStatus.text("");
}, function (errorMsg) {
citoidStatus.text(typeof errorMsg === "string" ? errorMsg : "Nehat dîtin. Kontrol bike ka URL/DOI/ISBN rast e.");
}).always(function () {
citoidBtn.setDisabled(false);
});
}
citoidBtn.on("click", runCitoidFetch);
citoidInput.on("keydown", function (e) {
if (e.which === 13) { // Enter
e.preventDefault();
runCitoidFetch();
}
});
citoidWrap.append(citoidInput).append(citoidBtn.$element).append(citoidStatus);
// Source template selector, specific to this citation.
var srcSel = $("<select></select>").addClass("wiktku-dfn-quote-src-sel wiktku-plain-select");
srcSel.append($("<option value=''>— Çavkaniyê hilbijêre —</option>"));
srcSel.append($("<option></option>").val("__manual__").text("Bi destê xwe binivîsim"));
srcSel.append($("<option></option>").val("__category__").text("Ji Kategorî:Çavkanî şablonekê hilbijêre"));
var jederDefs = steps.dfn.jederDefs || {};
$.each(jederDefs, function (tplName, def) {
srcSel.append($("<option></option>").val(tplName).text(def.label));
});
// Dynamic source fields container.
var srcFields = $("<div></div>").addClass("wiktku-dfn-quote-src-fields");
srcSel.on("change", function () {
srcFields.empty();
var chosen = $(this).val();
if (!chosen) return;
if (chosen === "__manual__") {
// Freeform source, written by the user — becomes the 2nd
// positional param of {{jêder|lang|…}} instead of çavkanî?.
srcFields.append(
$("<textarea></textarea>")
.attr("rows", 4)
.addClass("wiktku-dfn-subfield wiktku-dfn-quote-src-manual")
.attr("placeholder", "Çavkaniyê bi destê xwe binivîse…")
);
return;
}
if (chosen === "__category__") {
// Search widget over the members of [[Kategorî:Çavkanî]].
// Picking a şablon here immediately switches the row to
// "Bi destê xwe binivîsim" mode with {{Şablon}} pre-filled,
var catWrap = $("<span></span>").addClass("wiktku-native-select-wrap wiktku-dfn-quote-src-cat");
var catInput = $("<input type='search' autocomplete='off'>")
.addClass("wiktku-start-narrow wiktku-dfn-quote-src-cat-input")
.attr("placeholder", "Li navê şablonê bigere…");
var catResults = $("<ul></ul>").addClass("wiktku-ac-results wiktku-dfn-quote-src-cat-results").hide();
var catStatus = $("<span></span>").addClass("wiktku-dfn-quote-src-cat-status").text("Şablon tên barkirin…");
var showCatResults = function (query) {
var q = $.trim(query).toLowerCase();
catResults.empty();
var list = catSrcTemplates || [];
var matched = q ?
$.grep(list, function (name) { return name.toLowerCase().indexOf(q) !== -1; }) :
list;
if (!matched.length) {
catResults.hide();
return;
}
$.each(matched.slice(0, 50), function (_, name) {
var li = $("<li></li>").text(name).attr("data-value", name);
var touchMoved = false;
li.on("touchstart", function () { touchMoved = false; });
li.on("touchmove", function () { touchMoved = true; });
li.on("touchend", function (e) {
if (touchMoved) return;
e.preventDefault();
selectCatTpl(name);
});
li.on("mousedown", function (e) {
e.preventDefault();
selectCatTpl(name);
});
catResults.append(li);
});
catResults.show();
};
// Wraps the chosen şablon as {{Name}}, drops it into the
// manual textarea, and switches the row into manual mode
// so the user can keep editing it (add params, etc.).
var selectCatTpl = function (name) {
catResults.hide();
srcSel.val("__manual__");
srcSel.trigger("change");
srcFields.find(".wiktku-dfn-quote-src-manual")
.val("{{" + name + "}}")
.trigger("focus");
};
catInput.on("input", function () {
showCatResults($(this).val());
});
catInput.on("focus", function () {
showCatResults($(this).val());
});
catInput.on("blur", function () {
setTimeout(function () { catResults.hide(); }, 200);
});
catWrap.append(catInput).append(catResults).append(catStatus);
srcFields.append(catWrap);
fetchCatSrcTemplates().then(function () {
catStatus.text("");
}, function () {
catStatus.text("Şablon nehatin barkirin.");
});
return;
}
var def = (steps.dfn.jederDefs || {})[chosen];
if (!def) return;
$.each(def.fields, function (key, label) {
var row = $("<div></div>").addClass("wiktku-dfn-quote-src-row");
var fieldLbl = $("<label></label>").text(label + ": ");
var inp = $("<textarea></textarea>")
.attr("rows", 2)
.addClass("wiktku-dfn-quote-src-input wiktku-start-narrow")
.attr("data-field-key", key)
.attr("placeholder", label + "…");
// "Sernav" / "Sernavê orjînal" (title fields, e.g. for
// kitêb/kovar/malper) get a taller, draggable box; every
// other field in the template stays as-is. Field labels
// come from the on-wiki jederDefs data, so match on the
// (diacritic-folded) label text rather than a fixed key.
var foldedLabel = foldDiacritics(label);
if (/^sernav$/.test(foldedLabel) || /orjin/.test(foldedLabel)) {
inp.addClass("wiktku-dfn-quote-src-input--title");
}
row.append(fieldLbl).append(inp);
srcFields.append(row);
});
});
li.append(citoidWrap).append(srcSel).append(srcFields);
return li;
}
jederGroupDiv.data("buildJederLi", buildJederLi);
jederList.append(buildJederLi());
jederGroupDiv.append(jederLbl).append(jederList);
block.append(jederGroupDiv);
}());
// Apply the initial hide/show state for the sub-groups (matches
// tplSelect's starting value, which is normally empty).
updateFieldVisibility();
return block;
},
/** Grows the sense list when the last mane textarea gets content. */
onDfnInput: function (stepDiv, block, textarea) {
var val = $.trim($(textarea).val());
var list = stepDiv.find("ol.wiktku-dfn-list");
var isLast = block.is(list.children("li:last-child"));
if (val && isLast) {
var newBlock = steps.dfn.buildSenseBlock(stepDiv);
list.append(newBlock);
// Give the new block's template selector the searchable picker.
initSelects(newBlock);
}
refresh();
},
/** Grows a sub-list (nimûne/formên alternatîv/hevmane/dijmane/termên koordîne) on input. */
onSubInput: function (list, input, rows, narrow) {
var val = $.trim($(input).val());
var item = $(input).parent();
var isLast = item.is(list.children("li:last-child"));
if (val && isLast) {
var next = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-sub-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", rows)
.attr("class", "wiktku-dfn-subfield" + (narrow ? " wiktku-start-narrow" : ""));
next.on("input", function () {
steps.dfn.onSubInput(list, this, rows, narrow);
});
list.append($("<li></li>").append(next));
}
},
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (tplDefs, posExamples, jederDefs).
tplDefs: {},
posExamples: {},
jederDefs: {},
build: function (stepDiv) {
if (stepDiv.find("ol.wiktku-dfn-list").length) return null;
var list = $("<ol class='wiktku-dfn-list'></ol>");
list.append(steps.dfn.buildSenseBlock(stepDiv));
stepDiv.append(list);
return null;
},
/** Reads all sense blocks from the DOM and returns an array of sense objects. */
getSenses: function (stepDiv) {
var senses = [];
stepDiv.find("li.wiktku-dfn-sense").each(function () {
var block = $(this);
var tplSel = block.find("select.wiktku-dfn-tpl-select");
var tpl = tplSel.val() || "";
// noLang: template already encodes the language — don't add |lang| param.
var tplNoLang = tpl
? tplSel.find("option[value='" + tpl + "']").attr("data-nolang") === "1"
: false;
var tplTitle = $.trim(block.find("input.wiktku-dfn-tpl-title").val());
var mane = $.trim(block.find("textarea.wiktku-dfn-mane").val());
function readList(cls) {
var vals = [];
block.find("." + cls + "-list textarea").each(function () {
var v = $.trim($(this).val());
if (v) vals.push(v);
});
return vals;
}
// Nimûne items are compound: { text, tr?, t? }
function readNimuneList() {
var items = [];
block.find(".wiktku-dfn-nimune-list li.wiktku-dfn-nimune-li").each(function () {
var text = $.trim($(this).find(".wiktku-dfn-nimune-text").val());
if (!text) return;
var obj = { text: text };
var tr = $.trim($(this).find(".wiktku-dfn-nimune-tr").val());
var t = $.trim($(this).find(".wiktku-dfn-nimune-t").val());
if (tr) obj.tr = tr;
if (t) obj.t = t;
items.push(obj);
});
return items;
}
// Jêder is a growing list of citations, one per li — mirrors readNimuneList().
function readJederList() {
var items = [];
block.find(".wiktku-dfn-jeder-list li.wiktku-dfn-jeder-li").each(function () {
var li = $(this);
var quote = $.trim(li.find(".wiktku-dfn-nimune-quote").val());
if (!quote) return;
var obj = { quote: quote };
var qtr = $.trim(li.find(".wiktku-dfn-nimune-quote-tr").val());
var qt = $.trim(li.find(".wiktku-dfn-nimune-quote-t").val());
if (qtr) obj.quoteTr = qtr;
if (qt) obj.quoteT = qt;
var tplName = li.find(".wiktku-dfn-quote-src-sel").val();
if (tplName === "__manual__") {
var manual = $.trim(li.find(".wiktku-dfn-quote-src-manual").val());
if (manual) obj.jederManual = manual;
} else if (tplName === "__category__") {
// Reachable only if the user opened the category search but
// never picked a şablon — picking one switches the row to
// __manual__ (see selectCatTpl above), so there's nothing
// meaningful to save here.
} else if (tplName) {
obj.jederTpl = tplName;
var fields = {};
li.find(".wiktku-dfn-quote-src-input").each(function () {
var k = $(this).attr("data-field-key");
var v = $.trim($(this).val());
if (k && v) fields[k] = v;
});
obj.jêderFields = fields;
}
items.push(obj);
});
return items;
}
senses.push({
tpl: tpl,
tplNoLang: tplNoLang,
tplTitle: tplTitle,
mane: mane,
etiket: readList("wiktku-dfn-etiket"),
kategori: readList("wiktku-dfn-kategori"),
nimune: readNimuneList(),
jeder: readJederList(),
alternativ: readList("wiktku-dfn-alternativ"),
hevmane: readList("wiktku-dfn-hevmane"),
dijmane: readList("wiktku-dfn-dijmane"),
koordine: readList("wiktku-dfn-koordine"),
jornav: readList("wiktku-dfn-jornav"),
jernav: readList("wiktku-dfn-jernav")
});
});
return senses;
},
getOutput: function (values, callback) {
var stepDiv = $("#wiktku-start-dfn");
var senses = steps.dfn.getSenses(stepDiv);
var lang = values.lang;
// A sense counts as "filled" if it has a mane, a chosen template + title,
// or any other content (etîket/hevmane/nimûne/jêder…) worth keeping.
var hasMane = senses.some(function (s) {
return s.mane !== "" || (s.tpl && s.tplTitle) || senseHasExtraContent(s);
});
var defLines = []; // one entry per kept sense (goes to linkify)
var citeLines = []; // parallel — nimûne+jêder for that same sense
var izahLines = []; // parallel — raw îzah gloss for that same sense
// True only once some sense's *actual* dfn text (post tercime/îzah
// split) is non-empty.
var hasLinkableMane = false;
$.each(senses, function (_, sense) {
// — Template sense (e.g. {{guharto|ku|somepage}}) —
if (sense.tpl) {
if (!sense.tplTitle) return; // skip empty template senses
var tplKatTpl = buildSenseTpl(sense, "kategori", lang, "K");
var tplLabelTpl = buildSenseTpl(sense, "etiket", lang, "e");
var tplCall = sense.tplNoLang
? "{{" + sense.tpl + "|" + sense.tplTitle + "}}"
: "{{" + sense.tpl + "|" + lang + "|" + sense.tplTitle + "}}";
var idx = defLines.length;
var cite = buildCite(sense, lang);
defLines.push("# " + (tplKatTpl ? tplKatTpl + " " : "") + (tplLabelTpl ? tplLabelTpl + " " : "") + tplCall +
(cite ? "{{wiktku-cite-" + idx + "}}" : ""));
citeLines.push(cite);
izahLines.push(""); // template senses have no îzah
return;
}
// — Normal mane sense —
var dfn = sense.mane;
if (!dfn && !senseHasExtraContent(sense)) return; // truly empty
// Pull the îzah gloss (if any) out of the combined tercime+îzah
// string — it's spliced back in separately below, after its
// own linkify pass (see izahLines / the second linkifyText call).
var izahRaw = null;
var tercimeIzah = splitTercimeIzah(dfn);
if (tercimeIzah) {
dfn = tercimeIzah.tercime;
izahRaw = stripWikilinks(tercimeIzah.izah);
}
if (dfn) {
dfn = stripWikilinks(dfn);
// Sentence-case + trailing period are for ku definitions,
// which are written as full glosses.
if (lang === "ku") {
if (dfn[0] !== dfn[0].toUpperCase()) dfn = capitalize(dfn);
if (!dfn.match(/[.…?!)\]]$/)) dfn += ".";
}
} else if (izahRaw === null) {
dfn = lang === "ku" ? "{{mane?|" + lang + "}}" : "";
}
if (dfn) hasLinkableMane = true;
var katTpl = buildSenseTpl(sense, "kategori", lang, "K");
var labelTpl = buildSenseTpl(sense, "etiket", lang, "e");
var out = "# " + (katTpl ? katTpl + " " : "") + (labelTpl ? labelTpl + " " : "") + dfn;
var idx = defLines.length;
var hasThisIzah = izahRaw !== null && $.trim(izahRaw) !== "";
// Bare {{...}} token — like {{wiktku-cite-N}}, this survives
// linkify's first pass untouched (it treats template calls as
// opaque), then gets swapped for {{îzah|…}} once the actual
// gloss text has been linkified in its own separate pass.
if (hasThisIzah) {
out += (dfn ? " " : "") + "{{wiktku-izah-" + idx + "}}";
}
function wordLine(tpl, words) {
if (!words.length) return "";
return "\n#: {{" + tpl + "|" + lang + "|" + words.join("|") + "}}";
}
out += wordLine("alt-r", sense.alternativ);
out += wordLine("hevmane", sense.hevmane);
out += wordLine("dijmane", sense.dijmane);
out += wordLine("koordîne", sense.koordine);
out += wordLine("jornav", sense.jornav);
out += wordLine("jêrnav", sense.jernav);
var cite = buildCite(sense, lang);
defLines.push(out + (cite ? "{{wiktku-cite-" + idx + "}}" : ""));
citeLines.push(cite);
izahLines.push(hasThisIzah ? izahRaw : "");
});
// Splice citeLines back into a linkified string, replacing each
// {{wiktku-cite-N}} token with its stored nimûne/jêder block.
function restoreCites(t) {
return t.replace(/\{\{wiktku-cite-(\d+)\}\}/g, function (_, n) {
return citeLines[parseInt(n, 10)] || "";
});
}
// Runs text through the linkify gadget if it's loaded, otherwise
// just passes it through unchanged. Shared by both linkify passes
// below (main mane text, and — separately — îzah glosses).
function linkifyText(t, cb) {
if (typeof $.kuLinkify === "function") {
$.kuLinkify(t, cb);
} else {
cb(t);
}
}
var hasIzah = izahLines.some(function (t) { return t && $.trim(t) !== ""; });
var text = defLines.join("\n") + "\n";
if (!hasMane) {
// No definitions entered — emit {{mane?}} with nimûne?.
text = "# {{mane?|" + lang + "}}\n#* {{nimûne?|" + lang + "}}\n";
callback(text);
return;
}
// Runs the îzah-only linkify pass against `base` (either the raw
// text, when there's no linkable mane to run the main pass on
// first, or the already-linkified main text). Shared by both
// branches below so the token-splice logic only lives once.
function runIzahPass(base) {
var izahJoined = $.map(izahLines, function (raw, idx) {
if (!raw) return undefined;
return "{{wiktku-izah-open-" + idx + "}}" + raw + "{{wiktku-izah-close-" + idx + "}}";
}).join("\n");
linkifyText(izahJoined, function (izahLinked) {
var izahByIdx = {};
var re = /\{\{wiktku-izah-open-(\d+)\}\}([\s\S]*?)\{\{wiktku-izah-close-\1\}\}/g;
var m;
while ((m = re.exec(izahLinked)) !== null) {
izahByIdx[parseInt(m[1], 10)] = m[2];
}
var withIzah = base.replace(/\{\{wiktku-izah-(\d+)\}\}/g, function (_, n) {
var linked = izahByIdx[parseInt(n, 10)];
return linked !== undefined ? "{{îzah|" + linked + "}}" : "";
});
callback(restoreCites(withIzah));
});
}
if (!hasLinkableMane) {
if (!hasIzah) {
// All filled senses are template senses (or otherwise have
// no plain text at all) — nothing here needs linkify.
callback(restoreCites(text));
return;
}
// There's no plain mane text anywhere (e.g. tercime left blank
// with only îzah filled in), so every defLine is just a bare
// template call with nothing to word-link. Sending a line
// like "# {{wiktku-izah-0}}" through the main linkify pass
// gives it no plain words to work with, makes the linkify
// gadget hang — so skip that pass entirely and run only
// the îzah pass, splicing straight into the unlinkified text.
var loadIzahOnly = function () { runIzahPass(text); };
mw.loader.using("ext.gadget.linkify", loadIzahOnly, loadIzahOnly);
return;
}
var didTryToLoad = function () {
// First pass: the main definition text (mane), same as before.
linkifyText(text, function (mainLinked) {
if (!hasIzah) {
callback(restoreCites(mainLinked));
return;
}
// Second pass: îzah glosses, linkified via their own
// separate call. Each gloss is wrapped in its own
// {{wiktku-izah-open/close-N}} pair; like the existing
// {{wiktku-cite-N}} tokens, these sit inside double
// braces so linkify leaves the tokens themselves alone —
// only the raw gloss text between each pair gets linked.
runIzahPass(mainLinked);
});
};
mw.loader.using("ext.gadget.linkify", didTryToLoad, didTryToLoad);
}
},
tewandin: {
id: "tewandin",
name: "tewandin",
question_fmt: 'Tewandina "' + pageName + '" binivîse',
visible: function (values) {
return values.lang && values.pos;
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-tewandin-wrap").length) return null;
var wrap = $("<div class='wiktku-tewandin-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-tewandin-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-tewandin-text")
.attr("rows", 4)
.attr("placeholder", "{{ku-tewîn-nav|" + pageName + "|n}}");
wrap.append(ta);
stepDiv.append(wrap);
// Auto-populate with {{ku-tewîn-nav|...}} when conditions are met.
function autoPopulate() {
if (!ta.length) return;
var vals = getValues();
var c = vals.cinsiyet || "";
var p = vals.pos || "";
if (!pageName.includes(" ") && c && GENDER_BASE_LABELS[c] &&
(p === "navdêr" || p === "serenav") && vals.lang === "ku") {
var out = "{{ku-tewîn-nav|" + pageName + "|" + GENDER_BASE_LABELS[c];
if (p === "serenav") out += "|y";
out += "}}";
if (!$.trim(ta.val())) ta.val(out);
}
}
setTimeout(autoPopulate, 0);
$("#wiktku-start-lang-field, #wiktku-start-cinsiyet-field, #wiktku-start-pos-field")
.on("change.tewandin", autoPopulate);
return ta;
},
output: function (values) {
var cinsiyet = values.cinsiyet || "";
var pos = values.pos || "";
var manualText = $.trim($("#wiktku-start-tewandin .wiktku-tewandin-text").val());
if (manualText) {
return "\n==== Tewandin ====\n" + manualText + "\n";
}
if (!pageName.includes(" ") && cinsiyet &&
GENDER_BASE_LABELS[cinsiyet] &&
(pos === "navdêr" || pos === "serenav") && values.lang === "ku") {
var out = "{{ku-tewîn-nav|" + pageName + "|" + GENDER_BASE_LABELS[cinsiyet];
if (pos === "serenav") out += "|y";
out += "}}";
return "\n==== Tewandin ====\n" + out + "\n";
}
return "";
}
},
je: makeWordListStep("je", "jê", "Kelîmeyên jê çêbûyî binivîse"),
tekildar: makeWordListStep("tekildar", "têkildar", "Kelîmeyên ji aliyê etîmolojiyê ve têkildarî vê kelîmeyê binivîse"),
binereherwiha: makeWordListStep("binereherwiha", "binêre herwiha", "Kelîmeyên din ên eleqedar binivîse"),
etym: {
id: "etym",
name: "etîmolojî",
question_fmt: "Etîmolojiya kelîmeyê binivîse",
// etymTpls populated from data.json
etymTpls: {},
visible: function (values) {
return values.lang && values.pos;
},
// Fills the insert-dropdown from the current etymTpls object.
refreshTplSelect: function () {
var sel = $("#wiktku-start-etym .wiktku-tpl-insert-select");
if (!sel.length) return;
sel.find("option[value!='']").remove();
$.each(steps.etym.etymTpls, function (name, tpl) {
sel.append($("<option></option>").val(tpl.snippet).text(name + " — " + tpl.desc));
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-etym-wrap").length) return null;
var wrap = $("<div class='wiktku-etym-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-etym-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-etym-text")
.attr("rows", 4)
.attr("placeholder", "Ji {{ji|en|ku|apple}}. yan rasterast binivîse…");
// Template insert dropdown — options also refreshed after data.json loads.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike…");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
$.each(steps.etym.etymTpls, function (name, tpl) {
sel.append($("<option></option>").val(tpl.snippet).text(name + " — " + tpl.desc));
});
sel.on("change", function () {
var snippet = $(this).val();
if (!snippet) return;
var lang = getValues().lang || "";
snippet = snippet.replace(/CODE/g, lang).replace(/SOURCELANG/g, "?");
insertAtCursor(ta[0], snippet);
$(this).val("");
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel);
wrap.append(ta);
stepDiv.append(wrap);
initSelects(wrap);
return ta;
},
output: function (values) {
var text = $.trim($("#wiktku-start-etym .wiktku-etym-text").val());
if (text) {
return "\n==== Etîmolojî ====\n" + text + "\n";
}
// No etymology entered — emit {{ji?|lang}} as a placeholder.
// Skip it only when every filled sense is a şablon sense
// a completely empty entry with no şablon chosen still gets the placeholder
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasFilledTplSense = dfnSenses.some(function (s) {
return !!s.tpl && !!s.tplTitle;
});
var hasRegularMane = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
if (hasFilledTplSense && !hasRegularMane) return "";
return "\n==== Etîmolojî ====\n{{ji?|" + values.lang + "}}\n";
} },
dunde: {
id: "dunde",
name: "dûnde",
question_fmt: "Eger ev kelîme ji vî zimanî ketibe zimanekî din, vî zimanî û kelîmeya wî binivîse",
visible: function (values) {
return !!values.pos;
},
disabledKeys: function (values) {
return {"navz": true, [values.lang]: true}
},
// Language dropdown + growing word-input list; a new row appends
// when the dropdown gets a value. Mirrors steps.trans, but flat.
buildRow: function (stepDiv) {
var row = $("<li class='wiktku-dunde-row wiktku-lang-row'></li>");
// Language selector — the searchable picker is applied after insertion into DOM.
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zimanekî bigere");
populateMenus(langSel, steps.dunde.keys || [], steps.dunde.disabledKeys);
// When a language is chosen, ensure a next empty row exists.
langSel.on("change", function () {
steps.dunde.onLangChange(stepDiv, row);
});
// Word list for this language.
var wordList = $("<ul class='wiktku-dunde-words wiktku-lang-row-words'></ul>");
var firstWord = steps.dunde.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
// The searchable picker is attached by initSelects() once the row
// is in the DOM (see onLangChange/build below).
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-dunde-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Kelîme…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-dunde-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.dunde.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (stepDiv, row) {
var list = stepDiv.find("ul.wiktku-dunde-list");
var isLast = row.is(list.children("li.wiktku-dunde-row:last-child"));
if (isLast) {
var newRow = steps.dunde.buildRow(stepDiv);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
// Keep disabled keys in sync across all lang selectors.
steps.dunde.syncDisabledKeys(stepDiv);
},
/** Disables already-selected languages in all other dropdowns. */
syncDisabledKeys: function (stepDiv) {
var taken = $.extend({}, steps.dunde.disabledKeys);
stepDiv.find("li.wiktku-dunde-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
stepDiv.find("li.wiktku-dunde-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
build: function (stepDiv) {
if (stepDiv.find("ul.wiktku-dunde-list").length) return null;
var list = $("<ul class='wiktku-dunde-list wiktku-lang-row-list'></ul>");
list.append(steps.dunde.buildRow(stepDiv));
stepDiv.append(list);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return null;
},
/** Reads all [langcode, words[]] rows from the DOM. */
getRows: function (stepDiv) {
var result = [];
stepDiv.find("li.wiktku-dunde-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-dunde-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
output: function () {
var stepDiv = $("#wiktku-start-dunde");
var rows = steps.dunde.getRows(stepDiv);
if (!rows.length) return "";
var lines = $.map(rows, function (row) {
var lang = row[0], words = row[1];
return "* {{dû|" + lang + "|" + words.join("|") + "}}";
});
return "\n==== Dûnde ====\n" + lines.join("\n") + "\n";
}
},
zarava: {
id: "zarava",
name: "bi zaravayên din",
question_fmt: "'"+ pageName + "' di zaravayên din de çawa tê gotin?",
visible: function (values) {
return steps.trans.visible(values);
},
disabledKeys: {},
buildRow: function (group) {
var row = $("<li class='wiktku-zarava-row wiktku-lang-row'></li>");
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zaravayekî bigere");
populateMenus(langSel, steps.zarava.keys || [], steps.zarava.disabledKeys);
langSel.on("change", function () {
steps.zarava.onLangChange(group, row);
});
var wordList = $("<ul class='wiktku-zarava-words wiktku-lang-row-words'></ul>");
var firstWord = steps.zarava.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-zarava-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Tercime…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-zarava-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.zarava.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (group, row) {
var list = group.find("ul.wiktku-zarava-list");
var isLast = row.is(list.children("li.wiktku-zarava-row:last-child"));
if (isLast) {
var newRow = steps.zarava.buildRow(group);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
steps.zarava.syncDisabledKeys(group);
},
/** Disables already-selected dialects in all other dropdowns within one group. */
syncDisabledKeys: function (group) {
var taken = $.extend({}, steps.zarava.disabledKeys);
group.find("li.wiktku-zarava-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
group.find("li.wiktku-zarava-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
/** Builds (or fetches) the .wiktku-zarava-group for one gloss. */
buildGroup: function (stepDiv, gi) {
var group = $("<div class='wiktku-zarava-group'></div>").attr("data-gloss-pos", gi);
var list = $("<ul class='wiktku-zarava-list wiktku-lang-row-list'></ul>");
list.append(steps.zarava.buildRow(group));
group.append(list);
stepDiv.append(group);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return group;
},
/** Syncs one .wiktku-zarava-group per current gloss (same logic as steps.trans.build). */
build: function (stepDiv) {
var glosses = steps.trans.glossList();
if (!glosses.length) {
stepDiv.find(".wiktku-zarava-group").remove();
return null;
}
var existingGroups = stepDiv.find(".wiktku-zarava-group");
if (existingGroups.length > glosses.length) {
existingGroups.slice(glosses.length).remove();
}
$.each(glosses, function (gi, gloss) {
var group = stepDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
if (!group.length) group = steps.zarava.buildGroup(stepDiv, gi);
var label = group.find(".wiktku-zarava-group-label");
if (glosses.length > 1) {
if (!label.length) {
label = $("<div class='wiktku-zarava-group-label'></div>");
group.prepend(label);
}
label.text(gloss.index + " " + gloss.text);
} else if (label.length) {
label.remove();
}
});
return null;
},
/** Reads the dialect rows for a single gloss group. */
getGroupTranslations: function (group) {
var result = [];
group.find("li.wiktku-zarava-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-zarava-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
/** Reads all rows from the DOM, grouped by gloss position. */
getTranslations: function (stepDiv) {
var result = [];
stepDiv.find(".wiktku-zarava-group").each(function () {
result.push(steps.zarava.getGroupTranslations($(this)));
});
return result;
},
output: function (values) {
if (values.lang !== "ku") return "";
var stepDiv = $("#wiktku-start-zarava");
var glosses = steps.trans.glossList();
if (!glosses.length) return "";
var blocks = $.map(glosses, function (gloss, gi) {
var group = stepDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
var rows = group.length ? steps.zarava.getGroupTranslations(group) : [];
if (!gloss.text && !rows.length) return undefined;
if (rows.length) {
rows.sort(function (a, b) {
var aLang = langsByCode[a[0]] || {};
var bLang = langsByCode[b[0]] || {};
return (aLang.sortKey || "").localeCompare(bLang.sortKey || "", "ku");
});
}
var wordLines = $.map(rows, function (row) {
var lang = row[0];
var words = row[1];
var wikiWords = words.map(function (w) {
return "{{W|" + lang + "|" + w + "}}";
}).join(", ");
return "* {{Z|" + lang + "}}: " + wikiWords;
}).join("\n");
if (!wordLines) return undefined;
var block = "{{werger-ser|" + (gloss.text || "?") + "|" + gloss.index + "}}";
block += "\n" + wordLines;
block += "\n{{werger-bin}}";
return block;
});
if (!blocks.length) return "";
return "\n==== Bi zaravayên din ====\n" + blocks.join("\n") + "\n";
}
},
trans: {
id: "trans",
name: "werger",
question_fmt: "Tercimeyên vê maneyê bi zimanên din binivîse",
visible: function (values) {
if (!(values.lang === "ku" && values.pos)) return false;
// Hide only when every sense is a filled template sense (no plain
// gloss to attach translations to). A mix, or nothing filled in
// yet, still shows Werger.
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasRealSense = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
var hasFilledTplSense = dfnSenses.some(function (s) {
return s.tpl && s.tplTitle;
});
return hasRealSense || !hasFilledTplSense;
},
disabledKeys: {
"navz": true,
"ku": true,
"ckb": true,
"sdh": true,
"lki": true,
"hac": true,
"zza": true },
// Language dropdown + growing word-input list, scoped to one gloss's
// group (each gloss has its own group and row list).
buildRow: function (group) {
var row = $("<li class='wiktku-trans-row wiktku-lang-row'></li>");
// Language selector — the searchable picker is applied after insertion into DOM.
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zimanekî bigere");
populateMenus(langSel, steps.trans.keys || [], steps.trans.disabledKeys);
// When a language is chosen, ensure a next empty row exists.
langSel.on("change", function () {
steps.trans.onLangChange(group, row);
});
// Word list for this language.
var wordList = $("<ul class='wiktku-trans-words wiktku-lang-row-words'></ul>");
var firstWord = steps.trans.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
// The searchable picker is attached by initSelects() once the row
// is in the DOM (see onLangChange/buildGroup below).
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-trans-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Tercime…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-trans-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.trans.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (group, row) {
var list = group.find("ul.wiktku-trans-list");
var isLast = row.is(list.children("li.wiktku-trans-row:last-child"));
if (isLast) {
var newRow = steps.trans.buildRow(group);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
// Keep disabled keys in sync across this gloss's lang selectors
// only — the same language can be used for different senses.
steps.trans.syncDisabledKeys(group);
},
/** Disables already-selected languages in all other dropdowns within one group. */
syncDisabledKeys: function (group) {
var taken = $.extend({}, steps.trans.disabledKeys);
group.find("li.wiktku-trans-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
group.find("li.wiktku-trans-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
// Builds (or fetches) the .wiktku-trans-group for one gloss.
buildGroup: function (stepDiv, gi) {
var group = $("<div class='wiktku-trans-group'></div>").attr("data-gloss-pos", gi);
var list = $("<ul class='wiktku-trans-list wiktku-lang-row-list'></ul>");
list.append(steps.trans.buildRow(group));
group.append(list);
stepDiv.append(group);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return group;
},
// Syncs one .wiktku-trans-group per current gloss, keyed by
// data-gloss-pos so groups stay matched across rebuilds.
build: function (stepDiv) {
var glosses = steps.trans.glossList();
if (!glosses.length) {
stepDiv.find(".wiktku-trans-group").remove();
return null;
}
// Drop groups for glosses that no longer exist (always from the
// tail — groups are only ever appended in gloss order below).
var existingGroups = stepDiv.find(".wiktku-trans-group");
if (existingGroups.length > glosses.length) {
existingGroups.slice(glosses.length).remove();
}
$.each(glosses, function (gi, gloss) {
var group = stepDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
if (!group.length) group = steps.trans.buildGroup(stepDiv, gi);
// Only label groups when there's more than one gloss to
// distinguish between — a single gloss needs no caption.
var label = group.find(".wiktku-trans-group-label");
if (glosses.length > 1) {
if (!label.length) {
label = $("<div class='wiktku-trans-group-label'></div>");
group.prepend(label);
}
label.text(gloss.index + " " + gloss.text);
} else if (label.length) {
label.remove();
}
});
return null;
},
/** Reads the translation rows for a single gloss group. */
getGroupTranslations: function (group) {
var result = [];
group.find("li.wiktku-trans-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-trans-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
// Reads all translation rows, grouped by gloss position.
getTranslations: function (stepDiv) {
var result = [];
stepDiv.find(".wiktku-trans-group").each(function () {
result.push(steps.trans.getGroupTranslations($(this)));
});
return result;
},
// Builds the numbered "{ index, gloss }" list, one per dfn sense
// with a real mane (skips template senses). index is 1-based and
// matches the sense's position in the "#" definition list.
// When nothing's filled in, returns one placeholder entry so
// Werger still has a group to attach to; when every sense is a
// filled template sense, stays empty (matches trans.visible()).
glossList: function () {
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var glosses = [];
var hasFilledTplSense = false;
$.each(dfnSenses, function (i, s) {
if (s.tpl) {
if (s.tplTitle) hasFilledTplSense = true;
return; // template sense — no gloss to caption with
}
var dfn = s.mane;
if (!dfn) {
// No mane, but other fields are filled — still gets a
// gloss group since dfn.getOutput() emits {{mane?}} for it.
if (senseHasExtraContent(s)) glosses.push({ index: i + 1, text: "" });
return;
}
if (dfn[0] !== dfn[0].toLowerCase()) dfn = decapitalize(dfn);
dfn = stripWikilinks(dfn).replace(/[.…?!)\]،؟]+$/, "");
glosses.push({ index: i + 1, text: dfn });
});
if (!glosses.length && !hasFilledTplSense) {
glosses.push({ index: 1, text: "" });
}
return glosses;
},
output: function (values) {
if (values.lang !== "ku") return "";
var stepDiv = $("#wiktku-start-trans");
var glosses = steps.trans.glossList();
// Every sense is a template sense — there's no real gloss
// anywhere and no group in the DOM either (glossList() only
// returns empty in that case), so skip the section entirely.
if (!glosses.length) return "";
// A completely empty entry (nothing filled in dfn at all, no
// şablon chosen either) still gets a placeholder Werger section
// to fill in later. Only
// skip an individual placeholder gloss below when some other
// sense actually has real content, making that particular
// placeholder redundant.
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasRegularMane = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
// Each gloss now has its own group of translation rows —
// attach every gloss's own words under its own werger-ser/-bin
// pair instead of dumping everything under the first one.
var blocks = $.map(glosses, function (gloss, gi) {
var group = stepDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
var rows = group.length ? steps.trans.getGroupTranslations(group) : [];
// Placeholder gloss (no real mane entered yet) with nothing
// translated into it. If some other sense already has real
// content, this placeholder is redundant — skip it. If the
// whole entry is empty, keep it so Werger still gets a
// section to fill in.
if (!gloss.text && !rows.length && hasRegularMane) return undefined;
if (rows.length) {
// Sort by Kurdish sort key.
rows.sort(function (a, b) {
var aLang = langsByCode[a[0]] || {};
var bLang = langsByCode[b[0]] || {};
return (aLang.sortKey || "").localeCompare(bLang.sortKey || "", "ku");
});
}
var wordLines = $.map(rows, function (row) {
var lang = row[0];
var words = row[1];
var wikiWords = words.map(function (w) {
return "{{W|" + lang + "|" + w + "}}";
}).join(", ");
return "* {{Z|" + lang + "}}: " + wikiWords;
}).join("\n");
var block = "{{werger-ser|" + (gloss.text || "?") + "|" + gloss.index + "}}";
if (wordLines) block += "\n" + wordLines;
block += "\n{{werger-bin}}";
return block;
});
if (!blocks.length) return "";
return "\n==== Werger ====\n" + blocks.join("\n") + "\n";
}
},
cavkani: {
id: "cavkani",
name: "çavkanî",
question_fmt: "Çavkaniyên din (ne jêgirtin) lê zêde bike",
visible: function (values) {
return !!values.pos;
},
// Fills the insert-dropdown from the members of [[Kategorî:Çavkanî]].
refreshTplSelect: function () {
var sel = $("#wiktku-start-cavkani .wiktku-tpl-insert-select");
if (!sel.length) return;
sel.find("option[value!='']").remove();
$.each(catSrcTemplates || [], function (_, name) {
sel.append($("<option></option>").val(name).text(name));
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-cavkani-wrap").length) return null;
var wrap = $("<div class='wiktku-cavkani-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-cavkani-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-cavkani-text")
.attr("rows", 4)
.attr("placeholder", "Şablonekî ji jêrê hilbijêre an rasterast binivîse…");
// Template insert dropdown, populated from [[Kategorî:Çavkanî]] —
// options refreshed once the category members are fetched.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike…");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
var status = $("<span class='wiktku-cavkani-status'></span>");
sel.on("change", function () {
var name = $(this).val();
if (!name) return;
insertAtCursor(ta[0], "\n* {{" + name + "}}");
$(this).val("");
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel);
wrap.append(status).append(ta);
stepDiv.append(wrap);
// build() runs again for every new beş (see the "+ Beş zêde bike"
// handler), after the initial page-wide pass — so this select needs
// its own init or it stays a plain, unsearchable native <select>.
initSelects(wrap);
// Populate only now: refreshTplSelect() looks the select up by id
// under #wiktku-start-cavkani, so running it before the wrap was
// appended found nothing and bailed out — which left the dropdown
// empty on every beş after the first, once the category members
// were already cached.
if (catSrcTemplates) {
steps.cavkani.refreshTplSelect();
} else {
status.text("Şablon tên barkirin…");
fetchCatSrcTemplates().then(function () {
steps.cavkani.refreshTplSelect();
status.text("");
}, function () {
status.text("Şablon nehatin barkirin.");
});
}
return ta;
},
output: function () {
var text = $.trim($("#wiktku-start-cavkani .wiktku-cavkani-text").val());
if (!text) return "";
return "\n==== Çavkanî ====\n" + text + "\n";
}
},
};
steps.trans.keys = steps.lang.choices;
steps.dunde.keys = steps.lang.choices;
steps.zarava.keys = getZaravaKeys(steps.lang.choices);
var ordered_steps = [
steps.lang, steps.pron, steps.pos, steps.cinsiyet, steps.lektur, steps.tr,
steps.dfn, steps.tewandin, steps.je, steps.tekildar,
steps.etym, steps.dunde, steps.binereherwiha, steps.zarava, steps.trans, steps.cavkani];
// Step ids that belong to each section (not shared across sections).
var PER_SECTION_STEP_IDS = [
"pos", "cinsiyet", "lektur", "tr",
"dfn", "tewandin", "je", "tekildar", "etym", "dunde", "binereherwiha", "zarava", "trans", "cavkani"
];
// ── Multi-section state ──────────────────────────────────────────────────
// Each entry is a plain snapshot: { pos, cinsiyet, lektur, tr, dfn (senses[]),
// je, tekildar, binereherwiha, trans (rows[]) }.
var sections = [{}]; // section 0 starts empty (DOM is the truth)
var activeSection = 0;
function snapshotDfn() {
return steps.dfn.getSenses($("#wiktku-start-dfn"));
}
// Rebuilds the dfn DOM from a previously snapshotted senses array.
function restoreDfn(senses) {
var stepDiv = $("#wiktku-start-dfn");
// Tear down the existing list so build() recreates it cleanly.
stepDiv.find("ol.wiktku-dfn-list").remove();
steps.dfn.build(stepDiv);
var list = stepDiv.find("ol.wiktku-dfn-list");
$.each(senses, function (i, sense) {
// Ensure enough blocks exist (build() seeds one).
var blocks = list.find("li.wiktku-dfn-sense");
var block = blocks.eq(i);
if (!block.length) {
var nb = steps.dfn.buildSenseBlock(stepDiv);
list.append(nb);
block = list.find("li.wiktku-dfn-sense").last();
}
// Template selector.
block.find("select.wiktku-dfn-tpl-select").val(sense.tpl || "");
if (sense.tpl) {
block.find("textarea.wiktku-dfn-mane").hide();
block.find("input.wiktku-dfn-tpl-title").val(sense.tplTitle || "").show();
} else {
block.find("textarea.wiktku-dfn-mane").val(sense.mane || "").show();
block.find("input.wiktku-dfn-tpl-title").hide().val("");
}
// dfnArea is the only thing actually saved, so split it back into
// tercime/îzah for editing (mirrors syncNonKuToMane's join format).
var maneParts = splitTercimeIzah(sense.mane);
block.find(".wiktku-dfn-tercime").val(maneParts ? maneParts.tercime : (sense.mane || ""));
block.find(".wiktku-dfn-izah").val(maneParts ? maneParts.izah : "");
// Re-sync the formên alternatîv/hevmane/… hide state now that
// tplSelect's value was set (its own "change"
// handler doesn't fire from .val(), so this doesn't happen otherwise).
var updateVis = block.data("updateFieldVisibility");
if (updateVis) updateVis();
// Same for the mane-box mode (plain vs tercime+îzah), since this
// also depends on tplSelect's (and lang's) value.
var updateMane = block.data("updateManeMode");
if (updateMane) updateMane();
// Restore a sub-list (etiket, formên alternatîv, hevmane …) from a values array.
function restoreSubList(cls, values) {
if (!values || !values.length) return;
var groupDiv = block.find("." + cls + "-group");
var subList = groupDiv.find("ol, ul").first();
if (!subList.length) return; // group not found
// Fill existing items, append new ones as needed.
$.each(values, function (j, val) {
var items = subList.find("li");
if (j < items.length) {
items.eq(j).find("textarea").val(val);
} else {
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-restore-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.val(val);
ta.on("input", function () {
steps.dfn.onSubInput(subList, this, 1, true);
});
subList.append($("<li></li>").append(ta));
}
});
}
// Reveal and populate lazy groups that have data.
var lazyMap = {
"wiktku-dfn-etiket": sense.etiket,
"wiktku-dfn-kategori": sense.kategori,
"wiktku-dfn-alternativ": sense.alternativ,
"wiktku-dfn-hevmane": sense.hevmane,
"wiktku-dfn-dijmane": sense.dijmane,
"wiktku-dfn-koordine": sense.koordine,
"wiktku-dfn-jornav": sense.jornav,
"wiktku-dfn-jernav": sense.jernav
};
$.each(lazyMap, function (cls, vals) {
if (vals && vals.length) restoreSubList(cls, vals);
});
// Nimûne items are objects { text, tr?, t? } — restore using the builder.
if (sense.nimune && sense.nimune.length) {
var nimuneGroupDiv = block.find(".wiktku-dfn-nimune-group");
var nimuneList = nimuneGroupDiv.find("ol.wiktku-dfn-nimune-list");
var buildFn = nimuneGroupDiv.data("buildNimuneLi");
nimuneList.empty();
$.each(sense.nimune, function (_, n) {
var text = typeof n === "object" ? (n.text || "") : n;
if (!text) return;
var li = buildFn ? buildFn() : $("<li class='wiktku-dfn-nimune-li'></li>");
li.find(".wiktku-dfn-nimune-text").val(text).each(function () { highlightLinebreak(this); });
if (n.tr) li.find(".wiktku-dfn-nimune-tr").val(n.tr);
if (n.t) li.find(".wiktku-dfn-nimune-t").val(n.t);
nimuneList.append(li);
});
// Always leave a blank trailing item.
if (buildFn) nimuneList.append(buildFn());
}
// Restore jêder entries — accepts current array shape or a legacy
// single object (older saved sections) for backwards compat.
var jederArr = $.isArray(sense.jeder) ? sense.jeder : (sense.jeder ? [sense.jeder] : []);
if (jederArr.length) {
var jederGroupDiv = block.find(".wiktku-dfn-jeder-group");
var jederList = jederGroupDiv.find("ol.wiktku-dfn-jeder-list");
var buildJederFn = jederGroupDiv.data("buildJederLi");
jederList.empty();
$.each(jederArr, function (_, j) {
if (!j || !j.quote) return;
var li = buildJederFn ? buildJederFn() : $("<li class='wiktku-dfn-jeder-li'></li>");
li.find(".wiktku-dfn-nimune-quote").val(j.quote).each(function () { highlightLinebreak(this); });
if (j.quoteTr) li.find(".wiktku-dfn-nimune-quote-tr").val(j.quoteTr);
if (j.quoteT) li.find(".wiktku-dfn-nimune-quote-t").val(j.quoteT);
if (j.jederManual) {
var manualSel = li.find(".wiktku-dfn-quote-src-sel");
manualSel.val("__manual__").trigger("change");
li.find(".wiktku-dfn-quote-src-manual").val(j.jederManual);
} else if (j.jederCatTpl) {
// Legacy format from before the şablon search switched rows to
// manual mode directly — convert it the same way now, so it's
// editable like any other free-form source.
var catSelEl = li.find(".wiktku-dfn-quote-src-sel");
catSelEl.val("__manual__").trigger("change");
li.find(".wiktku-dfn-quote-src-manual").val("{{" + j.jederCatTpl + "}}");
} else if (j.jederTpl) {
var srcSel = li.find(".wiktku-dfn-quote-src-sel");
srcSel.val(j.jederTpl).trigger("change");
if (j.jêderFields) {
$.each(j.jêderFields, function (key, val) {
li.find(".wiktku-dfn-quote-src-input[data-field-key='" + key + "']").val(val);
});
}
}
jederList.append(li);
});
// Always leave a blank trailing item, same as Nimûne.
if (buildJederFn) jederList.append(buildJederFn());
}
});
}
// Snapshots simple (non-dfn) per-section steps from the DOM into obj.
function saveCurrentSection() {
var snap = {};
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
snap.dfn = snapshotDfn();
return;
}
if (id === "etym") {
snap.etym = $.trim($("#wiktku-start-etym .wiktku-etym-text").val());
return;
}
if (id === "cavkani") {
snap.cavkani = $.trim($("#wiktku-start-cavkani .wiktku-cavkani-text").val());
return;
}
var step = steps[id];
if (!step) return;
var stepDiv = $("#wiktku-start-" + id);
if (id === "trans") {
snap.trans = steps.trans.getTranslations(stepDiv);
return;
}
if (id === "zarava") {
snap.zarava = steps.zarava.getTranslations(stepDiv);
return;
}
if (id === "dunde") {
snap.dunde = steps.dunde.getRows(stepDiv);
return;
}
// Generic: read all step fields.
var fields = stepDiv.find(".wiktku-start-step-field");
if (step.multiple) {
snap[id] = fields.map(function () { return $(this).val(); }).get();
} else {
snap[id] = fields.val();
}
});
sections[activeSection] = snap;
}
// Restores a previously saved snapshot into the form DOM.
function restoreSection(snap) {
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
restoreDfn(snap.dfn || []);
return;
}
if (id === "etym") {
$("#wiktku-start-etym .wiktku-etym-wrap").remove();
steps.etym.build($("#wiktku-start-etym"));
$("#wiktku-start-etym .wiktku-etym-text").val(snap.etym || "");
return;
}
if (id === "cavkani") {
$("#wiktku-start-cavkani .wiktku-cavkani-wrap").remove();
steps.cavkani.build($("#wiktku-start-cavkani"));
$("#wiktku-start-cavkani .wiktku-cavkani-text").val(snap.cavkani || "");
return;
}
if (id === "trans") {
// Rebuild trans groups (dfn must already be restored by this
// point in the $.each loop, so glossList() reflects it).
var transDiv = $("#wiktku-start-trans");
transDiv.find(".wiktku-trans-group").remove();
steps.trans.build(transDiv);
var groupsSnap = snap.trans || [];
$.each(groupsSnap, function (gi, rows) {
var group = transDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
if (!group.length) return; // gloss no longer exists — drop its rows
var list = group.find("ul.wiktku-trans-list");
$.each(rows, function (j, row) {
var lang = row[0], words = row[1];
var lastRow = list.find("li.wiktku-trans-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-trans-words");
$.each(words, function (k, word) {
var wordItems = wordList.find("li");
if (k < wordItems.length) {
wordItems.eq(k).find("textarea").val(word);
} else {
// .val() below doesn't fire "input", so the normal
// auto-grow never runs — append a matching item
// ourselves instead of silently dropping the word.
var extraInput = steps.trans.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
// Leave one trailing empty field so the row can still grow
// when the user types, matching a freshly-built row.
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.trans.makeWordInput()));
}
});
});
return;
}
if (id === "zarava") {
// Rebuild zarava groups (dfn must already be restored by this
// point in the $.each loop, so glossList() reflects it).
var zaravaDiv = $("#wiktku-start-zarava");
zaravaDiv.find(".wiktku-zarava-group").remove();
steps.zarava.build(zaravaDiv);
var zaravaGroupsSnap = snap.zarava || [];
$.each(zaravaGroupsSnap, function (gi, rows) {
var group = zaravaDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
if (!group.length) return; // gloss no longer exists — drop its rows
var list = group.find("ul.wiktku-zarava-list");
$.each(rows, function (j, row) {
var lang = row[0], words = row[1];
var lastRow = list.find("li.wiktku-zarava-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-zarava-words");
$.each(words, function (k, word) {
var wordItems = wordList.find("li");
if (k < wordItems.length) {
wordItems.eq(k).find("textarea").val(word);
} else {
var extraInput = steps.zarava.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.zarava.makeWordInput()));
}
});
});
return;
}
if (id === "dunde") {
// Rebuild dunde rows.
var dundeDiv = $("#wiktku-start-dunde");
dundeDiv.find("ul.wiktku-dunde-list").remove();
steps.dunde.build(dundeDiv);
var dundeRows = snap.dunde || [];
$.each(dundeRows, function (i, row) {
var lang = row[0], words = row[1];
var list = dundeDiv.find("ul.wiktku-dunde-list");
var lastRow = list.find("li.wiktku-dunde-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-dunde-words");
$.each(words, function (j, word) {
var wordItems = wordList.find("li");
if (j < wordItems.length) {
wordItems.eq(j).find("textarea").val(word);
} else {
// .val() below doesn't fire "input", so the normal
// auto-grow never runs — append a matching item
// ourselves instead of silently dropping the word.
var extraInput = steps.dunde.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
// Leave one trailing empty field so the row can still grow
// when the user types, matching a freshly-built row.
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.dunde.makeWordInput()));
}
});
return;
}
var step = steps[id];
if (!step) return;
var stepDiv = $("#wiktku-start-" + id);
var fields = stepDiv.find(".wiktku-start-step-field");
var val = snap[id];
if (val === undefined || val === null) return;
if (step.multiple) {
var arr = val;
fields.each(function (i) {
if (i < arr.length) $(this).val(arr[i]);
});
} else {
fields.val(val);
}
// Tell the pickers about the programmatic value change.
fields.filter("select").trigger("wiktku:refresh");
});
}
function getWikitextForCurrentSection(callback) {
var values = getValues();
var entry = steps.pos.output(values);
steps.dfn.getOutput(values, function (output) {
entry += output;
entry += steps.tewandin.output(values);
entry += steps.je.output(values);
entry += steps.tekildar.output(values);
entry += steps.etym.output(values);
entry += steps.dunde.output(values);
entry += steps.binereherwiha.output(values);
entry += steps.zarava.output(values);
entry += steps.trans.output(values);
entry += steps.cavkani.output(values);
callback(entry, values);
});
}
function getWikitextAllSections(callback) {
saveCurrentSection();
var results = new Array(sections.length);
var sharedValues = getValues(); // lang/pron are shared
function processSection(i) {
if (i >= sections.length) {
// All done — restore original active section.
restoreSection(sections[activeSection]);
refresh();
callback(results, sharedValues);
return;
}
restoreSection(sections[i]);
refresh();
getWikitextForCurrentSection(function (sectionText) {
results[i] = sectionText;
processSection(i + 1);
});
}
processSection(0);
}
// Assembles wikitext for all sections plus the shared lang/pron header.
function getWikitext(callback) {
getWikitextAllSections(function (sectionTexts, sharedValues) {
var entry = steps.lang.output(sharedValues);
entry += steps.pron.output(sharedValues);
entry += sectionTexts.join("\n");
// Edit summary uses section 0's values. Read from the saved snapshot
// (not the live DOM) so it doesn't mix section 0's pos with whichever
// section happens to be active/restored at this point.
var dfnSenses = (sections[0] && sections[0].dfn) || [];
var dfnSummary = dfnSenses.map(function (s) {
if (s.mane) return s.mane;
// Template sense (e.g. {{guharto|ku|somepage}}) — same
// construction as the tplCall built in getOutput, so the
// summary shows what actually gets written to the entry
// instead of going blank.
if (s.tpl && s.tplTitle) {
return s.tplNoLang
? "{{" + s.tpl + "|" + s.tplTitle + "}}"
: "{{" + s.tpl + "|" + sharedValues.lang + "|" + s.tplTitle + "}}";
}
return "";
}).filter(Boolean).join("; ");
var summary = "([[Mediawiki:Gadget-start.js|WF:NÛ]] v.2.0) +" +
sharedValues.lang + ":" + sections[0].pos + ":" + dfnSummary;
var summaryField = document.getElementById("wpSummary");
if (addLangMode && summaryField.value) {
summary = summaryField.value + " " + summary;
}
summaryField.value = summary;
callback(entry);
});
}
var continueBtn;
function getValuesForStep(stepId) {
var fields = $("#wiktku-start-" + stepId + " .wiktku-start-step-field");
var step = steps[stepId];
if (step.keys) {
var values = {};
fields.each(function (i, field) {
var key = $(field).prevAll(".wiktku-start-step-keyfield").val();
if (key) values[key] = $(field).val();
});
return values;
}
else if (step.multiple) {
return fields.map(function () {
return $(this).val();
}).get();
}
return fields.val();
}
function getValues() {
var values = {};
$.each(steps, function (stepId) {
values[stepId] = getValuesForStep(stepId);
});
return values;
}
function populateMenus(inputs, choices, disabledValues, placeholderText) {
if (!disabledValues) disabledValues = {};
var vals = inputs.map(function (i, input) {
return $(input).val();
});
inputs.empty();
inputs.append($("<option></option>").text(placeholderText || ""));
$.each(choices, function (j, choice) {
// Append the language code in parentheses so that typing a code
// (e.g. "ku") in the search box still finds the language name.
var displayText = capitalize(choice.label);
if (choice.sortKey !== undefined) {
// This is a language choice {code, label, sortKey} — show code.
displayText = capitalize(choice.label) + " (" + choice.code + ")";
}
var option = $(mw.html.element("option", {
value: choice.code }, displayText));
if (disabledValues[choice.code]) option.prop("disabled", true);
inputs.append(option);
});
inputs.val(function (i) {
return vals[i];
});
}
// Keys to disable for a key menu: already-taken or explicitly disabled.
function getDisabledKeys(step) {
var occupiedKeys = {};
$("#wiktku-start-" + step.id + " .wiktku-start-step-keyfield").each(function () {
occupiedKeys[$(this).val()] = true;
});
if (step.disabledKeys) $.extend(occupiedKeys, step.disabledKeys);
return occupiedKeys;
}
function buildKeyInput(step) {
if (!step.keys) return undefined;
var input = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
input.attr("data-placeholder", "Hilbijêre " + step.keyName);
populateMenus(input, step.keys, getDisabledKeys(step));
// Keep the key menus mutually exclusive: whatever one row selects is
// disabled in every other row. Recomputed from the DOM on each change.
input.on("change", function () {
var all = $("#wiktku-start-" + step.id + " .wiktku-start-step-keyfield");
var taken = {};
all.each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
all.not(this).each(function () {
var self = $(this), own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (code) $(this).prop("disabled", !!taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
});
// Return the wrapper; the select lives inside it and still fires change.
return wrapNativeSelect(input);
}
// Adds another text field to the list if the last one now has text.
function refreshForTextField(currentInput, step) {
currentInput = $(currentInput);
var value = currentInput.val();
var item = currentInput.parent();
if (value && !item.next("li").length) {
var nextInput = $("<textarea></textarea>")
.attr("name", "wiktku-field-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", currentInput.attr("class"))
.attr("rows", currentInput.attr("rows") || 1);
if (step.placeholder) nextInput.attr("placeholder", step.placeholder);
nextInput.on("input", function (evt) {
refreshForTextField(evt.target, step);
});
var nextKeyInput = buildKeyInput(step);
var nextItem = $("<li></li>").append(nextKeyInput).append(nextInput);
item.parent().append(nextItem);
if (nextKeyInput) initSelects(nextItem);
}
var canContinue = !continueBtn.isDisabled();
if ((value && !canContinue) || (!value && canContinue)) {
refresh(step);
}
}
function prepareInput(input, step) {
if (!input) return;
if (step.required) input.prop('required', true);
input.change(step, refresh);
}
// Shows/hides steps based on whether their prerequisites are met, and
// updates placeholders where applicable.
function refresh(evt) {
var values = getValues();
var changedStep = evt && evt.data;
var didFocus = false;
var canContinue = true;
// Re-filter template options in every sense block whenever lang changes.
$("#wiktku-start-dfn .wiktku-dfn-tpl-select").each(function () {
var fn = $(this).data("updateOptions");
if (typeof fn === "function") fn();
});
// Re-filter pronunciation and etymology template dropdowns when language changes.
steps.pron.refreshTplSelect();
steps.etym.refreshTplSelect();
steps.cavkani.refreshTplSelect();
// Re-render any step's question label that depends on current values
// (e.g. dfn's Werger-section reminder, which only applies to ku).
$.each(steps, function (stepId, step) {
if (typeof step.question_fmt === "function") {
$("#wiktku-start-" + stepId + " .wiktku-start-step-question")
.text(step.question_fmt(values));
}
});
// Sync every sense block's mane-box mode (plain mane vs tercime+îzah)
// to the current language, in case lang changes after blocks exist.
$("#wiktku-start-dfn li.wiktku-dfn-sense").each(function () {
var updateMane = $(this).data("updateManeMode");
if (updateMane) updateMane();
});
// Sync tr/t sub-fields in every nimûne item to the current language.
// tr shown when language needs transliteration; t shown when lang !== "ku".
(function () {
var lang = values.lang || "";
var showTr = needsTransliteration(lang);
var showT = lang && lang !== "ku";
$("#wiktku-start-dfn .wiktku-dfn-nimune-list li.wiktku-dfn-nimune-li").each(function () {
var li = $(this);
// Ensure the sub-wrapper exists when we need it.
var subWrap = li.find(".wiktku-dfn-nimune-sub");
// tr field
var trTa = li.find(".wiktku-dfn-nimune-tr");
if (showTr && !trTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
li.append(subWrap);
}
trTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-tr")
.attr("placeholder", "Transliterasyon…");
subWrap.prepend(trTa);
} else if (!showTr && trTa.length) {
trTa.remove();
}
// t field
var tTa = li.find(".wiktku-dfn-nimune-t");
if (showT && !tTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
li.append(subWrap);
}
tTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-t")
.attr("placeholder", "Tercimeya nimûneyê bi kurmancî…");
subWrap.append(tTa);
} else if (!showT && tTa.length) {
tTa.remove();
}
// Remove the wrapper if it ended up empty.
subWrap = li.find(".wiktku-dfn-nimune-sub");
if (subWrap.length && !subWrap.children().length) subWrap.remove();
});
}());
// Sync tr/t sub-fields in every jêder citation to the current language.
// tr shown when language needs transliteration; t shown when lang !== "ku".
(function () {
var lang = values.lang || "";
var showTr = needsTransliteration(lang);
var showT = lang && lang !== "ku";
$("#wiktku-start-dfn .wiktku-dfn-jeder-list li.wiktku-dfn-jeder-li").each(function () {
var li = $(this);
// Ensure the sub-wrapper exists when we need it. It must sit right
// after the quote textarea and before the source selector.
var subWrap = li.find(".wiktku-dfn-quote-sub");
// tr field
var trTa = li.find(".wiktku-dfn-nimune-quote-tr");
if (showTr && !trTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
// Insert after the quote textarea's resize-wrap (if the manual
// resize handle has already been attached to it), not after the
// bare textarea -- otherwise this lands *inside* that wrap,
// between the textarea and its own grip, breaking jêgirtin's
// handle and nesting the tr/t boxes inside it.
var quoteTa = li.find(".wiktku-dfn-nimune-quote");
var quoteResizeWrap = quoteTa.closest(".wiktku-resize-wrap");
(quoteResizeWrap.length ? quoteResizeWrap : quoteTa).after(subWrap);
}
trTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-tr")
.attr("placeholder", "Transliterasyona jêgirtinê…");
subWrap.prepend(trTa);
} else if (!showTr && trTa.length) {
trTa.remove();
}
// t field
var tTa = li.find(".wiktku-dfn-nimune-quote-t");
if (showT && !tTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
// See the tr-field branch above for why this targets the
// resize-wrap instead of the bare textarea.
var quoteTa2 = li.find(".wiktku-dfn-nimune-quote");
var quoteResizeWrap2 = quoteTa2.closest(".wiktku-resize-wrap");
(quoteResizeWrap2.length ? quoteResizeWrap2 : quoteTa2).after(subWrap);
}
tTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-t")
.attr("placeholder", "Tercimeya jêgirtinê bi kurmancî…");
subWrap.append(tTa);
} else if (!showT && tTa.length) {
tTa.remove();
}
// Remove the wrapper if it ended up empty.
subWrap = li.find(".wiktku-dfn-quote-sub");
if (subWrap.length && !subWrap.children().length) subWrap.remove();
});
}());
$.each(steps, function (stepId, step) {
if (typeof(step.visible) === "function" && !step.visible(values)) {
$("#wiktku-start-" + stepId).slideUp();
}
else {
var stepDiv = $("#wiktku-start-" + stepId);
if (changedStep !== step && typeof(step.build) === "function") {
prepareInput(step.build(stepDiv, values), step);
}
var input = stepDiv.find(".wiktku-start-step-field");
if (typeof(step.example) === "function") {
// .find() above already reaches nested fields (e.g. the dfn
// step's mane textareas inside each sense block), so one
// assignment covers every step; dfn keeps its own fallback.
var exampleText = step.example(values) || (step.id === "dfn" ? "Mane…" : "");
input.attr("placeholder", exampleText);
}
var didSlideDown;
if (!didFocus && stepDiv.css("display") === "none" && step.required) {
// Skip scrolling for the first section (ziman) since it's
// always at the top of the page.
if (step.id !== "lang") {
didSlideDown = function (evt) {
var stepEl = stepDiv.get(0);
if (stepEl && typeof stepEl.scrollIntoView === "function") {
stepEl.scrollIntoView({ behavior: "smooth", block: "start" });
}
};
}
didFocus = true;
}
stepDiv.slideDown(didSlideDown);
}
if (step.required &&
(values[stepId] === "" ||
(step.multiple && values[stepId].join("") === ""))) {
canContinue = false;
}
});
continueBtn.setDisabled(!canContinue);
}
function destroy() {
$("#wiktku-start-form, .noafterwizard").slideUp(function () {
$(this).remove();
});
$(".noarticletext .nowizard, #editform").slideDown();
$("#ca-edit").removeClass("selected");
$("#ca-wiktku-nowizard").addClass("selected");
}
// Priority order for Kurdish dialects and navz.
// Codes listed here come before all other languages; unlisted codes
// are sorted alphabetically by their display name via localeCompare.
var LANG_PRIORITY = ["navz", "ku", "hac", "sdh", "lki", "ckb", "zza"];
// Inserts a new "== {{ziman|code}} ==" section at the correct sorted
// position: navz, then ku/hac/sdh/lki/ckb/zza, then alphabetical by name.
function insertNewLangSection(existing, wikitext) {
var newCodeMatch = wikitext.match(new RegExp("^" + langHeaderSource("[^}]+")));
var newCode = newCodeMatch ? newCodeMatch[1] : "";
var sections = [];
var preamble = "";
var anyHeaderSrc = langHeaderSource("[^}]+");
var firstMatch = new RegExp("^" + anyHeaderSrc, "m").exec(existing);
if (!firstMatch) {
// No existing lang sections at all — just append.
var sep = existing && !/\n\s*$/.test(existing) ? "\n\n" : "";
return existing + sep + wikitext;
}
// Everything before the first == {{ziman|...}} == is the preamble.
var firstSectionStart = firstMatch.index;
// Walk back to the start of that line.
var lineStart = existing.lastIndexOf("\n", firstSectionStart - 1);
var preambleEnd = lineStart !== -1 ? lineStart + 1 : 0;
preamble = existing.slice(0, preambleEnd);
// Parse each language section: header line + everything until the next header.
var body = existing.slice(preambleEnd);
// (?![\s\S]) matches only true end-of-string, since a bare "$" with
// /m would stop at the section's first line break instead.
var langSectionRe = new RegExp(
"^(" + anyHeaderSrc + "\\n?)([\\s\\S]*?)(?=\\n" + anyHeaderSrc + "|(?![\\s\\S]))",
"gm"
);
var m;
while ((m = langSectionRe.exec(body)) !== null) {
sections.push({
code: m[2],
content: m[0] // full text of this section including header
});
}
// Determine sort rank: priority list first (by index), then alphabetical.
function getLangName(code) {
var entry = langsByCode[code];
return entry ? entry.label : code;
}
function sortRank(code) {
var idx = LANG_PRIORITY.indexOf(code);
return idx !== -1 ? idx : LANG_PRIORITY.length;
}
function compareLangs(a, b) {
var ra = sortRank(a), rb = sortRank(b);
if (ra !== rb) return ra - rb;
// Both are outside priority list — sort by display name.
return getLangName(a).localeCompare(getLangName(b), userLang);
}
// Insert the new section into the sorted list.
var newSection = { code: newCode, content: wikitext };
var inserted = false;
for (var i = 0; i < sections.length; i++) {
if (compareLangs(newCode, sections[i].code) < 0) {
sections.splice(i, 0, newSection);
inserted = true;
break;
}
}
if (!inserted) sections.push(newSection);
// Re-join: preamble + sections separated by newlines.
var joined = sections.map(function (s) {
// Ensure each section ends with exactly one newline before the next.
return s.content.replace(/\n+$/, "");
}).join("\n");
return preamble + joined + "\n";
}
function build() {
$(".nowizard, .nowizard .noafterwizard").hide();
var callToAction = $("#wiktku-calltoaction");
var origCallToActionText = callToAction.text();
$(mw.util.addPortletLink("p-views", "#", "Edîtora çavkaniyê veke",
"ca-wiktku-nowizard", "Vê rûpelê bi edîtora çavkaniyê çêke",
undefined, "#ca-watch")).click(function (evt) {
evt.preventDefault();
callToAction.text(origCallToActionText);
destroy();
});
if (callToAction.length) {
callToAction.text(origCallToActionText +
" Forma li jêr ji bo çêkirina madeyeke nû bi kar bîne.");
}
var startForm = $("<form id='wiktku-start-form'></form>");
var clearPageCheck = null;
if (addLangMode) {
startForm.append($("<p class='wiktku-addlang-notice'></p>").html(
"Bi vê formê tu yê zimanekî nû li rûpelê îlawe bikî. Eger ev ziman jixwe hebe, beşa nû li dawiya vî zimanî dê were îlawekirin. " +
"Ji kerema xwe netîceya dawî kontrol bike, eger problemek derkeve, li <a href='" +
mw.util.getUrl('Mediawiki talk:Gadget-start.js') +
"'>nîqaşa vê amûrê</a> problemê ragihîne."
));
clearPageCheck = $("<input type='checkbox' id='wiktku-clear-page-check'>");
var clearPageLabel = $("<label for='wiktku-clear-page-check'></label>")
.text(" Muhtewaya rûpelê paqij bike (her tiştî jê bibe û rûpelê ji nû ve binivîse)");
startForm.append(
$("<p class='wiktku-addlang-notice'></p>")
.append(clearPageCheck)
.append(clearPageLabel)
);
// Re-evaluate step visibility (e.g. the pron step) whenever this
// is toggled, since it changes what counts as "existing content".
clearPageCheck.on("change", function () {
refresh();
});
}
var spinner;
// Tab bar for switching between POS sections.
var sectionTabsDiv = $("<div id='wiktku-section-tabs'></div>");
startForm.submit(function (evt) {
evt.preventDefault();
continueBtn.setDisabled(true);
continueBtn.$element.addClass("wiktku-btn-sending");
spinner.show();
getWikitext(function (wikitext) {
if (addLangMode && clearPageCheck && clearPageCheck.prop("checked")) {
// User asked to wipe the page and start fresh — just
// write the newly generated wikitext as the full content.
$("#wpTextbox1").val(wikitext);
} else if (addLangMode) {
var textbox = $("#wpTextbox1");
var existing = textbox.val() || "";
// If this language's section already exists (whitespace
// differences aside), merge into it; otherwise insert new.
var langHeaderMatch = wikitext.match(new RegExp("^(" + langHeaderSource("[^}]+") + "\\n)"));
if (langHeaderMatch) {
var langHeader = langHeaderMatch[1]; // e.g. "== {{ziman|ku}} ==\n"
var newCode = langHeaderMatch[2];
var existingHeader = findLangHeader(existing, newCode);
if (existingHeader) {
// Strip the header from the new output.
var newContent = wikitext.slice(langHeader.length);
// Find the insertion point: end of the existing lang section.
// A new L2 heading marks the start of the next language block.
var searchFrom = existingHeader.index + existingHeader.match.length;
// Find the next == … == heading after this section's start.
var nextL2 = existing.indexOf("\n== ", searchFrom);
var insertAt = nextL2 !== -1 ? nextL2 : existing.length;
// Ensure there's a blank line before the inserted block.
var before = existing.slice(0, insertAt);
var after = existing.slice(insertAt);
var sep = /\n\s*$/.test(before) ? "" : "\n";
textbox.val(before + sep + newContent + after);
} else {
// New language — insert at the correct sorted position.
textbox.val(insertNewLangSection(existing, wikitext));
}
} else {
// Unexpected format — insert at sorted position anyway.
textbox.val(insertNewLangSection(existing, wikitext));
}
} else {
$("#wpTextbox1").val(wikitext);
}
$("html, body").animate({scrollTop: 0});
callToAction.text("Hindik ma!");
$("#wiktku-preview-container").remove();
destroy();
});
});
$.each(ordered_steps, function (i, step) {
var stepDiv = $(mw.html.element("div", {
"class": "wiktku-start-step",
id: "wiktku-start-" + step.id }));
var name = capitalize(step.name);
stepDiv.append($(mw.html.element("h3", {
"class": "wiktku-start-step-name" }, new mw.html.Raw(mw.html.element("label", {
"for": "wiktku-start-" + step.id + "-field" }, name)))));
if (step.question_fmt) {
// question_fmt can be a plain string, or a function of the
// current values (used by steps whose question text depends
// on e.g. the chosen language) — refresh() keeps it in sync
// afterwards via the .wiktku-start-step-question class.
var questionText = typeof step.question_fmt === "function"
? step.question_fmt(getValues())
: step.question_fmt;
stepDiv.append($(mw.html.element("label", {
"class": "wiktku-start-step-question",
"for": "wiktku-start-" + step.id + "-field" }, questionText)));
if (step.question_br) stepDiv.append($("<br>"));
}
var input;
if (step.choices) {
input = $(mw.html.element("select", {
"class": "wiktku-start-step-field",
id: "wiktku-start-" + step.id + "-field" }));
input.attr("data-placeholder",
capitalize(step.name) + " hilbijêre ");
populateMenus(input, step.choices);
if (step.multiple) input.attr("multiple", true);
// initSelects() runs over the whole form once it is in the DOM.
stepDiv.append(input);
} else if (typeof(step.build) === "function") {
input = step.build(stepDiv);
} else {
input = $("<textarea></textarea>")
.attr("class", "wiktku-start-step-field")
.attr("id", "wiktku-start-" + step.id + "-field")
.attr("rows", step.rows || 2);
if (step.narrow) input.addClass("wiktku-start-narrow");
if (step.placeholder) input.attr("placeholder", step.placeholder);
if (step.multiple) {
input.on("input", function (evt) {
refreshForTextField(evt.target, step);
});
var keyInput = buildKeyInput(step);
var list = $(step.ordered ? "<ol></ol>" : "<ul></ul>")
.append($("<li></li>").append(keyInput).append(input));
stepDiv.append(list);
}
else stepDiv.append(input);
}
prepareInput(input, step);
stepDiv.hide();
// Insert tab bar just before the first per-section step.
if (step.id === "pos") startForm.append(sectionTabsDiv);
startForm.append(stepDiv);
});
// ── Section tab helpers ──────────────────────────────────────────────
// ── Add-section button — lives in the tab bar, disabled until pos chosen ──
var addSectionBtn = new OO.ui.ButtonWidget({
label: "+ Beş zêde bike",
disabled: true
});
addSectionBtn.on("click", function () {
saveCurrentSection();
sections.push({});
activeSection = sections.length - 1;
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
var stepDiv = $("#wiktku-start-dfn");
stepDiv.find("ol.wiktku-dfn-list").remove();
steps.dfn.build(stepDiv);
return;
}
if (id === "etym") {
$("#wiktku-start-etym .wiktku-etym-wrap").remove();
steps.etym.build($("#wiktku-start-etym"));
return;
}
if (id === "cavkani") {
$("#wiktku-start-cavkani .wiktku-cavkani-wrap").remove();
steps.cavkani.build($("#wiktku-start-cavkani"));
return;
}
if (id === "trans") {
var transDiv = $("#wiktku-start-trans");
transDiv.find(".wiktku-trans-group").remove();
return;
}
if (id === "zarava") {
var zaravaDiv = $("#wiktku-start-zarava");
zaravaDiv.find(".wiktku-zarava-group").remove();
return;
}
if (id === "dunde") {
var dundeDiv = $("#wiktku-start-dunde");
dundeDiv.find("ul.wiktku-dunde-list").remove();
return;
}
var stepDiv = $("#wiktku-start-" + id);
stepDiv.find(".wiktku-start-step-field").val("");
stepDiv.find("select.wiktku-start-step-field").trigger("wiktku:refresh");
});
renderSectionTabs();
refresh();
$("html, body").animate({ scrollTop: sectionTabsDiv.offset().top - 20 }, 300);
});
/** Re-render the tab bar to reflect current sections[] and activeSection. */
function renderSectionTabs() {
// Detach (not remove) the button first: .empty() strips bound
// event data from any children left inside it, which would
// silently kill addSectionBtn's click handler on every re-render.
addSectionBtn.$element.detach();
sectionTabsDiv.empty();
var lang = getValues().lang || "";
if (!lang) {
sectionTabsDiv.hide();
return;
}
sectionTabsDiv.show();
$.each(sections, function (i) {
var posVal = sections[i].pos || "";
var tabLabel = posVal ? capitalize(posVal) : ("Beş " + (i + 1));
var tab = $("<span></span>")
.addClass("wiktku-section-tab")
.text(tabLabel)
.toggleClass("wiktku-tab-active", i === activeSection);
(function (idx) {
tab.on("click", function () {
if (idx === activeSection) return;
saveCurrentSection();
activeSection = idx;
restoreSection(sections[activeSection]);
refresh();
renderSectionTabs();
});
}(i));
sectionTabsDiv.append(tab);
});
// Enable "Beş zêde bike" only when the active section has a pos chosen.
var activePos = sections[activeSection] && sections[activeSection].pos
? sections[activeSection].pos
: getValues().pos;
addSectionBtn.setDisabled(!activePos);
sectionTabsDiv.append(addSectionBtn.$element);
}
renderSectionTabs();
/**
* Restores a full cached draft: shared lang/pron fields, then every
* section (via the same restoreSection()/refresh()/renderSectionTabs()
* sequence already used when switching tabs).
* @param cached {{lang: string, pron: string, sections: Array, activeSection: number}}
*/
function restoreFromCache(cached) {
if (cached.lang) {
$("#wiktku-start-lang-field").val(cached.lang);
$("#wiktku-start-lang-field").trigger("wiktku:refresh");
}
// Rebuild dependent steps (pos, pron wrap, etc.) now that lang is set.
refresh();
if (cached.pron !== undefined) {
$("#wiktku-start-pron .wiktku-pron-text").val(cached.pron);
}
sections = (cached.sections && cached.sections.length) ? cached.sections : [{}];
activeSection = (typeof cached.activeSection === "number" &&
cached.activeSection >= 0 && cached.activeSection < sections.length)
? cached.activeSection : 0;
restoreSection(sections[activeSection]);
refresh();
renderSectionTabs();
mw.notify("Danûstandina berê ya qeydkirî ji cache hate barkirin.",
{ type: "info", tag: "wiktku-cache-restore" });
}
// Update the active tab's label whenever pos changes.
startForm.on("change", "#wiktku-start-pos-field", function () {
renderSectionTabs();
});
// Show the tab bar as soon as a language is selected.
startForm.on("change", "#wiktku-start-lang-field", function () {
renderSectionTabs();
});
var footer = $("<div id='wiktku-start-footer'></div>");
spinner = $(mw.html.element("img", {
id: "wiktku-start-spinner",
src: "//upload.wikimedia.org/wikipedia/commons/d/de/Ajax-loader.gif",
alt: "Tê barkirin…",
title: "Tê barkirin…" }));
footer.append(spinner.hide());
continueBtn = new OO.ui.ButtonWidget({
id: "wiktku-unhide-editform",
label: "Bişîne",
flags: [ "primary", "progressive" ]
});
continueBtn.on("click", function () {
// Immediate feedback that the click registered
continueBtn.$element.addClass("wiktku-btn-flash");
setTimeout(function () {
continueBtn.$element.removeClass("wiktku-btn-flash");
}, 500);
mw.notify("Tê şandin…", { type: "info", tag: "wiktku-submit" });
startForm.trigger("submit");
});
footer.append(continueBtn.$element);
// "Edîtora çavkaniyê veke" button — inline fallback for the portlet link
var sourceEditorBtn = new OO.ui.ButtonWidget({
label: "Edîtora çavkaniyê veke"
});
sourceEditorBtn.on("click", function () {
destroy();
});
footer.append(sourceEditorBtn.$element);
// ── Cache save/clear buttons ─────────────────────────────────────────
// Manual, page-scoped save of the entire wizard (all sections, not
// just the active one) via [[MediaWiki:Gadget-StorageUtils.js]]'s
// ObjectStorage. Restoring happens silently on load at the end of
// build(), once the full language list is available.
var saveCacheBtn = new OO.ui.ButtonWidget({
label: "Li cache qeyd bike",
title: "Halê vê formê yê niha (ziman, bilêvkirin û hemû beş) li cache (localStorage) qeyd bike, da ku eger rûpel bêyî xwestin were girtin an ji nû ve were barkirin, tu karibî berdewam bikî."
});
saveCacheBtn.on("click", function () {
saveCurrentSection();
var snapshot = {
lang: getValues().lang || "",
pron: $("#wiktku-start-pron .wiktku-pron-text").val() || "",
sections: sections,
activeSection: activeSection
};
// ObjectStorage.Set() doesn't return a success/failure value, so
// the only way to detect a real failure (storage blocked, quota
// exceeded, JSON.stringify choking on something unexpected) is to
// catch it here rather than inspect a (nonexistent) return value.
try {
formCache.Set(snapshot);
mw.notify("Halê formê li cache hate qeydkirin.", { type: "success", tag: "wiktku-cache-save" });
} catch (e) {
mw.notify("Qeydkirina li cache bi ser neket.", { type: "error", tag: "wiktku-cache-save" });
}
});
footer.append(saveCacheBtn.$element);
var clearCacheBtn = new OO.ui.ButtonWidget({
label: "Cache paqij bike",
flags: [ "destructive" ],
title: "Datayên qeydkirî yên vê rûpelê ji cache jê bibe (forma ku niha xuya dike naguherîne)."
});
clearCacheBtn.on("click", function () {
formCache.Set({});
mw.notify("Cache hate paqijkirin.", { type: "success", tag: "wiktku-cache-clear" });
});
footer.append(clearCacheBtn.$element);
// ── Preview checkboxes ───────────────────────────────────────────────
// Wikitext preview (raw text panel)
var previewCheck = $("<input type='checkbox' id='wiktku-preview-toggle'>");
var previewLabel = $("<label for='wiktku-preview-toggle'></label>")
.text(" Pêşdîtina wîkîtekstê");
var previewPanel = $("<pre id='wiktku-preview-panel'></pre>").hide();
// Live rendered preview (parsed HTML panel, same logic as AjaxEdit).
// Not available on mobile — API polling causes too many problems on small screens.
var livePreviewCheck = null;
var livePreviewPanel = null;
if (!isMobile) {
livePreviewCheck = $("<input type='checkbox' id='wiktku-live-preview-toggle'>");
livePreviewPanel = $("<div id='wiktku-live-preview-panel'></div>").hide();
}
// Container that holds both panels and switches between stacked / side-by-side.
var previewContainer = $("<div id='wiktku-preview-container'></div>");
previewContainer.append(previewPanel);
if (!isMobile) previewContainer.append(livePreviewPanel);
var previewTimer = null;
var livePreviewIntervalId = -1;
var livePreviewActive = false; // guards in-flight fetches after uncheck
/** Rebuilds wikitext preview if its checkbox is checked. */
function schedulePreview() {
if (!previewCheck.prop("checked")) return;
clearTimeout(previewTimer);
// Debounce: wait 400 ms after the last keystroke before rebuilding.
previewTimer = setTimeout(function () {
getWikitext(function (wikitext) {
previewPanel.text(wikitext).show();
updatePanelLayout();
});
}, 400);
}
/** Fetches parsed HTML and populates the live preview panel. */
function loadLivePreview() {
getWikitext(function (wikitext) {
new mw.Api().parse(wikitext, { title: mw.config.get("wgPageName") }).done(function (html) {
// Discard result if the user unchecked while the fetch was in flight.
if (!livePreviewActive) return;
livePreviewPanel.html(html).show();
updatePanelLayout();
});
});
}
/** Adjusts panel widths depending on which previews are visible. */
function updatePanelLayout() {
var wikitextVisible = previewCheck.prop("checked");
var liveVisible = livePreviewCheck && livePreviewCheck.prop("checked");
if (wikitextVisible && liveVisible) {
// Side by side — each panel takes roughly half the available width.
previewPanel.css({ "flex": "1 1 45%", "min-width": "280px" });
livePreviewPanel.css({ "flex": "1 1 45%", "min-width": "280px" });
} else {
// Full width for whichever is visible — only touch panels that are
// actually shown so that setting flex doesn't override display:none.
if (wikitextVisible) previewPanel.css({ "flex": "1 1 100%", "min-width": "" });
if (liveVisible && livePreviewPanel) livePreviewPanel.css({ "flex": "1 1 100%", "min-width": "" });
}
}
previewCheck.on("change", function () {
if ($(this).prop("checked")) {
schedulePreview();
} else {
clearTimeout(previewTimer);
previewPanel.hide();
updatePanelLayout();
}
});
if (!isMobile) {
livePreviewCheck.on("change", function () {
if ($(this).prop("checked")) {
livePreviewActive = true;
livePreviewPanel.show();
loadLivePreview();
livePreviewIntervalId = setInterval(loadLivePreview, 500);
} else {
livePreviewActive = false;
clearInterval(livePreviewIntervalId);
livePreviewIntervalId = -1;
livePreviewPanel.hide().empty();
updatePanelLayout();
}
});
}
// Listen on all input/change events on the form and update both previews.
startForm.on("input change", function () {
schedulePreview();
});
footer.append($("<span style='margin-left:1em'></span>")
.append(previewCheck).append(previewLabel));
if (!isMobile) {
var livePreviewLabel = $("<label for='wiktku-live-preview-toggle'></label>")
.text(" Pêşdîtina zindî");
footer.append($("<span style='margin-left:1em'></span>")
.append(livePreviewCheck).append(livePreviewLabel));
}
startForm.append(footer);
$("#editform").hide().before(startForm);
// Insert preview container (holds both panels) after the form.
startForm.after(previewContainer);
// One pass over the whole form: every select that hasn't already been
// initialised, and isn't opted out with .wiktku-plain-select, gets
// the searchable picker.
initSelects(startForm);
refresh();
// Give every draggable textarea a custom resize grip (works
// consistently on Safari/iOS, unlike the native corner grip — see
// the "Manual drag-to-resize handle" comment in styles.css), and
// keep applying it to textareas added later on (new sense blocks,
// quote-source fields, nimûne rows, …).
wiktkuInitManualResize(startForm);
new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
$(mutation.addedNodes).each(function () {
if (this.nodeType !== 1) return;
wiktkuInitManualResize(this);
});
});
}).observe(startForm[0], { childList: true, subtree: true });
// Now that the full language list is loaded, silently restore any
// draft the editor previously saved for this page.
var cachedDraft = formCache.Get();
if (cachedDraft && cachedDraft.sections && cachedDraft.sections.length) {
restoreFromCache(cachedDraft);
}
}
mw.loader.using(["oojs-ui-core"], function () {
// Load metadata, langChoices, posChoices and tplDefs from the companion
// data page so they can be updated without touching this script.
// (Request was already fired via metaApiPromise above, in parallel
// with this module load — we're just picking up the result here.)
metaApiPromise.then(function (data) {
var page = data.query.pages[0];
var content = page &&
page.revisions &&
page.revisions[0].slots.main.content;
var d;
try { d = JSON.parse(content); } catch (e) { d = {}; }
// Populate metadata.
if (d.metadata) $.extend(metadata, d.metadata);
// Populate gender labels.
if (d.genderLabels) $.extend(GENDER_BASE_LABELS, d.genderLabels);
// Populate lang choices (pinned list).
if (d.langChoices) steps.lang.choices = choicesFromObject(d.langChoices, true);
// Populate langsByCode and merge full language list from d.ziman.
// d.ziman is a {code: name} object with all known languages.
$.each(steps.lang.choices, function (i, choice) {
if (choice.sortKey === undefined) choice.sortKey = choice.label;
langsByCode[choice.code] = choice;
});
if (d.ziman) {
var pinnedCodes = {};
$.each(steps.lang.choices, function (i, c) { pinnedCodes[c.code] = true; });
var extraChoices = [];
$.each(d.ziman, function (code, name) {
if (/-pro$/i.test(code)) return;
if (/ziman[eê]\s+destan/i.test(name)) return;
if (pinnedCodes[code]) return;
var choice = { code: code, label: name, sortKey: name };
extraChoices.push(choice);
langsByCode[code] = choice;
});
extraChoices.sort(function (a, b) {
return a.sortKey.localeCompare(b.sortKey, userLang);
});
steps.lang.choices = steps.lang.choices.concat(extraChoices);
}
// Populate POS choices — also a plain {code: label} object in data.json.
if (d.posChoices) steps.pos.choices = choicesFromObject(d.posChoices, false);
// Populate template definitions for the dfn sense-block builder.
if (d.tplDefs) steps.dfn.tplDefs = d.tplDefs;
// Populate pos placeholder examples.
if (d.posExamples) steps.dfn.posExamples = d.posExamples;
// Populate citation template definitions for the quote widget.
if (d.jederDefs) steps.dfn.jederDefs = d.jederDefs;
// Populate pronunciation and etymology template insert lists.
if (d.pronTpls) {
steps.pron.pronTpls = d.pronTpls;
steps.pron.refreshTplSelect();
}
if (d.etymTpls) {
steps.etym.etymTpls = d.etymTpls;
steps.etym.refreshTplSelect();
}
// Sync trans/dunde/zarava keys with the full language list.
steps.trans.keys = steps.lang.choices;
steps.dunde.keys = steps.lang.choices;
steps.zarava.keys = getZaravaKeys(steps.lang.choices);
}).always(build);
});
});
//</nowiki>
s1x459h0f0zru4yhox4r9osuykhw5zf
6292094
6292093
2026-07-29T21:58:45Z
Wikihez
7344
6292094
javascript
text/javascript
// Li ser [[vi:MediaWiki:Gadget-start.js]] hatiye refaktorkirin.
// implicit dependencies: StorageUtils (ObjectStorage)
//<nowiki>
$(function () {
if (window.location.href.includes("editintro=User:Wikihez/creation/intro")) {
return; // Do not run the script wextê WF:Bilez dişuxile
}
var ns = mw.config.get("wgNamespaceNumber");
if (ns &&
!(ns === 2 && mw.config.get("wgPageName").match(/\/ceribandin$|\/test$/))) {
return;
}
var action = mw.config.get("wgAction");
var pageExists = !!mw.config.get("wgArticleId");
var addLangMode = pageExists && mw.util.getParamValue("wiktkuaddlang") === "1";
if (action === "view" && pageExists) {
var targetContainer;
var skin = mw.config.get('skin');
if (skin === 'vector-2022') {
targetContainer = 'p-cactions';
} else if (skin === 'vector') {
targetContainer = 'p-tb';
} else {
targetContainer = 'p-views';
}
mw.util.addPortletLink(targetContainer,
mw.util.getUrl(mw.config.get("wgPageName"), { action: "submit", wiktkuaddlang: "1" }),
"+Ziman/beşeke din", "ca-wiktku-addlang",
"Ji vê rûpelê re ziman an jî beşeke nû zêde bike");
return;
}
if (!(action === "edit" || action === "submit")) {
return;
}
if (!addLangMode && !$(".mw-newarticletext, .mw-newarticletextanon").length) {
return;
}
mw.notify(
"Amûr dest pê dike, hinek bisekinin.\nNot: jkx Sentaks (Syntax highlighting) neaktîv bikin",
{ type: "info", tag: "wiktku-start-notice", autoHide: true, autoHideSeconds: 10 }
);
var dataJsonPromise;
var metaApiPromise = mw.loader.using("mediawiki.api").then(function () {
var metaApi = new mw.Api();
dataJsonPromise = metaApi.get({
action: "query",
prop: "revisions",
titles: "MediaWiki:Gadget-start.js/data.json",
rvprop: "content",
rvslots: "main",
formatversion: 2
});
return dataJsonPromise;
});
function capitalize(str) {
if (!str) return str;
return str[0].toUpperCase() + str.substr(1);
}
function decapitalize(str) {
if (!str) return str;
return str[0].toLowerCase() + str.substr(1);
}
function escapeRegExp(str) {
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
function langHeaderSource(codePattern) {
return "\n?==\\s*\\{\\{\\s*ziman\\s*\\|\\s*(" + codePattern + ")\\s*\\}\\}\\s*==";
}
function findLangHeader(text, code) {
var m = new RegExp(langHeaderSource(escapeRegExp(code))).exec(text);
return m ? { index: m.index, match: m[0] } : null;
}
function stripWikilinks(str) {
return str.replace(/\[\[([^\]|]+)(?:\|([^\]]+))?\]\]/g, function (m, target, display) {
return display || target;
});
}
function splitTercimeIzah(mane) {
var m = /^([\s\S]*?)\s*\{\{îzah\|([\s\S]*)\}\}\s*$/.exec(mane || "");
return m ? { tercime: m[1], izah: m[2] } : null;
}
function insertAtCursor(el, text) {
var start = el.selectionStart;
var end = el.selectionEnd;
var val = el.value;
el.value = val.slice(0, start) + text + val.slice(end);
var pos = start + text.length;
el.selectionStart = el.selectionEnd = pos;
}
var catSrcTemplates = null;
var catSrcTemplatesPromise = null;
function fetchCatSrcTemplates() {
if (catSrcTemplatesPromise) return catSrcTemplatesPromise;
catSrcTemplatesPromise = new mw.Api().get({
action: "query",
list: "categorymembers",
cmtitle: "Kategorî:Çavkanî",
cmnamespace: 10,
cmlimit: "max",
formatversion: 2
}).then(function (data) {
var members = (data.query && data.query.categorymembers) || [];
catSrcTemplates = $.map(members, function (m) {
// Pêşgira navî ya "Şablon:" rake.
return m.title.replace(/^[^:]+:/, "");
});
catSrcTemplates.sort(function (a, b) { return a.localeCompare(b, userLang); });
return catSrcTemplates;
}, function () {
catSrcTemplates = [];
return catSrcTemplates;
});
return catSrcTemplatesPromise;
}
var pageName = mw.config.get("wgPageName").replaceAll(/_/g, " ");
if (ns) pageName = pageName.replace(/.*\//, "");
var pageNameRe = escapeRegExp(pageName);
var userLang = mw.config.get("wgUserLanguage");
var formCache = new ObjectStorage("wiktku_start_draft_" + mw.config.get("wgPageName"), 1);
var isMobile = !!mw.config.get("wgMFMode") || window.matchMedia("(pointer: coarse)").matches;
var FOLD_EXTRA = {
"ı": "i", // dotless i
"ø": "o", // o with stroke
"đ": "d", // d with stroke
"ð": "d", // eth
"ə": "e", // schwa
"ħ": "h", // h with stroke
"ł": "l", // l with stroke
"ŋ": "n", // eng
"ʉ": "u", // u bar
"ɨ": "i", // i bar
"ʒ": "z", // ezh
"ɛ": "e", // open e
"ɔ": "o", // open o
"æ": "ae",
"œ": "oe",
"ß": "ss",
"þ": "th" };
function foldDiacritics(str) {
if (str === null || str === undefined) return "";
var s = String(str).toLowerCase();
if (typeof s.normalize === "function") {
// Split "î" into "i" + combining circumflex, then drop the accent.
s = s.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
}
return s.replace(/[^\u0000-\u007f]/g, function (ch) {
return Object.prototype.hasOwnProperty.call(FOLD_EXTRA, ch) ? FOLD_EXTRA[ch] : ch;
});
}
var WIKTKU_RESIZE_STORAGE_PREFIX = "wiktku_resize_height_";
/** Textareas of the same "kind" (e.g. every Nimûne box, every Tercime
* box) share a class list even though each individual box is a fresh
* DOM node built on the fly (new sense blocks, quote fields, …) with
* no stable id of its own. That class list is what we key the cached
* height on, so a size chosen for one Nimûne box is reused for every
* Nimûne box, on this page and on the next one. */
function wiktkuResizeStorageKey(textarea) {
var cls = (textarea.attr("class") || "").trim().replace(/\s+/g, "_");
return WIKTKU_RESIZE_STORAGE_PREFIX + cls;
}
function wiktkuSaveResizeHeight(textarea, height) {
if (!(window.mw && mw.storage)) return;
try {
mw.storage.set(wiktkuResizeStorageKey(textarea), String(Math.round(height)));
} catch (e) { /* localStorage unavailable (private mode, quota, …) — skip caching */ }
}
function wiktkuLoadResizeHeight(textarea) {
if (!(window.mw && mw.storage)) return null;
try {
var v = mw.storage.get(wiktkuResizeStorageKey(textarea));
return v ? parseFloat(v) : null;
} catch (e) {
return null;
}
}
/** Replaces a textarea's native corner resize grip with a small custom
* drag handle (see the "Manual drag-to-resize handle" comment and
* .wiktku-resize-wrap / .wiktku-resize-grip in styles.css). Needed
* because iOS Safari never implements the native grip at all and
* desktop Safari's own version is inconsistent, so we replace it
* everywhere for uniform behaviour. One-line fields (.wiktku-start-narrow)
* are meant to stay a fixed height and are left untouched. Safe to call
* more than once on the same textarea. */
function wiktkuMakeManualResizable(textarea) {
textarea = $(textarea);
if (!textarea.is("textarea") || textarea.hasClass("wiktku-start-narrow")) return;
if (textarea.data("wiktkuResizableDone")) return;
textarea.data("wiktkuResizableDone", true);
textarea.wrap("<div class='wiktku-resize-wrap'></div>");
var grip = $("<div class='wiktku-resize-grip'></div>");
textarea.after(grip);
// Restore a previously chosen height for this kind of field, if any.
var cachedHeight = wiktkuLoadResizeHeight(textarea);
if (cachedHeight) {
var minHeightInit = parseFloat(textarea.css("min-height")) || 0;
textarea.css("height", Math.max(cachedHeight, minHeightInit) + "px");
}
var dragging = false, startY = 0, startHeight = 0;
function onPointerMove(e) {
if (!dragging) return;
var oe = e.originalEvent || e;
var minHeight = parseFloat(textarea.css("min-height")) || 0;
var newHeight = startHeight + (oe.clientY - startY);
textarea.css("height", Math.max(newHeight, minHeight) + "px");
}
function onPointerUp(e) {
if (!dragging) return;
dragging = false;
var oe = e.originalEvent || e;
try { grip[0].releasePointerCapture(oe.pointerId); } catch (err) { /* ignore */ }
$(document).off("pointermove", onPointerMove);
$(document).off("pointerup pointercancel", onPointerUp);
wiktkuSaveResizeHeight(textarea, textarea.outerHeight());
}
grip.on("pointerdown", function (e) {
var oe = e.originalEvent || e;
if (oe.button !== undefined && oe.button !== 0) return; // primary contact only
e.preventDefault();
dragging = true;
startY = oe.clientY;
startHeight = textarea.outerHeight();
try { grip[0].setPointerCapture(oe.pointerId); } catch (err) { /* ignore */ }
$(document).on("pointermove", onPointerMove);
$(document).on("pointerup pointercancel", onPointerUp);
});
}
/** Applies wiktkuMakeManualResizable to every eligible textarea already
* inside `context` (context itself, if it is a textarea, or any of its
* descendants). Used both for the initial form render and, via the
* MutationObserver set up in build(), for textareas added later on
* (new sense blocks, quote-source fields, nimûne rows, …). */
function wiktkuInitManualResize(context) {
var $context = $(context);
var $textareas = $context.is("textarea") ? $context : $context.find("textarea");
$textareas.each(function () {
wiktkuMakeManualResizable(this);
});
}
function wrapNativeSelect(select) {
var wrapper = $("<span class='wiktku-native-select-wrap'></span>");
if (select.prop("multiple")) {
return wrapper.append(select);
}
var placeholder = select.attr("data-placeholder") || "Lê bigere...";
select.hide();
var textInput = $("<input type='search' autocomplete='off'>")
.attr("placeholder", placeholder)
.attr("role", "combobox")
.attr("aria-autocomplete", "list")
.attr("aria-expanded", "false")
.addClass("wiktku-start-narrow wiktku-ac-input");
var resultsList = $("<ul class='wiktku-ac-results' role='listbox'></ul>").hide();
var allOptions = [];
var shown = [];
var activeIndex = -1;
function cacheOptions() {
allOptions = [];
select.find("option").each(function () {
var v = $(this).val();
var text = $(this).text();
// A blank value with no label (most selects' placeholder) is
// never a real choice, so skip it. But a blank value WITH a
// label -- e.g. tplSelect's "— yan jî şablonek hilbijêre —" --
// is a meaningful "clear the selection" choice, so keep it
// searchable/selectable like any other option.
if (!v && !text) return;
// Language options read "Name (code)" -- score the name on its own
// so the trailing code doesn't also count as a name match.
var name = text.replace(/\s*\([^()]*\)\s*$/, "");
allOptions.push({
value: v,
text: text,
disabled: $(this).prop("disabled"),
foldCode: foldDiacritics(v),
foldName: foldDiacritics(name),
foldText: foldDiacritics(text)
});
});
}
cacheOptions();
// True if `q` starts a word inside `name` ("kevn" in "ingiliziya kevn").
function startsWord(name, q) {
var from = 0, at;
while ((at = name.indexOf(q, from)) !== -1) {
if (at === 0 || /[\s\-\u2013\u2014(/,.]/.test(name.charAt(at - 1))) return true;
from = at + 1;
}
return false;
}
// Lower rank = better match.
// a code that *is* the query, or begins with it, always outranks a name
// that merely contains it -- so "ang" lists "Îngilîziya kevn (ang)"
// first instead of burying it among every name containing "ang".
var RANK_NONE = 99;
function rankOption(o, q) {
var code = o.foldCode, name = o.foldName;
if (code === q) return 0; // exact code
if (code.indexOf(q) === 0) return 1; // code prefix
if (name === q) return 2; // exact name
if (name.indexOf(q) === 0) return 3; // name prefix
if (startsWord(name, q)) return 4; // starts a word in the name
if (name.indexOf(q) !== -1) return 5; // name substring
if (code.indexOf(q) !== -1) return 6; // code substring
if (o.foldText.indexOf(q) !== -1) return 7; // anywhere else in the label
return RANK_NONE;
}
function positionList() {
// Position the list above or below depending on viewport space.
var inputRect = textInput[0].getBoundingClientRect();
var viewportH = window.innerHeight;
var spaceBelow = viewportH - inputRect.bottom - 8;
var spaceAbove = inputRect.top - 8;
var maxH = Math.min(224, Math.max(spaceBelow, spaceAbove)); // 224px = 14em
resultsList.css({
"max-height": maxH + "px",
"top": spaceBelow >= spaceAbove ? "100%" : "auto",
"bottom": spaceBelow >= spaceAbove ? "auto" : "100%"
});
}
function closeList() {
resultsList.hide();
textInput.attr("aria-expanded", "false");
activeIndex = -1;
}
function showResults(query) {
var q = foldDiacritics($.trim(query || ""));
resultsList.empty();
activeIndex = -1;
var matched = [];
if (q) {
$.each(allOptions, function (i, o) {
if (o.disabled) return;
var rank = rankOption(o, q);
if (rank !== RANK_NONE) matched.push({ opt: o, rank: rank, i: i });
});
if (!matched.length && q.indexOf(" ") !== -1) {
var tokens = q.split(/\s+/);
$.each(allOptions, function (i, o) {
if (o.disabled) return;
var all = true;
$.each(tokens, function (_, t) {
if (o.foldText.indexOf(t) === -1) { all = false; return false; }
});
if (all) matched.push({ opt: o, rank: 8, i: i });
});
}
matched.sort(function (a, b) {
if (a.rank !== b.rank) return a.rank - b.rank;
// Inside the code tiers the shorter code is the better hit:
// "an" -> "an" before "ang" before "ang-x-...".
if (a.rank <= 1 && a.opt.foldCode.length !== b.opt.foldCode.length) {
return a.opt.foldCode.length - b.opt.foldCode.length;
}
// Otherwise keep the menu's own order (pinned languages first).
return a.i - b.i;
});
} else {
$.each(allOptions, function (i, o) {
if (!o.disabled) matched.push({ opt: o, rank: 0, i: i });
});
}
shown = $.map(matched.slice(0, 50), function (m) { return m.opt; });
if (!shown.length) {
closeList();
return;
}
$.each(shown, function (idx, opt) {
var li = $("<li role='option'></li>")
.text(opt.text)
.attr("data-value", opt.value)
.attr("aria-selected", "false");
// touchend (not touchstart) so a scroll doesn't trigger a select.
var touchMoved = false;
li.on("touchstart", function () {
touchMoved = false;
});
li.on("touchmove", function () {
touchMoved = true;
});
li.on("touchend", function (e) {
if (touchMoved) return; // was a scroll, not a tap
e.preventDefault();
selectOption(opt.value, opt.text);
});
// mousedown (not click) so it beats the input's blur handler.
li.on("mousedown", function (e) {
e.preventDefault();
selectOption(opt.value, opt.text);
});
li.on("mouseenter", function () {
// Hovered items are already in view -- don't scroll the list
// under the mouse, or the shift can trigger the next item's
// mouseenter and cascade into a runaway scroll.
setActive(idx, /* scrollIntoView */ false);
});
resultsList.append(li);
});
positionList();
resultsList.show();
resultsList[0].scrollTop = 0;
textInput.attr("aria-expanded", "true");
}
function setActive(idx, scrollIntoView) {
var items = resultsList.children("li");
if (!items.length) return;
if (idx < 0) idx = items.length - 1;
if (idx >= items.length) idx = 0;
activeIndex = idx;
items.removeClass("wiktku-ac-active").attr("aria-selected", "false");
var li = items.eq(idx).addClass("wiktku-ac-active").attr("aria-selected", "true");
if (scrollIntoView === false) return;
// Keep the cursor visible inside the scrollable list -- only for
// keyboard navigation. A mouse-hovered item is already visible, so
// scrolling here would shift the list under a stationary pointer
// and cascade into further mouseenter events.
var ul = resultsList[0], el = li[0];
if (el.offsetTop < ul.scrollTop) {
ul.scrollTop = el.offsetTop;
} else if (el.offsetTop + el.offsetHeight > ul.scrollTop + ul.clientHeight) {
ul.scrollTop = el.offsetTop + el.offsetHeight - ul.clientHeight;
}
}
/** Puts the currently selected option's label back in the text box. */
function syncInputToSelect() {
var cur = select.val();
var match = null;
if (cur) {
$.each(allOptions, function (_, o) {
if (o.value === cur) { match = o; return false; }
});
}
textInput.val(match ? match.text : "");
}
function selectOption(value, text) {
textInput.val(text);
select.val(value);
closeList();
select.trigger("change");
}
textInput.on("input", function () {
showResults($(this).val());
});
textInput.on("focus", function () {
// Select the current label so typing replaces it, and open the full list
this.select();
showResults("");
});
textInput.on("click", function () {
if (!resultsList.is(":visible")) showResults($(this).val());
});
textInput.on("keydown", function (e) {
var open = resultsList.is(":visible");
switch (e.which) {
case 40: // Down
e.preventDefault();
if (!open) { showResults($(this).val()); setActive(0); }
else setActive(activeIndex + 1);
break;
case 38: // Up
e.preventDefault();
if (!open) { showResults($(this).val()); setActive(-1); }
else setActive(activeIndex - 1);
break;
case 13: // Enter -- must never submit the form while the list is open
if (open) {
e.preventDefault();
if (activeIndex >= 0 && shown[activeIndex]) {
selectOption(shown[activeIndex].value, shown[activeIndex].text);
} else if (shown.length === 1) {
selectOption(shown[0].value, shown[0].text);
}
}
break;
case 27: // Esc -- abandon the search, restore the real value
if (open) {
e.preventDefault();
closeList();
syncInputToSelect();
}
break;
case 9: // Tab -- commit the highlighted row on the way out
if (open && activeIndex >= 0 && shown[activeIndex]) {
selectOption(shown[activeIndex].value, shown[activeIndex].text);
}
closeList();
break;
}
});
textInput.on("blur", function () {
// Short delay so a touchstart/mousedown on a result fires first.
setTimeout(function () {
closeList();
// Half-typed text that never became a selection would otherwise sit
// in the box looking like a choice -- put the real value back.
syncInputToSelect();
}, 200);
});
// Re-caches the option list. Fired after the full language list loads, after
// options are enabled/disabled, and after programmatic .val() changes.
select.on("wiktku:refresh", function () {
cacheOptions();
syncInputToSelect();
if (resultsList.is(":visible")) showResults(textInput.val());
});
wrapper.append(textInput).append(resultsList).append(select);
return wrapper;
}
/**
* Gives every plain <select> under `root` the searchable picker. Selects
* marked .wiktku-plain-select opt out, and the call is idempotent, so it is
* safe to re-run after new rows or sense blocks are inserted.
*/
function initSelects(root) {
$(root).find("select").addBack("select").not(".wiktku-plain-select").each(function () {
var sel = $(this);
if (sel.prop("multiple")) return;
if (sel.closest(".wiktku-native-select-wrap").length) return; // already wrapped
var marker = $("<span></span>").insertBefore(sel);
marker.replaceWith(wrapNativeSelect(sel));
});
}
var langsByCode = {};
// Populated from [[MediaWiki:Gadget-start.js/data.json]] at runtime.
var metadata = {};
var ZARAVA_LANG_CODES = ["ckb", "sdh", "lki", "hac", "zza"];
// Converts a {code: label} object (langChoices/posChoices in data.json)
// into the {code, label[, sortKey]} array the rest of the script uses.
// isLang: true adds a sortKey and shows "(code)" after the label —
// language choices only.
function choicesFromObject(obj, isLang) {
var result = [];
$.each(obj || {}, function (code, label) {
var choice = { code: code, label: label };
if (isLang) choice.sortKey = label;
result.push(choice);
});
return result;
}
function getZaravaKeys(choices) {
var byCode = {};
$.each(choices || [], function (_, c) { byCode[c.code] = c; });
var result = [];
$.each(ZARAVA_LANG_CODES, function (_, code) {
if (byCode[code]) result.push(byCode[code]);
});
return result;
}
function needsTransliteration(langCode) {
var meta = metadata[langCode];
if (!meta || !meta.sc) return false;
var scripts = Array.isArray(meta.sc) ? meta.sc : [meta.sc];
return scripts.length > 0 && scripts[0] !== "Latn";
}
// Kodên cinsiyetê yên di metadata.g de — ji data.json tê dagirtin
var GENDER_BASE_LABELS = {};
// Sub-lists that only make sense for a plain (non-şablon) sense — hidden
// when a şablon (e.g. {{guharto|…}}) is chosen for that sense
var HIDDEN_ON_TPL_GROUPS = [
"wiktku-dfn-alternativ",
"wiktku-dfn-hevmane",
"wiktku-dfn-dijmane",
"wiktku-dfn-koordine",
"wiktku-dfn-jornav",
"wiktku-dfn-jernav"
];
function genderLabel(code) {
if (code === "p") return "Pirjimar";
var pluralMatch = code.match(/^(.+)-p$/);
if (pluralMatch && GENDER_BASE_LABELS[pluralMatch[1]]) {
return GENDER_BASE_LABELS[pluralMatch[1]] + " (pirjimar)";
}
return GENDER_BASE_LABELS[code] || code;
}
// True if a sense has content beyond mane worth keeping (etîket, word
// lists, nimûne, jêder) — so it's still emitted with {{mane?}} if empty.
function senseHasExtraContent(s) {
if (s.etiket && $.grep(s.etiket, function (e) { return $.trim(e) !== ""; }).length) return true;
if (s.kategori && $.grep(s.kategori, function (k) { return $.trim(k) !== ""; }).length) return true;
if (s.alternativ.length || s.hevmane.length || s.dijmane.length ||
s.koordine.length || s.jornav.length || s.jernav.length) return true;
if (s.nimune && $.grep(s.nimune, function (n) {
return (typeof n === "object" ? n.text : n) !== "";
}).length > 0) return true;
if (senseHasJeder(s)) return true;
return false;
}
// Bolds the *first* occurrence of the page name (plus any letters
// glued directly onto it, e.g. a plural "s") inside nimûne/jêgirtin
// text — "apple"/"Apple"/"apples"/"Apples" all match (case-insensitive),
// but only the first hit is wrapped, not every one in the text.
function boldPageNameOnce(text) {
if (!text || !pageNameRe) return text;
var re = new RegExp("(" + pageNameRe + "([^( |,|;|\\?|\\.|\\!)]+)?)", "i");
return text.replace(re, "'''$1'''");
}
// Converts literal line breaks typed into a nimûne/jêgirtin box into
// wikitext <br> tags, so a pasted/typed newline doesn't break the
// surrounding "#:"/"#*" wikitext list syntax on output.
function nlToBr(text) {
return text ? text.replace(/\r\n|\r|\n/g, "<br>") : text;
}
function escapeHtmlForBackdrop(str) {
return String(str)
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">");
}
// Mirrors a textarea's text, with a small highlighted marker placed
// right after each line that's followed by an actual typed/pasted
// linebreak. Rendered into a transparent backdrop layer behind the
// textarea (see ensureLinebreakBackdrop()), so only the point of the
// break is marked instead of the whole box.
function buildLinebreakBackdropHtml(text) {
var lines = text.split(/\r\n|\r|\n/);
return $.map(lines, function (line, i) {
var isLast = i === lines.length - 1;
return escapeHtmlForBackdrop(line) +
(isLast ? "" : "<mark class='wiktku-linebreak-mark'>↵</mark>\n");
}).join("");
}
// Copies the metrics that affect where text wraps/lands (font, line
// height, padding, border) from the real textarea onto its backdrop,
// via computed style rather than shared CSS classes — most of the
// box's own rules are written as "textarea.foo", which a <div> with
// the same class wouldn't match. Re-run on every update in case a
// responsive breakpoint changed the textarea's own font-size.
function syncLinebreakBackdropMetrics(textarea, backdrop) {
var cs = window.getComputedStyle(textarea[0]);
backdrop.css({
"box-sizing": cs.boxSizing,
"padding-top": cs.paddingTop,
"padding-right": cs.paddingRight,
"padding-bottom": cs.paddingBottom,
"padding-left": cs.paddingLeft,
"border-width": cs.borderWidth,
"border-style": "solid",
"font-family": cs.fontFamily,
"font-size": cs.fontSize,
"font-weight": cs.fontWeight,
"line-height": cs.lineHeight,
"letter-spacing": cs.letterSpacing
});
}
// Lazily wraps a textarea in its own positioning anchor (independent
// of .wiktku-resize-wrap, so this doesn't depend on load order versus
// wiktkuMakeManualResizable) and inserts the transparent backdrop
// layer used to mark the exact point of a linebreak. Safe to call
// more than once on the same textarea — the backdrop is cached.
function ensureLinebreakBackdrop(textarea) {
var existing = textarea.data("wiktkuLinebreakBackdrop");
if (existing) return existing;
textarea.wrap("<div class='wiktku-linebreak-wrap'></div>");
var backdrop = $("<div aria-hidden='true'></div>").addClass("wiktku-linebreak-backdrop");
textarea.before(backdrop);
textarea.data("wiktkuLinebreakBackdrop", backdrop);
textarea.on("scroll.wiktkuLinebreak", function () {
backdrop.scrollTop(textarea.scrollTop()).scrollLeft(textarea.scrollLeft());
});
return backdrop;
}
// Flags a nimûne/jêgirtin textarea (via CSS class, for the border
// tint + tooltip) while it contains a typed/pasted linebreak, so the
// user notices before it's silently turned into <br> on output.
// Marks only the exact point of the break via a mirrored backdrop,
// rather than tinting the whole box.
function highlightLinebreak(el) {
var textarea = $(el);
var text = textarea.val();
var hasBreak = /\r|\n/.test(text);
textarea
.toggleClass("wiktku-has-linebreak", hasBreak)
.attr("title", hasBreak ? "Xeta nû dê wek <br> bê nivîsandin" : "");
if (!hasBreak) {
var cached = textarea.data("wiktkuLinebreakBackdrop");
if (cached) cached.hide();
textarea.removeClass("wiktku-has-linebreak-source");
return;
}
var backdrop = ensureLinebreakBackdrop(textarea);
textarea.addClass("wiktku-has-linebreak-source");
syncLinebreakBackdropMetrics(textarea, backdrop);
backdrop.html(buildLinebreakBackdropHtml(text)).show();
backdrop.scrollTop(textarea.scrollTop()).scrollLeft(textarea.scrollLeft());
}
// Each nimûne item can be { text, tr, t }: text, transliteration, translation.
function formatNimune(nimunes, lang, hasJeder) {
var hasNimune = nimunes && $.grep(nimunes, function (n) {
return (typeof n === "object" ? n.text : n) !== "";
}).length > 0;
if (!hasNimune) {
return hasJeder ? "" : "\n#* {{nimûne?|" + lang + "}}";
}
return $.map(nimunes, function (n) {
var text = typeof n === "object" ? n.text : n;
if (!text) return undefined;
var bolded = nlToBr(boldPageNameOnce(text));
var tpl = "\n#: {{nm|" + lang + "|" + bolded;
if (typeof n === "object") {
if (n.tr) tpl += "|tr=" + nlToBr(n.tr);
// Translation as third positional param (no key needed).
if (n.t) tpl += "|" + nlToBr(n.t);
}
// Short examples fit on one line together with their translation.
// rêz=1 is not used for ku — definitions are shown on separate lines there.
if (text.length < 60 && lang !== "ku") tpl += "|rêz=1";
tpl += "}}";
return tpl;
}).join("");
}
// Formats jêder (citation) entries into "#* {{jêder…|…}}" lines; skips
// entries with no quote text. Falls back to the generic {{jêder}}
// template when no specific template was chosen.
function formatJeder(jederList, lang) {
if (!jederList || !jederList.length) return "";
return $.map(jederList, function (jeder) {
if (!jeder || !jeder.quote) return undefined;
var quote = nlToBr(boldPageNameOnce(jeder.quote));
var quoteTr = nlToBr(jeder.quoteTr);
var quoteT = nlToBr(jeder.quoteT);
if (jeder.jederTpl) {
var cite = "\n#* {{" + jeder.jederTpl + "|" + lang;
cite += "|jêgirtin=" + quote;
if (quoteTr) cite += "|tr=" + quoteTr;
if (quoteT) cite += "|tercime=" + quoteT;
$.each(jeder.jêderFields || {}, function (key, val) {
if (val) cite += "|" + key + "=" + val;
});
cite += "}}";
return cite;
}
var out = "\n#* {{jêder|" + lang + "|jêgirtin=" + quote;
if (quoteTr) out += "|tr=" + quoteTr;
if (quoteT) out += "|tercime=" + quoteT;
// A şablon picked from Kategorî:Çavkanî is transcluded as the
// source param (e.g. |{{Kovara X}}); manual text is used as-is.
var srcParam = jeder.jederCatTpl ? ("{{" + jeder.jederCatTpl + "}}") :
(jeder.jederManual ? jeder.jederManual : "çavkanî?");
// A positional param containing "=" gets parsed as its own key=value
// pair by MediaWiki and breaks the template, so force it to be
// explicitly named (|2=) whenever that's the case.
out += (srcParam.indexOf("=") !== -1 ? "|2=" : "|") + srcParam;
out += "}}";
return out;
}).join("");
}
// True if a sense has at least one jêder entry with quote text.
function senseHasJeder(sense) {
return !!(sense.jeder && $.grep(sense.jeder, function (j) {
return j && j.quote;
}).length > 0);
}
// Builds "{{tplName|lang|part1|part2|…}}" from a sense field (kategori,
// etiket), wrapped inline (" {{…}} ") or on its own line ("\n#: {{…}}").
function buildSenseTpl(sense, field, lang, tplName) {
if (!sense[field] || !sense[field].length) return "";
var parts = sense[field].map(function (p) { return $.trim(p); })
.filter(function (p) { return p !== ""; });
if (!parts.length) return "";
var call = "{{" + tplName + "|" + lang + "|" + parts.join("|") + "}}";
return call
}
/**
* Assembles the nimûne + jêder wikitext block for a sense. Shared by
* both the template-sense and normal-mane-sense branches below.
*/
function buildCite(sense, lang) {
return formatNimune(sense.nimune, lang, senseHasJeder(sense)) +
formatJeder(sense.jeder, lang);
}
function makeWordListStep(id, name, question_fmt) {
return {
id: id,
name: name,
question_fmt: question_fmt,
multiple: true,
narrow: true,
placeholder: "Kelîme…",
visible: function (values) {
return values.lang && values.pos;
},
output: function (values) {
var words = $.grep(values[id] || [], function (w) { return !!w; });
var header = capitalize(name);
if (!words.length) return "";
var lang = values.lang;
var section = "\n==== " + header + " ====\n";
var params = "cure=" + header + "\n" +
$.map(words, function (w) {
return "|" + w;
}).join("\n");
return section +
"{{kol3|" + lang + "|" + params + "\n}}\n";
} };
}
var steps = {
lang: {
id: "lang",
required: true,
name: "ziman",
question_fmt: '"' + pageName + '" bi çi zimanî ye?',
question_br: true,
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (langChoices).
choices: [],
output: function (values) {
if (addLangMode){
return "\n== {{ziman|" + values.lang + "}} ==\n";
}else {
return "== {{ziman|" + values.lang + "}} ==\n";
}
} },
pron: {
id: "pron",
name: "bilêvkirin",
question_fmt: '"' + pageName + '" çawa tê telafûzkirin?',
// pronTpls populated from data.json
pronTpls: {},
visible: function (values) {
if (!values.lang) return false;
// addLangMode: skip pron only if this lang already has a section.
if (addLangMode) {
// Clearing the page makes existing content irrelevant.
var clearPageCheck = $("#wiktku-clear-page-check");
if (clearPageCheck.length && clearPageCheck.prop("checked")) {
return true;
}
var existing = $("#wpTextbox1").val() || "";
return !findLangHeader(existing, values.lang);
}
return true;
},
// Fills the insert-dropdown from pronTpls, filtered by language.
refreshTplSelect: function () {
var sel = $("#wiktku-start-pron .wiktku-tpl-insert-select");
if (!sel.length) return;
var lang = getValues().lang || "";
sel.find("option[value!='']").remove();
$.each(steps.pron.pronTpls, function (name, tpl) {
// Filter: if tpl.langs exists, only show if lang is in that list; otherwise show always
var allowed = !tpl.langs || tpl.langs.indexOf(lang) !== -1;
if (allowed) {
sel.append($("<option></option>")
.val(tpl.snippet)
.text(name + " — " + tpl.desc)
.attr("data-nolang", tpl.noLang ? "1" : ""));
}
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-pron-wrap").length) return null;
var wrap = $("<div class='wiktku-pron-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-pron-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-pron-text")
.attr("rows", 4)
.attr("placeholder", "Nimûne: {{IPA|ku|/pɛɪ̯n/}} yan {{kîte|ku|he|ce|ki|rin}}");
// Template insert dropdown — filtered by language.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike ");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
var lang = getValues().lang || "";
$.each(steps.pron.pronTpls, function (name, tpl) {
// Filter: if tpl.langs exists, only show if lang is in that list; otherwise show always
var allowed = !tpl.langs || tpl.langs.indexOf(lang) !== -1;
if (allowed) {
sel.append($("<option></option>")
.val(tpl.snippet)
.text(name + " — " + tpl.desc)
.attr("data-nolang", tpl.noLang ? "1" : ""));
}
});
sel.on("change", function () {
var snippet = $(this).val();
if (!snippet) return;
var lang = getValues().lang || "";
// Check if the selected option has noLang flag
var selectedOption = sel.find("option:selected");
var hasNoLang = selectedOption.attr("data-nolang") === "1";
if (!hasNoLang) {
snippet = snippet.replace(/CODE/g, lang).replace(/SOURCELANG/g, "?");
}
insertAtCursor(ta[0], snippet);
$(this).val("");
// Clear the picker's search box
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel).append(ta);
stepDiv.append(wrap);
initSelects(wrap);
return ta;
},
output: function () {
var text = $.trim($("#wiktku-start-pron .wiktku-pron-text").val());
if (!text) return "";
var lines = text.split("\n");
var out = $.map(lines, function (line) {
line = $.trim(line);
if (!line) return undefined;
return line;
}).join("\n");
return "\n=== Bilêvkirin ===\n" + out + "\n";
} },
pos: {
id: "pos",
required: true,
name: "Cureyê rêzimanî",
question_fmt: 'Cureyê rêzimanî yê "' + pageName + '" çi ye?',
visible: function (values) {
return values.lang;
},
question_br: true,
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (posChoices).
choices: [],
output: function (values) {
var pos = values.pos || "";
var cinsiyet = values.cinsiyet || ""; // from the cinsiyet step
var lekTur = values.lektur || ""; // from the lêker transitivity step
var capitalizedPos = capitalize(pos);
var outputString = "\n=== " + capitalizedPos + " ===\n";
outputString += "{{" + pos + "|" + values.lang;
if (pos === "navdêr" || pos === "serenav") {
if (cinsiyet) {
outputString += "|c=" + cinsiyet;
} else if (values.lang === "ku") {
outputString += "|c=?";
}
} else if (/^lêker/.test(pos) && lekTur) {
outputString += "|c=" + lekTur;
}
if (values.tr) {
outputString += "|tr=" + values.tr;
}
outputString += "}}\n";
return outputString;
}
},
// cinsiyet (gender) — shown for navdêr/serenav only, with choices built
// from metadata[lang].g since not every language has grammatical gender.
cinsiyet: {
id: "cinsiyet",
name: "cinsiyet",
question_fmt: 'Cinsiyeta "' + pageName + '" çi ye?',
question_br: true,
visible: function (values) {
var meta = metadata[values.lang];
return !!(values.lang && (values.pos === "navdêr" || values.pos === "serenav") &&
meta && meta.g && meta.g.length);
},
build: function (stepDiv, values) {
var select = stepDiv.find("select.wiktku-start-step-field");
if (!select.length) {
select = $(mw.html.element("select", {
"class": "wiktku-start-step-field wiktku-plain-select",
id: "wiktku-start-cinsiyet-field" }));
stepDiv.append(select);
}
if (!values) return select;
var meta = metadata[values.lang];
var codes = (meta && meta.g) || [];
var prevVal = select.val();
var choices = $.map(codes, function (code) {
return [{ code: code, label: genderLabel(code) }];
});
populateMenus(select, choices, null, "Cinsiyetê hilbijêre");
if ($.grep(choices, function (c) { return c.code === prevVal; }).length) {
select.val(prevVal);
}
return select;
},
output: function () { return ""; } // consumed by pos.output
},
// Lêker transitivity
lektur: {
id: "lektur",
name: "Cureyê lêkerê (fiîlê)",
question_fmt: "Cureyê lêkerê (fiîlê) çi ye?",
question_br: true,
visible: function (values) {
return values.lang && values.pos && /^lêker/.test(values.pos);
},
choices: [
{ code: "gh", label: "gerguhêz" },
{ code: "x-gh", label: "xwerû-gerguhêz" },
{ code: "p-gh", label: "pêkhatî-gerguhêz" },
{ code: "h-gh", label: "hevedudanî-gerguhêz" },
{ code: "b-gh", label: "biwêjî-gerguhêz" },
{ code: "ngh", label: "negerguhêz" },
{ code: "x-ngh", label: "xwerû-negerguhêz" },
{ code: "p-ngh", label: "pêkhatî-negerguhêz" },
{ code: "h-ngh", label: "hevedudanî-negerguhêz" },
{ code: "b-ngh", label: "biwêjî-negerguhêz" } ],
output: function () { return ""; } // consumed by pos.output
},
tr: {
id: "tr",
name: "transliterasyon",
question_fmt: "Transliterasyona vê kelîmeyê",
multiple: false,
narrow: true,
visible: function (values) {
return values.lang && values.pos && needsTransliteration(values.lang);
} },
dfn: {
id: "dfn",
name: "Mane",
question_fmt: function (values) {
var base = "Maneya kelîmeyê binivîse. Mane otomatîk tê lînkkirin!";
if (values.lang === "ku") {
return base + " Ji bo tercimeyan beşa 'Werger' bi kar bîne!";
}
return base;
},
multiple: true,
ordered: true,
rows: 3,
visible: function (values) {
return values.lang && values.pos;
},
example: function (values) {
// posExamples loaded from [[MediaWiki:Gadget-start.js/data.json]].
var examples = steps.dfn.posExamples || {};
var full = values.pos || "";
return examples[full] || "";
},
// Builds one sense block (<li>): mane textarea, nimûne list, and
// sub-lists for alternatîv/hevmane/dijmane/etc.
buildSenseBlock: function (stepDiv) {
var block = $("<li class='wiktku-dfn-sense'></li>");
// — Mane textarea (declared first so the template handler can reference it) —
var dfnArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-mane-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-start-step-field wiktku-dfn-mane")
.attr("rows", 6)
.attr("placeholder", "Mane…");
dfnArea.on("input", function () {
steps.dfn.onDfnInput(stepDiv, block, this);
});
// — Tercime + Îzah boxes (non-ku alternative to the plain mane box) —
// Non-ku entries get a direct translation plus a {{îzah|…}}-wrapped
// gloss instead of a Kurdish-style gloss. Rather than teach every
// consumer (getSenses/getOutput/linkify) a second data shape, these
// boxes just write their combined text into dfnArea and re-fire its
// "input" event, so dfnArea stays the single source of truth.
var tercimeArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-tercime-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-dfn-subfield wiktku-dfn-tercime")
.attr("rows", 2)
.attr("placeholder", "Tercimeyên rasterast ên kurmancî… Ji bo school-a îngilîzî li vir 'mekteb, medrese' binivîse");
var izahArea = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-izah-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", "wiktku-dfn-subfield wiktku-dfn-izah")
.attr("rows", 3)
.attr("placeholder", "Îzaha kurmancî… Ji bo school-a îngilîzî li vir 'cihê tehsîlgirtinê' binivîse");
var nonKuWrap = $("<div class='wiktku-dfn-nonku-wrap'></div>")
.append(tercimeArea).append(izahArea)
.hide();
function syncNonKuToMane() {
var t = $.trim(tercimeArea.val());
var iz = $.trim(izahArea.val());
// if tercime is blank, use îzah as definition
var combined = t ? (iz ? t + " {{îzah|" + iz + "}}" : t) : iz;
dfnArea.val(combined);
// Re-fires onDfnInput so the sense list still grows and
// refresh() still runs, exactly as if this were typed
// directly into the mane textarea.
dfnArea.trigger("input");
}
tercimeArea.on("input", syncNonKuToMane);
izahArea.on("input", syncNonKuToMane);
// Switches between the plain mane box and the tercime+îzah pair —
// only for non-ku entries with no tplSelect selected.
function updateManeMode() {
var lang = getValues().lang || "";
var isTpl = !!tplSelect.val();
if (lang && lang !== "ku" && !isTpl) {
dfnArea.hide();
nonKuWrap.show();
} else {
nonKuWrap.hide();
if (!isTpl) dfnArea.show();
}
}
// Store on the block so refresh() can re-sync every block when
// lang changes, and restoreDfn() can re-sync after restoring.
block.data("updateManeMode", updateManeMode);
// — Template selector (optional — replaces mane when chosen) —
// Template definitions loaded from [[MediaWiki:Gadget-start.js/data.json]].
var tplDefs = steps.dfn.tplDefs || {};
// Cache of all non-placeholder option elements, so updateTplOptions
// can detach/re-attach them without losing the full list.
var _allTplOptions = [];
var tplSelect = $(mw.html.element("select", { "class": "wiktku-dfn-tpl-select" }));
tplSelect.attr("data-placeholder", "Li şablonekê bigere");
tplSelect.append($("<option value=''>— yan jî şablonek hilbijêre —</option>"));
$.each(tplDefs, function (name, tpl) {
var opt = $("<option></option>")
.val(name)
.text(name)
.attr("data-langs", tpl.langs ? tpl.langs.join(",") : "")
.attr("data-nolang", tpl.noLang ? "1" : "");
tplSelect.append(opt);
_allTplOptions.push(opt[0]);
});
function updateTplOptions() {
var lang = getValues().lang || "";
var currentVal = tplSelect.val();
var currentStillValid = false;
// Detach all non-placeholder options, then re-attach only the visible
// ones — native <select> won't reliably hide options any other way.
tplSelect.find("option[value!='']").detach();
$.each(_allTplOptions, function (_, opt) {
var allowed = $(opt).attr("data-langs");
var visible = !allowed || allowed.split(",").indexOf(lang) !== -1;
if (visible) {
tplSelect.append(opt);
if ($(opt).val() === currentVal) currentStillValid = true;
}
});
tplSelect.trigger("wiktku:refresh");
if (currentVal && !currentStillValid) {
tplSelect.val("");
tplTitleInput.hide().val("");
updateManeMode();
}
}
// Store updater on the element so refresh() can call it for all blocks.
tplSelect.data("updateOptions", updateTplOptions);
var tplTitleInput = $("<input type='text'>")
.addClass("wiktku-dfn-tpl-title wiktku-start-narrow")
.attr("placeholder", "Navê rûpela hedefê…")
.hide();
// Grow the sense list when the title field of the last block gets content,
// mirroring what onDfnInput does for the plain mane textarea.
tplTitleInput.on("input", function () {
steps.dfn.onDfnInput(stepDiv, block, this);
});
// Şablon senses have no plain gloss, so hide alternatîv/hevmane/
// dijmane/etc. Etîket, Nimûne and Jêgirtin stay visible either way.
function updateFieldVisibility() {
var isTpl = !!tplSelect.val();
$.each(HIDDEN_ON_TPL_GROUPS, function (_, cls) {
block.find("." + cls + "-group").toggle(!isTpl);
});
}
// Store on the block so restoreDfn() can re-sync visibility
// after setting tplSelect's value.
block.data("updateFieldVisibility", updateFieldVisibility);
tplSelect.on("change", function () {
var chosen = $(this).val();
if (chosen) {
dfnArea.hide();
nonKuWrap.hide();
tplTitleInput.show().focus();
} else {
tplTitleInput.hide().val("");
updateManeMode();
}
updateFieldVisibility();
// Re-run refresh so the Werger step visibility updates.
refresh();
});
var tplRow = $("<div></div>").addClass("wiktku-dfn-tpl-row")
.append(tplSelect).append(" ").append(tplTitleInput);
block.append(tplRow);
block.append(dfnArea);
block.append(nonKuWrap);
// Apply lang filter on initial build.
updateTplOptions();
updateManeMode();
// — Sub-field groups are always visible with a placeholder textarea.
var allGroups = [
{ cls: "wiktku-dfn-etiket", label: "Etîket", rows: 1, narrow: true, izah: "xisûsen, Mêrdîn, anatomî, Badînî" },
{ cls: "wiktku-dfn-kategori", label: "Kategorî", rows: 1, narrow: true, izah: "wekî etîket lê xuya nabe tenê kategorîze dike" },
{ cls: "wiktku-dfn-alternativ", label: "Formên alternatîv", rows: 1, narrow: true, izah: "Varyantên vê kelîmeyê" },
{ cls: "wiktku-dfn-hevmane", label: "Hevmane", rows: 1, narrow: true, izah: "Spehî hevmaneya Bedew e." },
{ cls: "wiktku-dfn-dijmane", label: "Dijmane", rows: 1, narrow: true, izah: "Zengîn dijmaneya feqîr e." },
{ cls: "wiktku-dfn-koordine", label: "Termên koordîne", rows: 1, narrow: true, izah: "Pisîk û kûçik termên koordîne ne çunkî Jornavên wan gelek in" },
{ cls: "wiktku-dfn-jornav", label: "Jornav", rows: 1, narrow: true, izah: "Heywan jornavê guhandar e" },
{ cls: "wiktku-dfn-jernav", label: "Jêrnav", rows: 1, narrow: true, izah: "Guhandar jêrnavê heywan e" },
{ cls: "wiktku-dfn-nimune", label: "Nimûne", rows: 2, narrow: false }
];
$.each(allGroups, function (_, g) {
var groupDiv = $("<div></div>").addClass("wiktku-dfn-subgroup " + g.cls + "-group");
function buildNimuneLi() {
var lang = getValues().lang || "";
var li = $("<li></li>").addClass("wiktku-dfn-nimune-li");
var mainTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-text-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", g.rows)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-text")
.attr("placeholder", "Nimûneya emilandina kelîmeyê tu bi xwe binivîse…");
mainTa.on("input", function () {
highlightLinebreak(this);
var val = $.trim($(this).val());
var isLast = li.is(list.children("li:last-child"));
if (val && isLast) {
list.append(buildNimuneLi());
}
});
li.append(mainTa);
var subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
if (needsTransliteration(lang)) {
subWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-tr")
.attr("placeholder", "Transliterasyona bi alfabeya latînî")
);
}
if (lang && lang !== "ku") {
subWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-t")
.attr("placeholder", "Tercimeya nimûneyê bi kurmancî")
);
}
if (subWrap.children().length) li.append(subWrap);
return li;
}
if (g.cls === "wiktku-dfn-nimune") {
// Nimûne — compound widget with tr/t sub-fields.
var lbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text(g.label))
.append(": ");
var list = $("<ol></ol>").addClass("wiktku-dfn-sublist " + g.cls + "-list");
groupDiv.data("buildNimuneLi", buildNimuneLi);
list.append(buildNimuneLi());
groupDiv.append(lbl).append(list);
block.append(groupDiv);
} else {
// Regular always-visible group — label + growing textarea list.
var lbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text(g.label))
.append(": ")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-hint").text(g.izah));
var list = $("<ol></ol>").addClass("wiktku-dfn-sublist " + g.cls + "-list");
var firstInput = $("<textarea></textarea>")
.attr("name", g.cls + "-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", g.rows)
.attr("class", "wiktku-dfn-subfield" + (g.narrow ? " wiktku-start-narrow" : ""))
.attr("placeholder", g.label + "…");
firstInput.on("input", function () {
steps.dfn.onSubInput(list, this, g.rows, g.narrow);
});
list.append($("<li></li>").append(firstInput));
groupDiv.append(lbl).append(list);
block.append(groupDiv);
}
});
// — Jêder group — growing list, same structure as Nimûne. —
(function () {
var jederGroupDiv = $("<div></div>").addClass("wiktku-dfn-subgroup wiktku-dfn-jeder-group");
var jederLbl = $("<span></span>").addClass("wiktku-dfn-sublabel")
.append($("<span></span>").addClass("wiktku-dfn-sublabel-term").text("Jêgirtin"))
.append(": ");
var jederList = $("<ol></ol>").addClass("wiktku-dfn-sublist wiktku-dfn-jeder-list");
function buildJederLi() {
var lang = getValues().lang || "";
var li = $("<li></li>").addClass("wiktku-dfn-jeder-li");
// Quote text textarea
var quoteTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote")
.attr("placeholder", "Nimûneya emilandinê ji kitêb an çavkaniyeke din binivîse");
quoteTa.on("input", function () {
highlightLinebreak(this);
var val = $.trim($(this).val());
var isLast = li.is(jederList.children("li:last-child"));
if (val && isLast) {
jederList.append(buildJederLi());
}
});
li.append(quoteTa);
// tr/t sub-fields for the quote — shown as needed for the language.
var quoteSubWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
if (needsTransliteration(lang)) {
quoteSubWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-tr")
.attr("placeholder", "Transliterasyona jêgirtinê…")
);
}
if (lang && lang !== "ku") {
quoteSubWrap.append(
$("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-t")
.attr("placeholder", "Tercimeya jêgirtinê bi kurmancî")
);
}
if (quoteSubWrap.children().length) li.append(quoteSubWrap);
// Citoid auto-fill: fetch citation data from a URL, DOI or ISBN and
// prefill the source şablon + fields below (see Gadget-citoid-helper.js).
var citoidWrap = $("<div></div>").addClass("wiktku-dfn-quote-citoid");
var citoidInput = $("<textarea></textarea>")
.addClass("wiktku-dfn-subfield wiktku-dfn-quote-citoid-input")
.attr("rows", 1)
.attr("placeholder", "URL, DOI an ISBN binivîse ku otomatîk were tijekirin…");
var citoidBtn = new OO.ui.ButtonWidget({
label: "Bi Citoidê bîne",
classes: [ "wiktku-dfn-quote-citoid-btn" ]
});
var citoidStatus = $("<span></span>").addClass("wiktku-dfn-quote-citoid-status");
// Fetches citation data from Citoid and fills this citation's
// şablon + fields — only rebuilds fields on template change,
// and never overwrites values the user already typed.
function runCitoidFetch() {
var query = $.trim(citoidInput.val());
if (!query) {
mw.notify("Ji kerema xwe re pêşî URL, DOI an ISBNyekê binivîse.");
return;
}
citoidBtn.setDisabled(true);
citoidStatus.text("Tê anîn…");
wikt.citoidHelper.ensure().then(function () {
return wikt.citoid.fetchJederFields(query);
}).then(function (result) {
var jederKey = result.jederKey;
var hasTpl = !!jederKey && srcSel.find("option[value='" + jederKey + "']").length > 0;
var targetVal = hasTpl ? jederKey : "__manual__";
// Only rebuild if switching şablon, so a repeat fetch
// doesn't clear fields already filled in by hand.
if (srcSel.val() !== targetVal) {
srcSel.val(targetVal).trigger("change");
}
if (hasTpl) {
// Tenê qadên vala tijî bike.
$.each(result.fields, function (key, val) {
var input = srcFields.find("[data-field-key='" + key + "']");
if (input.length && !$.trim(input.val())) {
input.val(val);
}
});
} else {
// Şablonek nehat naskirin ji bo vê itemType — rêzikeke
// çavkaniyê ya bi destan a ji qadên Citoid tê çêkirin,
// lê tenê ger qada destan vala be.
var manualField = srcFields.find(".wiktku-dfn-quote-src-manual");
if (!$.trim(manualField.val())) {
var parts = [];
$.each(["nivîskar", "sernav", "websîte", "kovar", "weşanxane", "sal", "url"], function (_, k) {
if (result.fields[k]) parts.push(result.fields[k]);
});
manualField.val(parts.join(", "));
}
}
citoidStatus.text("");
}, function (errorMsg) {
citoidStatus.text(typeof errorMsg === "string" ? errorMsg : "Nehat dîtin. Kontrol bike ka URL/DOI/ISBN rast e.");
}).always(function () {
citoidBtn.setDisabled(false);
});
}
citoidBtn.on("click", runCitoidFetch);
citoidInput.on("keydown", function (e) {
if (e.which === 13) { // Enter
e.preventDefault();
runCitoidFetch();
}
});
citoidWrap.append(citoidInput).append(citoidBtn.$element).append(citoidStatus);
// Source template selector, specific to this citation.
var srcSel = $("<select></select>").addClass("wiktku-dfn-quote-src-sel wiktku-plain-select");
srcSel.append($("<option value=''>— Çavkaniyê hilbijêre —</option>"));
srcSel.append($("<option></option>").val("__manual__").text("Bi destê xwe binivîsim"));
srcSel.append($("<option></option>").val("__category__").text("Ji Kategorî:Çavkanî şablonekê hilbijêre"));
var jederDefs = steps.dfn.jederDefs || {};
$.each(jederDefs, function (tplName, def) {
srcSel.append($("<option></option>").val(tplName).text(def.label));
});
// Dynamic source fields container.
var srcFields = $("<div></div>").addClass("wiktku-dfn-quote-src-fields");
srcSel.on("change", function () {
srcFields.empty();
var chosen = $(this).val();
if (!chosen) return;
if (chosen === "__manual__") {
// Freeform source, written by the user — becomes the 2nd
// positional param of {{jêder|lang|…}} instead of çavkanî?.
srcFields.append(
$("<textarea></textarea>")
.attr("rows", 4)
.addClass("wiktku-dfn-subfield wiktku-dfn-quote-src-manual")
.attr("placeholder", "Çavkaniyê bi destê xwe binivîse…")
);
return;
}
if (chosen === "__category__") {
// Search widget over the members of [[Kategorî:Çavkanî]].
// Picking a şablon here immediately switches the row to
// "Bi destê xwe binivîsim" mode with {{Şablon}} pre-filled,
var catWrap = $("<span></span>").addClass("wiktku-native-select-wrap wiktku-dfn-quote-src-cat");
var catInput = $("<input type='search' autocomplete='off'>")
.addClass("wiktku-start-narrow wiktku-dfn-quote-src-cat-input")
.attr("placeholder", "Li navê şablonê bigere…");
var catResults = $("<ul></ul>").addClass("wiktku-ac-results wiktku-dfn-quote-src-cat-results").hide();
var catStatus = $("<span></span>").addClass("wiktku-dfn-quote-src-cat-status").text("Şablon tên barkirin…");
var showCatResults = function (query) {
var q = $.trim(query).toLowerCase();
catResults.empty();
var list = catSrcTemplates || [];
var matched = q ?
$.grep(list, function (name) { return name.toLowerCase().indexOf(q) !== -1; }) :
list;
if (!matched.length) {
catResults.hide();
return;
}
$.each(matched.slice(0, 50), function (_, name) {
var li = $("<li></li>").text(name).attr("data-value", name);
var touchMoved = false;
li.on("touchstart", function () { touchMoved = false; });
li.on("touchmove", function () { touchMoved = true; });
li.on("touchend", function (e) {
if (touchMoved) return;
e.preventDefault();
selectCatTpl(name);
});
li.on("mousedown", function (e) {
e.preventDefault();
selectCatTpl(name);
});
catResults.append(li);
});
catResults.show();
};
// Wraps the chosen şablon as {{Name}}, drops it into the
// manual textarea, and switches the row into manual mode
// so the user can keep editing it (add params, etc.).
var selectCatTpl = function (name) {
catResults.hide();
srcSel.val("__manual__");
srcSel.trigger("change");
srcFields.find(".wiktku-dfn-quote-src-manual")
.val("{{" + name + "}}")
.trigger("focus");
};
catInput.on("input", function () {
showCatResults($(this).val());
});
catInput.on("focus", function () {
showCatResults($(this).val());
});
catInput.on("blur", function () {
setTimeout(function () { catResults.hide(); }, 200);
});
catWrap.append(catInput).append(catResults).append(catStatus);
srcFields.append(catWrap);
fetchCatSrcTemplates().then(function () {
catStatus.text("");
}, function () {
catStatus.text("Şablon nehatin barkirin.");
});
return;
}
var def = (steps.dfn.jederDefs || {})[chosen];
if (!def) return;
$.each(def.fields, function (key, label) {
var row = $("<div></div>").addClass("wiktku-dfn-quote-src-row");
var fieldLbl = $("<label></label>").text(label + ": ");
var inp = $("<textarea></textarea>")
.attr("rows", 2)
.addClass("wiktku-dfn-quote-src-input wiktku-start-narrow")
.attr("data-field-key", key)
.attr("placeholder", label + "…");
// "Sernav" / "Sernavê orjînal" (title fields, e.g. for
// kitêb/kovar/malper) get a taller, draggable box; every
// other field in the template stays as-is. Field labels
// come from the on-wiki jederDefs data, so match on the
// (diacritic-folded) label text rather than a fixed key.
var foldedLabel = foldDiacritics(label);
if (/^sernav$/.test(foldedLabel) || /orjin/.test(foldedLabel)) {
inp.addClass("wiktku-dfn-quote-src-input--title");
}
row.append(fieldLbl).append(inp);
srcFields.append(row);
});
});
li.append(citoidWrap).append(srcSel).append(srcFields);
return li;
}
jederGroupDiv.data("buildJederLi", buildJederLi);
jederList.append(buildJederLi());
jederGroupDiv.append(jederLbl).append(jederList);
block.append(jederGroupDiv);
}());
// Apply the initial hide/show state for the sub-groups (matches
// tplSelect's starting value, which is normally empty).
updateFieldVisibility();
return block;
},
/** Grows the sense list when the last mane textarea gets content. */
onDfnInput: function (stepDiv, block, textarea) {
var val = $.trim($(textarea).val());
var list = stepDiv.find("ol.wiktku-dfn-list");
var isLast = block.is(list.children("li:last-child"));
if (val && isLast) {
var newBlock = steps.dfn.buildSenseBlock(stepDiv);
list.append(newBlock);
// Give the new block's template selector the searchable picker.
initSelects(newBlock);
}
refresh();
},
/** Grows a sub-list (nimûne/formên alternatîv/hevmane/dijmane/termên koordîne) on input. */
onSubInput: function (list, input, rows, narrow) {
var val = $.trim($(input).val());
var item = $(input).parent();
var isLast = item.is(list.children("li:last-child"));
if (val && isLast) {
var next = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-sub-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", rows)
.attr("class", "wiktku-dfn-subfield" + (narrow ? " wiktku-start-narrow" : ""));
next.on("input", function () {
steps.dfn.onSubInput(list, this, rows, narrow);
});
list.append($("<li></li>").append(next));
}
},
// Populated from [[MediaWiki:Gadget-start.js/data.json]] (tplDefs, posExamples, jederDefs).
tplDefs: {},
posExamples: {},
jederDefs: {},
build: function (stepDiv) {
if (stepDiv.find("ol.wiktku-dfn-list").length) return null;
var list = $("<ol class='wiktku-dfn-list'></ol>");
list.append(steps.dfn.buildSenseBlock(stepDiv));
stepDiv.append(list);
return null;
},
/** Reads all sense blocks from the DOM and returns an array of sense objects. */
getSenses: function (stepDiv) {
var senses = [];
stepDiv.find("li.wiktku-dfn-sense").each(function () {
var block = $(this);
var tplSel = block.find("select.wiktku-dfn-tpl-select");
var tpl = tplSel.val() || "";
// noLang: template already encodes the language — don't add |lang| param.
var tplNoLang = tpl
? tplSel.find("option[value='" + tpl + "']").attr("data-nolang") === "1"
: false;
var tplTitle = $.trim(block.find("input.wiktku-dfn-tpl-title").val());
var mane = $.trim(block.find("textarea.wiktku-dfn-mane").val());
function readList(cls) {
var vals = [];
block.find("." + cls + "-list textarea").each(function () {
var v = $.trim($(this).val());
if (v) vals.push(v);
});
return vals;
}
// Nimûne items are compound: { text, tr?, t? }
function readNimuneList() {
var items = [];
block.find(".wiktku-dfn-nimune-list li.wiktku-dfn-nimune-li").each(function () {
var text = $.trim($(this).find(".wiktku-dfn-nimune-text").val());
if (!text) return;
var obj = { text: text };
var tr = $.trim($(this).find(".wiktku-dfn-nimune-tr").val());
var t = $.trim($(this).find(".wiktku-dfn-nimune-t").val());
if (tr) obj.tr = tr;
if (t) obj.t = t;
items.push(obj);
});
return items;
}
// Jêder is a growing list of citations, one per li — mirrors readNimuneList().
function readJederList() {
var items = [];
block.find(".wiktku-dfn-jeder-list li.wiktku-dfn-jeder-li").each(function () {
var li = $(this);
var quote = $.trim(li.find(".wiktku-dfn-nimune-quote").val());
if (!quote) return;
var obj = { quote: quote };
var qtr = $.trim(li.find(".wiktku-dfn-nimune-quote-tr").val());
var qt = $.trim(li.find(".wiktku-dfn-nimune-quote-t").val());
if (qtr) obj.quoteTr = qtr;
if (qt) obj.quoteT = qt;
var tplName = li.find(".wiktku-dfn-quote-src-sel").val();
if (tplName === "__manual__") {
var manual = $.trim(li.find(".wiktku-dfn-quote-src-manual").val());
if (manual) obj.jederManual = manual;
} else if (tplName === "__category__") {
// Reachable only if the user opened the category search but
// never picked a şablon — picking one switches the row to
// __manual__ (see selectCatTpl above), so there's nothing
// meaningful to save here.
} else if (tplName) {
obj.jederTpl = tplName;
var fields = {};
li.find(".wiktku-dfn-quote-src-input").each(function () {
var k = $(this).attr("data-field-key");
var v = $.trim($(this).val());
if (k && v) fields[k] = v;
});
obj.jêderFields = fields;
}
items.push(obj);
});
return items;
}
senses.push({
tpl: tpl,
tplNoLang: tplNoLang,
tplTitle: tplTitle,
mane: mane,
etiket: readList("wiktku-dfn-etiket"),
kategori: readList("wiktku-dfn-kategori"),
nimune: readNimuneList(),
jeder: readJederList(),
alternativ: readList("wiktku-dfn-alternativ"),
hevmane: readList("wiktku-dfn-hevmane"),
dijmane: readList("wiktku-dfn-dijmane"),
koordine: readList("wiktku-dfn-koordine"),
jornav: readList("wiktku-dfn-jornav"),
jernav: readList("wiktku-dfn-jernav")
});
});
return senses;
},
getOutput: function (values, callback) {
var stepDiv = $("#wiktku-start-dfn");
var senses = steps.dfn.getSenses(stepDiv);
var lang = values.lang;
// A sense counts as "filled" if it has a mane, a chosen template + title,
// or any other content (etîket/hevmane/nimûne/jêder…) worth keeping.
var hasMane = senses.some(function (s) {
return s.mane !== "" || (s.tpl && s.tplTitle) || senseHasExtraContent(s);
});
var defLines = []; // one entry per kept sense (goes to linkify)
var citeLines = []; // parallel — nimûne+jêder for that same sense
var izahLines = []; // parallel — raw îzah gloss for that same sense
// True only once some sense's *actual* dfn text (post tercime/îzah
// split) is non-empty.
var hasLinkableMane = false;
$.each(senses, function (_, sense) {
// — Template sense (e.g. {{guharto|ku|somepage}}) —
if (sense.tpl) {
if (!sense.tplTitle) return; // skip empty template senses
var tplKatTpl = buildSenseTpl(sense, "kategori", lang, "K");
var tplLabelTpl = buildSenseTpl(sense, "etiket", lang, "e");
var tplCall = sense.tplNoLang
? "{{" + sense.tpl + "|" + sense.tplTitle + "}}"
: "{{" + sense.tpl + "|" + lang + "|" + sense.tplTitle + "}}";
var idx = defLines.length;
var cite = buildCite(sense, lang);
defLines.push("# " + (tplKatTpl ? tplKatTpl + " " : "") + (tplLabelTpl ? tplLabelTpl + " " : "") + tplCall +
(cite ? "{{wiktku-cite-" + idx + "}}" : ""));
citeLines.push(cite);
izahLines.push(""); // template senses have no îzah
return;
}
// — Normal mane sense —
var dfn = sense.mane;
if (!dfn && !senseHasExtraContent(sense)) return; // truly empty
// Pull the îzah gloss (if any) out of the combined tercime+îzah
// string — it's spliced back in separately below, after its
// own linkify pass (see izahLines / the second linkifyText call).
var izahRaw = null;
var tercimeIzah = splitTercimeIzah(dfn);
if (tercimeIzah) {
dfn = tercimeIzah.tercime;
izahRaw = stripWikilinks(tercimeIzah.izah);
}
if (dfn) {
dfn = stripWikilinks(dfn);
// Sentence-case + trailing period are for ku definitions,
// which are written as full glosses.
if (lang === "ku") {
if (dfn[0] !== dfn[0].toUpperCase()) dfn = capitalize(dfn);
if (!dfn.match(/[.…?!)\]]$/)) dfn += ".";
}
} else if (izahRaw === null) {
dfn = lang === "ku" ? "{{mane?|" + lang + "}}" : "";
}
if (dfn) hasLinkableMane = true;
var katTpl = buildSenseTpl(sense, "kategori", lang, "K");
var labelTpl = buildSenseTpl(sense, "etiket", lang, "e");
var out = "# " + (katTpl ? katTpl + " " : "") + (labelTpl ? labelTpl + " " : "") + dfn;
var idx = defLines.length;
var hasThisIzah = izahRaw !== null && $.trim(izahRaw) !== "";
// Bare {{...}} token — like {{wiktku-cite-N}}, this survives
// linkify's first pass untouched (it treats template calls as
// opaque), then gets swapped for {{îzah|…}} once the actual
// gloss text has been linkified in its own separate pass.
if (hasThisIzah) {
out += (dfn ? " " : "") + "{{wiktku-izah-" + idx + "}}";
}
function wordLine(tpl, words) {
if (!words.length) return "";
return "\n#: {{" + tpl + "|" + lang + "|" + words.join("|") + "}}";
}
out += wordLine("alt-r", sense.alternativ);
out += wordLine("hevmane", sense.hevmane);
out += wordLine("dijmane", sense.dijmane);
out += wordLine("koordîne", sense.koordine);
out += wordLine("jornav", sense.jornav);
out += wordLine("jêrnav", sense.jernav);
var cite = buildCite(sense, lang);
defLines.push(out + (cite ? "{{wiktku-cite-" + idx + "}}" : ""));
citeLines.push(cite);
izahLines.push(hasThisIzah ? izahRaw : "");
});
// Splice citeLines back into a linkified string, replacing each
// {{wiktku-cite-N}} token with its stored nimûne/jêder block.
function restoreCites(t) {
return t.replace(/\{\{wiktku-cite-(\d+)\}\}/g, function (_, n) {
return citeLines[parseInt(n, 10)] || "";
});
}
// Runs text through the linkify gadget if it's loaded, otherwise
// just passes it through unchanged. Shared by both linkify passes
// below (main mane text, and — separately — îzah glosses).
function linkifyText(t, cb) {
if (typeof $.kuLinkify === "function") {
$.kuLinkify(t, cb);
} else {
cb(t);
}
}
var hasIzah = izahLines.some(function (t) { return t && $.trim(t) !== ""; });
var text = defLines.join("\n") + "\n";
if (!hasMane) {
// No definitions entered — emit {{mane?}} with nimûne?.
text = "# {{mane?|" + lang + "}}\n#* {{nimûne?|" + lang + "}}\n";
callback(text);
return;
}
// Runs the îzah-only linkify pass against `base` (either the raw
// text, when there's no linkable mane to run the main pass on
// first, or the already-linkified main text). Shared by both
// branches below so the token-splice logic only lives once.
function runIzahPass(base) {
var izahJoined = $.map(izahLines, function (raw, idx) {
if (!raw) return undefined;
return "{{wiktku-izah-open-" + idx + "}}" + raw + "{{wiktku-izah-close-" + idx + "}}";
}).join("\n");
linkifyText(izahJoined, function (izahLinked) {
var izahByIdx = {};
var re = /\{\{wiktku-izah-open-(\d+)\}\}([\s\S]*?)\{\{wiktku-izah-close-\1\}\}/g;
var m;
while ((m = re.exec(izahLinked)) !== null) {
izahByIdx[parseInt(m[1], 10)] = m[2];
}
var withIzah = base.replace(/\{\{wiktku-izah-(\d+)\}\}/g, function (_, n) {
var linked = izahByIdx[parseInt(n, 10)];
return linked !== undefined ? "{{îzah|" + linked + "}}" : "";
});
callback(restoreCites(withIzah));
});
}
if (!hasLinkableMane) {
if (!hasIzah) {
// All filled senses are template senses (or otherwise have
// no plain text at all) — nothing here needs linkify.
callback(restoreCites(text));
return;
}
// There's no plain mane text anywhere (e.g. tercime left blank
// with only îzah filled in), so every defLine is just a bare
// template call with nothing to word-link. Sending a line
// like "# {{wiktku-izah-0}}" through the main linkify pass
// gives it no plain words to work with, makes the linkify
// gadget hang — so skip that pass entirely and run only
// the îzah pass, splicing straight into the unlinkified text.
var loadIzahOnly = function () { runIzahPass(text); };
mw.loader.using("ext.gadget.linkify", loadIzahOnly, loadIzahOnly);
return;
}
var didTryToLoad = function () {
// First pass: the main definition text (mane), same as before.
linkifyText(text, function (mainLinked) {
if (!hasIzah) {
callback(restoreCites(mainLinked));
return;
}
// Second pass: îzah glosses, linkified via their own
// separate call. Each gloss is wrapped in its own
// {{wiktku-izah-open/close-N}} pair; like the existing
// {{wiktku-cite-N}} tokens, these sit inside double
// braces so linkify leaves the tokens themselves alone —
// only the raw gloss text between each pair gets linked.
runIzahPass(mainLinked);
});
};
mw.loader.using("ext.gadget.linkify", didTryToLoad, didTryToLoad);
}
},
tewandin: {
id: "tewandin",
name: "tewandin",
question_fmt: 'Tewandina "' + pageName + '" binivîse',
visible: function (values) {
return values.lang && values.pos;
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-tewandin-wrap").length) return null;
var wrap = $("<div class='wiktku-tewandin-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-tewandin-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-tewandin-text")
.attr("rows", 4)
.attr("placeholder", "{{ku-tewîn-nav|" + pageName + "|n}}");
wrap.append(ta);
stepDiv.append(wrap);
function autoPopulate() {
if (!ta.length) return;
var vals = getValues();
var c = vals.cinsiyet || "";
var p = vals.pos || "";
if (!pageName.includes(" ") && c && GENDER_BASE_LABELS[c] &&
(p === "navdêr" || p === "serenav") && vals.lang === "ku") {
var out = "{{ku-tewîn-nav|" + pageName + "|" + GENDER_BASE_LABELS[c];
if (p === "serenav") out += "|y";
out += "}}";
if (!$.trim(ta.val())) ta.val(out);
}
}
setTimeout(function () {
autoPopulate();
$("#wiktku-start-form").on("change.tewandin",
"#wiktku-start-lang-field, #wiktku-start-cinsiyet-field, #wiktku-start-pos-field",
autoPopulate);
}, 0);
return ta;
},
output: function (values) {
var cinsiyet = values.cinsiyet || "";
var pos = values.pos || "";
var manualText = $.trim($("#wiktku-start-tewandin .wiktku-tewandin-text").val());
if (manualText) {
return "\n==== Tewandin ====\n" + manualText + "\n";
}
if (!pageName.includes(" ") && cinsiyet &&
GENDER_BASE_LABELS[cinsiyet] &&
(pos === "navdêr" || pos === "serenav") && values.lang === "ku") {
var out = "{{ku-tewîn-nav|" + pageName + "|" + GENDER_BASE_LABELS[cinsiyet];
if (pos === "serenav") out += "|y";
out += "}}";
return "\n==== Tewandin ====\n" + out + "\n";
}
return "";
}
},
je: makeWordListStep("je", "jê", "Kelîmeyên jê çêbûyî binivîse"),
tekildar: makeWordListStep("tekildar", "têkildar", "Kelîmeyên ji aliyê etîmolojiyê ve têkildarî vê kelîmeyê binivîse"),
binereherwiha: makeWordListStep("binereherwiha", "binêre herwiha", "Kelîmeyên din ên eleqedar binivîse"),
etym: {
id: "etym",
name: "etîmolojî",
question_fmt: "Etîmolojiya kelîmeyê binivîse",
// etymTpls populated from data.json
etymTpls: {},
visible: function (values) {
return values.lang && values.pos;
},
// Fills the insert-dropdown from the current etymTpls object.
refreshTplSelect: function () {
var sel = $("#wiktku-start-etym .wiktku-tpl-insert-select");
if (!sel.length) return;
sel.find("option[value!='']").remove();
$.each(steps.etym.etymTpls, function (name, tpl) {
sel.append($("<option></option>").val(tpl.snippet).text(name + " — " + tpl.desc));
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-etym-wrap").length) return null;
var wrap = $("<div class='wiktku-etym-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-etym-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-etym-text")
.attr("rows", 4)
.attr("placeholder", "Ji {{ji|en|ku|apple}}. yan rasterast binivîse…");
// Template insert dropdown — options also refreshed after data.json loads.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike…");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
$.each(steps.etym.etymTpls, function (name, tpl) {
sel.append($("<option></option>").val(tpl.snippet).text(name + " — " + tpl.desc));
});
sel.on("change", function () {
var snippet = $(this).val();
if (!snippet) return;
var lang = getValues().lang || "";
snippet = snippet.replace(/CODE/g, lang).replace(/SOURCELANG/g, "?");
insertAtCursor(ta[0], snippet);
$(this).val("");
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel);
wrap.append(ta);
stepDiv.append(wrap);
initSelects(wrap);
return ta;
},
output: function (values) {
var text = $.trim($("#wiktku-start-etym .wiktku-etym-text").val());
if (text) {
return "\n==== Etîmolojî ====\n" + text + "\n";
}
// No etymology entered — emit {{ji?|lang}} as a placeholder.
// Skip it only when every filled sense is a şablon sense
// a completely empty entry with no şablon chosen still gets the placeholder
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasFilledTplSense = dfnSenses.some(function (s) {
return !!s.tpl && !!s.tplTitle;
});
var hasRegularMane = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
if (hasFilledTplSense && !hasRegularMane) return "";
return "\n==== Etîmolojî ====\n{{ji?|" + values.lang + "}}\n";
} },
dunde: {
id: "dunde",
name: "dûnde",
question_fmt: "Eger ev kelîme ji vî zimanî ketibe zimanekî din, vî zimanî û kelîmeya wî binivîse",
visible: function (values) {
return !!values.pos;
},
disabledKeys: function (values) {
return {"navz": true, [values.lang]: true}
},
// Language dropdown + growing word-input list; a new row appends
// when the dropdown gets a value. Mirrors steps.trans, but flat.
buildRow: function (stepDiv) {
var row = $("<li class='wiktku-dunde-row wiktku-lang-row'></li>");
// Language selector — the searchable picker is applied after insertion into DOM.
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zimanekî bigere");
populateMenus(langSel, steps.dunde.keys || [], steps.dunde.disabledKeys);
// When a language is chosen, ensure a next empty row exists.
langSel.on("change", function () {
steps.dunde.onLangChange(stepDiv, row);
});
// Word list for this language.
var wordList = $("<ul class='wiktku-dunde-words wiktku-lang-row-words'></ul>");
var firstWord = steps.dunde.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
// The searchable picker is attached by initSelects() once the row
// is in the DOM (see onLangChange/build below).
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-dunde-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Kelîme…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-dunde-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.dunde.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (stepDiv, row) {
var list = stepDiv.find("ul.wiktku-dunde-list");
var isLast = row.is(list.children("li.wiktku-dunde-row:last-child"));
if (isLast) {
var newRow = steps.dunde.buildRow(stepDiv);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
// Keep disabled keys in sync across all lang selectors.
steps.dunde.syncDisabledKeys(stepDiv);
},
/** Disables already-selected languages in all other dropdowns. */
syncDisabledKeys: function (stepDiv) {
var taken = $.extend({}, steps.dunde.disabledKeys);
stepDiv.find("li.wiktku-dunde-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
stepDiv.find("li.wiktku-dunde-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
build: function (stepDiv) {
if (stepDiv.find("ul.wiktku-dunde-list").length) return null;
var list = $("<ul class='wiktku-dunde-list wiktku-lang-row-list'></ul>");
list.append(steps.dunde.buildRow(stepDiv));
stepDiv.append(list);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return null;
},
/** Reads all [langcode, words[]] rows from the DOM. */
getRows: function (stepDiv) {
var result = [];
stepDiv.find("li.wiktku-dunde-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-dunde-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
output: function () {
var stepDiv = $("#wiktku-start-dunde");
var rows = steps.dunde.getRows(stepDiv);
if (!rows.length) return "";
var lines = $.map(rows, function (row) {
var lang = row[0], words = row[1];
return "* {{dû|" + lang + "|" + words.join("|") + "}}";
});
return "\n==== Dûnde ====\n" + lines.join("\n") + "\n";
}
},
zarava: {
id: "zarava",
name: "bi zaravayên din",
question_fmt: "'"+ pageName + "' di zaravayên din de çawa tê gotin?",
visible: function (values) {
return steps.trans.visible(values);
},
disabledKeys: {},
buildRow: function (group) {
var row = $("<li class='wiktku-zarava-row wiktku-lang-row'></li>");
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zaravayekî bigere");
populateMenus(langSel, steps.zarava.keys || [], steps.zarava.disabledKeys);
langSel.on("change", function () {
steps.zarava.onLangChange(group, row);
});
var wordList = $("<ul class='wiktku-zarava-words wiktku-lang-row-words'></ul>");
var firstWord = steps.zarava.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-zarava-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Tercime…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-zarava-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.zarava.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (group, row) {
var list = group.find("ul.wiktku-zarava-list");
var isLast = row.is(list.children("li.wiktku-zarava-row:last-child"));
if (isLast) {
var newRow = steps.zarava.buildRow(group);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
steps.zarava.syncDisabledKeys(group);
},
/** Disables already-selected dialects in all other dropdowns within one group. */
syncDisabledKeys: function (group) {
var taken = $.extend({}, steps.zarava.disabledKeys);
group.find("li.wiktku-zarava-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
group.find("li.wiktku-zarava-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
/** Builds (or fetches) the .wiktku-zarava-group for one gloss. */
buildGroup: function (stepDiv, gi) {
var group = $("<div class='wiktku-zarava-group'></div>").attr("data-gloss-pos", gi);
var list = $("<ul class='wiktku-zarava-list wiktku-lang-row-list'></ul>");
list.append(steps.zarava.buildRow(group));
group.append(list);
stepDiv.append(group);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return group;
},
/** Syncs one .wiktku-zarava-group per current gloss (same logic as steps.trans.build). */
build: function (stepDiv) {
var glosses = steps.trans.glossList();
if (!glosses.length) {
stepDiv.find(".wiktku-zarava-group").remove();
return null;
}
var existingGroups = stepDiv.find(".wiktku-zarava-group");
if (existingGroups.length > glosses.length) {
existingGroups.slice(glosses.length).remove();
}
$.each(glosses, function (gi, gloss) {
var group = stepDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
if (!group.length) group = steps.zarava.buildGroup(stepDiv, gi);
var label = group.find(".wiktku-zarava-group-label");
if (glosses.length > 1) {
if (!label.length) {
label = $("<div class='wiktku-zarava-group-label'></div>");
group.prepend(label);
}
label.text(gloss.index + " " + gloss.text);
} else if (label.length) {
label.remove();
}
});
return null;
},
/** Reads the dialect rows for a single gloss group. */
getGroupTranslations: function (group) {
var result = [];
group.find("li.wiktku-zarava-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-zarava-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
/** Reads all rows from the DOM, grouped by gloss position. */
getTranslations: function (stepDiv) {
var result = [];
stepDiv.find(".wiktku-zarava-group").each(function () {
result.push(steps.zarava.getGroupTranslations($(this)));
});
return result;
},
output: function (values) {
if (values.lang !== "ku") return "";
var stepDiv = $("#wiktku-start-zarava");
var glosses = steps.trans.glossList();
if (!glosses.length) return "";
var blocks = $.map(glosses, function (gloss, gi) {
var group = stepDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
var rows = group.length ? steps.zarava.getGroupTranslations(group) : [];
if (!gloss.text && !rows.length) return undefined;
if (rows.length) {
rows.sort(function (a, b) {
var aLang = langsByCode[a[0]] || {};
var bLang = langsByCode[b[0]] || {};
return (aLang.sortKey || "").localeCompare(bLang.sortKey || "", "ku");
});
}
var wordLines = $.map(rows, function (row) {
var lang = row[0];
var words = row[1];
var wikiWords = words.map(function (w) {
return "{{W|" + lang + "|" + w + "}}";
}).join(", ");
return "* {{Z|" + lang + "}}: " + wikiWords;
}).join("\n");
if (!wordLines) return undefined;
var block = "{{werger-ser|" + (gloss.text || "?") + "|" + gloss.index + "}}";
block += "\n" + wordLines;
block += "\n{{werger-bin}}";
return block;
});
if (!blocks.length) return "";
return "\n==== Bi zaravayên din ====\n" + blocks.join("\n") + "\n";
}
},
trans: {
id: "trans",
name: "werger",
question_fmt: "Tercimeyên vê maneyê bi zimanên din binivîse",
visible: function (values) {
if (!(values.lang === "ku" && values.pos)) return false;
// Hide only when every sense is a filled template sense (no plain
// gloss to attach translations to). A mix, or nothing filled in
// yet, still shows Werger.
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasRealSense = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
var hasFilledTplSense = dfnSenses.some(function (s) {
return s.tpl && s.tplTitle;
});
return hasRealSense || !hasFilledTplSense;
},
disabledKeys: {
"navz": true,
"ku": true,
"ckb": true,
"sdh": true,
"lki": true,
"hac": true,
"zza": true },
// Language dropdown + growing word-input list, scoped to one gloss's
// group (each gloss has its own group and row list).
buildRow: function (group) {
var row = $("<li class='wiktku-trans-row wiktku-lang-row'></li>");
// Language selector — the searchable picker is applied after insertion into DOM.
var langSel = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
langSel.attr("data-placeholder", "Li zimanekî bigere");
populateMenus(langSel, steps.trans.keys || [], steps.trans.disabledKeys);
// When a language is chosen, ensure a next empty row exists.
langSel.on("change", function () {
steps.trans.onLangChange(group, row);
});
// Word list for this language.
var wordList = $("<ul class='wiktku-trans-words wiktku-lang-row-words'></ul>");
var firstWord = steps.trans.makeWordInput();
wordList.append($("<li></li>").append(firstWord));
// The searchable picker is attached by initSelects() once the row
// is in the DOM (see onLangChange/buildGroup below).
row.append(langSel).append(wordList);
return row;
},
makeWordInput: function () {
var input = $("<textarea></textarea>")
.attr("name", "wiktku-trans-word-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.attr("placeholder", "Tercime…");
input.on("input", function () {
var list = $(this).closest("ul.wiktku-trans-words");
var item = $(this).parent();
var val = $.trim($(this).val());
if (val && item.is(list.children("li:last-child"))) {
var next = steps.trans.makeWordInput();
list.append($("<li></li>").append(next));
}
});
return input;
},
onLangChange: function (group, row) {
var list = group.find("ul.wiktku-trans-list");
var isLast = row.is(list.children("li.wiktku-trans-row:last-child"));
if (isLast) {
var newRow = steps.trans.buildRow(group);
list.append(newRow);
// Attach the searchable picker now the row is in the DOM.
initSelects(newRow);
}
// Keep disabled keys in sync across this gloss's lang selectors
// only — the same language can be used for different senses.
steps.trans.syncDisabledKeys(group);
},
/** Disables already-selected languages in all other dropdowns within one group. */
syncDisabledKeys: function (group) {
var taken = $.extend({}, steps.trans.disabledKeys);
group.find("li.wiktku-trans-row select").each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
group.find("li.wiktku-trans-row select").each(function () {
var self = $(this);
var own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (!code) return;
$(this).prop("disabled", taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
},
// Builds (or fetches) the .wiktku-trans-group for one gloss.
buildGroup: function (stepDiv, gi) {
var group = $("<div class='wiktku-trans-group'></div>").attr("data-gloss-pos", gi);
var list = $("<ul class='wiktku-trans-list wiktku-lang-row-list'></ul>");
list.append(steps.trans.buildRow(group));
group.append(list);
stepDiv.append(group);
// Attach the searchable picker now the select is in the DOM.
initSelects(list);
return group;
},
// Syncs one .wiktku-trans-group per current gloss, keyed by
// data-gloss-pos so groups stay matched across rebuilds.
build: function (stepDiv) {
var glosses = steps.trans.glossList();
if (!glosses.length) {
stepDiv.find(".wiktku-trans-group").remove();
return null;
}
// Drop groups for glosses that no longer exist (always from the
// tail — groups are only ever appended in gloss order below).
var existingGroups = stepDiv.find(".wiktku-trans-group");
if (existingGroups.length > glosses.length) {
existingGroups.slice(glosses.length).remove();
}
$.each(glosses, function (gi, gloss) {
var group = stepDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
if (!group.length) group = steps.trans.buildGroup(stepDiv, gi);
// Only label groups when there's more than one gloss to
// distinguish between — a single gloss needs no caption.
var label = group.find(".wiktku-trans-group-label");
if (glosses.length > 1) {
if (!label.length) {
label = $("<div class='wiktku-trans-group-label'></div>");
group.prepend(label);
}
label.text(gloss.index + " " + gloss.text);
} else if (label.length) {
label.remove();
}
});
return null;
},
/** Reads the translation rows for a single gloss group. */
getGroupTranslations: function (group) {
var result = [];
group.find("li.wiktku-trans-row").each(function () {
var lang = $(this).find("select").val();
if (!lang) return;
var words = [];
$(this).find("ul.wiktku-trans-words textarea").each(function () {
var v = $.trim($(this).val());
if (v) words.push(v);
});
if (words.length) result.push([lang, words]);
});
return result;
},
// Reads all translation rows, grouped by gloss position.
getTranslations: function (stepDiv) {
var result = [];
stepDiv.find(".wiktku-trans-group").each(function () {
result.push(steps.trans.getGroupTranslations($(this)));
});
return result;
},
// Builds the numbered "{ index, gloss }" list, one per dfn sense
// with a real mane (skips template senses). index is 1-based and
// matches the sense's position in the "#" definition list.
// When nothing's filled in, returns one placeholder entry so
// Werger still has a group to attach to; when every sense is a
// filled template sense, stays empty (matches trans.visible()).
glossList: function () {
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var glosses = [];
var hasFilledTplSense = false;
$.each(dfnSenses, function (i, s) {
if (s.tpl) {
if (s.tplTitle) hasFilledTplSense = true;
return; // template sense — no gloss to caption with
}
var dfn = s.mane;
if (!dfn) {
// No mane, but other fields are filled — still gets a
// gloss group since dfn.getOutput() emits {{mane?}} for it.
if (senseHasExtraContent(s)) glosses.push({ index: i + 1, text: "" });
return;
}
if (dfn[0] !== dfn[0].toLowerCase()) dfn = decapitalize(dfn);
dfn = stripWikilinks(dfn).replace(/[.…?!)\]،؟]+$/, "");
glosses.push({ index: i + 1, text: dfn });
});
if (!glosses.length && !hasFilledTplSense) {
glosses.push({ index: 1, text: "" });
}
return glosses;
},
output: function (values) {
if (values.lang !== "ku") return "";
var stepDiv = $("#wiktku-start-trans");
var glosses = steps.trans.glossList();
// Every sense is a template sense — there's no real gloss
// anywhere and no group in the DOM either (glossList() only
// returns empty in that case), so skip the section entirely.
if (!glosses.length) return "";
// A completely empty entry (nothing filled in dfn at all, no
// şablon chosen either) still gets a placeholder Werger section
// to fill in later. Only
// skip an individual placeholder gloss below when some other
// sense actually has real content, making that particular
// placeholder redundant.
var dfnSenses = steps.dfn.getSenses($("#wiktku-start-dfn"));
var hasRegularMane = dfnSenses.some(function (s) {
return !s.tpl && (s.mane !== "" || senseHasExtraContent(s));
});
// Each gloss now has its own group of translation rows —
// attach every gloss's own words under its own werger-ser/-bin
// pair instead of dumping everything under the first one.
var blocks = $.map(glosses, function (gloss, gi) {
var group = stepDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
var rows = group.length ? steps.trans.getGroupTranslations(group) : [];
// Placeholder gloss (no real mane entered yet) with nothing
// translated into it. If some other sense already has real
// content, this placeholder is redundant — skip it. If the
// whole entry is empty, keep it so Werger still gets a
// section to fill in.
if (!gloss.text && !rows.length && hasRegularMane) return undefined;
if (rows.length) {
// Sort by Kurdish sort key.
rows.sort(function (a, b) {
var aLang = langsByCode[a[0]] || {};
var bLang = langsByCode[b[0]] || {};
return (aLang.sortKey || "").localeCompare(bLang.sortKey || "", "ku");
});
}
var wordLines = $.map(rows, function (row) {
var lang = row[0];
var words = row[1];
var wikiWords = words.map(function (w) {
return "{{W|" + lang + "|" + w + "}}";
}).join(", ");
return "* {{Z|" + lang + "}}: " + wikiWords;
}).join("\n");
var block = "{{werger-ser|" + (gloss.text || "?") + "|" + gloss.index + "}}";
if (wordLines) block += "\n" + wordLines;
block += "\n{{werger-bin}}";
return block;
});
if (!blocks.length) return "";
return "\n==== Werger ====\n" + blocks.join("\n") + "\n";
}
},
cavkani: {
id: "cavkani",
name: "çavkanî",
question_fmt: "Çavkaniyên din (ne jêgirtin) lê zêde bike",
visible: function (values) {
return !!values.pos;
},
// Fills the insert-dropdown from the members of [[Kategorî:Çavkanî]].
refreshTplSelect: function () {
var sel = $("#wiktku-start-cavkani .wiktku-tpl-insert-select");
if (!sel.length) return;
sel.find("option[value!='']").remove();
$.each(catSrcTemplates || [], function (_, name) {
sel.append($("<option></option>").val(name).text(name));
});
// Tell the picker the option list changed.
sel.trigger("wiktku:refresh");
},
build: function (stepDiv) {
if (stepDiv.find(".wiktku-cavkani-wrap").length) return null;
var wrap = $("<div class='wiktku-cavkani-wrap'></div>");
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-cavkani-" + $.now())
.attr("class", "wiktku-start-step-field wiktku-cavkani-text")
.attr("rows", 4)
.attr("placeholder", "Şablonekî ji jêrê hilbijêre an rasterast binivîse…");
// Template insert dropdown, populated from [[Kategorî:Çavkanî]] —
// options refreshed once the category members are fetched.
var sel = $("<select class='wiktku-tpl-insert-select'></select>");
sel.attr("data-placeholder", "Şablonek lê zêde bike…");
sel.append($("<option value=''>— şablonek lê zêde bike —</option>"));
var status = $("<span class='wiktku-cavkani-status'></span>");
sel.on("change", function () {
var name = $(this).val();
if (!name) return;
insertAtCursor(ta[0], "\n* {{" + name + "}}");
$(this).val("");
sel.trigger("wiktku:refresh");
ta.focus();
});
wrap.append(sel);
wrap.append(status).append(ta);
stepDiv.append(wrap);
// build() runs again for every new beş (see the "+ Beş zêde bike"
// handler), after the initial page-wide pass — so this select needs
// its own init or it stays a plain, unsearchable native <select>.
initSelects(wrap);
// Populate only now: refreshTplSelect() looks the select up by id
// under #wiktku-start-cavkani, so running it before the wrap was
// appended found nothing and bailed out — which left the dropdown
// empty on every beş after the first, once the category members
// were already cached.
if (catSrcTemplates) {
steps.cavkani.refreshTplSelect();
} else {
status.text("Şablon tên barkirin…");
fetchCatSrcTemplates().then(function () {
steps.cavkani.refreshTplSelect();
status.text("");
}, function () {
status.text("Şablon nehatin barkirin.");
});
}
return ta;
},
output: function () {
var text = $.trim($("#wiktku-start-cavkani .wiktku-cavkani-text").val());
if (!text) return "";
return "\n==== Çavkanî ====\n" + text + "\n";
}
},
};
steps.trans.keys = steps.lang.choices;
steps.dunde.keys = steps.lang.choices;
steps.zarava.keys = getZaravaKeys(steps.lang.choices);
var ordered_steps = [
steps.lang, steps.pron, steps.pos, steps.cinsiyet, steps.lektur, steps.tr,
steps.dfn, steps.tewandin, steps.je, steps.tekildar,
steps.etym, steps.dunde, steps.binereherwiha, steps.zarava, steps.trans, steps.cavkani];
// Step ids that belong to each section (not shared across sections).
var PER_SECTION_STEP_IDS = [
"pos", "cinsiyet", "lektur", "tr",
"dfn", "tewandin", "je", "tekildar", "etym", "dunde", "binereherwiha", "zarava", "trans", "cavkani"
];
// ── Multi-section state ──────────────────────────────────────────────────
// Each entry is a plain snapshot: { pos, cinsiyet, lektur, tr, dfn (senses[]),
// je, tekildar, binereherwiha, trans (rows[]) }.
var sections = [{}]; // section 0 starts empty (DOM is the truth)
var activeSection = 0;
function snapshotDfn() {
return steps.dfn.getSenses($("#wiktku-start-dfn"));
}
// Rebuilds the dfn DOM from a previously snapshotted senses array.
function restoreDfn(senses) {
var stepDiv = $("#wiktku-start-dfn");
// Tear down the existing list so build() recreates it cleanly.
stepDiv.find("ol.wiktku-dfn-list").remove();
steps.dfn.build(stepDiv);
var list = stepDiv.find("ol.wiktku-dfn-list");
$.each(senses, function (i, sense) {
// Ensure enough blocks exist (build() seeds one).
var blocks = list.find("li.wiktku-dfn-sense");
var block = blocks.eq(i);
if (!block.length) {
var nb = steps.dfn.buildSenseBlock(stepDiv);
list.append(nb);
block = list.find("li.wiktku-dfn-sense").last();
}
// Template selector.
block.find("select.wiktku-dfn-tpl-select").val(sense.tpl || "");
if (sense.tpl) {
block.find("textarea.wiktku-dfn-mane").hide();
block.find("input.wiktku-dfn-tpl-title").val(sense.tplTitle || "").show();
} else {
block.find("textarea.wiktku-dfn-mane").val(sense.mane || "").show();
block.find("input.wiktku-dfn-tpl-title").hide().val("");
}
// dfnArea is the only thing actually saved, so split it back into
// tercime/îzah for editing (mirrors syncNonKuToMane's join format).
var maneParts = splitTercimeIzah(sense.mane);
block.find(".wiktku-dfn-tercime").val(maneParts ? maneParts.tercime : (sense.mane || ""));
block.find(".wiktku-dfn-izah").val(maneParts ? maneParts.izah : "");
// Re-sync the formên alternatîv/hevmane/… hide state now that
// tplSelect's value was set (its own "change"
// handler doesn't fire from .val(), so this doesn't happen otherwise).
var updateVis = block.data("updateFieldVisibility");
if (updateVis) updateVis();
// Same for the mane-box mode (plain vs tercime+îzah), since this
// also depends on tplSelect's (and lang's) value.
var updateMane = block.data("updateManeMode");
if (updateMane) updateMane();
// Restore a sub-list (etiket, formên alternatîv, hevmane …) from a values array.
function restoreSubList(cls, values) {
if (!values || !values.length) return;
var groupDiv = block.find("." + cls + "-group");
var subList = groupDiv.find("ol, ul").first();
if (!subList.length) return; // group not found
// Fill existing items, append new ones as needed.
$.each(values, function (j, val) {
var items = subList.find("li");
if (j < items.length) {
items.eq(j).find("textarea").val(val);
} else {
var ta = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-restore-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 1)
.attr("class", "wiktku-dfn-subfield wiktku-start-narrow")
.val(val);
ta.on("input", function () {
steps.dfn.onSubInput(subList, this, 1, true);
});
subList.append($("<li></li>").append(ta));
}
});
}
// Reveal and populate lazy groups that have data.
var lazyMap = {
"wiktku-dfn-etiket": sense.etiket,
"wiktku-dfn-kategori": sense.kategori,
"wiktku-dfn-alternativ": sense.alternativ,
"wiktku-dfn-hevmane": sense.hevmane,
"wiktku-dfn-dijmane": sense.dijmane,
"wiktku-dfn-koordine": sense.koordine,
"wiktku-dfn-jornav": sense.jornav,
"wiktku-dfn-jernav": sense.jernav
};
$.each(lazyMap, function (cls, vals) {
if (vals && vals.length) restoreSubList(cls, vals);
});
// Nimûne items are objects { text, tr?, t? } — restore using the builder.
if (sense.nimune && sense.nimune.length) {
var nimuneGroupDiv = block.find(".wiktku-dfn-nimune-group");
var nimuneList = nimuneGroupDiv.find("ol.wiktku-dfn-nimune-list");
var buildFn = nimuneGroupDiv.data("buildNimuneLi");
nimuneList.empty();
$.each(sense.nimune, function (_, n) {
var text = typeof n === "object" ? (n.text || "") : n;
if (!text) return;
var li = buildFn ? buildFn() : $("<li class='wiktku-dfn-nimune-li'></li>");
li.find(".wiktku-dfn-nimune-text").val(text).each(function () { highlightLinebreak(this); });
if (n.tr) li.find(".wiktku-dfn-nimune-tr").val(n.tr);
if (n.t) li.find(".wiktku-dfn-nimune-t").val(n.t);
nimuneList.append(li);
});
// Always leave a blank trailing item.
if (buildFn) nimuneList.append(buildFn());
}
// Restore jêder entries — accepts current array shape or a legacy
// single object (older saved sections) for backwards compat.
var jederArr = $.isArray(sense.jeder) ? sense.jeder : (sense.jeder ? [sense.jeder] : []);
if (jederArr.length) {
var jederGroupDiv = block.find(".wiktku-dfn-jeder-group");
var jederList = jederGroupDiv.find("ol.wiktku-dfn-jeder-list");
var buildJederFn = jederGroupDiv.data("buildJederLi");
jederList.empty();
$.each(jederArr, function (_, j) {
if (!j || !j.quote) return;
var li = buildJederFn ? buildJederFn() : $("<li class='wiktku-dfn-jeder-li'></li>");
li.find(".wiktku-dfn-nimune-quote").val(j.quote).each(function () { highlightLinebreak(this); });
if (j.quoteTr) li.find(".wiktku-dfn-nimune-quote-tr").val(j.quoteTr);
if (j.quoteT) li.find(".wiktku-dfn-nimune-quote-t").val(j.quoteT);
if (j.jederManual) {
var manualSel = li.find(".wiktku-dfn-quote-src-sel");
manualSel.val("__manual__").trigger("change");
li.find(".wiktku-dfn-quote-src-manual").val(j.jederManual);
} else if (j.jederCatTpl) {
// Legacy format from before the şablon search switched rows to
// manual mode directly — convert it the same way now, so it's
// editable like any other free-form source.
var catSelEl = li.find(".wiktku-dfn-quote-src-sel");
catSelEl.val("__manual__").trigger("change");
li.find(".wiktku-dfn-quote-src-manual").val("{{" + j.jederCatTpl + "}}");
} else if (j.jederTpl) {
var srcSel = li.find(".wiktku-dfn-quote-src-sel");
srcSel.val(j.jederTpl).trigger("change");
if (j.jêderFields) {
$.each(j.jêderFields, function (key, val) {
li.find(".wiktku-dfn-quote-src-input[data-field-key='" + key + "']").val(val);
});
}
}
jederList.append(li);
});
// Always leave a blank trailing item, same as Nimûne.
if (buildJederFn) jederList.append(buildJederFn());
}
});
}
// Snapshots simple (non-dfn) per-section steps from the DOM into obj.
function saveCurrentSection() {
var snap = {};
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
snap.dfn = snapshotDfn();
return;
}
if (id === "etym") {
snap.etym = $.trim($("#wiktku-start-etym .wiktku-etym-text").val());
return;
}
if (id === "cavkani") {
snap.cavkani = $.trim($("#wiktku-start-cavkani .wiktku-cavkani-text").val());
return;
}
var step = steps[id];
if (!step) return;
var stepDiv = $("#wiktku-start-" + id);
if (id === "trans") {
snap.trans = steps.trans.getTranslations(stepDiv);
return;
}
if (id === "zarava") {
snap.zarava = steps.zarava.getTranslations(stepDiv);
return;
}
if (id === "dunde") {
snap.dunde = steps.dunde.getRows(stepDiv);
return;
}
// Generic: read all step fields.
var fields = stepDiv.find(".wiktku-start-step-field");
if (step.multiple) {
snap[id] = fields.map(function () { return $(this).val(); }).get();
} else {
snap[id] = fields.val();
}
});
sections[activeSection] = snap;
}
// Restores a previously saved snapshot into the form DOM.
function restoreSection(snap) {
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
restoreDfn(snap.dfn || []);
return;
}
if (id === "etym") {
$("#wiktku-start-etym .wiktku-etym-wrap").remove();
steps.etym.build($("#wiktku-start-etym"));
$("#wiktku-start-etym .wiktku-etym-text").val(snap.etym || "");
return;
}
if (id === "cavkani") {
$("#wiktku-start-cavkani .wiktku-cavkani-wrap").remove();
steps.cavkani.build($("#wiktku-start-cavkani"));
$("#wiktku-start-cavkani .wiktku-cavkani-text").val(snap.cavkani || "");
return;
}
if (id === "trans") {
// Rebuild trans groups (dfn must already be restored by this
// point in the $.each loop, so glossList() reflects it).
var transDiv = $("#wiktku-start-trans");
transDiv.find(".wiktku-trans-group").remove();
steps.trans.build(transDiv);
var groupsSnap = snap.trans || [];
$.each(groupsSnap, function (gi, rows) {
var group = transDiv.find(".wiktku-trans-group[data-gloss-pos='" + gi + "']");
if (!group.length) return; // gloss no longer exists — drop its rows
var list = group.find("ul.wiktku-trans-list");
$.each(rows, function (j, row) {
var lang = row[0], words = row[1];
var lastRow = list.find("li.wiktku-trans-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-trans-words");
$.each(words, function (k, word) {
var wordItems = wordList.find("li");
if (k < wordItems.length) {
wordItems.eq(k).find("textarea").val(word);
} else {
// .val() below doesn't fire "input", so the normal
// auto-grow never runs — append a matching item
// ourselves instead of silently dropping the word.
var extraInput = steps.trans.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
// Leave one trailing empty field so the row can still grow
// when the user types, matching a freshly-built row.
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.trans.makeWordInput()));
}
});
});
return;
}
if (id === "zarava") {
// Rebuild zarava groups (dfn must already be restored by this
// point in the $.each loop, so glossList() reflects it).
var zaravaDiv = $("#wiktku-start-zarava");
zaravaDiv.find(".wiktku-zarava-group").remove();
steps.zarava.build(zaravaDiv);
var zaravaGroupsSnap = snap.zarava || [];
$.each(zaravaGroupsSnap, function (gi, rows) {
var group = zaravaDiv.find(".wiktku-zarava-group[data-gloss-pos='" + gi + "']");
if (!group.length) return; // gloss no longer exists — drop its rows
var list = group.find("ul.wiktku-zarava-list");
$.each(rows, function (j, row) {
var lang = row[0], words = row[1];
var lastRow = list.find("li.wiktku-zarava-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-zarava-words");
$.each(words, function (k, word) {
var wordItems = wordList.find("li");
if (k < wordItems.length) {
wordItems.eq(k).find("textarea").val(word);
} else {
var extraInput = steps.zarava.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.zarava.makeWordInput()));
}
});
});
return;
}
if (id === "dunde") {
// Rebuild dunde rows.
var dundeDiv = $("#wiktku-start-dunde");
dundeDiv.find("ul.wiktku-dunde-list").remove();
steps.dunde.build(dundeDiv);
var dundeRows = snap.dunde || [];
$.each(dundeRows, function (i, row) {
var lang = row[0], words = row[1];
var list = dundeDiv.find("ul.wiktku-dunde-list");
var lastRow = list.find("li.wiktku-dunde-row").last();
lastRow.find("select").val(lang).trigger("change");
var wordList = lastRow.find("ul.wiktku-dunde-words");
$.each(words, function (j, word) {
var wordItems = wordList.find("li");
if (j < wordItems.length) {
wordItems.eq(j).find("textarea").val(word);
} else {
// .val() below doesn't fire "input", so the normal
// auto-grow never runs — append a matching item
// ourselves instead of silently dropping the word.
var extraInput = steps.dunde.makeWordInput();
wordList.append($("<li></li>").append(extraInput));
extraInput.val(word);
}
});
// Leave one trailing empty field so the row can still grow
// when the user types, matching a freshly-built row.
if ($.trim(wordList.children("li").last().find("textarea").val())) {
wordList.append($("<li></li>").append(steps.dunde.makeWordInput()));
}
});
return;
}
var step = steps[id];
if (!step) return;
var stepDiv = $("#wiktku-start-" + id);
var fields = stepDiv.find(".wiktku-start-step-field");
var val = snap[id];
if (val === undefined || val === null) return;
if (step.multiple) {
var arr = val;
fields.each(function (i) {
if (i < arr.length) $(this).val(arr[i]);
});
} else {
fields.val(val);
}
// Tell the pickers about the programmatic value change.
fields.filter("select").trigger("wiktku:refresh");
});
}
function getWikitextForCurrentSection(callback) {
var values = getValues();
var entry = steps.pos.output(values);
steps.dfn.getOutput(values, function (output) {
entry += output;
entry += steps.tewandin.output(values);
entry += steps.je.output(values);
entry += steps.tekildar.output(values);
entry += steps.etym.output(values);
entry += steps.dunde.output(values);
entry += steps.binereherwiha.output(values);
entry += steps.zarava.output(values);
entry += steps.trans.output(values);
entry += steps.cavkani.output(values);
callback(entry, values);
});
}
function getWikitextAllSections(callback) {
saveCurrentSection();
var results = new Array(sections.length);
var sharedValues = getValues(); // lang/pron are shared
function processSection(i) {
if (i >= sections.length) {
// All done — restore original active section.
restoreSection(sections[activeSection]);
refresh();
callback(results, sharedValues);
return;
}
restoreSection(sections[i]);
refresh();
getWikitextForCurrentSection(function (sectionText) {
results[i] = sectionText;
processSection(i + 1);
});
}
processSection(0);
}
// Assembles wikitext for all sections plus the shared lang/pron header.
function getWikitext(callback) {
getWikitextAllSections(function (sectionTexts, sharedValues) {
var entry = steps.lang.output(sharedValues);
entry += steps.pron.output(sharedValues);
entry += sectionTexts.join("\n");
// Edit summary uses section 0's values. Read from the saved snapshot
// (not the live DOM) so it doesn't mix section 0's pos with whichever
// section happens to be active/restored at this point.
var dfnSenses = (sections[0] && sections[0].dfn) || [];
var dfnSummary = dfnSenses.map(function (s) {
if (s.mane) return s.mane;
// Template sense (e.g. {{guharto|ku|somepage}}) — same
// construction as the tplCall built in getOutput, so the
// summary shows what actually gets written to the entry
// instead of going blank.
if (s.tpl && s.tplTitle) {
return s.tplNoLang
? "{{" + s.tpl + "|" + s.tplTitle + "}}"
: "{{" + s.tpl + "|" + sharedValues.lang + "|" + s.tplTitle + "}}";
}
return "";
}).filter(Boolean).join("; ");
var summary = "([[Mediawiki:Gadget-start.js|WF:NÛ]] v.2.0) +" +
sharedValues.lang + ":" + sections[0].pos + ":" + dfnSummary;
var summaryField = document.getElementById("wpSummary");
if (addLangMode && summaryField.value) {
summary = summaryField.value + " " + summary;
}
summaryField.value = summary;
callback(entry);
});
}
var continueBtn;
function getValuesForStep(stepId) {
var fields = $("#wiktku-start-" + stepId + " .wiktku-start-step-field");
var step = steps[stepId];
if (step.keys) {
var values = {};
fields.each(function (i, field) {
var key = $(field).prevAll(".wiktku-start-step-keyfield").val();
if (key) values[key] = $(field).val();
});
return values;
}
else if (step.multiple) {
return fields.map(function () {
return $(this).val();
}).get();
}
return fields.val();
}
function getValues() {
var values = {};
$.each(steps, function (stepId) {
values[stepId] = getValuesForStep(stepId);
});
return values;
}
function populateMenus(inputs, choices, disabledValues, placeholderText) {
if (!disabledValues) disabledValues = {};
var vals = inputs.map(function (i, input) {
return $(input).val();
});
inputs.empty();
inputs.append($("<option></option>").text(placeholderText || ""));
$.each(choices, function (j, choice) {
// Append the language code in parentheses so that typing a code
// (e.g. "ku") in the search box still finds the language name.
var displayText = capitalize(choice.label);
if (choice.sortKey !== undefined) {
// This is a language choice {code, label, sortKey} — show code.
displayText = capitalize(choice.label) + " (" + choice.code + ")";
}
var option = $(mw.html.element("option", {
value: choice.code }, displayText));
if (disabledValues[choice.code]) option.prop("disabled", true);
inputs.append(option);
});
inputs.val(function (i) {
return vals[i];
});
}
// Keys to disable for a key menu: already-taken or explicitly disabled.
function getDisabledKeys(step) {
var occupiedKeys = {};
$("#wiktku-start-" + step.id + " .wiktku-start-step-keyfield").each(function () {
occupiedKeys[$(this).val()] = true;
});
if (step.disabledKeys) $.extend(occupiedKeys, step.disabledKeys);
return occupiedKeys;
}
function buildKeyInput(step) {
if (!step.keys) return undefined;
var input = $(mw.html.element("select", {
"class": "wiktku-start-step-keyfield wiktku-start-narrow" }));
input.attr("data-placeholder", "Hilbijêre " + step.keyName);
populateMenus(input, step.keys, getDisabledKeys(step));
// Keep the key menus mutually exclusive: whatever one row selects is
// disabled in every other row. Recomputed from the DOM on each change.
input.on("change", function () {
var all = $("#wiktku-start-" + step.id + " .wiktku-start-step-keyfield");
var taken = {};
all.each(function () {
var v = $(this).val();
if (v) taken[v] = true;
});
all.not(this).each(function () {
var self = $(this), own = self.val();
self.find("option").each(function () {
var code = $(this).val();
if (code) $(this).prop("disabled", !!taken[code] && code !== own);
});
self.trigger("wiktku:refresh");
});
});
// Return the wrapper; the select lives inside it and still fires change.
return wrapNativeSelect(input);
}
// Adds another text field to the list if the last one now has text.
function refreshForTextField(currentInput, step) {
currentInput = $(currentInput);
var value = currentInput.val();
var item = currentInput.parent();
if (value && !item.next("li").length) {
var nextInput = $("<textarea></textarea>")
.attr("name", "wiktku-field-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("class", currentInput.attr("class"))
.attr("rows", currentInput.attr("rows") || 1);
if (step.placeholder) nextInput.attr("placeholder", step.placeholder);
nextInput.on("input", function (evt) {
refreshForTextField(evt.target, step);
});
var nextKeyInput = buildKeyInput(step);
var nextItem = $("<li></li>").append(nextKeyInput).append(nextInput);
item.parent().append(nextItem);
if (nextKeyInput) initSelects(nextItem);
}
var canContinue = !continueBtn.isDisabled();
if ((value && !canContinue) || (!value && canContinue)) {
refresh(step);
}
}
function prepareInput(input, step) {
if (!input) return;
if (step.required) input.prop('required', true);
input.change(step, refresh);
}
// Shows/hides steps based on whether their prerequisites are met, and
// updates placeholders where applicable.
function refresh(evt) {
var values = getValues();
var changedStep = evt && evt.data;
var didFocus = false;
var canContinue = true;
// Re-filter template options in every sense block whenever lang changes.
$("#wiktku-start-dfn .wiktku-dfn-tpl-select").each(function () {
var fn = $(this).data("updateOptions");
if (typeof fn === "function") fn();
});
// Re-filter pronunciation and etymology template dropdowns when language changes.
steps.pron.refreshTplSelect();
steps.etym.refreshTplSelect();
steps.cavkani.refreshTplSelect();
// Re-render any step's question label that depends on current values
// (e.g. dfn's Werger-section reminder, which only applies to ku).
$.each(steps, function (stepId, step) {
if (typeof step.question_fmt === "function") {
$("#wiktku-start-" + stepId + " .wiktku-start-step-question")
.text(step.question_fmt(values));
}
});
// Sync every sense block's mane-box mode (plain mane vs tercime+îzah)
// to the current language, in case lang changes after blocks exist.
$("#wiktku-start-dfn li.wiktku-dfn-sense").each(function () {
var updateMane = $(this).data("updateManeMode");
if (updateMane) updateMane();
});
// Sync tr/t sub-fields in every nimûne item to the current language.
// tr shown when language needs transliteration; t shown when lang !== "ku".
(function () {
var lang = values.lang || "";
var showTr = needsTransliteration(lang);
var showT = lang && lang !== "ku";
$("#wiktku-start-dfn .wiktku-dfn-nimune-list li.wiktku-dfn-nimune-li").each(function () {
var li = $(this);
// Ensure the sub-wrapper exists when we need it.
var subWrap = li.find(".wiktku-dfn-nimune-sub");
// tr field
var trTa = li.find(".wiktku-dfn-nimune-tr");
if (showTr && !trTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
li.append(subWrap);
}
trTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-tr")
.attr("placeholder", "Transliterasyon…");
subWrap.prepend(trTa);
} else if (!showTr && trTa.length) {
trTa.remove();
}
// t field
var tTa = li.find(".wiktku-dfn-nimune-t");
if (showT && !tTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-nimune-sub");
li.append(subWrap);
}
tTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 5)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-t")
.attr("placeholder", "Tercimeya nimûneyê bi kurmancî…");
subWrap.append(tTa);
} else if (!showT && tTa.length) {
tTa.remove();
}
// Remove the wrapper if it ended up empty.
subWrap = li.find(".wiktku-dfn-nimune-sub");
if (subWrap.length && !subWrap.children().length) subWrap.remove();
});
}());
// Sync tr/t sub-fields in every jêder citation to the current language.
// tr shown when language needs transliteration; t shown when lang !== "ku".
(function () {
var lang = values.lang || "";
var showTr = needsTransliteration(lang);
var showT = lang && lang !== "ku";
$("#wiktku-start-dfn .wiktku-dfn-jeder-list li.wiktku-dfn-jeder-li").each(function () {
var li = $(this);
// Ensure the sub-wrapper exists when we need it. It must sit right
// after the quote textarea and before the source selector.
var subWrap = li.find(".wiktku-dfn-quote-sub");
// tr field
var trTa = li.find(".wiktku-dfn-nimune-quote-tr");
if (showTr && !trTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
// Insert after the quote textarea's resize-wrap (if the manual
// resize handle has already been attached to it), not after the
// bare textarea -- otherwise this lands *inside* that wrap,
// between the textarea and its own grip, breaking jêgirtin's
// handle and nesting the tr/t boxes inside it.
var quoteTa = li.find(".wiktku-dfn-nimune-quote");
var quoteResizeWrap = quoteTa.closest(".wiktku-resize-wrap");
(quoteResizeWrap.length ? quoteResizeWrap : quoteTa).after(subWrap);
}
trTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-tr-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-tr")
.attr("placeholder", "Transliterasyona jêgirtinê…");
subWrap.prepend(trTa);
} else if (!showTr && trTa.length) {
trTa.remove();
}
// t field
var tTa = li.find(".wiktku-dfn-nimune-quote-t");
if (showT && !tTa.length) {
if (!subWrap.length) {
subWrap = $("<div></div>").addClass("wiktku-dfn-quote-sub");
// See the tr-field branch above for why this targets the
// resize-wrap instead of the bare textarea.
var quoteTa2 = li.find(".wiktku-dfn-nimune-quote");
var quoteResizeWrap2 = quoteTa2.closest(".wiktku-resize-wrap");
(quoteResizeWrap2.length ? quoteResizeWrap2 : quoteTa2).after(subWrap);
}
tTa = $("<textarea></textarea>")
.attr("name", "wiktku-dfn-nimune-quote-t-" + $.now() + "-" + Math.random().toString(36).substr(2, 9))
.attr("rows", 2)
.attr("class", "wiktku-dfn-subfield wiktku-dfn-nimune-quote-t")
.attr("placeholder", "Tercimeya jêgirtinê bi kurmancî…");
subWrap.append(tTa);
} else if (!showT && tTa.length) {
tTa.remove();
}
// Remove the wrapper if it ended up empty.
subWrap = li.find(".wiktku-dfn-quote-sub");
if (subWrap.length && !subWrap.children().length) subWrap.remove();
});
}());
$.each(steps, function (stepId, step) {
if (typeof(step.visible) === "function" && !step.visible(values)) {
$("#wiktku-start-" + stepId).slideUp();
}
else {
var stepDiv = $("#wiktku-start-" + stepId);
if (changedStep !== step && typeof(step.build) === "function") {
prepareInput(step.build(stepDiv, values), step);
}
var input = stepDiv.find(".wiktku-start-step-field");
if (typeof(step.example) === "function") {
// .find() above already reaches nested fields (e.g. the dfn
// step's mane textareas inside each sense block), so one
// assignment covers every step; dfn keeps its own fallback.
var exampleText = step.example(values) || (step.id === "dfn" ? "Mane…" : "");
input.attr("placeholder", exampleText);
}
var didSlideDown;
if (!didFocus && stepDiv.css("display") === "none" && step.required) {
// Skip scrolling for the first section (ziman) since it's
// always at the top of the page.
if (step.id !== "lang") {
didSlideDown = function (evt) {
var stepEl = stepDiv.get(0);
if (stepEl && typeof stepEl.scrollIntoView === "function") {
stepEl.scrollIntoView({ behavior: "smooth", block: "start" });
}
};
}
didFocus = true;
}
stepDiv.slideDown(didSlideDown);
}
if (step.required &&
(values[stepId] === "" ||
(step.multiple && values[stepId].join("") === ""))) {
canContinue = false;
}
});
continueBtn.setDisabled(!canContinue);
}
function destroy() {
$("#wiktku-start-form, .noafterwizard").slideUp(function () {
$(this).remove();
});
$(".noarticletext .nowizard, #editform").slideDown();
$("#ca-edit").removeClass("selected");
$("#ca-wiktku-nowizard").addClass("selected");
}
// Priority order for Kurdish dialects and navz.
// Codes listed here come before all other languages; unlisted codes
// are sorted alphabetically by their display name via localeCompare.
var LANG_PRIORITY = ["navz", "ku", "hac", "sdh", "lki", "ckb", "zza"];
// Inserts a new "== {{ziman|code}} ==" section at the correct sorted
// position: navz, then ku/hac/sdh/lki/ckb/zza, then alphabetical by name.
function insertNewLangSection(existing, wikitext) {
var newCodeMatch = wikitext.match(new RegExp("^" + langHeaderSource("[^}]+")));
var newCode = newCodeMatch ? newCodeMatch[1] : "";
var sections = [];
var preamble = "";
var anyHeaderSrc = langHeaderSource("[^}]+");
var firstMatch = new RegExp("^" + anyHeaderSrc, "m").exec(existing);
if (!firstMatch) {
// No existing lang sections at all — just append.
var sep = existing && !/\n\s*$/.test(existing) ? "\n\n" : "";
return existing + sep + wikitext;
}
// Everything before the first == {{ziman|...}} == is the preamble.
var firstSectionStart = firstMatch.index;
// Walk back to the start of that line.
var lineStart = existing.lastIndexOf("\n", firstSectionStart - 1);
var preambleEnd = lineStart !== -1 ? lineStart + 1 : 0;
preamble = existing.slice(0, preambleEnd);
// Parse each language section: header line + everything until the next header.
var body = existing.slice(preambleEnd);
// (?![\s\S]) matches only true end-of-string, since a bare "$" with
// /m would stop at the section's first line break instead.
var langSectionRe = new RegExp(
"^(" + anyHeaderSrc + "\\n?)([\\s\\S]*?)(?=\\n" + anyHeaderSrc + "|(?![\\s\\S]))",
"gm"
);
var m;
while ((m = langSectionRe.exec(body)) !== null) {
sections.push({
code: m[2],
content: m[0] // full text of this section including header
});
}
// Determine sort rank: priority list first (by index), then alphabetical.
function getLangName(code) {
var entry = langsByCode[code];
return entry ? entry.label : code;
}
function sortRank(code) {
var idx = LANG_PRIORITY.indexOf(code);
return idx !== -1 ? idx : LANG_PRIORITY.length;
}
function compareLangs(a, b) {
var ra = sortRank(a), rb = sortRank(b);
if (ra !== rb) return ra - rb;
// Both are outside priority list — sort by display name.
return getLangName(a).localeCompare(getLangName(b), userLang);
}
// Insert the new section into the sorted list.
var newSection = { code: newCode, content: wikitext };
var inserted = false;
for (var i = 0; i < sections.length; i++) {
if (compareLangs(newCode, sections[i].code) < 0) {
sections.splice(i, 0, newSection);
inserted = true;
break;
}
}
if (!inserted) sections.push(newSection);
// Re-join: preamble + sections separated by newlines.
var joined = sections.map(function (s) {
// Ensure each section ends with exactly one newline before the next.
return s.content.replace(/\n+$/, "");
}).join("\n");
return preamble + joined + "\n";
}
function build() {
$(".nowizard, .nowizard .noafterwizard").hide();
var callToAction = $("#wiktku-calltoaction");
var origCallToActionText = callToAction.text();
$(mw.util.addPortletLink("p-views", "#", "Edîtora çavkaniyê veke",
"ca-wiktku-nowizard", "Vê rûpelê bi edîtora çavkaniyê çêke",
undefined, "#ca-watch")).click(function (evt) {
evt.preventDefault();
callToAction.text(origCallToActionText);
destroy();
});
if (callToAction.length) {
callToAction.text(origCallToActionText +
" Forma li jêr ji bo çêkirina madeyeke nû bi kar bîne.");
}
var startForm = $("<form id='wiktku-start-form'></form>");
var clearPageCheck = null;
if (addLangMode) {
startForm.append($("<p class='wiktku-addlang-notice'></p>").html(
"Bi vê formê tu yê zimanekî nû li rûpelê îlawe bikî. Eger ev ziman jixwe hebe, beşa nû li dawiya vî zimanî dê were îlawekirin. " +
"Ji kerema xwe netîceya dawî kontrol bike, eger problemek derkeve, li <a href='" +
mw.util.getUrl('Mediawiki talk:Gadget-start.js') +
"'>nîqaşa vê amûrê</a> problemê ragihîne."
));
clearPageCheck = $("<input type='checkbox' id='wiktku-clear-page-check'>");
var clearPageLabel = $("<label for='wiktku-clear-page-check'></label>")
.text(" Muhtewaya rûpelê paqij bike (her tiştî jê bibe û rûpelê ji nû ve binivîse)");
startForm.append(
$("<p class='wiktku-addlang-notice'></p>")
.append(clearPageCheck)
.append(clearPageLabel)
);
// Re-evaluate step visibility (e.g. the pron step) whenever this
// is toggled, since it changes what counts as "existing content".
clearPageCheck.on("change", function () {
refresh();
});
}
var spinner;
// Tab bar for switching between POS sections.
var sectionTabsDiv = $("<div id='wiktku-section-tabs'></div>");
startForm.submit(function (evt) {
evt.preventDefault();
continueBtn.setDisabled(true);
continueBtn.$element.addClass("wiktku-btn-sending");
spinner.show();
getWikitext(function (wikitext) {
if (addLangMode && clearPageCheck && clearPageCheck.prop("checked")) {
// User asked to wipe the page and start fresh — just
// write the newly generated wikitext as the full content.
$("#wpTextbox1").val(wikitext);
} else if (addLangMode) {
var textbox = $("#wpTextbox1");
var existing = textbox.val() || "";
// If this language's section already exists (whitespace
// differences aside), merge into it; otherwise insert new.
var langHeaderMatch = wikitext.match(new RegExp("^(" + langHeaderSource("[^}]+") + "\\n)"));
if (langHeaderMatch) {
var langHeader = langHeaderMatch[1]; // e.g. "== {{ziman|ku}} ==\n"
var newCode = langHeaderMatch[2];
var existingHeader = findLangHeader(existing, newCode);
if (existingHeader) {
// Strip the header from the new output.
var newContent = wikitext.slice(langHeader.length);
// Find the insertion point: end of the existing lang section.
// A new L2 heading marks the start of the next language block.
var searchFrom = existingHeader.index + existingHeader.match.length;
// Find the next == … == heading after this section's start.
var nextL2 = existing.indexOf("\n== ", searchFrom);
var insertAt = nextL2 !== -1 ? nextL2 : existing.length;
// Ensure there's a blank line before the inserted block.
var before = existing.slice(0, insertAt);
var after = existing.slice(insertAt);
var sep = /\n\s*$/.test(before) ? "" : "\n";
textbox.val(before + sep + newContent + after);
} else {
// New language — insert at the correct sorted position.
textbox.val(insertNewLangSection(existing, wikitext));
}
} else {
// Unexpected format — insert at sorted position anyway.
textbox.val(insertNewLangSection(existing, wikitext));
}
} else {
$("#wpTextbox1").val(wikitext);
}
$("html, body").animate({scrollTop: 0});
callToAction.text("Hindik ma!");
$("#wiktku-preview-container").remove();
destroy();
});
});
$.each(ordered_steps, function (i, step) {
var stepDiv = $(mw.html.element("div", {
"class": "wiktku-start-step",
id: "wiktku-start-" + step.id }));
var name = capitalize(step.name);
stepDiv.append($(mw.html.element("h3", {
"class": "wiktku-start-step-name" }, new mw.html.Raw(mw.html.element("label", {
"for": "wiktku-start-" + step.id + "-field" }, name)))));
if (step.question_fmt) {
// question_fmt can be a plain string, or a function of the
// current values (used by steps whose question text depends
// on e.g. the chosen language) — refresh() keeps it in sync
// afterwards via the .wiktku-start-step-question class.
var questionText = typeof step.question_fmt === "function"
? step.question_fmt(getValues())
: step.question_fmt;
stepDiv.append($(mw.html.element("label", {
"class": "wiktku-start-step-question",
"for": "wiktku-start-" + step.id + "-field" }, questionText)));
if (step.question_br) stepDiv.append($("<br>"));
}
var input;
if (step.choices) {
input = $(mw.html.element("select", {
"class": "wiktku-start-step-field",
id: "wiktku-start-" + step.id + "-field" }));
input.attr("data-placeholder",
capitalize(step.name) + " hilbijêre ");
populateMenus(input, step.choices);
if (step.multiple) input.attr("multiple", true);
// initSelects() runs over the whole form once it is in the DOM.
stepDiv.append(input);
} else if (typeof(step.build) === "function") {
input = step.build(stepDiv);
} else {
input = $("<textarea></textarea>")
.attr("class", "wiktku-start-step-field")
.attr("id", "wiktku-start-" + step.id + "-field")
.attr("rows", step.rows || 2);
if (step.narrow) input.addClass("wiktku-start-narrow");
if (step.placeholder) input.attr("placeholder", step.placeholder);
if (step.multiple) {
input.on("input", function (evt) {
refreshForTextField(evt.target, step);
});
var keyInput = buildKeyInput(step);
var list = $(step.ordered ? "<ol></ol>" : "<ul></ul>")
.append($("<li></li>").append(keyInput).append(input));
stepDiv.append(list);
}
else stepDiv.append(input);
}
prepareInput(input, step);
stepDiv.hide();
// Insert tab bar just before the first per-section step.
if (step.id === "pos") startForm.append(sectionTabsDiv);
startForm.append(stepDiv);
});
// ── Section tab helpers ──────────────────────────────────────────────
// ── Add-section button — lives in the tab bar, disabled until pos chosen ──
var addSectionBtn = new OO.ui.ButtonWidget({
label: "+ Beş zêde bike",
disabled: true
});
addSectionBtn.on("click", function () {
saveCurrentSection();
sections.push({});
activeSection = sections.length - 1;
$.each(PER_SECTION_STEP_IDS, function (_, id) {
if (id === "dfn") {
var stepDiv = $("#wiktku-start-dfn");
stepDiv.find("ol.wiktku-dfn-list").remove();
steps.dfn.build(stepDiv);
return;
}
if (id === "etym") {
$("#wiktku-start-etym .wiktku-etym-wrap").remove();
steps.etym.build($("#wiktku-start-etym"));
return;
}
if (id === "cavkani") {
$("#wiktku-start-cavkani .wiktku-cavkani-wrap").remove();
steps.cavkani.build($("#wiktku-start-cavkani"));
return;
}
if (id === "trans") {
var transDiv = $("#wiktku-start-trans");
transDiv.find(".wiktku-trans-group").remove();
return;
}
if (id === "zarava") {
var zaravaDiv = $("#wiktku-start-zarava");
zaravaDiv.find(".wiktku-zarava-group").remove();
return;
}
if (id === "dunde") {
var dundeDiv = $("#wiktku-start-dunde");
dundeDiv.find("ul.wiktku-dunde-list").remove();
return;
}
var stepDiv = $("#wiktku-start-" + id);
stepDiv.find(".wiktku-start-step-field").val("");
stepDiv.find("select.wiktku-start-step-field").trigger("wiktku:refresh");
});
renderSectionTabs();
refresh();
$("html, body").animate({ scrollTop: sectionTabsDiv.offset().top - 20 }, 300);
});
/** Re-render the tab bar to reflect current sections[] and activeSection. */
function renderSectionTabs() {
// Detach (not remove) the button first: .empty() strips bound
// event data from any children left inside it, which would
// silently kill addSectionBtn's click handler on every re-render.
addSectionBtn.$element.detach();
sectionTabsDiv.empty();
var lang = getValues().lang || "";
if (!lang) {
sectionTabsDiv.hide();
return;
}
sectionTabsDiv.show();
$.each(sections, function (i) {
var posVal = sections[i].pos || "";
var tabLabel = posVal ? capitalize(posVal) : ("Beş " + (i + 1));
var tab = $("<span></span>")
.addClass("wiktku-section-tab")
.text(tabLabel)
.toggleClass("wiktku-tab-active", i === activeSection);
(function (idx) {
tab.on("click", function () {
if (idx === activeSection) return;
saveCurrentSection();
activeSection = idx;
restoreSection(sections[activeSection]);
refresh();
renderSectionTabs();
});
}(i));
sectionTabsDiv.append(tab);
});
// Enable "Beş zêde bike" only when the active section has a pos chosen.
var activePos = sections[activeSection] && sections[activeSection].pos
? sections[activeSection].pos
: getValues().pos;
addSectionBtn.setDisabled(!activePos);
sectionTabsDiv.append(addSectionBtn.$element);
}
renderSectionTabs();
/**
* Restores a full cached draft: shared lang/pron fields, then every
* section (via the same restoreSection()/refresh()/renderSectionTabs()
* sequence already used when switching tabs).
* @param cached {{lang: string, pron: string, sections: Array, activeSection: number}}
*/
function restoreFromCache(cached) {
if (cached.lang) {
$("#wiktku-start-lang-field").val(cached.lang);
$("#wiktku-start-lang-field").trigger("wiktku:refresh");
}
// Rebuild dependent steps (pos, pron wrap, etc.) now that lang is set.
refresh();
if (cached.pron !== undefined) {
$("#wiktku-start-pron .wiktku-pron-text").val(cached.pron);
}
sections = (cached.sections && cached.sections.length) ? cached.sections : [{}];
activeSection = (typeof cached.activeSection === "number" &&
cached.activeSection >= 0 && cached.activeSection < sections.length)
? cached.activeSection : 0;
restoreSection(sections[activeSection]);
refresh();
renderSectionTabs();
mw.notify("Danûstandina berê ya qeydkirî ji cache hate barkirin.",
{ type: "info", tag: "wiktku-cache-restore" });
}
// Update the active tab's label whenever pos changes.
startForm.on("change", "#wiktku-start-pos-field", function () {
renderSectionTabs();
});
// Show the tab bar as soon as a language is selected.
startForm.on("change", "#wiktku-start-lang-field", function () {
renderSectionTabs();
});
var footer = $("<div id='wiktku-start-footer'></div>");
spinner = $(mw.html.element("img", {
id: "wiktku-start-spinner",
src: "//upload.wikimedia.org/wikipedia/commons/d/de/Ajax-loader.gif",
alt: "Tê barkirin…",
title: "Tê barkirin…" }));
footer.append(spinner.hide());
continueBtn = new OO.ui.ButtonWidget({
id: "wiktku-unhide-editform",
label: "Bişîne",
flags: [ "primary", "progressive" ]
});
continueBtn.on("click", function () {
// Immediate feedback that the click registered
continueBtn.$element.addClass("wiktku-btn-flash");
setTimeout(function () {
continueBtn.$element.removeClass("wiktku-btn-flash");
}, 500);
mw.notify("Tê şandin…", { type: "info", tag: "wiktku-submit" });
startForm.trigger("submit");
});
footer.append(continueBtn.$element);
// "Edîtora çavkaniyê veke" button — inline fallback for the portlet link
var sourceEditorBtn = new OO.ui.ButtonWidget({
label: "Edîtora çavkaniyê veke"
});
sourceEditorBtn.on("click", function () {
destroy();
});
footer.append(sourceEditorBtn.$element);
// ── Cache save/clear buttons ─────────────────────────────────────────
// Manual, page-scoped save of the entire wizard (all sections, not
// just the active one) via [[MediaWiki:Gadget-StorageUtils.js]]'s
// ObjectStorage. Restoring happens silently on load at the end of
// build(), once the full language list is available.
var saveCacheBtn = new OO.ui.ButtonWidget({
label: "Li cache qeyd bike",
title: "Halê vê formê yê niha (ziman, bilêvkirin û hemû beş) li cache (localStorage) qeyd bike, da ku eger rûpel bêyî xwestin were girtin an ji nû ve were barkirin, tu karibî berdewam bikî."
});
saveCacheBtn.on("click", function () {
saveCurrentSection();
var snapshot = {
lang: getValues().lang || "",
pron: $("#wiktku-start-pron .wiktku-pron-text").val() || "",
sections: sections,
activeSection: activeSection
};
// ObjectStorage.Set() doesn't return a success/failure value, so
// the only way to detect a real failure (storage blocked, quota
// exceeded, JSON.stringify choking on something unexpected) is to
// catch it here rather than inspect a (nonexistent) return value.
try {
formCache.Set(snapshot);
mw.notify("Halê formê li cache hate qeydkirin.", { type: "success", tag: "wiktku-cache-save" });
} catch (e) {
mw.notify("Qeydkirina li cache bi ser neket.", { type: "error", tag: "wiktku-cache-save" });
}
});
footer.append(saveCacheBtn.$element);
var clearCacheBtn = new OO.ui.ButtonWidget({
label: "Cache paqij bike",
flags: [ "destructive" ],
title: "Datayên qeydkirî yên vê rûpelê ji cache jê bibe (forma ku niha xuya dike naguherîne)."
});
clearCacheBtn.on("click", function () {
formCache.Set({});
mw.notify("Cache hate paqijkirin.", { type: "success", tag: "wiktku-cache-clear" });
});
footer.append(clearCacheBtn.$element);
// ── Preview checkboxes ───────────────────────────────────────────────
// Wikitext preview (raw text panel)
var previewCheck = $("<input type='checkbox' id='wiktku-preview-toggle'>");
var previewLabel = $("<label for='wiktku-preview-toggle'></label>")
.text(" Pêşdîtina wîkîtekstê");
var previewPanel = $("<pre id='wiktku-preview-panel'></pre>").hide();
// Live rendered preview (parsed HTML panel, same logic as AjaxEdit).
// Not available on mobile — API polling causes too many problems on small screens.
var livePreviewCheck = null;
var livePreviewPanel = null;
if (!isMobile) {
livePreviewCheck = $("<input type='checkbox' id='wiktku-live-preview-toggle'>");
livePreviewPanel = $("<div id='wiktku-live-preview-panel'></div>").hide();
}
// Container that holds both panels and switches between stacked / side-by-side.
var previewContainer = $("<div id='wiktku-preview-container'></div>");
previewContainer.append(previewPanel);
if (!isMobile) previewContainer.append(livePreviewPanel);
var previewTimer = null;
var livePreviewIntervalId = -1;
var livePreviewActive = false; // guards in-flight fetches after uncheck
/** Rebuilds wikitext preview if its checkbox is checked. */
function schedulePreview() {
if (!previewCheck.prop("checked")) return;
clearTimeout(previewTimer);
// Debounce: wait 400 ms after the last keystroke before rebuilding.
previewTimer = setTimeout(function () {
getWikitext(function (wikitext) {
previewPanel.text(wikitext).show();
updatePanelLayout();
});
}, 400);
}
/** Fetches parsed HTML and populates the live preview panel. */
function loadLivePreview() {
getWikitext(function (wikitext) {
new mw.Api().parse(wikitext, { title: mw.config.get("wgPageName") }).done(function (html) {
// Discard result if the user unchecked while the fetch was in flight.
if (!livePreviewActive) return;
livePreviewPanel.html(html).show();
updatePanelLayout();
});
});
}
/** Adjusts panel widths depending on which previews are visible. */
function updatePanelLayout() {
var wikitextVisible = previewCheck.prop("checked");
var liveVisible = livePreviewCheck && livePreviewCheck.prop("checked");
if (wikitextVisible && liveVisible) {
// Side by side — each panel takes roughly half the available width.
previewPanel.css({ "flex": "1 1 45%", "min-width": "280px" });
livePreviewPanel.css({ "flex": "1 1 45%", "min-width": "280px" });
} else {
// Full width for whichever is visible — only touch panels that are
// actually shown so that setting flex doesn't override display:none.
if (wikitextVisible) previewPanel.css({ "flex": "1 1 100%", "min-width": "" });
if (liveVisible && livePreviewPanel) livePreviewPanel.css({ "flex": "1 1 100%", "min-width": "" });
}
}
previewCheck.on("change", function () {
if ($(this).prop("checked")) {
schedulePreview();
} else {
clearTimeout(previewTimer);
previewPanel.hide();
updatePanelLayout();
}
});
if (!isMobile) {
livePreviewCheck.on("change", function () {
if ($(this).prop("checked")) {
livePreviewActive = true;
livePreviewPanel.show();
loadLivePreview();
livePreviewIntervalId = setInterval(loadLivePreview, 500);
} else {
livePreviewActive = false;
clearInterval(livePreviewIntervalId);
livePreviewIntervalId = -1;
livePreviewPanel.hide().empty();
updatePanelLayout();
}
});
}
// Listen on all input/change events on the form and update both previews.
startForm.on("input change", function () {
schedulePreview();
});
footer.append($("<span style='margin-left:1em'></span>")
.append(previewCheck).append(previewLabel));
if (!isMobile) {
var livePreviewLabel = $("<label for='wiktku-live-preview-toggle'></label>")
.text(" Pêşdîtina zindî");
footer.append($("<span style='margin-left:1em'></span>")
.append(livePreviewCheck).append(livePreviewLabel));
}
startForm.append(footer);
$("#editform").hide().before(startForm);
// Insert preview container (holds both panels) after the form.
startForm.after(previewContainer);
// One pass over the whole form: every select that hasn't already been
// initialised, and isn't opted out with .wiktku-plain-select, gets
// the searchable picker.
initSelects(startForm);
refresh();
// Give every draggable textarea a custom resize grip (works
// consistently on Safari/iOS, unlike the native corner grip — see
// the "Manual drag-to-resize handle" comment in styles.css), and
// keep applying it to textareas added later on (new sense blocks,
// quote-source fields, nimûne rows, …).
wiktkuInitManualResize(startForm);
new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
$(mutation.addedNodes).each(function () {
if (this.nodeType !== 1) return;
wiktkuInitManualResize(this);
});
});
}).observe(startForm[0], { childList: true, subtree: true });
// Now that the full language list is loaded, silently restore any
// draft the editor previously saved for this page.
var cachedDraft = formCache.Get();
if (cachedDraft && cachedDraft.sections && cachedDraft.sections.length) {
restoreFromCache(cachedDraft);
}
}
mw.loader.using(["oojs-ui-core"], function () {
// Load metadata, langChoices, posChoices and tplDefs from the companion
// data page so they can be updated without touching this script.
// (Request was already fired via metaApiPromise above, in parallel
// with this module load — we're just picking up the result here.)
metaApiPromise.then(function (data) {
var page = data.query.pages[0];
var content = page &&
page.revisions &&
page.revisions[0].slots.main.content;
var d;
try { d = JSON.parse(content); } catch (e) { d = {}; }
// Populate metadata.
if (d.metadata) $.extend(metadata, d.metadata);
// Populate gender labels.
if (d.genderLabels) $.extend(GENDER_BASE_LABELS, d.genderLabels);
// Populate lang choices (pinned list).
if (d.langChoices) steps.lang.choices = choicesFromObject(d.langChoices, true);
// Populate langsByCode and merge full language list from d.ziman.
// d.ziman is a {code: name} object with all known languages.
$.each(steps.lang.choices, function (i, choice) {
if (choice.sortKey === undefined) choice.sortKey = choice.label;
langsByCode[choice.code] = choice;
});
if (d.ziman) {
var pinnedCodes = {};
$.each(steps.lang.choices, function (i, c) { pinnedCodes[c.code] = true; });
var extraChoices = [];
$.each(d.ziman, function (code, name) {
if (/-pro$/i.test(code)) return;
if (/ziman[eê]\s+destan/i.test(name)) return;
if (pinnedCodes[code]) return;
var choice = { code: code, label: name, sortKey: name };
extraChoices.push(choice);
langsByCode[code] = choice;
});
extraChoices.sort(function (a, b) {
return a.sortKey.localeCompare(b.sortKey, userLang);
});
steps.lang.choices = steps.lang.choices.concat(extraChoices);
}
// Populate POS choices — also a plain {code: label} object in data.json.
if (d.posChoices) steps.pos.choices = choicesFromObject(d.posChoices, false);
// Populate template definitions for the dfn sense-block builder.
if (d.tplDefs) steps.dfn.tplDefs = d.tplDefs;
// Populate pos placeholder examples.
if (d.posExamples) steps.dfn.posExamples = d.posExamples;
// Populate citation template definitions for the quote widget.
if (d.jederDefs) steps.dfn.jederDefs = d.jederDefs;
// Populate pronunciation and etymology template insert lists.
if (d.pronTpls) {
steps.pron.pronTpls = d.pronTpls;
steps.pron.refreshTplSelect();
}
if (d.etymTpls) {
steps.etym.etymTpls = d.etymTpls;
steps.etym.refreshTplSelect();
}
// Sync trans/dunde/zarava keys with the full language list.
steps.trans.keys = steps.lang.choices;
steps.dunde.keys = steps.lang.choices;
steps.zarava.keys = getZaravaKeys(steps.lang.choices);
}).always(build);
});
});
//</nowiki>
81i4tzp2q5sczvmq0bfufmec2gjxn5w
boires
0
975074
6292102
6059900
2026-07-29T22:05:02Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292102
wikitext
text/x-wiki
== {{ziman|fr}} ==
=== Bilêvkirin ===
* {{deng|fr|LL-Q150 (fra)-DenisdeShawi-boires.wav|Deng|dever=Shawinigan, Kanada}}
=== Formeke navdêrê ===
{{navdêr|fr|z=n|form=erê}}
# {{pirjimar|fr|boire}}
kqeibacbemcpzos8bkzptelj05wxvfb
Şablon:tabloya-tewandinê-ser
10
1324916
6291983
6034938
2026-07-29T12:24:39Z
Ghybu
1393
Ghybuî/ê navê [[Şablon:tewandin-ser]] weke [[Şablon:tabloya-tewandinê-ser]] guhart
6034938
wikitext
text/x-wiki
<includeonly><!-- special wrapper to prevent substitution of this template -->{{ safesubst:<noinclude/>#ifeq:{{ safesubst:<noinclude/>NAMESPACE}}|{{NAMESPACE}}|
<div class="inflection-table-wrapper inflection-table-narrow inflection-table-{{{palette|grey}}} {{#ifeq:{{{title}}}|-|inflection-table-no-title}} {{#if:{{{tall|}}}|inflection-table-collapsible inflection-table-collapsed no-vc}} {{{class|}}}" style="width: fit-content{{#if:{{{min-width|}}}|; min-width: {{{min-width}}}}}" data-toggle-category="{{{category|inflection}}}"><templatestyles src="Template:tewandin-ser/style.css" />
{{{!}} class="inflection-table {{#if:{{{lang|}}}|inflection-table-{{{lang}}}}}" <!-- {{!}} is used in place of | due to the special safesubst: wrapper -->
{{#ifeq:{{{title}}}|-||
{{!}}+ class="inflection-table-title" {{!}} {{{title|Inflection of ''{{PAGENAME}}''}}}
{{!}}-
}}
|{{color||Do not substitute this template}}}}
</includeonly><noinclude>{{documentation}}</noinclude>
sifxglyhqfevfoc4gxh5lblifk41qal
Şablon:tabloya-tewandinê-bin
10
1324917
6291985
6034930
2026-07-29T12:25:22Z
Ghybu
1393
Ghybuî/ê navê [[Şablon:tewandin-bin]] weke [[Şablon:tabloya-tewandinê-bin]] guhart
6034930
wikitext
text/x-wiki
|}
{{#if:{{{notes|}}}|<div class="inflection-table-notes">
{{{notes}}}
</div>}}
</div><noinclude>{{documentation}}</noinclude>
j29sq6byhi5vvm3l35omsf8rmoh5iaj
Bikarhêner:Wikihez/test.json
2
1325626
6292061
6101977
2026-07-29T19:41:34Z
Wikihez
7344
6292061
json
application/json
{
"aa": "afarî",
"aaa": "gotuoyî",
"aab": "alumu-tesuyî",
"aac": "ariyî",
"aad": "amalî",
"aaf": "aranadanî",
"aag": "ambrakî",
"aah": "abu' arapeşî",
"aai": "arîfama-mînîafîayî",
"aak": "ankaveyî",
"aal": "afadeyî",
"aan": "anambeyî",
"aao": "erebiya sahrayî ya cezayirî",
"aap": "pará arárayî",
"aaq": "penobskotî",
"aas": "aasayî",
"aau": "abauyî",
"aav-khs-pro": "proto-xasî",
"aav-nic-pro": "proto-nîkobarî",
"aav-pkl-pro": "proto-pnar-xasî-lîngngamî",
"aav-pro": "proto-awistroasyayî",
"aaw": "solongyî",
"aax": "mandobo atas",
"aaz": "amarasî",
"ab": "abxazî",
"aba": "abeyî",
"abb": "bankonî",
"abc": "ambala ayta",
"abd": "manîdeyî",
"abe": "abenakî",
"abf": "abaî sungayî",
"abg": "abagayî",
"abh": "erebiya tajîkî",
"abi": "abîdjî",
"abj": "aka-beayî",
"abl": "abûngî",
"abm": "abanyomî",
"abn": "abuayî",
"abo": "abonî",
"abp": "abenlen ayta",
"abq": "abazayî",
"abr": "abronî",
"abs": "ambonezî-malezî",
"abt": "ambulasî",
"abu": "abureyî",
"abv": "erebiya bahranî",
"abw": "pal",
"abx": "abaknonî",
"aby": "aneme wakeyî",
"abz": "abuiyî",
"aca": "açaguwayî",
"acb": "ancáyî",
"acd": "gîkyodeyî",
"ace": "açehî",
"ach": "açolî",
"aci": "aka-karî",
"ack": "aka-korayî",
"acl": "akar-baleyî",
"acm": "erebiya iraqî",
"acn": "açangî",
"acp": "akîpayiya rojhilatî",
"acq": "erebiya ta'îzzî adenî",
"acr": "açiyî",
"acs": "akroáyî",
"acu": "açuarî",
"acv": "açumawî",
"acw": "erebiya hîcazî",
"acx": "erebiya ummanî",
"acy": "erebiya qibrisî",
"acz": "açeronî",
"ada": "adangmeyî",
"adb": "adabeyî",
"add": "dzodinkayî",
"ade": "adeleyî",
"adf": "erebîya zufarî",
"adg": "andegerebînhayî",
"adh": "adholayî",
"adi": "adî",
"adj": "adyukruyî",
"adl": "gallongî",
"adn": "adangî",
"ado": "abuyî",
"adp": "adapî",
"adq": "adangbeyî",
"adr": "adonarayî",
"ads": "zimanê destan ê adamorobeyî",
"adt": "adnyamatanhayî",
"adu": "adugeyî",
"adw": "amondawayî",
"ady": "adîgeyî",
"adz": "adzerayî",
"ae": "avestayî",
"aea": "arebayî",
"aeb": "erebiya tunusî",
"aec": "erebiya sa'îdî",
"aed": "zimanê destan li arjentînê",
"aee": "paşayiya bakur-rojhilat",
"aek": "haekeyî",
"ael": "ambeleyî",
"aem": "aremî",
"aen": "zimanê destan ê ermenî",
"aeq": "aerî",
"aer": "arrernteyiya rojavayî",
"aes": "alseayî",
"aeu": "akeuyî",
"aew": "ambakîç",
"aey": "ameleyî",
"aez": "aekayî",
"af": "afrîkansî",
"afa-pro": "proto-afroasyayî",
"afb": "erebiya kendavî",
"afd": "andaî",
"afe": "putukwamî",
"afg": "zimanê destan ê afganî",
"afh": "afrîhîlî",
"afi": "akrukayî",
"afk": "nanubayî",
"afn": "defakayî",
"afo": "eloyî",
"afp": "tapeî",
"afs": "kreyoliya afro-semînolî",
"aft": "afîttî",
"afu": "awutuyî",
"afz": "obokuîtayî",
"aga": "aguanoyî",
"agb": "legboyî",
"agc": "agatuyî",
"agd": "agarabiyî",
"age": "angalî",
"agf": "argunî",
"agg": "angorî",
"agh": "ngelîmayî",
"agi": "agarîyayî",
"agj": "argobbayî",
"agk": "îsarog agtayî",
"agl": "fembeyî",
"agm": "angaatahayî",
"agn": "agutaynenî",
"ago": "taînaeyî",
"agq": "aghemî",
"agr": "aguarunayî",
"ags": "esîmbî",
"agt": "agtayiya kagayanî ya navendî",
"agu": "agwakatekî",
"agv": "remontado agta",
"agw": "kahuayî",
"agx": "aghulî",
"agy": "altaya başûrî",
"agz": "mount îrîga agta",
"aha": "ahanta",
"ahb": "axamb",
"ahg": "qimant",
"ahh": "aghu",
"ahi": "tîagbamrîn aîzî",
"ahk": "akha",
"ahl": "îgo",
"ahm": "mobumrîn aîzî",
"ahn": "ahàn",
"aho": "ahomî",
"ahp": "aproumu aîzî",
"ahr": "ahîranî",
"ahs": "aşeyî",
"aht": "ahtnayî",
"aia": "arosî",
"aib": "aynuyî",
"aic": "aînbaî",
"aid": "alngîthî",
"aie": "amarayî",
"aif": "agî",
"aig": "îngilîziya kreyolî ya antîgua û barbud",
"aih": "aî-çamî",
"aii": "aramiya nû ya asûrî",
"aij": "lîşanîd noşan",
"aik": "akeyî",
"ail": "aîmeleyî",
"aim": "aîmolî",
"ain": "aynuyî",
"aio": "aytonî",
"aip": "burumakokî",
"air": "ayroranî",
"ait": "arîkemî",
"aiw": "aarî",
"aix": "ayghonî",
"aiy": "aliyî",
"aja": "ajayî",
"ajg": "adjayî",
"aji": "ajië",
"ajn": "andajînî",
"ajp": "erebiya başûrê şamê",
"ajt": "erebiya cihû-tunusî",
"aju": "erebiya cihû-fasî",
"ajw": "ajawayî",
"ajz": "amrî karbî",
"ak": "akanî",
"akb": "angkola batakî",
"akc": "mpur",
"akd": "ukpet-ehom",
"ake": "akawaîo",
"akf": "akpayî",
"akg": "anakalunguyî",
"akh": "angal heneng",
"aki": "aiome",
"akj": "jeru",
"akk": "akadî",
"akl": "aklanon",
"akm": "aka-bo",
"ako": "akurio",
"akp": "siwu",
"akq": "ak",
"akr": "arakî",
"aks": "akaselem",
"akt": "akolet",
"aku": "akum",
"akv": "axvaxî",
"akw": "akwa",
"akx": "aka-kede",
"aky": "aka-kol",
"akz": "alabamayî",
"ala": "alago",
"alc": "kawésqar",
"ald": "alladînî",
"ale": "alêwîtî",
"alf": "alegeyî",
"alg-aga": "agawamî",
"alg-pro": "proto-algonkînî",
"alh": "alawayî",
"ali": "amaimonî",
"alj": "alanganî",
"alk": "alakî",
"all": "allarî",
"alm": "amblongî",
"alo": "larike-wakasihu",
"alp": "aluneyî",
"alq": "algonquinî",
"alr": "alutor",
"alt": "altayiya başûrî",
"alu": "areareyî",
"alv-ama": "amasî",
"alv-bgu": "baïnounk gubëeherî",
"alv-bua-pro": "proto-buayî",
"alv-cng-pro": "proto-kangînî",
"alv-edo-pro": "proto-edoidî",
"alv-fli-pro": "proto-faliyî",
"alv-gbe-pro": "proto-gbeyî",
"alv-gng-pro": "proto-guangî",
"alv-gtm-pro": "proto-togoyiya navendî",
"alv-gwa": "gwarayî",
"alv-hei-pro": "proto-heybanî",
"alv-igb-pro": "proto-îgboyidî",
"alv-kwa-pro": "proto-kwayî",
"alv-mum-pro": "proto-mumuyeyî",
"alv-nup-pro": "proto-nupoyidî",
"alv-pro": "proto-atlantîk-kongoyî",
"alv-yor-pro": "proto-yoruboyidî",
"alw": "alaba",
"alx": "amol",
"aly": "alyawarr",
"alz": "alur",
"am": "amharî",
"ama": "amanayé",
"amb": "ambo",
"amc": "amahuaca",
"ame": "yaneşa'",
"amf": "hamer-banna",
"amg": "amurdag",
"ami": "amîs",
"amj": "amdang",
"amk": "ambayî",
"aml": "war-jaîntî",
"amm": "amayî",
"amn": "amanabî",
"amo": "amoyî",
"amp": "alamblakî",
"amq": "amahaî",
"amr": "amarakaerî",
"ams": "amamî-oşîmayiya başûrî",
"amt": "amto",
"amu": "amuzgoyî",
"amv": "ambelau",
"amw": "neo-aramiya rojavayî",
"amx": "anmatyerre",
"amy": "amî",
"amz": "atampaya",
"an": "aragonî",
"ana": "andaquyî",
"anb": "andoa",
"anc": "ngas",
"and": "ansus",
"ane": "xârâcùù",
"anf": "anîmere",
"ang": "îngilîziya kevn",
"anh": "nendî",
"ani": "andî",
"anj": "anor",
"ank": "goemayî",
"anl": "anu",
"anm": "analî",
"ann": "obolo",
"ano": "andoque",
"anp": "angîka",
"anq": "jarawa",
"anr": "andhî",
"ans": "anserma",
"ant": "antakarînyayî",
"anu": "anuak",
"anv": "denya",
"anw": "anaang",
"anx": "andra-hus",
"any": "anyî",
"anz": "anem",
"aoa": "angolar",
"aob": "abom",
"aoc": "pemon",
"aod": "andarum",
"aoe": "angal enen",
"aof": "bragat",
"aog": "angoram",
"aoh": "arma",
"aoi": "anîndîlyakwa",
"aoj": "mufiyî",
"aok": "arhö",
"aol": "alor",
"aom": "ömie",
"aon": "bumbîta arapeş",
"aor": "aore",
"aos": "taykatî",
"aot": "atong (Hindistan)",
"aou": "a'ou",
"aox": "atorada",
"aoz": "uab meto",
"apa-pro": "proto-apaçî",
"apb": "sa'a",
"apc": "erebiya bakûrê şamê",
"apd": "erebiya sudanî",
"ape": "bukiyîpî",
"apf": "pahanan agta",
"apg": "ampanangî",
"aph": "athpare",
"api": "apiaká",
"apj": "xîkarîyayî",
"apk": "apaçiya deştan",
"apl": "lipan",
"apm": "çîrîkawayî",
"apn": "apinayé",
"apo": "ambul",
"app": "apma",
"apq": "a-pucikwar",
"apr": "arop-lokep",
"aps": "arop-sissano",
"apt": "apatanî",
"apu": "apurinã",
"apv": "alapmunte",
"apw": "apaçiya rojava",
"apx": "aputayî",
"apy": "apalayî",
"apz": "safeyoka",
"aqc": "arçî",
"aqd": "amparî dogon",
"aqg": "arîgîdî",
"aql-pro": "proto-algîkî",
"aqm": "atohwaim",
"aqn": "altaya bakurî",
"aqp": "atakapa",
"aqr": "arhâ",
"aqt": "angaité",
"aqz": "akuntsu",
"ar": "erebî",
"arc": "aramî",
"ard": "arabana",
"are": "arrernteya rojavayî",
"arh": "arhuako",
"ari": "arîkara",
"arj": "arapaso",
"ark": "arîkapûyî",
"arl": "arabela",
"arn": "mapuçî",
"aro": "araona",
"arp": "arapaho",
"arq": "erebiya cezayirî",
"arr": "arara-karo",
"ars": "erebiya necdî",
"art-blk": "bolakî",
"art-bsp": "black speech",
"art-com": "communicationssprache",
"art-dtk": "dothrakî",
"art-elo": "eloî",
"art-gld": "goa'uldî",
"art-lap": "lapineyî",
"art-man": "mandalorî",
"art-mun": "mundolincoyî",
"art-nav": "na'vî",
"art-nox": "noxiloyî",
"art-top": "toki ponayî",
"art-una": "unasî",
"aru": "arua",
"arv": "arbore",
"arw": "arawak",
"arx": "aruá",
"ary": "erebiya fasî",
"arz": "erebiya misrî",
"as": "asamî",
"asa": "pare",
"asb": "assînîboyî",
"asc": "asmatiya casuarina coast",
"ase": "zimanê destan ê emerîkî",
"asf": "zimanê destan ê awistralyayî",
"asg": "kîşîngînî",
"ash": "abîşîra",
"asi": "buruwayî",
"asj": "nsarî",
"ask": "aşkunî",
"asl": "asîluluyî",
"asn": "xingú asuriní",
"aso": "dano",
"asp": "zimanê destan ê cezayirî",
"asq": "zimanê destan ê awistiryayî",
"asr": "asur",
"ass": "îpulo",
"ast": "astûrî",
"asu": "tocantins asurînî",
"asv": "asoa",
"asw": "zimanê destan ê aborjîniyên awistralyayî",
"asx": "muratayak",
"asy": "yaosakor asmat",
"asz": "as",
"ata": "pele-ata",
"atb": "zaiwa",
"atc": "atsahuaka",
"atd": "ata manobo",
"ate": "atemble",
"atg": "okpela",
"ath-nic": "nicolayî",
"ath-pro": "proto-atabaskanî",
"ati": "attié",
"atj": "atîkamekwî",
"atk": "atî",
"atl": "agtaya çiyaya iraya",
"atm": "ata",
"ato": "atong (Kamerun)",
"atp": "pudtol atta",
"atq": "aralle-tabulahan",
"atr": "waîmîrî-atroarî",
"ats": "gros ventre",
"att": "pamplona atta",
"atu": "reel",
"atv": "altayiya bakurî",
"atw": "atsugewî",
"atx": "arutanî",
"aty": "aneityum",
"atz": "arta",
"aua": "asumboayî",
"aub": "alugu",
"auc": "huaoranî",
"aud": "anuta",
"auf-pro": "proto-arawayî",
"aug": "aguna",
"auh": "auşî",
"aui": "anukî",
"auj": "awjîla",
"auk": "heyo",
"aul": "aulua",
"aum": "asu",
"aun": "molmo one",
"auo": "auyokawa",
"aup": "makayam",
"auq": "anusî",
"aur": "aruek",
"aus-alu": "alungulî",
"aus-and": "andjingithî",
"aus-ang": "angkulayî",
"aus-arn-pro": "proto-arnhemî",
"aus-bra": "barranbinyayî",
"aus-brm": "barunggamî",
"aus-bru": "bruny islandî",
"aus-cww-pro": "proto-central new south wales",
"aus-dal-pro": "proto-dalî",
"aus-guw": "guwarî",
"aus-lsw": "little swanportî",
"aus-mbi": "mbiywomî",
"aus-ngk": "ngkothî",
"aus-nyu-pro": "proto-nyulnyulanî",
"aus-pam-pro": "proto-pama-nyungan",
"aus-par": "paredarermeyî",
"aus-pee": "peerapperî",
"aus-psl": "port sorellî",
"aus-pye": "pyemmairreyî",
"aus-set": "tasmaniya başûr-rojhilat",
"aus-tom": "tommeginneyî",
"aus-too": "toogeeyî",
"aus-tul": "tuluayî",
"aus-uwi": "uwinymilî",
"aus-wdj-pro": "proto-iwaidjanî",
"aus-won": "wong-gieyî",
"aus-wul": "wulguruyî",
"aus-ynk": "yangkaalî",
"aut": "austral",
"auu": "auye",
"auw": "awyî",
"aux": "aurá",
"auy": "auyana",
"auz": "erebiya ozbekî",
"av": "avarî",
"avb": "avau",
"avd": "elwîrî-wîderî",
"avi": "avîkam",
"avk": "kotavayî",
"avl": "erebiya misriya rojhilatî ya bedewî",
"avm": "angkamuthî",
"avn": "avatime",
"avo": "agavotaguerra",
"avs": "auşîrî",
"avt": "au",
"avu": "avokaya",
"avv": "avá-kanoeîro",
"awa": "awadhî",
"awb": "awa (Gîneya nû)",
"awc": "cicipu",
"awd-ama": "amarizanayî",
"awd-amc-pro": "proto-amuesha-çamicuro",
"awd-ana": "anauyayî",
"awd-apo": "apolistayî",
"awd-cav": "cavereyî",
"awd-gnu": "guinauyî",
"awd-kar": "cariayî",
"awd-kaw": "kawişanayî",
"awd-kmp-pro": "proto-kampayî",
"awd-kus": "kustenauyî",
"awd-man": "manaoyî",
"awd-mar": "marawanî",
"awd-mpr": "maypureyî",
"awd-mrt": "mariateyî",
"awd-nwk-pro": "proto-nawikî",
"awd-pai": "paikonekayî",
"awd-pas": "passeyî",
"awd-pro": "proto-arawakî",
"awd-prw-pro": "proto-paresî-waurayî",
"awd-she": "şebayoyî",
"awd-taa-pro": "proto-ta-arawak",
"awd-wai": "wainumayî",
"awd-yum": "yumanayî",
"awe": "awetí",
"awg": "anguthimrî",
"awh": "awbono",
"awi": "aekyom",
"awk": "awabakal",
"awm": "arawum",
"awn": "awngî",
"awo": "awak",
"awr": "awera",
"aws": "awyuya başûrî",
"awt": "araweté",
"awu": "awyuya navendî",
"awv": "awyuya jair",
"aww": "awun",
"awx": "awara",
"awy": "awyuya edura",
"axb": "abipon",
"axe": "ayerrerenge",
"axg": "mato grosso arára",
"axk": "aka (Afrîkaya navendî)",
"axl": "arandayiya başûrî ya jêrîn",
"axm": "ermeniya navîn",
"axx": "xaragure",
"ay": "aymarayî",
"aya": "awar",
"ayb": "ayizo",
"ayd": "ayabadhu",
"aye": "ayere",
"ayg": "nyanga (Togo)",
"ayh": "erebiya hedramî",
"ayi": "leyîhayî",
"ayk": "akukuyî",
"ayl": "erebiya lîbyayî",
"ayn": "erebiya sanaanî",
"ayo": "ayoreoyî",
"ayp": "erebiya mezopotamyayî ya bakur",
"ayq": "ayî",
"ays": "sorsogon aytayî",
"ayt": "bataan aytayî",
"ayu": "ayuyî",
"ayy": "tayabas aytayî",
"ayz": "maybratî",
"az": "azerî",
"aza": "azhayî",
"azc-caz": "cazcanî",
"azc-cup-pro": "proto-cupanî",
"azc-ktn": "kitanemukî",
"azc-nah-pro": "proto-nahuyanî",
"azc-num-pro": "proto-numîkî",
"azc-pro": "proto-uto-aztekî",
"azc-tak-pro": "proto-takîkî",
"azc-tat": "tataviamî",
"azd": "durango nahuatliya rojavayî",
"azg": "san pedro amuzgos amuzgo",
"azm": "amuzgoyiya îpalapayî",
"azn": "durango nahuatliya rojavayî ya jêrîn",
"azo": "awîngî",
"azt": "faîre atta",
"azz": "puebla nahuatliya çiyayî",
"ba": "başkîrî",
"baa": "babatanayî",
"bab": "bainouk-gunyuño",
"bac": "baduî",
"bae": "baré",
"baf": "nubaca",
"bag": "tukî",
"bah": "kreyoliya bahamayî",
"baj": "barakaî",
"bal": "belûçî",
"ban": "balînî",
"bao": "waîmaha",
"bap": "bantawa",
"bar": "bayerî",
"bas": "basayî",
"bau": "badançî",
"bav": "babungoyî",
"baw": "bambîlî-bambuî",
"bax": "bamumî",
"bay": "batuleyî",
"bba": "baatonumî",
"bbb": "barayî",
"bbc": "bataktobayî",
"bbd": "bauyî",
"bbe": "bangbayî",
"bbf": "baybayî",
"bbg": "baramayî",
"bbh": "buganî",
"bbi": "barombî",
"bbj": "ghomalayî'",
"bbk": "babankî",
"bbl": "batsbî",
"bbm": "babangoyî",
"bbn": "uneapayî",
"bbo": "konabereyî",
"bbp": "bandayiya rojavayî ya navendî",
"bbq": "bamalî",
"bbr": "girawayî",
"bbs": "bakpinkayî",
"bbt": "mburkuyî",
"bbu": "bakulungî",
"bbv": "karnaî",
"bbw": "babayî",
"bbx": "bubîayî",
"bby": "befangî",
"bbz": "erebiya kreyoliya babaliya",
"bca": "bayiya navendî",
"bcb": "bainûk-samîk",
"bcd": "babariya bakur",
"bce": "bamenyamî",
"bcf": "bamuyî",
"bcg": "baga pokurî",
"bch": "bariyayî",
"bci": "bawuleyî",
"bcj": "bardî",
"bck": "bunabayî",
"bcl": "bîkoliya naverast",
"bcm": "banonî",
"bcn": "bîbaalî",
"bco": "kalulî",
"bcp": "balî",
"bcq": "bençî",
"bcr": "babine-witsuwit'enî",
"bcs": "kohumonoyî",
"bct": "bendî",
"bcu": "bîlîwayî",
"bcv": "şoo-mînda-nye",
"bcw": "banayî",
"bcy": "bacamayî",
"bcz": "baînouk-gunyaamoloyî",
"bda": "bayotî",
"bdb": "basapî",
"bdc": "embera-baudoyî",
"bdd": "bunamayî",
"bde": "badeyî",
"bdf": "bîageyî",
"bdg": "bangî",
"bdh": "tara bakayî",
"bdi": "burunî",
"bdj": "bayî",
"bdk": "buduxî",
"bdl": "bajwayiya endonezyayî",
"bdm": "budumayî",
"bdn": "baldemuyî",
"bdo": "moromî",
"bdp": "bendeyî",
"bdq": "bahnarî",
"bdr": "bajwayiya kendava rojava",
"bds": "burungeyî",
"bdt": "bokotoyî",
"bdu": "orokoyî",
"bdv": "bodo parjayî",
"bdw": "bahamî",
"bdx": "budong-budongî",
"bdy": "bandjalangî",
"bdz": "badeşî",
"be": "belarusî",
"bea": "beaverî",
"beb": "bebeleyî",
"bec": "iceve-macî",
"bed": "bedoanasî",
"bee": "byangsî",
"bef": "benabenayî",
"beg": "belaîtî",
"beh": "biyalî",
"bei": "bekatî'",
"bej": "bejayî",
"bek": "bebelî",
"bem": "bembayî",
"beo": "beamî",
"bep": "besoayî",
"beq": "beembeyî",
"ber-pro": "proto-berberî",
"bes": "besmeyî",
"bet": "gûberowa beteyî",
"beu": "blagarî",
"bev": "daloa beteyî",
"bew": "betawî",
"bex": "jûr modoyî",
"bey": "akuwagelî",
"bez": "kîbenayî",
"bfa": "bariyî",
"bfb": "paurî barelî",
"bfc": "bayiya bakurî",
"bfd": "bafutî",
"bfe": "betafî",
"bff": "bofî",
"bfg": "busang kayanî",
"bfh": "blafeyî",
"bfi": "zimanê destan ê brîtanî",
"bfj": "bafanjî",
"bfk": "zimanê destan ê ban khor",
"bfl": "banda-ndeleyî",
"bfm": "mmenî",
"bfn": "bunakî",
"bfo": "malba bîrîforî",
"bfp": "bebayî",
"bfq": "badagayî",
"bfr": "bazîgarî",
"bfs": "bayiya başûrî",
"bft": "baltî",
"bfu": "gahrî",
"bfw": "bondoyî",
"bfx": "bantayanonî",
"bfy": "baghelî",
"bfz": "mahasu paharî",
"bg": "bulgarî",
"bga": "gwamhî-wurî",
"bgb": "bobongko",
"bgc": "haryanvî",
"bgd": "rathwî barelî",
"bge": "bawriyayî",
"bgf": "banganduyî",
"bgg": "bugunî",
"bgi": "giyanganî",
"bgj": "bangolanî",
"bgk": "bîtî",
"bgl": "boyî",
"bgo": "baga kogayî",
"bgq": "bagrî",
"bgr": "bawm çînî",
"bgs": "tagabawayî",
"bgt": "bugotûyî",
"bgu": "mbongnoyî",
"bgv": "warkay-bîpîmî",
"bgw": "bhatrî",
"bgx": "tirkiya gagawizî ya balkanan",
"bgy": "benggoî",
"bgz": "banggaî",
"bh": "biharî",
"bha": "bhariyayî",
"bhb": "bhîlî",
"bhc": "bîga",
"bhd": "bhadrawahî",
"bhe": "bhayayî",
"bhf": "odîaî",
"bhg": "bînandereyî",
"bhh": "buxarî",
"bhi": "bhilalî",
"bhj": "bahingî",
"bhl": "bimînî",
"bhm": "batharî",
"bhn": "aramiya nû ya botanî",
"bho": "bojpûrî",
"bhp": "bîmayî",
"bhq": "tukang besî başûr",
"bhs": "buwalî",
"bht": "bhattiyalî",
"bhu": "bhunjiyayî",
"bhv": "bahauyî",
"bhw": "biyakî",
"bhx": "bhalayî",
"bhy": "bheleyî",
"bhz": "badayî",
"bi": "bîslamayî",
"bia": "badimayayî",
"bib": "bîssayî",
"bic": "bikaruyî",
"bid": "bidiyoyî",
"bie": "bepourî",
"bif": "biafadayî",
"big": "biangaî",
"bij": "kwankayî",
"bil": "bileyî",
"bim": "bimobayî",
"bin": "edoyî",
"bio": "nai",
"bip": "bila",
"biq": "bipî",
"bir": "bisorio",
"bit": "berinomo",
"biu": "biete",
"biv": "biriforiya başûr",
"biw": "kol (Kamerun)",
"bix": "bijorî",
"biy": "birhor",
"biz": "baloî",
"bja": "budza",
"bjb": "barngarla",
"bjc": "barijî",
"bje": "biao-jiao mien",
"bjf": "neo-aramiya cihû ya barzanê",
"bjg": "bidyogo",
"bjh": "bahinemo",
"bji": "burjî",
"bjj": "kannaujî",
"bjk": "barok",
"bjl": "bulu (Gîneya nû)",
"bjm": "bajelanî",
"bjn": "banjarî",
"bjo": "bandayiya başûr-navendî",
"bjp": "fanamaket",
"bjr": "binumarî",
"bjs": "bajan",
"bjt": "balanta-ganjayî",
"bju": "busuu",
"bjv": "bedjond",
"bjw": "bakwé",
"bjx": "banao îtneg",
"bjy": "bayalî",
"bjz": "baruga",
"bka": "kyak",
"bkc": "baka",
"bkd": "binukid",
"bkf": "beeke",
"bkg": "buraka",
"bkh": "bakoko",
"bki": "bakî",
"bkj": "pande",
"bkk": "brokskat",
"bkl": "berik",
"bkm": "komiya kamerûnî",
"bkn": "bukîtan",
"bko": "kwa'",
"bkp": "îboko",
"bkq": "bakairí",
"bkr": "bakumpaî",
"bks": "masbate sorsogon",
"bkt": "bolokî",
"bku": "buhid",
"bkv": "bekwarra",
"bkw": "bekwel",
"bkx": "baikeno",
"bky": "bokyî",
"bkz": "bungku",
"bla": "blakfotî",
"blb": "bilua",
"blc": "bella koola",
"bld": "bolango",
"ble": "balanta-kentohe",
"blf": "buol",
"blg": "balau",
"blh": "kuwaa",
"bli": "bolia",
"blj": "bolonî",
"blk": "pa'o karen",
"bll": "biloxî",
"blm": "belî",
"bln": "bîkolanoyiya başûr katanduanî",
"blo": "anîî",
"blp": "blablanga",
"blq": "baluan-pam",
"blr": "blang",
"bls": "balaesang",
"blt": "tay dam",
"blv": "kibala",
"blw": "balangao",
"blx": "mag-îndî ayta",
"bly": "notre",
"blz": "balantak",
"bm": "bambarayî",
"bma": "lame",
"bmb": "bembe",
"bmc": "biem",
"bmd": "baga mandurî",
"bme": "limassa",
"bmf": "bom",
"bmg": "bamwe",
"bmh": "kein",
"bmi": "bagirmî",
"bmj": "bote-majhî",
"bmk": "ghayavî",
"bml": "bombolî",
"bmn": "bîna",
"bmo": "bambalang",
"bmp": "bulgebî",
"bmq": "bomu",
"bmr": "muinanî",
"bmt": "biao mon",
"bmu": "somba-siawarî",
"bmv": "bum",
"bmw": "bomwalî",
"bmx": "baimak",
"bmz": "baramu",
"bn": "bengalî",
"bna": "boneratî",
"bnb": "bookan",
"bnd": "banda",
"bne": "bintauna",
"bnf": "masiwang",
"bng": "benga",
"bni": "bangî",
"bnj": "tawbuîdiya rojhilatî",
"bnk": "biereboyî",
"bnl": "boon",
"bnm": "batangayî",
"bnn": "bununî",
"bno": "asî",
"bnp": "bolayî",
"bnq": "bantîkî",
"bnr": "butmas-turî",
"bns": "bundelî",
"bnt-bal": "balongî",
"bnt-cmw": "çimwiinî",
"bnt-ind": "indangayî",
"bnt-lal": "lalayî (Afrîkaya başûr)",
"bnt-lwl": "lwelî",
"bnt-mpi": "mpiinî",
"bnt-ngu-pro": "proto-ngunî",
"bnt-phu": "phuthî",
"bnt-pro": "proto-bantuyî",
"bnt-sts-pro": "proto-sotho-tswana",
"bnu": "bentongî",
"bnv": "benerafî",
"bnw": "bisisî",
"bnx": "bangubanguyî",
"bny": "bintuluyî",
"bnz": "beezenî",
"bo": "tîbetî",
"boa": "borayî",
"bob": "aweerî",
"boe": "mundablî",
"bof": "bolonî",
"bog": "zimanê destan ê bamakoyî",
"boh": "bomayî",
"boi": "barbarenyoyî",
"boj": "ancamî",
"bok": "boncoyî",
"bol": "boleyî",
"bom": "beromî",
"bon": "bineyî",
"boo": "bozoyoya tiemacewe",
"bop": "bonkimanî",
"boq": "bogayayî",
"bor": "bororoyî",
"bot": "bongoyî",
"bou": "bondeyî",
"bov": "tuwulî",
"bow": "remayî",
"box": "buamuyî",
"boy": "bodoyî (Afrîkaya navendî)",
"boz": "bozoyiya tieyaxo",
"bpa": "dakakayî",
"bpb": "barbakoasî",
"bpd": "banda-bandayî",
"bpg": "bonggoyî",
"bph": "botlixî",
"bpi": "bagupî",
"bpj": "binjî",
"bpk": "oroweyî",
"bpl": "broome pearling lugger pidginî",
"bpm": "biyomî",
"bpn": "dzao minî",
"bpo": "anasî",
"bpp": "kaureyî",
"bpq": "banda malayî",
"bpr": "koronadal blaanî",
"bps": "saranganî blaanî",
"bpt": "barrow pointî",
"bpu": "bonguyî",
"bpv": "bian marindî",
"bpx": "palya bareliyî",
"bpy": "manîpûriya bîşnûpriyayî",
"bpz": "bilbayî",
"bqa": "tchumbuliyî",
"bqb": "bagusayî",
"bqc": "bokoyî",
"bqd": "bungî",
"bqf": "baga kaloumî",
"bqg": "bago-kusuntuyî",
"bqh": "baimayî",
"bqi": "bextiyarî",
"bqj": "bandialî",
"bqk": "banda-mbrèsî",
"bql": "bilakurayî",
"bqm": "wumbokoyî",
"bqn": "zimanê destan ê bulgarî",
"bqo": "baloyî",
"bqp": "busayî",
"bqq": "biritaiyî",
"bqr": "burusuyî",
"bqs": "bosngunî",
"bqt": "bamukumbitî",
"bqu": "boguruyî",
"bqv": "begbere-ejarî",
"bqw": "buruyî (Nîjerya)",
"bqx": "baangiyî",
"bqy": "zimanê destan ê bengkalayî",
"bqz": "bakakayî",
"br": "bretonî",
"bra": "brajî",
"brb": "laveyî",
"brc": "kreyoliya holendî ya berbiceyî",
"brd": "baraamuyî",
"brf": "berayî",
"brg": "baureyî",
"brh": "brahuiyî",
"bri": "mokpweyî",
"brj": "bieriayî",
"brk": "birgidî",
"brl": "birwayî",
"brm": "barambuyî",
"brn": "borucayî",
"bro": "brokkatî",
"brp": "barapasiyî",
"brq": "breriyî",
"brr": "biraoyî",
"brs": "barasî",
"brt": "bitareyî",
"bru": "bruyiya rojhilatî",
"brv": "bruyiya rojavayî",
"brw": "bellariyî",
"brx": "bodoyî (Hindistan)",
"bry": "buruiyî",
"brz": "bîlbîlî",
"bsa": "abînomnî",
"bsb": "bisayayiya bruneyî",
"bsc": "bassariyî",
"bse": "wushiyî",
"bsf": "bawçiyî",
"bsg": "başkardiyî",
"bsh": "kamkata-viriyî",
"bsi": "bassossiyî",
"bsj": "bangwinjiyî",
"bsk": "buruşaskiyî",
"bsl": "basa-gumnayî",
"bsm": "busamiyî",
"bsn": "barasanayî",
"bso": "busoyî",
"bsp": "baga sitemuyî",
"bsq": "bassayî",
"bsr": "bassa-kontagorayî",
"bss": "akooseyî",
"bst": "basketoyî",
"bsu": "bahonswayî",
"bsv": "baga sobaneyî",
"bsw": "baysoyî",
"bsx": "yangkamî",
"bsy": "sabah bisayayî",
"bta": "batayî",
"btc": "batî (Kamerûn)",
"btd": "batakiya dairî",
"bte": "gamo-ningiyî",
"btf": "birgîtî",
"btg": "gagnoa betî",
"bth": "biatah bidayuhî",
"bti": "burateyî",
"btj": "malayiya bakanîsî",
"btk-pro": "proto-batakî",
"btm": "batakiya mandaîlîng",
"btn": "ratagnonî",
"bto": "iriga bikolanoyî",
"btp": "budibudî",
"btq": "batekî",
"btr": "baetorayî",
"bts": "batakiya simalungun",
"btt": "bete-bendiyî",
"btu": "batuyî",
"btv": "bateriyî",
"btw": "butuanonî",
"btx": "batakiya karo",
"bty": "bobotî",
"btz": "batakiya alas-kluet",
"bua": "buryatî",
"bub": "buayî",
"bud": "ntçamî",
"bue": "beothukî",
"buf": "buşûngî",
"bug": "bugî",
"buh": "younuo bunuyî",
"bui": "bongiliyî",
"buj": "basa-gurmanayî",
"buk": "bukawayî",
"bum": "buluyî (Kamerûn)",
"bun": "şerbroyî",
"buo": "tereiyî",
"bup": "busoayî",
"buq": "bremî",
"bus": "bokobaruyî",
"but": "bungainî",
"buu": "buduyî",
"buv": "bunî",
"buw": "bubiyî",
"bux": "boghomî",
"buy": "mmaniyî",
"bva": "bareinî",
"bvb": "bubeyî",
"bvc": "baeleleayî",
"bvd": "baegguyî",
"bve": "malayiya berau",
"bvf": "boorî",
"bvg": "bonkengî",
"bvh": "bureyî",
"bvi": "belanda viriyî",
"bvj": "baanî",
"bvk": "bukatî",
"bvl": "zimanê destan ê bolîvyayî",
"bvm": "bamunkayî",
"bvn": "bunayî",
"bvo": "bolgoyî",
"bvp": "bumangî",
"bvq": "birriyî",
"bvr": "burarrayî",
"bvt": "batî (Endonezya)",
"bvu": "malayiya bukitî",
"bvv": "banivayî",
"bvw": "bogayî",
"bvx": "baboleyî",
"bvy": "baybayanonî",
"bvz": "bawziyî",
"bwa": "bwatûyî",
"bwb": "namosî-naytasîrî-serwayî",
"bwc": "bwileyî",
"bwd": "biwaydokayî",
"bwe": "bwe karenî",
"bwf": "boselewayî",
"bwg": "barweyî",
"bwh": "bişuoyî",
"bwi": "baniwayî",
"bwj": "laa laa bwamuyî",
"bwk": "bauwakiyî",
"bwl": "bwelayî",
"bwm": "biwatî",
"bwn": "wunay bunuyî",
"bwo": "şinaşayî",
"bwp": "mandobo bawahî",
"bwq": "boboyiya başûrî",
"bwr": "burayî",
"bws": "bombomayî",
"bwt": "bafawî",
"bwu": "bulî (Gana)",
"bww": "bwayî",
"bwx": "bu-nao bunuyî",
"bwy": "cwi bwamuyî",
"bwz": "bwisiyî",
"bxa": "bauroyî",
"bxb": "belanda borî",
"bxc": "molengueyî",
"bxd": "pelayî",
"bxe": "ongotayî",
"bxf": "bilurî",
"bxg": "bangalayî",
"bxh": "buhutuyî",
"bxi": "pirlatapayî",
"bxj": "bayunguyî",
"bxk": "bukusuyî",
"bxl": "jalkunanî",
"bxn": "burdunayî",
"bxo": "barikançîyî",
"bxp": "bebilî",
"bxq": "beeleyî",
"bxs": "busamî",
"bxv": "berakouyî",
"bxw": "bankayî",
"bxz": "binahariyî",
"bya": "batakiya palawan",
"byb": "bikyayî",
"byc": "ubaxarayî",
"byd": "benyadu'",
"bye": "pouyeyî",
"byf": "beteyî",
"byg": "baygoyî",
"byh": "bujhyalî",
"byi": "buyuyî",
"byj": "binawayî",
"byk": "biaoyî",
"byl": "bayonoyî",
"bym": "bidyarayî",
"byn": "blinî",
"byo": "biyoyî",
"byp": "bumajiyî",
"byq": "basayî",
"byr": "baruyayî",
"bys": "burakî",
"byt": "bertiyî",
"byv": "medumbayî",
"byw": "belhariyayî",
"byx": "qaqetî",
"byz": "banaroyî",
"bza": "bandiyî",
"bzb": "andioyî",
"bzd": "bribriyî",
"bze": "jenaama bozoyî",
"bzf": "boikinî",
"bzg": "babuzayî",
"bzh": "mapos buangî",
"bzi": "bisuyî",
"bzj": "kreyoliya belizeyî",
"bzk": "kreyoliya nîkaraguayî",
"bzl": "boanoyî (sulawesî)",
"bzm": "bolondoyî",
"bzn": "boanoyî (Maluku)",
"bzo": "bozabayî",
"bzp": "kemberanoyî",
"bzq": "bulî",
"bzr": "biriyî",
"bzs": "zimanê destan ê brezîlî",
"bzu": "burmesoyî",
"bzv": "bebeyî",
"bzw": "basayî",
"bzx": "bozoyiya hainyaxo",
"bzy": "obanlikuyî",
"bzz": "evantî",
"ca": "katalanî",
"caa": "ç'orti'",
"cab": "garîfunayî",
"cac": "çujî",
"cad": "caddoyî",
"cae": "laalaayî",
"caf": "karrieriya başûrî",
"cag": "nivacleyî",
"cah": "cahuaranoyî",
"caj": "çaneyî",
"cak": "kaqçikelî",
"cal": "karolînî",
"cam": "cemuhî",
"can": "çambriyî",
"cao": "çacoboyî",
"cap": "çipayayî",
"caq": "car nicobareseyî",
"car": "galîbî karîbî",
"cas": "tsimaneyî",
"cau-abz-pro": "proto-abxazî-abazayî",
"cau-ava-pro": "proto-avaro-andî",
"cau-cir-pro": "proto-çerkezî",
"cau-drg-pro": "proto-dargwayî",
"cau-lzg-pro": "proto-lezghî",
"cau-nec-pro": "proto-qefqaziya bakur-rojhilatî",
"cau-nkh-pro": "proto-nakhî",
"cau-nwc-pro": "proto-qefqaziya bakur-rojavayî",
"cau-tsz-pro": "proto-tsezî",
"cav": "cavineñayî",
"caw": "callawallayî",
"cax": "çiquitanoyî",
"cay": "cayugayî",
"caz": "caniçanayî",
"cba-ata": "atanquesî",
"cba-cat": "catio çibçayî",
"cba-dor": "dorasqueyî",
"cba-dui": "duitî",
"cba-hue": "huetarî",
"cba-nut": "nutabeyî",
"cba-pro": "proto-çîbçanî",
"cbb": "cabiyariyî",
"cbc": "carapanayî",
"cbd": "carijonayî",
"cbg": "çimilayî",
"cbi": "çaçiyî",
"cbj": "ede cabeyî",
"cbk": "çavacanoyî",
"cbl": "bualkhaw çinî",
"cbn": "nyah kurî",
"cbo": "izorayî",
"cbq": "şubayî",
"cbr": "caşibo-cacataiboyî",
"cbs": "caşinahuayî",
"cbt": "çayahuitayî",
"cbu": "candoşi-şaprayî",
"cbv": "cacuayî",
"cbw": "kinabalianî",
"cby": "carabayoyî",
"cca": "caucayî",
"ccc": "çamicuroyî",
"ccd": "cafundóî",
"cce": "çopiyî",
"ccg": "çamba dakayî",
"cch": "atsamî",
"ccj": "kasangayî",
"ccl": "cutçi-swahiliyî",
"ccm": "malaccan creole malayî",
"ccn-pro": "proto-qefqaziya bakurî",
"cco": "comaltepec çinantecî",
"ccp": "çakmayî",
"ccr": "cacaoperayî",
"ccs-gzn-pro": "proto-gurcî-zanî",
"ccs-pro": "proto-kartvelî",
"cda": "çoniyî",
"cdc-cbm-pro": "proto-çadîkiya navendî",
"cdc-mas-pro": "proto-masayî",
"cdc-pro": "proto-çadîkî",
"cdd-pro": "proto-kaddoanî",
"cde": "çençuyî",
"cdf": "çiruyî",
"cdh": "çambealiyî",
"cdi": "çodriyî",
"cdj": "çurahiyî",
"cdm": "çepangî",
"cdn": "çaudangsiyî",
"cdo": "min dongî",
"cdr": "cinda-regî-tiyalî",
"cds": "zimanê destan ê çadî",
"cdy": "çadongî",
"cdz": "kodayî",
"ce": "çeçenî",
"cea": "çehalîsiya jêrîn",
"ceb": "sebwanoyî",
"ceg": "çamacocoyî",
"cel-bry-pro": "proto-brîtonî",
"cel-gal": "gallaesî",
"cel-gau": "gaulisî",
"cel-pro": "proto-keltî",
"cen": "cenî",
"cet": "centúúmî",
"cfa": "dijim-bwilimî",
"cfd": "carayî",
"cfg": "como karimî",
"cfm": "falam çinî",
"cga": "çangriwayî",
"cgc": "kagayanenî",
"cgg": "rukîgayî",
"cgk": "çocangacayî",
"ch": "çamoroyî",
"chb": "çibçayî",
"chc": "katawbayî",
"chd": "highland oaxaca çontalî",
"chf": "tabasco çontalî",
"chg": "çaxatayî",
"chh": "çinookî",
"chi-pro": "proto-çimakuanî",
"chj": "ojitlan çinantecî",
"chk": "çûkî",
"chl": "cahuillayî",
"chm": "marî",
"chn": "çinook jargonî",
"cho": "çoktawî",
"chp": "çîpewî",
"chq": "quiotepec çinantecî",
"chr": "çerokî",
"cht": "çolónî",
"chw": "çuaboyî",
"chx": "çantyalî",
"chy": "çeyenî",
"chz": "ozumacin çinantecî",
"cia": "cia-ciayî",
"cib": "ci gbeyî",
"cic": "çîkasawî",
"cid": "çimarikoyî",
"cie": "cineniyî",
"cih": "çinaliyî",
"cik": "çitkuli kinnauriyî",
"cim": "cimbrî",
"cin": "cinta largayî",
"cip": "çiapanecî",
"cir": "tiriyî",
"ciy": "çaimayî",
"cja": "çamiya rojavayî",
"cje": "çruyî",
"cjh": "çehalîsiya jorîn",
"cji": "çamalalî",
"cjk": "çokweyî",
"cjm": "çamiya rojhilatî",
"cjn": "çenapianî",
"cjo": "aşeninka pajonalî",
"cjp": "cabecarî",
"cjs": "şorî",
"cjv": "çuaveyî",
"cjy": "jinî",
"ckb": "soranî",
"ckh": "çakî",
"ckl": "cibakî",
"ckn": "kaang çinî",
"cko": "anufoyî",
"ckq": "kajakseyî",
"ckr": "kairakî",
"cks": "tayoyî",
"ckt": "çukçî",
"cku": "koasatî",
"ckv": "kavalanî",
"ckx": "cakayî",
"cky": "cakfem-muşereyî",
"ckz": "cakçiquel-quiçe mixed languageyî",
"cla": "ronî",
"clc": "çilcotinî",
"cld": "çaldean neo-aramaicî",
"cle": "lealao çinantecî",
"clh": "çilissoyî",
"cli": "çakaliyî",
"clj": "laitu çinî",
"clk": "iduyî",
"cll": "çalayî",
"clm": "klallamî",
"clo": "lowland oaxaca çontalî",
"clt": "lautu çinî",
"clu": "caluyanunî",
"clw": "çulymî",
"cly": "çatinoyiya eastern highland",
"cma": "maayî",
"cmc-pro": "proto-çamîkî",
"cme": "cermayî",
"cmg": "mongoliya klasîk",
"cmi": "embera-çamiyî",
"cml": "campalagianî",
"cmm": "miçigameayî",
"cmn": "mandarînî",
"cmo": "mnongiya navendî",
"cmr": "mro çinî",
"cms": "messapicî",
"cmt": "camthoyî",
"cna": "çangthangî",
"cnb": "çinbon çinî",
"cnc": "côôngî",
"cng": "qiangiya bakurî",
"cnh": "laiyî",
"cni": "aşanînkayî",
"cnk": "khumi çinî",
"cnl": "lalana çinantecî",
"cno": "conî",
"cns": "asmatiya navendî",
"cnt": "tepetotutla çinantecî",
"cnu": "çenouayî",
"cnw": "ngawn çinî",
"cnx": "korniya navîn",
"co": "korsîkayî",
"coa": "cocos islands malayî",
"cob": "çicomuceltecî",
"coc": "cocopayî",
"cod": "cocamayî",
"coe": "koreguajeyî",
"cof": "tsafikiyî",
"cog": "çongî",
"coh": "çiçonyi-çidzihana-çikauma",
"coj": "coçimiyî",
"cok": "santa teresa corayî",
"col": "columbia-wenatçiyî",
"com": "komançî",
"con": "cofanî",
"coo": "comoxî",
"cop": "qiptî",
"coq": "coquilleyî",
"cot": "caquinteyî",
"cou": "wameyî",
"cov": "cao miaoyî",
"cow": "cowlitzî",
"cox": "nantiyî",
"coy": "coyaimayî",
"coz": "çoçotecî",
"cpa": "palantla çinantecî",
"cpb": "ucayali-yurúa aşeninkayî",
"cpc": "ajyininka apurucayaliyî",
"cpe-mar": "zimanê maroon spirit",
"cpe-spp": "samoan plantation pidginî",
"cpg": "yûnaniya kapadokyayî",
"cpi": "îngilîziya pîdgînî ya çînî",
"cpn": "çereponî",
"cpo": "kpeeyî",
"cps": "capiznonî",
"cpu": "piçis aşeninkayî",
"cpx": "puxianî",
"cpy": "south ucayali aşeninkayî",
"cqd": "çuanqiandian cluster miaoyî",
"cr": "krî",
"cra": "çarayî",
"crb": "island caribî",
"crc": "lonwolwolî",
"crd": "coeur d'aleneyî",
"crf": "caramantayî",
"crg": "mîçîfî",
"crh": "teteriya krîmî",
"cri": "sãotomenseyî",
"crj": "kriya rojhilat ya başûrî",
"crk": "kriya bejayî",
"crl": "kriya rojhilat ya bakurî",
"crm": "kriya mûsî",
"crn": "corayî",
"cro": "crowî",
"crp-gep": "greenlandic pidginî",
"crp-mpp": "macau pidgin portugalî",
"crp-rsn": "russenorskî",
"crp-tpr": "taimyr pidgin rûsî",
"crq": "iyo'wujwa çoroteyî",
"crr": "carolina algonquianî",
"crs": "kreyoliya seyşelî",
"crt": "iyojwa'ja çoroteyî",
"crv": "çaurayî",
"crw": "çrauyî",
"crx": "karriyerî",
"cry": "coriyî",
"crz": "cruzeñoyî",
"cs": "çekî",
"csa": "çiltepec çinantecî",
"csb": "kaşûbî",
"csc": "zimanê destan ê katalanî",
"csd": "zimanê destan ê çiangmayî",
"cse": "zimanê destan ê çekî",
"csf": "zimanê destan ê kûbayî",
"csg": "zimanê destan ê şîlîyî",
"csh": "aşo çinî",
"csi": "coast miwokî",
"csj": "songlai çinî",
"csk": "jola-kasayî",
"csl": "zimanê destan ê çînî",
"csm": "sierra mîwokiya navendî",
"csn": "zimanê destan ê kolombiyayî",
"cso": "soçiapam çinantecî",
"csq": "zimanê destan ê xirwatî",
"csr": "zimanê destan ê kosta rîkayî",
"css": "ohloniya başûr",
"cst": "ohloniya bakur",
"csu-bba-pro": "proto-bongo-bagirmî",
"csu-maa-pro": "proto-mangbetuyî",
"csu-pro": "proto-sudanîkiya navendî",
"csu-sar-pro": "proto-sarayî",
"csv": "sumtu çinî",
"csw": "kriya swampî",
"csy": "siyin çinî",
"csz": "coosî",
"cta": "tataltepec çatinoyî",
"ctc": "çetco-tolowayî",
"ctd": "tedim çinî",
"cte": "tepinapa çinantecî",
"ctg": "çittagonianî",
"cth": "thaiphum çinî",
"ctl": "tlacoatzintepec çinantecî",
"ctm": "çitimaçayî",
"ctn": "çhintangeyî",
"cto": "embera-catioyî",
"ctp": "çatinoyiya western highland",
"ctp-san": "san juan quiahije çatinoyî",
"cts": "bicolanoyiya northern catanduanes",
"ctt": "wayanad çettiyî",
"ctu": "çolî",
"ctz": "zacatepec çatinoyî",
"cu": "slaviya kevn",
"cua": "cuayî",
"cub": "cubeoyî",
"cuc": "usila çinantecî",
"cug": "cungî",
"cuh": "çukayî",
"cui": "cuibayî",
"cuj": "maşco piroyî",
"cuk": "kunayî",
"cul": "culinayî",
"cuo": "cumanagotoyî",
"cup": "cupeñoyî",
"cuq": "cunî",
"cur": "çhulungî",
"cus-ash": "aşraafî",
"cus-pro": "proto-kuşîtî",
"cut": "teutila cuicatecî",
"cuu": "tai yayî",
"cuv": "cuvokî",
"cuw": "çukwayî",
"cux": "tepeuxila cuicatecî",
"cuy": "cuitlatecî",
"cv": "çuvaşî",
"cvg": "çugî",
"cvn": "valle nacional çinantecî",
"cwa": "kabwayî",
"cwb": "maindoyî",
"cwd": "kriya woods",
"cwe": "kwereyî",
"cwg": "çewongî",
"cwt": "kuwaataayî",
"cy": "weylsî",
"cya": "nopala çatinoyî",
"cyb": "cayubabayî",
"cyo": "cuyunonî",
"czh": "huizhouyî",
"czk": "knaanicî",
"czn": "zenzontepekiya çatîno",
"czo": "min zhongî",
"czt": "zotung çinî",
"da": "danmarkî",
"daa": "dangaleatî",
"dac": "dambiyî",
"dad": "marikî",
"dae": "duupayî",
"dag": "dagbaniyî",
"dah": "gwahatikeyî",
"dai": "dayî",
"daj": "dar fur dajuyî",
"dak": "dakotayî",
"dal": "dahaloyî",
"dam": "damakawayî",
"dao": "daai çinî",
"daq": "dandami mariayî",
"dar": "dargwayî",
"das": "daho-dooyî",
"dau": "dar sila dajuyî",
"dav": "taitayî",
"daw": "davawenyoyî",
"dax": "dayiyî",
"daz": "daoyî",
"dba": "bangi meyî",
"dbb": "denoyî",
"dbd": "dadiyayî",
"dbe": "dabeyî",
"dbf": "edopiyî",
"dbg": "dogul domî",
"dbi": "dokayî",
"dbj": "ida'anî",
"dbl": "diyirbalî",
"dbm": "dugurî",
"dbn": "duriankereyî",
"dbo": "dulbuyî",
"dbp": "duwaiyî",
"dbq": "dabayî",
"dbr": "dabarreyî",
"dbt": "ben teyî",
"dbu": "bondum dom dogonî",
"dbv": "dunguyî",
"dbw": "bankan tey dogonî",
"dby": "dibiyasoyî",
"dcc": "deccaniyî",
"dcr": "negerhollandsî",
"dda": "dadi dadiyî",
"ddd": "dongotonoyî",
"dde": "doondoyî",
"ddg": "fatalukuyî",
"ddi": "diodioyî",
"ddj": "jaruyî",
"ddn": "dendiyî",
"ddo": "tsezî",
"ddr": "dhudhuroayî",
"dds": "donno so dogonî",
"ddw": "dawera-daweloorî",
"de": "almanî",
"dec": "dagikî",
"ded": "deduayî",
"dee": "dewoinî",
"def": "dezfuliyî",
"deg": "degemayî",
"deh": "dehwariyî",
"dei": "demisayî",
"dek": "dekî",
"dem": "demî",
"den": "slaveyî",
"dep": "pidgin delawareyî",
"der": "deoriyî",
"des": "desanoyî",
"dev": "domungî",
"dez": "dengeseyî",
"dga": "dagaareyiya başûrî",
"dgb": "bunogeyî",
"dgc": "casiguran dumagat agtayî",
"dgd": "dagarî",
"dge": "degenanî",
"dgg": "dogayî",
"dgh": "dghwedeyî",
"dgi": "dagarayiya bakurî",
"dgk": "dagbayî",
"dgn": "dagomanî",
"dgo": "hindi dogriyî",
"dgr": "dogrîbî",
"dgs": "dogosoyî",
"dgt": "ntra'ngithî",
"dgw": "daungwurrungî",
"dgx": "doghoroyî",
"dgz": "dagayî",
"dhg": "dhanguyî",
"dhi": "dhimalî",
"dhl": "dhalandjiyî",
"dhm": "zembayî",
"dhn": "dhankiyî",
"dho": "dhodiayî",
"dhr": "tharrgariyî",
"dhs": "dhaisoyî",
"dhu": "dhurgayî",
"dhv": "dehûyî",
"dhw": "danuwarî",
"dhx": "dhungalooyî",
"dia": "diayî",
"dib": "dinkayiya navendî ya başûr",
"dic": "lakota didayî",
"did": "dîdîngayî",
"dif": "dieriyî",
"dig": "digoyî",
"dii": "dimbongî",
"dij": "daiyî",
"dik": "dinkayiya başûr-rojavayî",
"dil": "dillingî",
"dim": "dimeyî",
"din": "dinkayî",
"dio": "diboyî",
"dip": "dinkayiya bakur-rojhilatî",
"dir": "dirimî",
"dis": "dimasayî",
"diu": "gcirikuyî",
"diw": "dinkayiya bakur-rojavayî",
"dix": "dixon reefî",
"diy": "diuweyî",
"diz": "dingî",
"dja": "djadjawurrungî",
"djb": "djinbayî",
"djc": "dar daju dajuyî",
"djd": "jaminjungî",
"dje": "zarmayî",
"djf": "djangunî",
"dji": "djinangî",
"djj": "ndjebbanayî",
"djk": "aukanî",
"djl": "djiwarliyî",
"djm": "jamsayî",
"djn": "djauanî",
"djo": "jangkangî",
"djr": "djambarrpuynguyî",
"dju": "kaprimanî",
"djw": "djawiyî",
"dka": "dakpayî",
"dkk": "dakkayî",
"dkr": "kuijauyî",
"dks": "dinkayiya başûr-rojhilatî",
"dkx": "mazagwayî",
"dlg": "dolganî",
"dlk": "dahalikî",
"dlm": "dalmatî",
"dln": "darlongî",
"dma": "dumayî",
"dmb": "mombo dogonî",
"dmc": "gavakî",
"dmd": "madhi madhiyî",
"dme": "dugworî",
"dmg": "kinabatanganiya jorîn",
"dmk": "domaakiyî",
"dml": "dameliyî",
"dmm": "damayî (Nîjerya)",
"dmn-dam": "damayî (Sierra leone)",
"dmn-mdw-pro": "proto-mandeyiya rojavayî",
"dmn-pro": "proto-mandeyî",
"dmo": "kemezungî",
"dmr": "damariya rojhilat",
"dms": "dampelasî",
"dmu": "dubuyî",
"dmv": "dumpasî",
"dmw": "mudburrayî",
"dmx": "demayî",
"dmy": "demtayî",
"dna": "daniya geliya grand a jorîn",
"dnd": "daondayî",
"dne": "ndendeuleyî",
"dng": "dunganî",
"dni": "daniya geliya grand a jêrîn",
"dnj": "danî",
"dnk": "dengkayî",
"dnn": "dzuunî",
"dno": "ndruloyî",
"dnr": "danaruyî",
"dnt": "daniya geliya grand a naverast",
"dnu": "danauyî",
"dnv": "danuyî",
"dnw": "daniya rojavayî",
"dny": "deniyî",
"doa": "domî",
"dob": "dobûyî",
"doc": "kamiya bakurî",
"doe": "doeyî",
"dof": "domuyî",
"dog": "dogonî",
"doh": "dongî",
"doi": "dogriyî",
"dok": "dondoyî",
"dol": "dosoyî",
"don": "dourayî",
"doo": "dongoyî",
"dop": "lukpayî",
"doq": "zimanê destan ê domînîkî",
"dor": "dori'oyî",
"dos": "dogoseyî",
"dot": "dassî",
"dov": "toka-leyayî",
"dow": "doyayoyî",
"dox": "bussayî",
"doy": "dompoyî",
"doz": "dorzeyî",
"dpp": "paparî",
"dra-mkn": "kannadayiya navîn",
"dra-okn": "kannadayiya kevn",
"dra-pro": "proto-dravidî",
"drb": "dairî",
"drc": "mindericoyî",
"drd": "darmiyayî",
"drg": "rungusî",
"dri": "lelayî",
"drl": "baagandjiyî",
"drn": "damariya rojava",
"dro": "daro-matu melanauyî",
"drq": "durayî",
"drs": "gedeoyî",
"dru": "rukaiyî",
"dru-pro": "proto-rukaî",
"dry": "daraiyî",
"dsb": "sorbiya jêrîn",
"dse": "zimanê destan ê holendî",
"dsh": "daasanaçî",
"dsi": "disayî",
"dsl": "zimanê destan ê danmarkî",
"dsn": "dusnerî",
"dso": "desiyayî",
"dsq": "tadaksahakî",
"dta": "daurî",
"dtb": "labuk-kinabatangan kadazanî",
"dtd": "ditidahtî",
"dth": "adithinngithighî",
"dti": "ana tinga dogonî",
"dtk": "tene kan dogonî",
"dtm": "tomo kan dogonî",
"dto": "tommo soyî",
"dtp": "dusuniya navendî",
"dtr": "lotudî",
"dts": "toro so dogonî",
"dtt": "toro tegu dogonî",
"dtu": "tebul ure dogonî",
"dty": "doteliyî",
"dua": "diwalayî",
"dub": "dubliyî",
"duc": "dunayî",
"due": "umiray dumaget agtayî",
"duf": "dumbeayî",
"dug": "çidurumayî",
"duh": "dungra bhilî",
"dui": "dumunî",
"duk": "uyajitayayî",
"dul": "alabat island agtayî",
"dum": "holendiya navîn",
"dun": "dusun deyahî",
"duo": "dupaningan agtayî",
"dup": "duanoyî",
"duq": "dusun malangî",
"dur": "diiyî",
"dus": "dumiyî",
"duu": "drungî",
"duv": "duvleyî",
"duw": "dusun wituyî",
"dux": "duunî",
"duy": "dicamay agtayî",
"duz": "duliyî",
"dv": "divehî",
"dva": "duauyî",
"dwa": "diriyî",
"dwr": "dawroyî",
"dwu": "dhuwalî",
"dww": "dawawayî",
"dwy": "dhuwayayî",
"dwz": "dewas raiyî",
"dya": "dyanî",
"dyb": "dyaberdyaberî",
"dyd": "dyugunî",
"dyg": "villa viciosa agtayî",
"dyi": "djiminiyî",
"dym": "yanda dogonî",
"dyn": "dyangadiyî",
"dyo": "jola-fonyiyî",
"dyu": "dyulayî",
"dyy": "dyaabugayî",
"dz": "conxayî",
"dza": "tunzuyî",
"dzg": "dazagayî",
"dzl": "dzalayî",
"dzn": "dzandoyî",
"ebg": "ebughuyî",
"ebk": "bontociya rojhilatî",
"ebr": "ebrieyî",
"ebu": "embuyî",
"ecr": "eteocretanî",
"ecs": "zimanê destan ê ekwadorî",
"ecy": "eteoqibrisî",
"ee": "eweyî",
"eee": "eyî",
"efa": "efaiyî",
"efe": "efeyî",
"efi": "efikî",
"ega": "egayî",
"egl": "emilî",
"ego": "eggonî",
"egx-dem": "demotîkî",
"egy": "misrî",
"ehu": "ehueunî",
"eip": "eipomekî",
"eit": "eitiepî",
"eiv": "askopanî",
"eja": "ejamatî",
"eka": "ekajukî",
"eke": "ekitî",
"ekg": "ekariyî",
"eki": "ekiyî",
"ekl": "kolheyî",
"ekm": "elipî",
"eko": "kotiyî",
"ekp": "ekpeyeyî",
"ekr": "yaceyî",
"eky": "kayahiya rojhilatî",
"el": "yûnanî",
"ele": "elepiyî",
"elh": "el hugeiratî",
"eli": "ndingî",
"elk": "elkeiyî",
"elm": "elemeyî",
"elo": "el moloyî",
"elu": "eluyî",
"elu-prk": "heluyî",
"elx": "îlamî",
"ema": "emaiyî",
"emb": "embalohî",
"eme": "emerillonî",
"emg": "meohangiya rojhilatî",
"emi": "mûssaû-emîrakî",
"emk": "maninkakaniya rojhilatî",
"emm": "mamuliqueyî",
"emn": "emanî",
"emp": "emberayiya bakurî",
"ems": "alutîqî",
"emu": "muriayiya rojhilatî",
"emw": "emplawasî",
"emx": "erromintxelayî",
"emy": "mayaniya epigrafîk",
"en": "îngilîzî",
"ena": "apaliyî",
"enb": "markweetayî",
"enc": "enî",
"end": "endeyî",
"enf": "forest enetsî",
"enh": "tundra enetsî",
"enl": "enlhetî",
"enm": "îngilîziya navîn",
"enn": "engenniyî",
"eno": "engganoyî",
"enq": "engayî",
"enr": "ememî",
"enu": "enuyî",
"env": "enwanî",
"enw": "enwangî",
"enx": "enxetî",
"eo": "esperantoyî",
"eot": "eotileyî",
"epi": "epieyî",
"era": "eravallanî",
"erg": "sieyî",
"erh": "eruwayî",
"eri": "ogeayî",
"erk": "efateyiya başûr",
"ero": "horpayî",
"err": "erreyî",
"ers": "ersuyî",
"ert": "eritaiyî",
"erw": "erokwanasî",
"es": "spanî",
"ese": "ese ejjayî",
"esh": "iştihardî",
"esi": "înupiatuniya bakurê alaskayê",
"esk": "înupiatuniya bakur-rojavaya alaskayê",
"esl": "zimanê destan ê misrî",
"esm": "esumayî",
"esn": "zimanê destan ê salvadorî",
"eso": "zimanê destan ê estonî",
"esq": "esselenî",
"ess": "yupikiya sîberyaya navendî",
"esu": "yupîkiya navendî",
"esx-esk-pro": "proto-eskîmo",
"esx-inu-pro": "proto-înuîtî",
"esx-pro": "proto-eskîmo-alêwîtî",
"esy": "eskayanî",
"et": "estonî",
"etb": "etebiyî",
"etc": "etçeminî",
"eth": "zimanê destan ê etîyopyî",
"etn": "etonî (Vanuatu)",
"eto": "etonî (Kamerûn)",
"etr": "edoloyî",
"ets": "yekheeyî",
"ett": "etrûskî",
"etu": "ejaghamî",
"etx": "etenî",
"etz": "semimiyî",
"eu": "baskî",
"euq-pro": "proto-baskî",
"eve": "evenî",
"evh": "uvbieyî",
"evn": "evenkî",
"ewo": "ewondoyî",
"ext": "extremaduranî",
"eya": "eyakî",
"eyo": "keiyoyî",
"eza": "ezaayî",
"eze": "uzekweyî",
"fa": "farisî",
"faa": "fasuyî",
"fab": "annoboneseyî",
"fad": "wagiyî",
"faf": "faganiyî",
"fag": "finonganî",
"fah": "baissa faliyî",
"fai": "faiwolî",
"faj": "faitayî",
"fak": "fangî (Beboid)",
"fal": "faliyiya başûr",
"fam": "famî",
"fan": "fangî (Bantu)",
"fap": "palorî",
"far": "fatalekayî",
"fau": "fayuyî",
"fax": "falayî",
"fay": "farsiya başûr-rojavayî",
"faz": "farsiya bakur-rojavayî",
"fbl": "west albay bikolî",
"fcs": "zimanê destan ê qubekî",
"fer": "ferogeyî",
"ff": "fulahî",
"ffi": "foia foiayî",
"fgr": "fongoroyî",
"fi": "fînî",
"fia": "nobiinî",
"fie": "fyerî",
"fip": "fipayî",
"fir": "firanî",
"fit": "meänkiyelî",
"fiu-fin-pro": "proto-fînî",
"fiw": "fiwagayî",
"fj": "fîjî",
"fkk": "kirya-konzelî",
"fkv": "kvenî",
"fla": "montana salişî",
"flh": "foauyî",
"fli": "faliyî",
"fll": "faliyiya bakur",
"fln": "flinders islandî",
"flr": "fuliiruyî",
"fly": "tsotsitaalî",
"fmp": "fe'fe'",
"fmu": "muriayiya rojava ya dûr",
"fng": "fanagaloyî",
"fni": "faniayî",
"fo": "ferî",
"fod": "foodoyî",
"foi": "foiyî",
"fom": "fomayî",
"fon": "fonî",
"for": "foreyî",
"fos": "sirayayî",
"fpe": "piçinglisî",
"fqs": "fasî",
"fr": "fransî",
"frd": "fordatayî",
"frm": "fransiya navîn",
"fro": "fransiya kevn",
"frp": "frankoprovansî",
"frq": "forakî",
"frr": "frîsiya bakur",
"frt": "fortsenalî",
"fse": "zimanê destan ê fînî",
"fsl": "zimanê destan li Fransayê",
"fss": "zimanê destan ê fînî-swêdî",
"fud": "futunî",
"fuj": "koyî",
"fum": "fumî",
"fun": "fulniôî",
"fur": "friyolî",
"fut": "futuna-anîwayî",
"fuu": "furuyî",
"fuy": "fuyugî",
"fvr": "furî",
"fwa": "fwâiyî",
"fwe": "fweyî",
"fy": "frîsî",
"ga": "îrlendî",
"gaa": "gayî",
"gab": "gabriyî",
"gac": "andamaniya mezin a têkel",
"gad": "gaddangî",
"gae": "warekenayî",
"gaf": "gendeyî",
"gag": "gagawzî",
"gah": "alekanoyî",
"gai": "boreiyî",
"gaj": "gadsupî",
"gak": "gamkonorayî",
"gal": "galoliyî",
"gam": "kandawoyî",
"gan": "ganî",
"gao": "gantsî",
"gap": "galî",
"gaq": "gata'",
"gar": "galeyayî",
"gas": "adiwasi garasiayî",
"gat": "kenatiyî",
"gau": "kondekorî",
"gaw": "nobonobî",
"gay": "gayoyî",
"gba": "gbayayî",
"gbb": "kaytetyeyî",
"gbd": "karadjeriyî",
"gbe": "niksekî",
"gbf": "gaikundiyî",
"gbg": "gbanziriyî",
"gbh": "defi gbeyî",
"gbi": "galelayî",
"gbj": "bodo gadabayî",
"gbk": "gaddiyî",
"gbl": "gamitî",
"gbm": "garhwaliyî",
"gbn": "mo'dayî",
"gbo": "greboyiya bakurî",
"gbp": "gbaya-bossangoayî",
"gbq": "gbaya-bozoumî",
"gbr": "gbagyiyî",
"gbs": "gbesi gbeyî",
"gbu": "gagaduyî",
"gbv": "gbanuyî",
"gbw": "gabiyî",
"gbx": "xwla gbeyiya rojhilatî",
"gby": "gbariyî",
"gcc": "malîkî",
"gcd": "ganggalidayî",
"gce": "galiceyî",
"gcf": "kreyoliya antîlleyî",
"gcl": "kreyoliya îngilîzî ya grenadî",
"gcn": "gainayî",
"gcr": "kreyoliya guwiyanîsî",
"gct": "germaniya colonia tovar",
"gd": "gaelîka skotî",
"gdb": "ollariyî",
"gdc": "gugu badhunî",
"gdd": "gêdagêdî",
"gde": "gudeyî",
"gdf": "guduf-gavayî",
"gdg": "ga'dangî",
"gdh": "gadjerawangî",
"gdi": "gundiyî",
"gdj": "kurtjarî",
"gdk": "gadangî",
"gdl": "diraşayî",
"gdm": "laalî",
"gdn": "umanakainayî",
"gdo": "godoberî",
"gdq": "mehriyî",
"gdr": "wîpiyî",
"gds": "zimanê destan ê ghandrukî",
"gdt": "kungardutyiyî",
"gdu": "guduyî",
"gdx": "godwariyî",
"gea": "gerumayî",
"geb": "kireyî",
"gec": "gboloo greboyî",
"ged": "gadeyî",
"geg": "gengleyî",
"geh": "hutterisçî",
"gei": "gebeyî",
"gej": "genî",
"gek": "gerkayî",
"gel": "fakkanciyî",
"gem-bur": "burgundî",
"gem-pro": "proto-cermenî",
"geq": "gemeyî",
"ges": "geser-goromî",
"gev": "viyayî",
"gew": "gerayî",
"gex": "garreyî",
"gey": "enyayî",
"gez": "etiyopiya klasîk",
"gfk": "patpatarî",
"gft": "gafatî",
"gga": "gaoyî",
"ggb": "gbiiyî",
"ggd": "gugadjî",
"gge": "guragoneyî",
"ggg": "gurgulayî",
"ggk": "kungarakanyî",
"ggl": "ganglauyî",
"ggn": "gurungiya rojhilatî",
"ggt": "gituayî",
"ggu": "gbanî",
"ggw": "gogodalayî",
"gha": "ghadamî",
"ghe": "ghaleyiya başûrî",
"ghh": "ghaleyî bakurî",
"ghk": "geko karenî",
"ghl": "ghulfanî",
"ghn": "ghanonggayî",
"gho": "ghomarayî",
"ghr": "gherayî",
"ghs": "guhu-samaneyî",
"ght": "kutang ghaleyî",
"gia": "kitjayî",
"gib": "gibanawayî",
"gid": "gidarî",
"gie": "guebieyî",
"gig": "goariayî",
"gih": "githabulî",
"gil": "kîrîbatî",
"gim": "gimî (Goroka)",
"gin": "hinukhî",
"gio": "gelaoyî",
"gip": "gimî (Awistronezya)",
"giq": "gelaoyiya hêşîn",
"gir": "gelaoyiya sor",
"gis": "gizigayiya bakur",
"git": "gitxsanî",
"giu": "mulaoyî",
"giw": "gelaoyiya spî",
"gix": "gilimayî",
"giy": "giyugî",
"giz": "gizigayiya başûr",
"gji": "gejiyî",
"gjk": "kaçi koliyî",
"gjm": "gunditjmarayî",
"gjn": "gonjayî",
"gju": "gojriyî",
"gka": "guyayî",
"gkd": "magiyî",
"gke": "ndaiyî",
"gkn": "gokanayî",
"gko": "kok-narî",
"gkp": "kpelleyiya gîneyî",
"gl": "galîsî",
"glc": "bon gulayî",
"gld": "nanayî",
"glh": "paşayiya bakur-rojavayî",
"glj": "kulaalî",
"glk": "gîlekî",
"glo": "galambuyî",
"glr": "glaro-twaboyî",
"glu": "gulayî",
"glw": "glavdayî",
"gly": "guleyî",
"gma": "gamberayî",
"gmb": "gula'alaayî",
"gmd": "maghdiyî",
"gme-cgo": "gothîkiya krimî",
"gmg": "magiyiyî",
"gmh": "almaniya bilind a navîn",
"gml": "almaniya jêrîn a navîn",
"gmm": "gbaya-mbodomoyî",
"gmn": "gimnimeyî",
"gmq-bot": "westrobotnî",
"gmq-gut": "gutnişî",
"gmq-jmk": "jamtîşî",
"gmq-mno": "norweciya navîn",
"gmq-oda": "danmarkiya kevn",
"gmq-osw": "swêdiya kevn",
"gmq-pro": "proto-norsî",
"gmq-scy": "skanî",
"gmu": "gumaluyî",
"gmv": "gamoyî",
"gmw-cfr": "frankoniya navendî",
"gmw-ecg": "almaniya navendî ya rojhilat",
"gmw-gts": "gottscheerîşî",
"gmw-jdt": "danmarkiya jersey",
"gmw-pro": "proto-cermeniya rojava",
"gmw-rfr": "frankoniya rhine",
"gmw-stm": "sathmar swabî",
"gmw-tsx": "saksoniya transylvanyayê",
"gmw-vog": "almaniya volga",
"gmw-zps": "almaniya zipser",
"gmx": "magomayî",
"gmy": "yûnaniya mîkenî",
"gmz": "mgboyî",
"gn": "guwaranî",
"gna": "kaansayî",
"gnb": "gangteyî",
"gnc": "guwançî",
"gnd": "zulgo-gemzekî",
"gne": "ganangî",
"gng": "ngangamî",
"gnh": "lereyî",
"gni": "gooniyandiyî",
"gnj": "ngenî",
"gnk": "ǁganayî",
"gnl": "ganguluyî",
"gnm": "ginumanî",
"gnn": "gumatjî",
"gnq": "ganayî",
"gnr": "gureng gurengî",
"gnt": "guntaiyî",
"gnu": "gnauyî",
"gnw": "guaraniyiya bolîvyaya rojavayî",
"gnz": "ganziyî",
"goa": "guroyî",
"gob": "playeroyî",
"goc": "gorakorî",
"god": "godieyî",
"goe": "gongdukî",
"gof": "gofayî",
"gog": "gogoyî",
"goh": "almaniya bilind a kevn",
"goi": "gobasiyî",
"goj": "gowlanî",
"gol": "golayî",
"gon": "gondiyî",
"goo": "gone dauyî",
"gop": "yeretuarî",
"goq": "gorapî",
"gor": "gorontaloyî",
"got": "gotî",
"gou": "gavarî",
"gow": "gorowayî",
"gox": "gobuyî",
"goy": "goundoyî",
"goz": "gozarkhaniyî",
"gpa": "gupa-abawayî",
"gpn": "taiapî",
"gqa": "ga'andayî",
"gqi": "guiqiongî",
"gqn": "kinikinaoyî",
"gqr": "gorî",
"gqu": "qauyî",
"gra": "rajput garasiayî",
"grb": "greboyî",
"grc": "yûnaniya kevn",
"grd": "guruntumî",
"grg": "madiyî",
"grh": "gbiri-niraguyî",
"gri": "garî",
"grj": "greboyiya başûrî",
"grk-cal": "yûnaniya kalabrî",
"grk-ita": "grîkoyî",
"grk-mar": "yûnaniya mariupol",
"grk-pro": "proto-helenî",
"grm": "kota marudu talantangî",
"gro": "gromayî",
"grq": "gorovuyî",
"grr": "taznatitî",
"grs": "gresiyî",
"grt": "garoyî",
"gru": "kistaneyî",
"grv": "greboyiya navendî",
"grw": "gwedayî",
"grx": "guriasoyî",
"gry": "greboyiya barclayville",
"grz": "guramalumî",
"gse": "zimanê destan ê ganayî",
"gsg": "zimanê destan ê almanî",
"gsl": "gusilayî",
"gsm": "zimanê destan ê guatemalayî",
"gsn": "gusanî",
"gso": "gbayayiya başûr-rojava",
"gsp": "wasemboyî",
"gss": "zimanê destan ê yûnanî",
"gsw": "elmanîşî",
"gta": "guatóî",
"gtu": "aghu tharrnggalayî",
"gu": "gujaratî",
"gua": "şikiyî",
"gub": "guajajarayî",
"guc": "wayuuyî",
"gud": "yocoboue didayî",
"gue": "gurindjiyî",
"guf": "gupapuynguyî",
"gug": "guaraniyiya paraguayanî",
"guh": "guahiboyî",
"gui": "guaraniyiya bolivyayî ya rojhilatî",
"guk": "gumuzî",
"gul": "gullahî",
"gum": "guambianoyî",
"gun": "mbya guaraniyî",
"guo": "guayaberoyî",
"gup": "gunwingguyî",
"guq": "açeyî",
"gur": "farefareyî",
"gus": "zimanê destan ê gîneyî",
"gut": "maleku jaikayî",
"guu": "yanomamöî",
"guv": "geyî",
"guw": "gunî",
"gux": "gourmançemayî",
"guz": "gusiiyî",
"gv": "manksî",
"gva": "kaskihayî",
"gvc": "guananoyî",
"gve": "duwetî",
"gvf": "golinî",
"gvj": "guajayî",
"gvl": "gulayî",
"gvm": "gurmanayî",
"gvn": "kuku-yalanjiyî",
"gvo": "gavião do jiparanayî",
"gvp": "para gaviãoyî",
"gvr": "gurungiya rojavayî",
"gvs": "gumawanayî",
"gvy": "guyaniyî",
"gwa": "mbatoyî",
"gwb": "gwayî",
"gwc": "kalamiyî",
"gwd": "gawwadayî",
"gwe": "gwenoyî",
"gwf": "gowroyî",
"gwg": "mooyî",
"gwi": "gwiçinî",
"gwj": "gcwiyî",
"gwm": "awngthimî",
"gwn": "gwandarayî",
"gwr": "gwereyî",
"gwt": "gawar-batiyî",
"gwu": "guwamuyî",
"gww": "kwiniyî",
"gwx": "guayî",
"gxx": "weya başûrî",
"gya": "gbayayiya bakur-rojava",
"gyb": "garusî",
"gyd": "kayardildî",
"gye": "gyemî",
"gyf": "gungabulayî",
"gyg": "gbayiyî",
"gyi": "gyeleyî",
"gyl": "gayilî",
"gym": "ngäbereyî",
"gyn": "kreyoliya îngilîzî ya guyanî",
"gyo": "gyalsumdoyî",
"gyr": "guarayuyî",
"gyy": "gunyayî",
"gza": "ganzayî",
"gzn": "ganeyî",
"ha": "hawsayî",
"haa": "hänî",
"hab": "zimanê destan ê hanoyî",
"hac": "hewramî",
"had": "hatamî",
"haf": "zimanê destan ê haiphong",
"hag": "hangayî",
"hah": "hahonî",
"hai": "haidayî",
"haj": "hajongî",
"hak": "hakkayî",
"hal": "halangî",
"ham": "hewayî",
"hao": "haköyî",
"hap": "huplayî",
"har": "harariyî",
"has": "haislayî",
"hav": "havuyî",
"haw": "hawayî",
"hax": "haidayiya başûrî",
"hay": "hayayî",
"haz": "hazaragiyî",
"hba": "hambayî",
"hbb": "hubayî",
"hbn": "heibanî",
"hbu": "habuyî",
"hca": "kreyoliya hindî ya andamanê",
"hch": "huiçolî",
"hdn": "haidayiya bakurî",
"hds": "zimanê destan ê hondurasê",
"hdy": "hadiyyayî",
"he": "îbranî",
"hea": "qiandong miaoyiya bakurî",
"hed": "herdeyî",
"heg": "helongî",
"heh": "heheyî",
"hei": "heiltsukî",
"hem": "hembayî",
"hgm": "haiǁomî",
"hgw": "haigwaiyî",
"hhi": "hoia hoiayî",
"hhr": "kerakî",
"hhy": "hoyahoyayî",
"hi": "hindî",
"hia": "lamangî",
"hib": "hibitoyî",
"hid": "hidatsayî",
"hif": "fiji hindiyî",
"hig": "kamweyî",
"hih": "pamosuyî",
"hii": "hinduriyî",
"hij": "hijukî",
"hik": "seit-kaitetuyî",
"hil": "hîlîgaynonî",
"hio": "tşwayî",
"hir": "himarimayî",
"hit": "hîtîtî",
"hiw": "hiwî",
"hix": "hixkaryanayî",
"hji": "hajiyî",
"hka": "kaheyî",
"hke": "hundeyî",
"hkk": "hunjara-kaina keyî",
"hkn": "mel-khaonhî",
"hks": "zimanê destan ê hongkongî",
"hla": "haliayî",
"hlb": "halbiyî",
"hld": "halang doanî",
"hle": "hlersuyî",
"hlt": "nga layî",
"hma": "maşan hmongiya başûrî",
"hmb": "humburi senniyî",
"hmc": "huişui hmongiya navendî",
"hmd": "a-hmaoyî",
"hme": "huişui hmongiya rojhilatî",
"hmf": "hmong donî",
"hmg": "guiyang hmongiya başûr-rojavayî",
"hmh": "huişui hmongiya başûr-rojavayî",
"hmi": "huişui hmongiya bakurî",
"hmj": "geyî",
"hmk": "maekî",
"hml": "luopohe hmongî",
"hmm": "maşan hmongiya navendî",
"hmn-pro": "proto-hmongî",
"hmp": "maşan hmongiya bakurî",
"hmq": "qiandong miaoyiya rojhilatî",
"hmr": "hmarî",
"hms": "qiandong miaoyiya başûrî",
"hmt": "hamtaiyî",
"hmu": "hamapî",
"hmv": "hmong dôî",
"hmw": "maşan hmongiya rojavayî",
"hmx-mie-pro": "proto-mienî",
"hmx-pro": "proto-hmong-mîenî",
"hmy": "guiyang hmongiya başûrî",
"hmz": "hmong şuayî",
"hna": "minayî",
"hnd": "hindkoyiya başûrî",
"hne": "çhattisgarhiyî",
"hnh": "ǁaniyî",
"hni": "haniyî",
"hnj": "hmongiya hêşîn",
"hnn": "hanunooyî",
"hno": "hindkoyiya bakurî",
"hns": "hindustaniyiya karibî",
"hnu": "hungî",
"ho": "hirî motuyî",
"hoa": "hoavayî",
"hob": "mariyiya awistronezî",
"hoc": "hoyî",
"hod": "holmayî",
"hoe": "horomî",
"hoh": "hobyótî",
"hoi": "holîkaçukî",
"hoj": "hadothiyî",
"hol": "holuyî",
"hom": "homayî",
"hoo": "holoholoyî",
"hop": "hopîyî",
"hor": "horoyî",
"hos": "zimanê destan ê ho şî minh city",
"hot": "hoteyî",
"hov": "hovonganî",
"how": "honiyî",
"hoy": "holiyayî",
"hoz": "hozoyî",
"hpo": "hponî",
"hps": "zimanê destan ê hawai'i pidgin",
"hra": "hrangkholî",
"hrc": "niwer milî",
"hre": "hreyî",
"hrk": "harukuyî",
"hrm": "horned miaoyî",
"hro": "haroiyî",
"hrp": "nhirrpiyî",
"hrt": "hertevinî",
"hru": "hrusoyî",
"hrw": "warwar feniyî",
"hrx": "hunsrikî",
"hrz": "harzaniyî",
"hsb": "sorbiya jorîn",
"hsh": "zimanê destan ê mecarî",
"hsl": "zimanê destan ê hausayî",
"hsn": "xiangî",
"hss": "harsusiyî",
"ht": "haîtî",
"hti": "hotiyî",
"hto": "minica huitotoyî",
"hts": "hadzayî",
"htu": "hitûyî",
"hu": "mecarî",
"hub": "huambisayî",
"huc": "ǁhoanî",
"hud": "huauluyî",
"huf": "humeneyî",
"hug": "huaçipaeriyî",
"huh": "huilliçeyî",
"hui": "huliyî",
"huj": "guiyang hmongiya bakurî",
"huk": "hulungî",
"hul": "hulayî",
"hum": "hunganayî",
"huo": "huyî",
"hup": "hupayî",
"huq": "tsatî",
"hur": "halkomelemî",
"hus": "wastekî",
"huu": "murui huitotoyî",
"huv": "huaveyî",
"huw": "hukuminayî",
"hux": "nüpode huitotoyî",
"huy": "hulaulayî",
"huz": "hunzibî",
"hvc": "zimanê çanda haîtî ya vodoun",
"hvk": "havekeyî",
"hvn": "sabuyî",
"hwa": "waneyî",
"hwo": "hwanayî",
"hy": "ermenî",
"hya": "hyayî",
"hyx-pro": "proto-ermenî",
"hz": "hereroyî",
"ia": "înterlîngua",
"iai": "îaaiyî",
"ian": "îatmulî",
"iar": "purariyî",
"iba": "îbanî",
"ibb": "îbibioyî",
"ibd": "îwaidjayî",
"ibe": "akpesî",
"ibg": "îbanagî",
"ibh": "bihî",
"ibl": "îbaloiyî",
"ibm": "agoiyî",
"ibn": "îbinoyî",
"ibr": "îbuoroyî",
"ibu": "îbuyî",
"iby": "îbaniyî",
"ica": "ede icayî",
"ich": "etkywanî",
"icl": "zimanê destan ê îzlandê",
"icr": "kreyoliya îngilîzî ya îslanderê",
"id": "endonezyayî",
"ida": "îdakho-isukha",
"idb": "îndo-portegîzî",
"idc": "îdonî",
"idd": "ede idacayî",
"ide": "îdereyî",
"idi": "îdî",
"idr": "îndriyî",
"ids": "îdesayî",
"idt": "îdateyî",
"idu": "îdomayî",
"ie": "înterlîngue",
"ifa": "amganad ifugaoyî",
"ifb": "batad ifugaoyî",
"ife": "îfèî",
"iff": "îfoyî",
"ifk": "tuwali ifugaoyî",
"ifm": "teke-fuumuyî",
"ifu": "mayoyao ifugaoyî",
"ify": "keley-i kallahanî",
"ig": "îgboyî",
"igb": "ebirayî",
"ige": "îgedeyî",
"igg": "îganayî",
"igl": "îgalayî",
"igm": "kanggapeyî",
"ign": "îgnacianoyî",
"igo": "îsebeyî",
"igs": "glosayî",
"igw": "îgweyî",
"ihb": "pidgin ihayî",
"ihi": "îhievbeyî",
"ihp": "îhayî",
"ii": "yiyiya siçuwayî",
"iir-nur-pro": "proto-nuristanî",
"iir-pro": "proto-hindûîranî",
"ijc": "îzonî",
"ije": "biseniyî",
"ijj": "ede ijeyî",
"ijn": "kalabariyî",
"ijo-pro": "proto-ijoidî",
"ijs": "îjoyiya başûr-rojhilat",
"ik": "înupîakî",
"ike": "înuktitutiya kanadayî ya rojhilatî",
"iki": "îkoyî",
"ikk": "îkayî",
"ikl": "îkuluyî",
"iko": "olulumo-ikomî",
"ikp": "îkpeşiyî",
"ikr": "îkaranggalî",
"iks": "zimanê destan ê înuitî",
"ikt": "înuvialuktunî",
"ikv": "îku-gora-ankwayî",
"ikw": "îkwereyî",
"ikx": "îkî",
"ikz": "îkizuyî",
"ila": "île apeyî",
"ilb": "îlayî",
"ilg": "îlgarî",
"ili": "îli turkiyî",
"ilk": "îlongotî",
"ill": "îranunî",
"ilo": "îlokanoyî",
"ils": "zimanê destan ê navneteweyî",
"ilu": "îlîwunî",
"ilv": "îlueyî",
"ima": "mala malasarî",
"imi": "anamgurayî",
"iml": "milukî",
"imn": "îmondayî",
"imo": "îmbonguyî",
"imr": "îmroîngî",
"ims": "marsianî",
"imy": "milyanî",
"inb": "îngayî",
"inc-ash": "prakrîtiya aşokanît",
"inc-cen-pro": "proto-îndo-aryaniya navendî",
"inc-dar-pro": "proto-dardîkî",
"inc-gup": "apabhramsayiya gurjarî",
"inc-kam": "prakrîtiya kamarupî",
"inc-kha": "prakrîtiya xasa",
"inc-kho": "xolosî",
"inc-mas": "asamiya navîn",
"inc-mbn": "bengaliya navîn",
"inc-mgd": "prakrîtiya magadî",
"inc-mgu": "gujaratiya navîn",
"inc-mor": "oriyayiya navîn",
"inc-oas": "asamiya zû",
"inc-obn": "bengaliya kevn",
"inc-ogu": "gujaratiya kevn",
"inc-ohi": "hindiya kevn",
"inc-oor": "oriyayiya kevn",
"inc-ork": "kamtayiya kevn",
"inc-pro": "proto-hindûaryanî",
"inc-psc": "prakrîtiya paysakî",
"inc-sap": "apabhramsayiya sawurasenî",
"inc-tak": "apabhramsayiya takkayî",
"inc-vra": "apabhramsayiya vrakadayî",
"ine-ana-pro": "proto-anadolî",
"ine-bsl-pro": "proto-balto-slavî",
"ine-pae": "paeonî",
"ine-pro": "proto-hindûewropî",
"ine-toc-pro": "proto-toçarî",
"ing": "deg xinagî",
"inh": "îngûşî",
"inj": "jungle ingayî",
"inl": "zimanê destan ê endonezyayî",
"inm": "minaeanî",
"inn": "îsinaiyî",
"ino": "înoke-yateyî",
"inp": "îñapariyî",
"ins": "zimanê destan ê hîndî",
"int": "înthayî",
"inz": "înesenyoyî",
"io": "îdoyî",
"ior": "înorî",
"iou": "tuma-irumuyî",
"iow": "çiwereyî",
"ipi": "îpiliyî",
"ipo": "îpikoyî",
"iqu": "îquitoyî",
"iqw": "îkwoyî",
"ira-kms-pro": "proto-komisenî",
"ira-mny-pro": "proto-munji-yidgha",
"ira-mpr-pro": "proto-medo-partî",
"ira-pat-pro": "proto-pathanî",
"ira-pro": "proto-îranî",
"ira-sgc-pro": "proto-sogdîkî",
"ira-sgi-pro": "proto-sangleçî-îşkaşîmî",
"ira-shr-pro": "proto-şughnî-roşanî",
"ira-shy-pro": "proto-şughnî-yazgulamî",
"ira-sym-pro": "proto-şughnî-yazghulamî-munjî",
"ira-wnj": "vanjî",
"ira-zgr-pro": "proto-zaza-hewramî",
"ire": "îresimî",
"irh": "îrarûtûyî",
"iri": "rigweyî",
"irk": "îraqwî",
"irn": "îrantxeyî",
"iro-ere": "erieyî",
"iro-min": "mingoyî",
"iro-pro": "proto-iroquoyî",
"irr": "îrî",
"iru": "îrulayî",
"irx": "kamberauyî",
"iry": "îrayayî",
"is": "îzlendî",
"isa": "îsabiyî",
"isc": "îsconahuayî",
"isd": "îsnagî",
"ise": "zimanê destan ê îtalî",
"isg": "zimanê destan ê îrlendî",
"ish": "esanî",
"isi": "nkem-nkumî",
"isk": "îşkaşimiyî",
"ism": "masimasiyî",
"isn": "îsanzuyî",
"iso": "îsokoyî",
"isr": "zimanê destan ê îsraêlî",
"ist": "îstriyotî",
"isu": "îsuyî",
"it": "îtalî",
"itb": "binongan itnegî",
"itc-ola": "latîniya kevn",
"itc-pro": "proto-îtalî",
"itd": "başûrî tidongî",
"ite": "îteneyî",
"iti": "înlaod itnegî",
"itk": "îtaliya cihû",
"itl": "îtelmenî",
"itm": "îtu mbon uzoyî",
"ito": "îtonamayî",
"itr": "îteriyî",
"its": "îsekiriyî",
"itt": "maeng itnegî",
"itv": "îtawitî",
"itw": "îtoyî",
"itx": "îtikî",
"ity": "moyadan itnegî",
"itz": "îtzayî",
"iu": "înuîtî",
"ium": "îu mienî",
"ivb": "îbatanî",
"ivv": "îvatanî",
"iwk": "î-wakî",
"iwm": "îwamî",
"iwo": "îwurî",
"iws": "sepik iwamî",
"ixc": "îxcatecî",
"ixl": "îxilî",
"iya": "îyayuyî",
"iyo": "mesakayî",
"iyx": "yaayî",
"izh": "îngriyî",
"izi": "îzi-ezaa-îkwo-mgboyî",
"izr": "îzereyî",
"izz": "îziyî",
"ja": "japonî",
"jaa": "jamamadiyî",
"jab": "hyamî",
"jac": "jakaltekî",
"jad": "jahankayî",
"jae": "jabemî",
"jaf": "jarayî",
"jah": "jah hutî",
"jaj": "zazaoyî",
"jal": "yalahatanî",
"jam": "kreyoliya jameîkî",
"jan": "jandayî",
"jao": "yanyuwayî",
"jaq": "yaqayî",
"jas": "javayiya kaledonî ya nû",
"jat": "jakatiyî",
"jau": "yaurî",
"jax": "jambî malayî",
"jay": "yan-nhanguyî",
"jaz": "jaweyî",
"jbe": "berberiya cihû",
"jbj": "arandaiyî",
"jbk": "barikewayî",
"jbn": "nefusayî",
"jbo": "lojbanî",
"jbr": "jofotek-bromnyayî",
"jbt": "jabutiyî",
"jbu": "jukun takumî",
"jbw": "yawijibayayî",
"jcs": "zimanê destan ê jamaîkî country",
"jct": "krymçakî",
"jda": "jadî",
"jdg": "jadgaliyî",
"jdt": "tatiya cihû",
"jeb": "jeberoyî",
"jee": "jerungî",
"jeg": "jengî",
"jeh": "jehî",
"jei": "yeiyî",
"jek": "jeri kuoyî",
"jel": "yelmekî",
"jen": "dzayî",
"jer": "jereyî",
"jet": "manemî",
"jeu": "jonkor bourmataguilî",
"jgb": "ngbeeyî",
"jgk": "gwakî",
"jgo": "ngombayî",
"jhi": "jehaiyî",
"jhs": "zimanê destan ê jhankotî",
"jia": "jinayî",
"jib": "jibuyî",
"jic": "tolî",
"jid": "buyî",
"jie": "jilbeyî",
"jig": "jinguluyî",
"jih": "şangzhaiyî",
"jii": "jiidduyî",
"jil": "jilimî",
"jim": "jimjimenî",
"jio": "jiamaoyî",
"jiq": "guanyinqiaoyî",
"jit": "jitayî",
"jiu": "youle jinuoyî",
"jiv": "şuarî",
"jiy": "buyuan jinuoyî",
"jje": "jejuyî",
"jjr": "zharî",
"jka": "kaerayî",
"jko": "kuboyî",
"jkr": "koroyî (Hindistan)",
"jku": "labirî",
"jle": "ngileyî",
"jls": "zimanê destan ê jamaîkî",
"jma": "dimayî",
"jmb": "zumbunî",
"jmc": "maçameyî",
"jmd": "yamdenayî",
"jmi": "jimiyî",
"jml": "jumliyî",
"jmn": "makuri nagayî",
"jmr": "kamarayî",
"jmw": "mouwaseyî",
"jmx": "juxtlahuaca mixteciya rojavayî",
"jna": "jangşungî",
"jnd": "jandavrayî",
"jng": "yangmanî",
"jni": "janjiyî",
"jnj": "yemsayî",
"jnl": "rawatî",
"jns": "jaunsariyî",
"job": "jobayî",
"jod": "wojenakayî",
"jor": "jorayî",
"jos": "zimanê destan ê urdunî",
"jow": "jowuluyî",
"jpr": "farsiya cihû",
"jpx-pro": "proto-japonîkî",
"jpx-ryu-pro": "proto-ryukyuanî",
"jqr": "jaqaruyî",
"jra": "jarayî",
"jrb": "cihû-erebî",
"jrr": "jiruyî",
"jru": "japreriayî",
"jsl": "zimanê destan ê japonî",
"jua": "júmayî",
"jub": "wannuyî",
"juc": "jurçenî",
"jud": "worodougouyî",
"juh": "honeyî",
"jui": "ngadcurî",
"juk": "wapanî",
"jul": "jirelî",
"jum": "jumjumî",
"jun": "juangî",
"juo": "jibayî",
"jup": "hupdëî",
"jur": "jurúnayî",
"jus": "zimanê destan ê jumlayî",
"jut": "jutişî",
"juu": "juyî",
"juw": "wãphayî",
"juy": "jurayî",
"jv": "javayî",
"jvd": "javindoyî",
"jvn": "javayiya karîbî",
"jwi": "jwira-pepesayî",
"jye": "cihû-erebiya yemenî",
"jyy": "jayayî",
"ka": "gurcî",
"kaa": "karakalpakî",
"kab": "kabîlî",
"kac": "cingphoyî",
"kad": "kadarayî",
"kae": "ketangalanî",
"kaf": "katsoyî",
"kag": "kajamanî",
"kah": "fer",
"kai": "karekareyî",
"kaj": "jjuyî",
"kak": "kayapa kallahanî",
"kam": "kambayî",
"kao": "kassonkeyî",
"kap": "bezhtayî",
"kaq": "capanahuayî",
"kar-pro": "proto-karenî",
"kaw": "javayiya kevn",
"kax": "kaoyî",
"kay": "kamayurayî",
"kba": "kalarkoyî",
"kbb": "kaxuyanayî",
"kbc": "kadiweuyî",
"kbd": "kabardî",
"kbe": "kanjuyî",
"kbh": "camsayî",
"kbi": "kaptiauyî",
"kbj": "kariyî",
"kbk": "grass koiariyî",
"kbm": "iwalî",
"kbn": "kareyî (Afrîka)",
"kbo": "kelikoyî",
"kbp": "kabiyeyî",
"kbq": "kamanoyî",
"kbr": "kafayî",
"kbs": "kandeyî",
"kbt": "gabadiyî",
"kbu": "kabutrayî",
"kbv": "kamberataroyî",
"kbw": "kaîepî",
"kbx": "ap mayî",
"kbz": "duhwayî",
"kca": "xantî",
"kcb": "kawaçayî",
"kcc": "lubilayî",
"kcd": "ngkâlmpw kanumî",
"kce": "kaiviyî",
"kcf": "ukaanî",
"kcg": "tyapî",
"kch": "vonoyî",
"kci": "kamantanî",
"kcj": "kobianayî",
"kck": "kalangayî",
"kcl": "kalayî",
"kcm": "tar gulayî",
"kcn": "nubiyî",
"kco": "kinalaknayî",
"kcp": "kangayî",
"kcq": "kamoyî",
"kcr": "katlayî",
"kcs": "koenoemî",
"kct": "kaianî",
"kcu": "kikamiyî",
"kcv": "keteyî",
"kcw": "kabwariyî",
"kcx": "kaçama-ganjuleyî",
"kcy": "korandjeyî",
"kcz": "konongoyî",
"kda": "worimiyî",
"kdc": "kutuyî",
"kdd": "yankunytjatjarayî",
"kde": "makondeyî",
"kdf": "mamusiyî",
"kdg": "sebayî",
"kdh": "temî",
"kdi": "kumamî",
"kdj": "karamojongî",
"kdk": "numeeyî",
"kdl": "tsikimbayî",
"kdm": "kagomayî",
"kdn": "kundayî",
"kdp": "kaningdon-nindemî",
"kdq": "koçî",
"kdr": "karaîmî",
"kdt": "kuyî",
"kdu": "kadaruyî",
"kdv": "kadoyî",
"kdw": "konerawî",
"kdx": "kamî",
"kdy": "kederî",
"kdz": "kwajayî",
"kea": "kapverdî",
"keb": "keleyî",
"kec": "keigayî",
"ked": "kereweyî",
"kee": "keresiya rojhilatî",
"kef": "kpessiyî",
"keg": "teseyî",
"keh": "keakî",
"kei": "keyî",
"kej": "kadarî",
"kek": "q'eqçiyî",
"kel": "kela-yelayî",
"kem": "kemakî",
"ken": "kenyangî",
"keo": "kakwayî",
"kep": "kaikadiyî",
"keq": "kamarî",
"ker": "kerayî",
"kes": "kugboyî",
"ket": "ketî",
"keu": "akebuyî",
"kev": "kanikkaranî",
"kew": "kewayî",
"kex": "kuknayî",
"key": "kupiayî",
"kez": "kukeleyî",
"kfa": "kodavayî",
"kfb": "kolamiyî",
"kfc": "konda-dorayî",
"kfd": "korra koragayî",
"kfe": "kotayî (Hindistan)",
"kff": "koyayî",
"kfg": "kudiyayî",
"kfh": "kuriçiyayî",
"kfi": "kannada kurumbayî",
"kfj": "kemiehuayî",
"kfk": "kinnauriyî",
"kfl": "kungî",
"kfn": "kukî",
"kfo": "koroyî (Afrîkaya rojava)",
"kfp": "korwayî",
"kfq": "korkuyî",
"kfr": "kaççiyî",
"kfs": "bilaspuriyî",
"kft": "kanjariyî",
"kfu": "katkariyî",
"kfv": "kurmukarî",
"kfw": "kharam nagayî",
"kfx": "kullu pahariyî",
"kfy": "kumaoniyî",
"kfz": "koromfeyî",
"kg": "kîkongoyî",
"kga": "koyagayî",
"kgb": "kaweyî",
"kgd": "kataangî",
"kge": "komeringî",
"kgf": "kubeyî",
"kgg": "kusundayî",
"kgi": "zimanê destan ê selangorî",
"kgj": "gamale khamî",
"kgk": "kaiwayî",
"kgl": "kunggariyî",
"kgm": "karipúnayî",
"kgn": "karinganiyî",
"kgo": "krongoyî",
"kgp": "kayingangî",
"kgq": "kamoroyî",
"kgr": "abunî",
"kgs": "kumbainggarî",
"kgt": "somyevî",
"kgu": "kobolî",
"kgv": "karasî",
"kgw": "karon doriyî",
"kgx": "kamaruyî",
"kgy": "kyerungî",
"kha": "khasiyî",
"khb": "lueyî",
"khc": "tukang besiya bakur",
"khd": "bädi kanumî",
"khe": "korowaiyî",
"khf": "khuenî",
"khh": "kehuyî",
"khi-kho-pro": "proto-khoeyî",
"khi-kun": "ǃkungî",
"khj": "kuturmiyî",
"khl": "lusiyî",
"khn": "khandeşiyî",
"kho": "xotanî",
"khp": "kapauriyî",
"khq": "koyra çiiniyî",
"khr": "khariayî",
"khs": "kasuayî",
"kht": "khamtiyî",
"khu": "nkhumbiyî",
"khv": "khvarşiyî",
"khw": "khowarî",
"khx": "kanuyî",
"khy": "ekeleyî",
"khz": "keaparayî",
"ki": "kîkûyûyî",
"kia": "kimî",
"kib": "koalibî",
"kic": "kîkapûyî",
"kid": "koşinî",
"kie": "kibetî",
"kif": "parbate khamiya rojhilatî",
"kig": "kimaamayî",
"kih": "kilmeriyî",
"kii": "kitsaiyî",
"kij": "kîlîvîlayî",
"kil": "kariyayî",
"kim": "tofalarî",
"kio": "kiowayî",
"kip": "şeşi khamî",
"kiq": "kosadleyî",
"kis": "kîsî",
"kit": "agobî",
"kiv": "kimbuyî",
"kiw": "kiwaiyiya bakur-rojhilat",
"kix": "khiamniungan nagayî",
"kiy": "kirikiriyî",
"kiz": "kisiyî",
"kj": "kwanyamayî",
"kja": "mlapî",
"kjb": "q'anjob'alî",
"kjc": "konjoyiya beravî",
"kjd": "kiwaiyiya başûrî",
"kje": "kîsarî",
"kjg": "khmuyî",
"kjh": "xakasî",
"kji": "zabanayî",
"kjj": "khinalugî",
"kjk": "highland konjoyî",
"kjl": "khamî",
"kjm": "khangî",
"kjn": "kunjenî",
"kjo": "harijan kinnauriyî",
"kjp": "pwoyiya rojhilatî",
"kjq": "keresiya rojavayî",
"kjr": "kuruduyî",
"kjs": "kewayiya rojhilat",
"kjt": "phrae pwoyî",
"kju": "kaşayayî",
"kjx": "ramopayî",
"kjy": "eraveyî",
"kjz": "bumthangkhayî",
"kk": "qazaxî",
"kka": "kakandayî",
"kkb": "kwerisayî",
"kkc": "odoodeeyî",
"kkd": "kinukuyî",
"kke": "kakabeyî",
"kkf": "kalaktang monpayî",
"kkg": "mabaka valley kalingayî",
"kkh": "khünî",
"kki": "kaguluyî",
"kkj": "kakoyî",
"kkk": "kokotayî",
"kkl": "kosarek yaleyî",
"kkm": "kiongî",
"kkn": "kon keuyî",
"kko": "karkoyî",
"kkp": "koko-berayî",
"kkq": "kaikuyî",
"kkr": "kir-balarî",
"kks": "kirfiyî",
"kkt": "koiyî",
"kku": "tumiyî",
"kkv": "kangeanî",
"kkw": "teke-kukuyayî",
"kkx": "kohinî",
"kky": "guugu yimidhirrî",
"kkz": "kaskayî",
"kl": "kalalîsûtî",
"kla": "klamatî-modokî",
"klb": "kiliwayî",
"klc": "kolbilayî",
"kld": "gamîlaraayî",
"kle": "kulungî",
"klf": "kendejeyî",
"klg": "tagakaulu kalaganî",
"klh": "welikiyî",
"kli": "kalumpangî",
"klj": "khalajî",
"klk": "konoyî (Nîjerya)",
"kll": "kagan kalaganî",
"klm": "kolomî",
"kln": "kalencînî",
"klo": "kapyayî",
"klp": "kamasayî",
"klq": "rumuyî",
"klr": "khalingî",
"kls": "kalaşayî",
"klt": "nuknayî",
"klu": "klaoyî",
"klv": "maskelynesî",
"klw": "linduyî",
"klx": "koluwawayî",
"kly": "kalaoyî",
"klz": "kabolayî",
"km": "ximêrî",
"kma": "konniyî",
"kmb": "kimbunduyî",
"kmc": "kamiya başûrî",
"kmd": "madukayang kalingayî",
"kme": "bakoleyî",
"kmf": "kareyî (Gîneya nû)",
"kmg": "kâteyî",
"kmh": "kalamî",
"kmi": "kamiyî",
"kmj": "kumarbhag pahariayî",
"kmk": "limos kalingayî",
"kml": "tanudan kalingayî",
"kmm": "komî (Hindistan)",
"kmn": "awtuwî",
"kmo": "kwomayî",
"kmp": "gimmeyî",
"kmq": "kwamayî",
"kms": "kamasauyî",
"kmt": "kemtuikî",
"kmu": "kaniteyî",
"kmv": "kreyoliya fransî ya karipúna",
"kmw": "kumuyî",
"kmx": "wabodayî",
"kmy": "komayî",
"kmz": "tirkiya xorasanê",
"kn": "kannadayî",
"kna": "kanakuruyî",
"knb": "lubuagan kalingayî",
"knd": "kondayî",
"kne": "kankanaeyî",
"knf": "mankanyayî",
"kni": "kanufiyî",
"knj": "akatekî",
"knk": "kurankoyî",
"knl": "keninjalî",
"knm": "kanamariyî",
"kno": "konoyî (sierra leone)",
"knp": "kwanjayî",
"knq": "kintaqî",
"knr": "kaningrayî",
"kns": "kensiuyî",
"knt": "katukinayî",
"knu": "konoyî (Gîne)",
"knv": "taboyî",
"knx": "kendayanî",
"kny": "kanyokî",
"knz": "kalamseyî",
"ko": "koreyî",
"koa": "konomalayî",
"koc": "kpatiyî",
"kod": "kodî",
"koe": "kacipo-balesiyî",
"kof": "kubiyî",
"kog": "coguiyî",
"koh": "koyoyî",
"koi": "komî-permyakî",
"kok": "konkanî",
"kol": "kolî (Gîneya nû)",
"koo": "konzoyî",
"kop": "waubeyî",
"koq": "kotayî (Gabon)",
"kos": "kosraeyî",
"kot": "lagwanî",
"kou": "kokeyî",
"kov": "kudu-camoyî",
"kow": "kugamayî",
"koy": "koyukonî",
"koz": "korakî",
"kpa": "kuttoyî",
"kpb": "mullu kurumbayî",
"kpc": "curripacoyî",
"kpd": "kobayî",
"kpe": "kpelleyî",
"kpf": "kombayî",
"kpg": "kapîngamarancîyî",
"kph": "kplangî",
"kpi": "kofeiyî",
"kpj": "karajayî",
"kpk": "kpanî",
"kpl": "kpalayî",
"kpm": "kohoyî",
"kpn": "kepkiriwatî",
"kpo": "ikposoyî",
"kpp": "paku karenî",
"kpq": "korupun-selayî",
"kpr": "korafe-yeghayî",
"kps": "tehitî",
"kpt": "karatayî",
"kpu": "kafoayî",
"kpv": "komî-zîriyî",
"kpw": "kobonî",
"kpx": "koiariyiya çiyayî",
"kpy": "koryakî",
"kpz": "kupsabinyî",
"kqa": "mumî",
"kqb": "kovaiyî",
"kqc": "doromu-kokiyî",
"kqd": "koy sanjaq suratî",
"kqe": "kalaganî",
"kqf": "kakabaiyî",
"kqg": "kheyî",
"kqh": "kisankasayî",
"kqi": "koitabuyî",
"kqj": "koromirayî",
"kqk": "kotafon gbeyî",
"kql": "kyeneleyî",
"kqm": "khisayî",
"kqn": "kaondeyî",
"kqo": "krahniya rojhilatî",
"kqp": "kimreyî",
"kqq": "krenakî",
"kqr": "kîmaragangî",
"kqs": "kissiya bakurî",
"kqt": "kadazaniya çemê kliasê",
"kqu": "seroayî",
"kqv": "okolodî",
"kqw": "kandasî",
"kqx": "mserî",
"kqy": "kooreteyî",
"kqz": "koranayî",
"kr": "kanuriyî",
"kra": "kumhaliyî",
"krb": "karkinî",
"krc": "karaçay-balkarî",
"krd": "kairui-midikiyî",
"kre": "panarayî",
"krf": "koroyî (Vanuatu)",
"krh": "kuramayî",
"kri": "krioyî",
"krj": "kinaray-ayî",
"krk": "kerekî",
"krl": "karelî",
"krm": "krimî",
"krn": "sapoyî",
"kro-pro": "proto-kruyî",
"krp": "koropî",
"krr": "kru'ngî",
"krs": "kreşî",
"kru": "kurukhî",
"krv": "kavetî",
"krw": "krahniya rojavayî",
"krx": "karonî",
"kry": "krytsî",
"krz": "sota kanumî",
"ks": "keşmîrî",
"ksa": "şuwa-zamaniyî",
"ksb": "şambalayî",
"ksc": "kalingayiya başûrî",
"ksd": "tolaiyî",
"kse": "kuniyî",
"ksf": "bafiayî",
"ksg": "kusagheyî",
"ksi": "krisayî",
"ksj": "uareyî",
"ksk": "kansayî",
"ksl": "kumaluyî",
"ksm": "kumbayî",
"ksn": "kasiguraninî",
"kso": "kofayî",
"ksp": "kabayî",
"ksq": "kwaamiyî",
"ksr": "borongî",
"kss": "kissiyiya başûrî",
"kst": "winyeyî",
"ksu": "khamyangî",
"ksv": "kusuyî",
"ksw": "s'gaw karenî",
"ksx": "kêdangî",
"ksy": "kharia tharî",
"ksz": "kodakuyî",
"kta": "katuayî",
"ktb": "kambaatayî",
"ktc": "kholokî",
"ktd": "kokatayî",
"ktf": "kwamiyî",
"ktg": "kalkatunguyî",
"kth": "karangayî",
"kti": "muyuyiya bakur",
"ktj": "plapo krumenî",
"ktk": "kanietî",
"ktl": "koroşiyî",
"ktm": "kurtiyî",
"ktn": "karitiyanayî",
"kto": "kuotî",
"ktp": "kaduoyî",
"ktq": "katabagayî",
"ktr": "kota marudu tinagasî",
"kts": "muyuyiya başûr",
"ktt": "ketumî",
"ktu": "kitubayî",
"ktv": "katuyiya rojhilatî",
"ktw": "katoyî",
"ktx": "kaxarariyî",
"kty": "kangoyî",
"ktz": "juǀ'hoanî",
"ku": "kurmancî",
"ku-pro": "proto-kurdî",
"kub": "kutepî",
"kuc": "kwinsuyî",
"kud": "awhelawayî",
"kue": "kumanî",
"kuf": "katuyiya rojavayî",
"kug": "kupayî",
"kuh": "kuşiyî",
"kui": "kuikúroyî",
"kuj": "kuriayî",
"kuk": "kepo'",
"kul": "kulereyî",
"kum": "kumikî",
"kun": "kunamayî",
"kuo": "kumukioyî",
"kup": "kunimaipayî",
"kuq": "karipunayî",
"kus": "kusaalî",
"kut": "kutenaiyî",
"kuu": "kuskokwîmiya jorîn",
"kuv": "kurî",
"kuw": "kpaguayî",
"kux": "kukatjayî",
"kuy": "kuuku-ya'uyî",
"kuz": "kunzayî",
"kva": "bagvalalî",
"kvb": "kubuyî",
"kvc": "kovêyî",
"kvd": "kuiyî (Endonezya)",
"kve": "kalabakanî",
"kvf": "kabalaiyî",
"kvg": "kuni-boaziyî",
"kvh": "komodoyî",
"kvi": "kwangî",
"kvj": "psikyeyî",
"kvk": "zimanê destan ê koreyî",
"kvl": "brek karenî",
"kvm": "kendemî",
"kvn": "border kunayî",
"kvo": "dobelî",
"kvp": "kompaneyî",
"kvq": "geba karenî",
"kvr": "kerînçî",
"kvt": "lahta karenî",
"kvu": "yinbaw karenî",
"kvv": "kolayî",
"kvw": "wersingî",
"kvx": "parkari koliyî",
"kvy": "yintale karenî",
"kvz": "tsakwamboyî",
"kw": "kornî",
"kwa": "dâwî",
"kwb": "baayî",
"kwc": "likwalayî",
"kwd": "kwaioyî",
"kwe": "kwerbayî",
"kwf": "kwara'aeyî",
"kwg": "sara kaba demeyî",
"kwh": "kowyayî",
"kwi": "awa-cuaiquerî",
"kwj": "kwangayî",
"kwk": "kwak'walayî",
"kwl": "kofyarî",
"kwm": "kwambiyî",
"kwn": "kwangaliyî",
"kwo": "kwomtariyî",
"kwp": "kodiayî",
"kwq": "kwakî",
"kwr": "kwerî",
"kws": "kweseyî",
"kwt": "kwestenî",
"kwu": "kwakumî",
"kwv": "sara kaba naàî",
"kww": "kwintiyî",
"kwx": "khirwarî",
"kwz": "kwadiyî",
"kxa": "kayrîrûyî",
"kxb": "krobuyî",
"kxc": "khonsoyî",
"kxd": "bruneyî",
"kxe": "kakihumî",
"kxf": "manumanaw karenî",
"kxh": "karoyî",
"kxi": "keningau murutî",
"kxj": "kulfayî",
"kxk": "zayein karenî",
"kxl": "nepali kuruxî",
"kxm": "ximeriya bakurî",
"kxn": "kanowitî",
"kxo": "kanoeyî",
"kxp": "wadiyara koliyî",
"kxq": "smärky kanumî",
"kxr": "koroyî (Gîneya nû)",
"kxs": "kangjiayî",
"kxt": "koiwatî",
"kxu": "kuiyî (Hindistan)",
"kxv": "kuviyî",
"kxw": "konaiyî",
"kxx": "likubayî",
"kxy": "kayongî",
"kxz": "kerewoyî",
"ky": "kirgizî",
"kya": "kwayayî",
"kyb": "butbut kalingayî",
"kyc": "kyakayî",
"kyd": "kareyî",
"kye": "kraçeyî",
"kyf": "kouyayî",
"kyg": "keyaganayî",
"kyh": "karokî",
"kyi": "kîputî",
"kyj": "karaoyî",
"kyk": "kamayoyî",
"kyl": "kalapuyayî",
"kym": "kpatiliyî",
"kyn": "karolanosî",
"kyo": "kelonî",
"kyp": "kangî",
"kyq": "kengayî",
"kyr": "kuruayayî",
"kys": "baram kayanî",
"kyt": "kayagarî",
"kyu": "kayahiya rojavayî",
"kyv": "kayortî",
"kyw": "kudmaliyî",
"kyx": "rapoisiyî",
"kyy": "kambairayî",
"kyz": "kayabiyî",
"kza": "karaboroyiya rojavayî",
"kzb": "kaiboboyî",
"kzc": "bondoukou kulangoyî",
"kzd": "kadaiyî",
"kze": "kosenayî",
"kzf": "da'a kailiyî",
"kzg": "kikaiyî",
"kzh": "dongolawiyî",
"kzi": "kelabît bariyoyî",
"kzj": "kadazaniya beravî",
"kzk": "kazukuruyî",
"kzl": "kayeliyî",
"kzm": "kaisî",
"kzn": "kokolayî",
"kzo": "kaningiyî",
"kzp": "kaidipangî",
"kzq": "kaikeyî",
"kzr": "karangî",
"kzs": "sugut dusunî",
"kzt": "tambunan dusunî",
"kzu": "kayupulauyî",
"kzv": "komyandaretî",
"kzw": "kaririyî",
"kzx": "kamarianî",
"kzy": "kango-suayî",
"kzz": "kalabrî",
"la": "latînî",
"laa": "lapuyan subanunî",
"lab": "linear A",
"lac": "lacandonî",
"lad": "ladînoyî",
"lae": "pattaniyî",
"laf": "lafofayî",
"lag": "langiyî",
"lah": "lahndayî",
"lai": "lambyayî",
"laj": "langoyî (Uganda)",
"lak": "lakayî",
"lam": "lambayî",
"lan": "laruyî",
"lap": "kabba-lakayî",
"laq": "qabiaoyî",
"lar": "lartehî",
"las": "gur lamayî",
"lau": "labayî",
"law": "laujeyî",
"lax": "tiwayî",
"lay": "lama baiyî",
"laz": "aribwatsayî",
"lb": "luksembûrgî",
"lbb": "labelî",
"lbc": "lakkiayî",
"lbe": "lakî",
"lbf": "tinaniyî",
"lbg": "laopangî",
"lbi": "la'biyî",
"lbj": "ladakhiyî",
"lbk": "bontociya navendî",
"lbl": "libon bikolî",
"lbm": "lodhiyî",
"lbn": "lametî",
"lbo": "lavenî",
"lbq": "wamparî",
"lbr": "lorungiya bakurî",
"lbs": "zimanê destan ê libyayî",
"lbt": "laçiyî",
"lbu": "labuyî",
"lbv": "lavatbura-lamusongî",
"lbw": "tolakiyî",
"lbx": "lawanganî",
"lby": "lamu-lamuyî",
"lbz": "lardilî",
"lcc": "legenyemî",
"lcd": "lolayî",
"lce": "loncongî",
"lcf": "lubuyî",
"lch": "luçaziyî",
"lcl": "liselayî",
"lcm": "tungagî",
"lcp": "lawayiya rojavayî",
"lcq": "luhuyî",
"lcs": "lisabata-nunialiyî",
"lda": "klayî",
"ldb": "idunî",
"ldd": "lurî (Nîjerya)",
"ldg": "lenyimayî",
"ldh": "lamja-dengsa-tolayî",
"ldj": "lemoroyî",
"ldk": "leelauyî",
"ldl": "kaanî",
"ldm": "landomayî",
"ldn": "laadanî",
"ldo": "looyî",
"ldp": "tsoyî",
"ldq": "lufuyî",
"lea": "lega-şabundayî",
"leb": "lala-bisayî",
"lec": "lecoyî",
"led": "lenduyî",
"lee": "lyeleyî",
"lef": "lelemiyî",
"leh": "lenjeyî",
"lei": "lemioyî",
"lej": "lengolayî",
"lek": "leyponî",
"lel": "leleyî (Kongo)",
"lem": "nomaandeyî",
"len": "lencayiya honduranî",
"leo": "letî (Kamerûn)",
"lep": "lepçayî",
"leq": "lembenayî",
"ler": "lenkauyî",
"les": "leseyî",
"let": "lesing-gelimiyî",
"leu": "karayî (Gîneya nû)",
"lev": "lammayî",
"lew": "ledo kailiyî",
"lex": "luangî",
"ley": "lemolangî",
"lez": "lezgînî",
"lfa": "lefayî",
"lfn": "lingua franca nova",
"lg": "lugandayî",
"lga": "lunggayî",
"lgb": "laghuyî",
"lgg": "lugbarayî",
"lgh": "laghuuyî",
"lgi": "lengiluyî",
"lgk": "neververî",
"lgl": "walayî",
"lgm": "lega-mwengayî",
"lgn": "opuuoyî",
"lgq": "logbayî",
"lgr": "lengoyî",
"lgt": "pahîyî",
"lgu": "longguyî",
"lgz": "ligenzayî",
"lha": "lahayî (Viyetnam)",
"lhh": "lahayî (Endonezya)",
"lhi": "lahu şiyî",
"lhl": "lahul loharî",
"lhn": "lahananî",
"lhp": "lhokpuyî",
"lhs": "mlahsö",
"lht": "lo-togayî",
"lhu": "lahuyî",
"li": "lîmbûrgî",
"lia": "limbayiya navendî-rojava",
"lib": "likumî",
"lic": "hlaiyî",
"lid": "nyindrouyî",
"lie": "likilayî",
"lif": "limbuyî",
"lig": "ligbiyî",
"lih": "lihirî",
"lii": "lingkhimî",
"lij": "lîgûrî",
"lik": "likayî",
"lil": "lillooetî",
"lio": "likiyî",
"lip": "sekpeleyî",
"liq": "libidoyî",
"lir": "îngilîziya lîberî",
"lis": "lisuyî",
"liu": "logorikî",
"liv": "lîvonî",
"liw": "colî",
"lix": "liabukuyî",
"liy": "banda-bambariyî",
"liz": "libinzayî",
"lja": "golpayî",
"lje": "rampiyî",
"lji": "laiyoloyî",
"ljl": "li’oyî",
"ljp": "lampungî",
"ljw": "yirandaliyî",
"ljx": "yuruyî",
"lka": "lakaleiyî",
"lkb": "kabrasî",
"lkc": "kucongî",
"lkd": "lakondê",
"lke": "kenyiyî",
"lkh": "lakhayî",
"lki": "lekî",
"lkj": "remunî",
"lkl": "laeko-libuatî",
"lkm": "kalaamayayî",
"lkn": "lakonî",
"lko": "khayoyî",
"lkr": "päriyî",
"lks": "kisayî",
"lkt": "lakotayî",
"lku": "kungkariyî",
"lky": "lokoyayî",
"lla": "lala-robayî",
"llb": "loloyî",
"llc": "leleyî (Gîne)"
}
rxkmy1al09ztqkdk5rkde1fzjzgdjxm
Wîkîferheng:Dîwan/2026
4
1327120
6291992
6291958
2026-07-29T13:20:27Z
Bikarhêner
3719
/* mê yan nêr li gorî maneyê / mê yan nêr (bikaranîn dudil e) */ Bersiv
6291992
wikitext
text/x-wiki
<noinclude>{{Dîwan/arşîv-ser|2026}}</noinclude>
{{clear}}
== Daxwazên standardkirinê ==
https://ku.wiktionary.org/wiki/W%C3%AEk%C3%AEferheng:Daxwaz%C3%AAn_standardkirin%C3%AA, Gelo di vê malperê de peyvên hatîye standart kirin; ji malperê rakin? Zêde tehlîhev e. @[[Bikarhêner:Bikarhêner|Bikarhêner]]@[[Bikarhêner:Guherto|Guherto]] [[Bikarhêner:Rewiye tine|Rewiye tine]] ([[Gotûbêja bikarhêner:Rewiye tine|gotûbêj]]) 10:03, 8 kanûna paşîn 2026 (UTC)
:@[[Bikarhêner:Rewiye tine|Rewiye tine]] [[Taybet:Tercîh#mw-prefsection-gadgets]] li vir amûra [[MediaWiki:Gadget-aWa.js/belgekirin|awa]] aktîv bike û pê re dikarî gotûbêjan arşîv bikî. Li sayfa [[WF:DS]] li kêleka her sernavê gotûbêjê <nowiki>[arşîv bike]</nowiki> derdikeve, pê lê bike û ew ê arşîv bike. Eger nikarî tu tenê şablona {{ş|ds-kirî}} îlawe bike, ez ê dûre arşîv bikim. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:35, 5 tîrmeh 2026 (UTC)
== Standartkirin ==
Sala borî, min pêşnîyazek kiribû. Halî hazir piştî daxwaza standarkirinê em du heftî disekinin, eger kesek fikrek dîyar neke. Raste rast peyv li gor ferhenga standart a mezopotamyayê tê standart kirin. Ji xwe sazîyek vê karî dike çima em vê barî dikin stuyê xwe. Mesela ez çaxe di wîkîferhengê de peyvek digêrim; standart a peyvê jî li cem xwe kontrol dikim. Eger destûr hebe bi germî dikarim wê malperê standart bikim. Benda bûna du heftîyan gelo ne zehmet e? Duyemîn pêşnîyaza min nîşandana standarta peyvê di malpera de ye. Kesek dema malperan binêre, divê li jora malperan bibîne ku ev peyv standart e. Ev jî hîzmet e. Çimkî nivîskar, wergêr, edîtor, rojnemavan hez dikin bi peyvê standart binivîsin. https://ku.wiktionary.org/wiki/k%C3%AAf li vir wekî mînak min daye nîşan. Lê îfade eger wisa be: Standarda Rastnivîsîna Ferhenga Kurdî a Weqfa Mezopotamyayê kêf (r. 253) e yê çetir be. Çimkî îfadeya berê de peyva kurdî-tirkî derbas dibe û di mejîyê mirov de tevlihevî çêdibe.@[[Bikarhêner:Bikarhêner|Bikarhêner]]@[[Bikarhêner:Guherto|Guherto]] [[Bikarhêner:Rewiye tine|Rewiye tine]] ([[Gotûbêja bikarhêner:Rewiye tine|gotûbêj]]) 10:25, 8 kanûna paşîn 2026 (UTC)
:Merheba. Hevalno dîyar e karê standarkirinê li wîkîferhengê rawestîya ye. Min sê peyv ji bo standartkirinê qeyd kir. Kes li ser şîrove nenivîsî. Mehek jî li ser derbas bû. Aniha ez dikarim van rupelan biguherim. Li gor qaîdeya hatine danîn wisa ye. Daxwaza min heta niha jî ew e kelîmeyên di ferhenga standartkirinê de heyî divê em bikaribin rasterast li vir jî bikin standart. An jî demê kurttir bikin. Li weqfa mezapotamyayê 20 mirov digêhin hev li ser peyvekî seetan nîqaş dikin. Ma hewceyê em jî li vir nîqaş bikin? Tevlî vê jî ji xwe kes li ser vê mijare nasekîne van dema. Xeynî vê pêşnîyaza min nîşandana standarta peyvê di malpera de hebû. Li ser malperê 'Standarda Rastnivîsîna Ferhenga Kurdî a Weqfa Mezopotamyayê kêf (r.253) e' Tiştek mîna wî hebe yê gelek kêrî her cure nivîskarê me were. Çimkî hin nivîskarên me hez dike bi kelîmeyên standart binivîse. Di malperê de bila vê hêsanî fam bike çêtir e. @[[Bikarhêner:Bikarhêner|Bikarhêner]]@[[Bikarhêner:Ghybu|Ghybu]] [[Bikarhêner:Rewiye tine|Rewiye tine]] ([[Gotûbêja bikarhêner:Rewiye tine|gotûbêj]]) 18:35, 17 sibat 2026 (UTC)
::Merheba @[[Bikarhêner:Rewiye tine|Rewiye tine]]. Ev format pir xirab dibe. Tu dikarî li beşa Çavkaniyê binivîsî bi şablona {{ş|kitêb}} binivîsî çêtir e û tê eynî maneyê. Lê her kes standarda Weqfa Mezopotamyayê qebûl nakin û ez jî şibhê dikim ku ev websîte bi awayekî kolektîv tê çêkirin an na. Loma em bi ya kitêba rastnivisînê çêkin û eger îtîraz tinebe, şablona {{ş|ds-kirî}} li gotûbêja [[WF:DS]] binivîse, dûre li gotûbêjê arşîv bike, ne hewce ye li hêviya kesên din bisekinî. Eger itirazek hebe, ê ku dixwaze dûre dîsa şablona ds zêde bike. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:30, 5 tîrmeh 2026 (UTC)
:::[https://berwarnews.com/ferhenga-rastnivisine-qonaxeke-giring-a-standardkirina-kurmanci-ye/ Roportaja Mikail Bülbül] li ser proseya standardkirinê. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 00:57, 9 tîrmeh 2026 (UTC)
::::Min nû dît an jî nû hatiye zêdekirin lê meqaleyek bi navê [https://www.ferhengkurdi.com/?q=iltihap&modal=lijne lijneya edîtorîyê] nivîsandine [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 17:40, 22 tîrmeh 2026 (UTC)
== <span lang="en" dir="ltr">Annual review of the Universal Code of Conduct and Enforcement Guidelines</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
I am writing to you to let you know the annual review period for the Universal Code of Conduct and Enforcement Guidelines is open now. You can make suggestions for changes through 9 February 2026. This is the first step of several to be taken for the annual review. [[m:Special:MyLanguage/Universal Code of Conduct/Annual review/2026|Read more information and find a conversation to join on the UCoC page on Meta]].
The [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|Universal Code of Conduct Coordinating Committee]] (U4C) is a global group dedicated to providing an equitable and consistent implementation of the UCoC. This annual review was planned and implemented by the U4C. For more information and the responsibilities of the U4C, [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|you may review the U4C Charter]].
Please share this information with other members in your community wherever else might be appropriate.
-- In cooperation with the U4C, [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]])<section end="announcement-content" />
</div>
21:02, 19 kanûna paşîn 2026 (UTC)
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29905753 -->
== Request for comment (global AI policy) ==
<bdi lang="en" dir="ltr" class="mw-content-ltr">
Apologies for writing in English. {{int:Please-translate}}
A [[:m:Requests for comment/Artificial intelligence policy|request for comment]] is currently being held to decide on a global AI policy. {{int:Feedback-thanks-title}}
[[Bikarhêner:MediaWiki message delivery|MediaWiki message delivery]] ([[Gotûbêja bikarhêner:MediaWiki message delivery|gotûbêj]]) 00:58, 26 nîsan 2026 (UTC)
</bdi>
<!-- Message sent by User:Codename Noreste@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30424282 -->
== Guharto ==
: <small>→ Ji rûpela ''[//ku.wiktionary.org/w/index.php?title=Got%C3%BBb%C3%AAj:berf%C3%AEtik&oldid=6233338 Gotûbêj:berfîtik]'' hatiye girtin.</small>
Silav {{r|Ghybu}} ma hewce ye em guhartoyan jî kategorîze bikin? Li vê [[ژیشک]] binere, tije guhartoyên wê hene, ku em ji gişan re guhandar binivîsin dê 10 navên heman hebin di nav wê kategorîyê de. Tu çi difikirî? [[Bikarhêner:Keyomerd|Keyomerd]] ([[Gotûbêja bikarhêner:Keyomerd|gotûbêj]]) 09:40, 26 nîsan 2026 (UTC)
:{{silav|Keyomerd}}. Erê, problem çî ye? {{=)}} Ew jî tên bikaranîn... Dema ku peyvek tê çêkirin hewce ye ku em hemû agahiyên wan binivîsin: bilêvkirin, bikaranîn, mînak, terîm, herêm, tewandin, etîmolojî...
:Bi min peyvên ku wekî ''guherto'' hatine nivîsandin bi nivîsa {{w|Italic type|îtalîk|ziman=en}} (xwahr) di nav kategoriyan de werin nişan kirin (ji bo cudakirinê). {{ping|Ferhengvan|Bikarhêner}} [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 16:40, 30 nîsan 2026 (UTC)
::Yên '''''nestandard''''' di kategorîyan de biferq werin nîşandan baştir e. Qene em karibin wan ji yên stadard ferq bikin. @[[Bikarhêner:Ghybu|Ghybu]] Xêra xwe hûn sîstemeke wisa çêkin. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:36, 1 gulan 2026 (UTC)
:::Merheba @[[Bikarhêner:Keyomerd|Keyomerd]] û @[[Bikarhêner:Bikarhêner|Bikarhêner]] ev xisûsiyet jixwe di şablonên rêzimanê de heye, wextê {{param|formaalt|1}} dinivîsin, made dikeve Kategoriya [[:Kategorî:Formên alternatîv bi kurmancî]] li gorî koda zimanî jî zimanên din tê çêkirin. Hemû madeyên kurmancî bi alfabeya erebî dikevin vê kategoriyê lê nizanim ev tiştekî rast e Yan xelet e, ji bo nîşandanê min çêkiribû lê min hîn wext nedît ku nîqaşek li ser çêkim. Qaîdeyên bikaranîna vê parametreyê di wîkiya îngilîzî de jî tam ne belî ye. Du gotûbêj [https://en.wiktionary.org/wiki/Wiktionary:Requests_for_moves,_mergers_and_splits#Category:Alternative_forms_by_language] [https://en.wiktionary.org/wiki/Wiktionary:Beer_parlour/2024/June#Decluttering_the_altform_mess] çêkirine lê ji bo îngilîzî ev parametre nehatiye bikaranîn. Min ji bo nîşandanê niha [https://ku.wiktionary.org/w/index.php?title=bax%C3%A7%C3%AA_zarokan&diff=prev&oldid=6241372] ceriband lê bi min xelet e. Em çawa bikin? Kengî vê parametreyê bi kar bînin? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:29, 8 tîrmeh 2026 (UTC)
::::@[[Bikarhêner:Kurdanparez|Kurdanparez]] Tu çi difikirî? Ji bo zazakî [https://ku.wiktionary.org/w/index.php?title=a_c%C4%B1_geyrayene&oldid=6241396 wisa] bikin? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:55, 8 tîrmeh 2026 (UTC)
:::::Kategorîyekê cuda baş dibe. Wextê ku ez li kategorîya "lekêren bi zazakî" dinêrim, ez hem formê bi şikilê Johnsonê û formê standardê dibînim. Zaten wexte ku ez dikevim ê Johnsonê, min dibe formê standardê. Kategorîyekê cuda, bi taybetî ji bo nivîsandinên alternatîf, baş dibe.
:::::Lê em bîr nekin ku wextê ku em bo formên alternatîf yên devokî qal dikin, belkî adil neye ku em ev bişînin derekê din yê ku însan ewqas nabînin. [[Bikarhêner:Kurdanparez|Kurdanparez]] ([[Gotûbêja bikarhêner:Kurdanparez|gotûbêj]]) 22:03, 8 tîrmeh 2026 (UTC)
::::::@[[Bikarhêner:Kurdanparez|Kurdanparez]] Gelo min rast fêm kir? Tu dibêjî formên {{q|ku|kîvroşk}} bi dîqet werin guhartokirin lê bi yên bi alfabeya Jacobsonê hemû bikin {{param|formaalt|1}}? Formên Jacobsonê dê bikevin Kategoriya [[:Kategorî:Lêker bi zazakî|Lêker bi zazakî]] û [[:Kategorî:Lema bi zazakî|Lema bi zazakî]] yan na? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:55, 8 tîrmeh 2026 (UTC)
:::::::Bi min naxwaze di wan kategoriyan de bikeve. Wek tu dibînî dûplîkat pir hene. Bi min çareya baştir yên Johnsonê di katehgorîyekê din bikevin (bila format li rûpelan neyin guherandin, bi tenê kategorî) [[Bikarhêner:Kurdanparez|Kurdanparez]] ([[Gotûbêja bikarhêner:Kurdanparez|gotûbêj]]) 00:37, 9 tîrmeh 2026 (UTC)
== Peyvên soranî bi latînî ([[:Kategorî:Soranî]]) ==
Silav, di nav vê kategoriyê (''[[:Kategorî:Soranî]]'') de pirr peyv tenê bi alfabeya latînî hatine nivîsandin. Divê ew mutleq jî bi alfabeya erebî werin transkrîbe kirin ji ber ku soranî bi alfabeya erebî tê nivîsand... Bikarênerên ku soranî dizanin dikarin wan sererast bikin? Mînakên guhertinan: [//ku.wiktionary.org/w/index.php?title=zor%C3%AEne&curid=6584&diff=6233355&oldid=5859303], [//ku.wiktionary.org/w/index.php?title=s%C3%AAw&diff=6233097&oldid=6233003], [//ku.wiktionary.org/w/index.php?title=sewz&diff=6233313&oldid=6069107], ... Spas! [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 01:16, 2 gulan 2026 (UTC)
== <span lang="en" dir="ltr">Vote now in the 2026 U4C election</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
Eligible voters are asked to participate in the 2026 [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|Universal Code of Conduct Coordinating Committee]] election. More information–including an eligibility check, voting process information, candidate information, and a link to the vote–are available on Meta at the [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026|2026 Election information page]]. The vote closes on 2 June 2026 at [https://zonestamp.toolforge.org/1780358400 00:00 UTC].
Please vote if your account is eligible. Results will be available by 14 June 2026. -- In cooperation with the U4C,<section end="announcement-content" />
</div>
[[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]]) 17:15, 27 gulan 2026 (UTC)
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== RFC about AI-generated content in Wikimedia Commons ==
<bdi lang="en" dir="ltr">Apologies for writing in English, please help translate this message to your language. You are invited to participate in a [[c:Commons:Requests for comment/Policy update for AI content|request for comment on Wikimedia Commons about a policy update for AI content]]. This may affect files that are uploaded to Wikimedia Commons for use on this project. Thank you. [[m:User:Codename Noreste|Codename Noreste]] ([[m:User talk:Codename Noreste|gotûbêj]])</bdi> 17:12, 23 hezîran 2026 (UTC)
<!-- Message sent by User:Codename Noreste@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== <span lang="en" dir="ltr">Deployment of Legal and Safety Contacts Link in the Footer of Your Wiki</span> ==
<div lang="en" dir="ltr">
<section begin="Message"/>
'''Legal & Safety Contacts'''
Hello community, the Wikimedia Foundation has provided a [[wmf:Special:MyLanguage/Legal:Wikimedia Foundation Legal and Safety Contact Information|single legal and safety contact page]], to be linked in the footer of your wiki, to ensure access to accurate legal information. This is a regulatory requirement. We have already rolled out links to English, German, Italian, Spanish and other wikis and we will deploy to your wiki soon. [[m:Special:MyLanguage/Wikimedia_Foundation_Legal_and_Safety_Contacts_FAQ|Please read more on the project page]] and leave any comments in this thread or on the [[m:Special:MyLanguage/Talk:Wikimedia Foundation Legal and Safety Contacts FAQ|talk page]].
<section end="Message"/>
</div>
-- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 13:31, 25 hezîran 2026 (UTC)
<!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:Sannita_(WMF)/Mass_sending_test&oldid=30731267 -->
== Jêbirina ferhenga Sadallah ==
Merheba @[[Bikarhêner:Guherto|Guherto]] Îmkan heye lîsteyeke wisa çêkî ku hemû sayfeyên Cyrusbot çêkir yên ku tê de tenê tercimeyeke îngilîzî heye û ev tercime jî hatibe jêbirin? Nimûne ''[[derdzanî]], [[êşzanî]]'' tenê tercimeya [[pestology]] heye ew jî ji ber heqê telîfê hatiye jêbirin. Nimûneyeke din ''zêrrgeh'', ''zêrrkar'' [[goldsmith]] hatiye jêbirin zêr wekî zêrr hatiye guhartin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 19:48, 26 hezîran 2026 (UTC)
== Beşa Tewandin bo kurmancî ==
Bi ya min şablona {{ş|ku-tewîn-nav}} û ya fiîlê em bixin beşa Tewandinê (wekî [[şodir|zazakî]]. Bi vî awayî hem ji aliyê şiklî ve hem jî ji aliyê bikaranînê ve xweştir xuya bike. Eger di qismê Tewandinê de be, ê ku dixwaze îzah û notên xwe yan jî emilandinên din jî dikare binivîse. Hûn çi dibêjin? @[[Bikarhêner:Ferhengvan|Ferhengvan]], @[[Bikarhêner:Ghybu|Ghybu]], @[[Bikarhêner:Bikarhêner|Bikarhêner]]. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:05, 6 tîrmeh 2026 (UTC)
:Belkî em dikarin Formata şiweyan wekî ya behdînî jî têxin nav şablonê. Pir caran şiklê tabloya Tercimeyan ji ber dirêjbûna şablona teqînê jî xirab dibe wekî [[astrofizîk]]. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:08, 6 tîrmeh 2026 (UTC)
:Min mijarê te li jorê yê xwe dît, fikirên min jî hene eger baş e. Yê ku te gotiye bi min baş dibe, ji ber ku her rûpel ji vê mîna hev dibe. Em ê rindtir jî ferq li nav devokan binivîsin. [[Bikarhêner:Kurdanparez|Kurdanparez]] ([[Gotûbêja bikarhêner:Kurdanparez|gotûbêj]]) 11:44, 7 tîrmeh 2026 (UTC)
::@[[Bikarhêner:Bikarhêner|Bikarhêner]] fikr? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 08:44, 15 tîrmeh 2026 (UTC)
:::Formata ku te teklîf kirîye jî ne xerab e, baş tê xuyan. Feqet bi min halê berê (mewcûd) baştir e. Ji ber ku ev şablon (ku-tewîn-nav) bi piranî kurt in û ji bo her kesî ne mihîm e, lewma li kinarê bi formeke hebe ku karibe were vekirin û girtin baştir e. Lê belê ger şablon dirêjtir bin, em karin wekî ya wîkîya almanî bikin (ew jî wekî teklîfa te ye). -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:50, 15 tîrmeh 2026 (UTC)
== Reşwî ==
Silav ji we gî re, Pirsekê min heye.
Ez difikirim şablonekê din çê bikim boy devokek kurmancî, yê êla Reşwî. Ew lêkerên xwe hinek cuda ditewînin. Mesela te hem "ez dikim" bêjî yan jî "ez dikime", "em dikinî, em tênî, te em kuştinî" (ne "em dikin") dema xwe yek in lê maneyên xwe ne yek in, "ez bikim" "ez ê bikim" "ez bikime" û dewamên xwe hemû demên xwe yek in lê mane dîsa ne yek in.
Eger min çê kir, şûna xwe li ku derê tînim? Ez difikirim li tewandina devokên kurdî yê ku "tabên" xwe hene "kurmancîya rojavayî", "kurmancîya standard" hsw. Lê tewandin ewqes cuda ye dixwaze ku wî şablona tewandina kurdî pir were guherîn.
Hûn çi dibêjin? (R: Hûn dewên çi?) [[Bikarhêner:Kurdanparez|Kurdanparez]] ([[Gotûbêja bikarhêner:Kurdanparez|gotûbêj]]) 11:38, 7 tîrmeh 2026 (UTC)
:{{silav|Kurdanparez}} Binêre mînaka devoka ''rojhilatî'': [[Modul:ku-tewandin#L-135]] / [[Modul:ku-tewandin#L-138|L138]] / [[Modul:ku-tewandin#L-143|L-143]], .. Di nav modula ''ku-tewandin"-ê de tê çêkirin. [[Gotûbêja modulê:ku-tewandin#Paşgirên lêkeran di kurmanciya rojhilatî de]] [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 13:09, 7 tîrmeh 2026 (UTC)
::PS: Dema niha: [[Modul:ku-tewandin#L-128]]; dema borî: [[Modul:ku-tewandin#L-153]] [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 13:15, 7 tîrmeh 2026 (UTC)
:::Merheba @[[Bikarhêner:Ghybu|Ghybu]], Eger mimkin be tu dikarî yên devokî têxî binmodulekê û bila modul load bike, bi vî awayî belkî çêkirina yên nû û famkirina modulê hêsantir be? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 15:09, 7 tîrmeh 2026 (UTC)
:::Lê di devokê reşwî de hem dema niha yê statîk heye (Îng: I do -> Ez dikim) û yê progressîf heye (I am doing -> Eîz (nêr) Ez î (mê) dikime, yan jî Ez î dikime/Ez ê dikime). Reşwî ji yê standardê pirtir bo zayend ferq tîne, hem jî li dema pêşî (Ez ê bikim (Nêr) ez a bikim (Mê)). Dema pêşî jî formên cuda hene (Ezêk bikime (I will be doing it) û ez ê/a bikim (I will do it))
:::Ev di modûlê têhel bê? [[Bikarhêner:Kurdanparez|Kurdanparez]] ([[Gotûbêja bikarhêner:Kurdanparez|gotûbêj]]) 22:09, 8 tîrmeh 2026 (UTC)
== WF:Xebat ==
Min sayfeya [[WF:Xebat]] çêkir, xeletiyên ku hûn ferq dikin ji kerema xwe lê zêde bikin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 11:35, 15 tîrmeh 2026 (UTC)
== Modul:quote ==
@[[Bikarhêner:Ghybu|Ghybu]], @[[Bikarhêner:Bikarhêner|Bikarhêner]], @[[Bikarhêner:Keyomerd|Keyomerd]], @[[Bikarhêner:Ferhengvan|Ferhengvan]] Merheba, ez modula îngilîzî ya jêgirtin û çavkaniyan li gorî şablonên {{ş|jêder}} format dikim û ji bo ku hertişt wekî formata me ya niha be, gelek serê min diêşe. Ez dibêjim bila em dev ji formata niha berdin wekî ya îngilîzî bi kar bînin ji ber ku gelek xisûsiyetên îngilîzî hene ku yekî dikare biemilîne. Hûn ê bibêjin niha ji kû hat bîra tê, min got [[Wîkîferheng:Xebat#MediaWiki:Gadget-start.js|start.js]] nû bikim û min dît otomatîk çavkanî bi riya [[mw:Citoid]]ê bi riya DOI, ISBN û lînk tê çêkirin, min got wiya jî li skrîptê îlawe bikim loma min [[Wîkîferheng:Xebat#Mediawiki:Gadget-citoid-helper.js|Mediawiki:Gadget-citoid-helper.js]] hazir kir lê hin parametreyên Citoidê kêm bûn, min got ka wana rast bikim, min dît formata me ya niha ti standard bi kar nayîne tenê parametreyan bi virgulê li hev dixe.
Ez dibêjim formata îngilîzî baştir e, hem ne îtalîk e ku bi hêsanî tên xwendin, hem jî tarîx û çavkanî herî pêşî tên nîşandan ku ji bo peyitandinê bo min muhîm e. Modula îngilîzî de hema bêje her tişt hatiye çêkirin, eger em rûnin tenê yên lazim li şablona çavkaniyên xwe binivîsin ew ê gelek wext bistîne. Eger em modula îngilîzî bi kar bînin, em ê hem karibin şablonên îngilîzî bi hêsanî û rast kopî bikin hem jî kurdîkirina parametreyan gelek hêsan e. Fikir? --[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:20, 24 tîrmeh 2026 (UTC)
: Ji bo miqayesekirinê bnr. [[:en:Template:quote-book]] / [[Şablon:jêder-kitêb/ceribandin]] --[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:32, 24 tîrmeh 2026 (UTC)
::Bi min bila yê mewcûd jî bimîne, ew jî şiklen xweş û baştir e. Feqet bi min jî yên îngilîzî rehettir in, eger rastkirina yê mewcûd zehmet be, em rasterast wan ji xwe re bînin û tercime bikin. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:41, 24 tîrmeh 2026 (UTC)
:::Ez êvarê ve dixebitim, min nêzîk kiribû lê min got belkî hûn qane bibin lê xuya ye hûn ê hîn serê min gelek biêşînin {{=D}} [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:59, 24 tîrmeh 2026 (UTC)
::::@[[Bikarhêner:Bikarhêner|Bikarhêner]] û @[[Bikarhêner:Ghybu|Ghybu]] Eger îtîrazek tinebe, ez ê îtalîk ji jêgirtinê rakim... Jixwe bi riya [jêgirtin] dikare were veşartin û her daim bi * dest pê dike loma bi hêsanî tê fêmkirin û xwendin rihettir dibe. Bnr. [https://ku.wiktionary.org/w/index.php?title=W%C3%AEk%C3%AEferheng:ceribandin/nim%C3%BBne&oldid=6277132#L%C3%AAker_2 ceribandinê] [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:13, 24 tîrmeh 2026 (UTC)
== Request for comment (the future of Abstract Wikipedia) ==
<bdi lang="en" dir="ltr" class="mw-content-ltr">
Apologies if this has not yet been translated into your wiki's language. {{int:Please-translate}}
You are invited to voice your opinions in a [[:m:Requests for comment/The future of Abstract Wikipedia|request for comment about the future of Abstract Wikipedia]]. {{Int:Feedback-thanks-title}}
[[:m:User:Kowal2701|Kowal2701]] ([[:m:User talk:Kowal2701|talk]]) 12:25, 24 tîrmeh 2026 (UTC)
</bdi>
<!-- Message sent by User:DreamRimmer@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== ''mê'' yan ''nêr'' li gorî maneyê / ''mê'' yan ''nêr'' (bikaranîn dudil e) ==
[//ku.wiktionary.org/w/index.php?title=xelat&diff=prev&oldid=6291766]: Mixabin pirr bikarhêner şûnda parametreya <code>z=m/n</code> ('' m yan n li gorî maneyê'') <code>z=mn</code> (''m yan n (bikaranîn dudil e)'') bi kar tînin ([[Şablon:navdêr#Parametre]]) ji ber ku di nav her du nivîsê de pir ferq nebînin. Nizanim em ê dîsa parametreya <code>z=nt</code> (''nêtar'') çêkin, wekî berê: [//ku.wiktionary.org/w/index.php?title=W%C3%AEk%C3%AEferheng:D%C3%AEwan/ar%C5%9F%C3%AEv_2019&oldid=6104681#Zayend]. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 00:17, 28 tîrmeh 2026 (UTC)
:Merheba {{r|Ghybu}} {{demo|sep=wisa xuya dibe:<br>|<nowiki>{{navdêr|ku|kelîme|c=mn}}</nowiki>}}
Ya din jî; {{demo|sep=wisa xuya dibe:<br>|<nowiki>{{navdêr|ku|kelîme|c=m/n}}</nowiki>}}
Tu dixwazî em wana berevajî bikin? Not: nêtar ji bo kurmancî nabe, mn û m/n baş in. Berê ji ber ku m/n tinebû, her kes li gorî parametreyên heyî dixebitî. Niha hene bi min problem nîne eger em berevajî nekin.--[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 05:32, 28 tîrmeh 2026 (UTC)
: Bi min ev format baştir e:
{{demo|sep=wisa xuya dibe:<br>|<nowiki>{{navdêr|ku|kelîme|c1=m|c1etîk=Mêrdîn|c2=n|c2etîk=Dihok}}</nowiki>}}
Yan jî:
{{demo|sep=wisa xuya dibe:<br>|<nowiki>{{navdêr|ku|zayend|c1=n|c2=m|c1ref={{Jêgirtin/Celadet Alî Bedirxan/HAWAR Cild 1 Hejmar 1-23 (1932-1933)/1998|hejmar=4|sal=1938}}|c2ref={{Zana Farqînî}}}}</nowiki>}}
{{çavkanî}}
:--[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 05:49, 28 tîrmeh 2026 (UTC)
::Feqat em dikarin li şûna {{param2|c|m/n}}, {{param2|c|mn?}} yan {{param2|c|mn!}} çêkin ji bo ku neyên tevlihevkirin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 06:00, 28 tîrmeh 2026 (UTC)
:::Ez jî dizanim ku "nêtar ji bo kurmancî nabe" ([//ku.wiktionary.org/w/index.php?title=Got%C3%BBb%C3%AAj%3Afikirmend&diff=3063789&oldid=3063526]) jixwe min "nêtar" kiribû "[//ku.wiktionary.org/w/index.php?title=Got%C3%BBb%C3%AAj:fikirmend&diff=prev&oldid=3063788 mê an nêr li gorî bikaranînê]". Feqet nizanim çima rind nayê fêm kirin: Ferhengvan jî ew parametreyê bi awayekî rast bi kar nayîne [//ku.wiktionary.org/w/index.php?title=Got%C3%BBb%C3%AAj%3Areh&diff=6235991&oldid=6235985]. {{ping|Bikarhêner}} ? Min heta niha pirr gotar serrerastkir... Em ê hertim kontrol bikinê: pêşta problemeke vitira tine bû :) [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 15:13, 28 tîrmeh 2026 (UTC)
::::Bi rastî kî li vira parametreyên ku te li jor nivîsandine bi kar tîne {{=D}} ? Ji bîr meke em li ser wîkîferhenga kurdî ne... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 15:39, 28 tîrmeh 2026 (UTC)
:::::Ya muhîm hebûna sîstemekê ye, heta niha ti sîstemeke baş nehatiye çêkirin û ti rê nehatiye dayîn ji bikarhêneran re ku hîn bibin, hêdî hêdî em ê çi ji destê me were, çêkin û hîn bikin. Bi min atolyeyek lazim e em hin tiştan ji bikarhênerên din re hîn bikin. Mîsal min <code><nowiki>{{subst:beralîbike}}</nowiki></code> li wîkîpediyayê çêkir û ji bikarhênerekî re nîşan da çawa tê bikaranîn, wî dest bi bikaranînê kir. Ji ber ku bikarhênerekî mobîlê ye, nikaribû bi tenê serê xwe beralîkin çêke her daîm alîkarî ji kesên din dixwast ku pir carî ti kes nedihat. Însanên me ji aliyê teknîkî ve baş nebin jî, wextê bi riyeke baş îzah dikî, fam dikim şikir ji xwedê re.
:::::Welhasil, [https://ku.wiktionary.org/w/index.php?title=reh&diff=prev&oldid=6291839 reh] çêbû? Eger tu nabêjî nêtar be, min daxwaza te fam nekir. Tu çi dixwazî em çawa bikin? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 15:58, 28 tîrmeh 2026 (UTC)
::::::Nivîs dîsa "''mê yan nêr li gorî maneyê''" be (kategorî jî) feqet di nav parametreyê de <code>mn</code> neyê nivîsandin. Parametre wekî {{param2|z/c|nt}} bisekiniyana (an jî navekî din "g" an "c") feqet nivîs û kategorî bihata guhertin... Herwiha profîlên bikarhênerên ku tên vira wekî en.wiki nînin: li vir zêde namînin û tiştên ku hu dikin jî ji bîr dikin. PS: Di zimanê peştûyî de jî (nêzîkî zimanê kurmancî ye) peyvên "mê an nêr" (''common gender'') hene [[:en:Category:Pashto nouns with multiple genders]] [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 17:28, 28 tîrmeh 2026 (UTC)
:::::::"g", "c", "nt" gî behsa cureyekî xisûsî dikin loma nabin, feqat di nav [https://ku.wiktionary.org/w/index.php?title=Modul:r%C3%AAziman&oldid=6115355#L-306 Modul:rêziman] de koda me "mn" otomatîk dike "mnmane" min ji bo back-compatiblity wisa kiribû lê ya rast "mnmane" ya, em "mn" ji bo kurmancî rakin, hemû "mn" bikin "mnmane" û "m/n" jî rakin û bikin "mndudil", nabe? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 17:44, 28 tîrmeh 2026 (UTC)
::::::::OK, bi min baş e:) [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 18:18, 28 tîrmeh 2026 (UTC)
:::::::::Îmkan heye şablona tewandinê jî wisa bikî ku hem di qismê tewandinê de hem jî aliyê rastê were bikaranîn? Wekî me [[Wîkîferheng:Dîwan/2026#Beşa_Tewandin_bo_kurmancî|li vir]] got? Wextê gelek dirêj be yan mndudil be, em dikarin bixin qismê tewandinê bi şiklê "ya mêr" û "ya nêr". Wekî din yên biçûk û standard bila li aliyê rastê bimînin? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 18:54, 28 tîrmeh 2026 (UTC)
::::::::::Erê bi parametreya {{param2|hêl|çep}} tê çêkirin. Belkî bi JSê tiştekî vitra jî tê çêkirin: dema ku tablo pirr fireh ye (>450px) tablo wekî "veşartî" xuya bike...
::::::::::"''Wekî din yên biçûk û standard bila li aliyê rastê bimînin?''": '''Aliyê rast:''' Dema ku tu mînakan dixwînî bi hêsanî tabloya tewandinê jî seh dikî (pedagojîk e). '''Bin beşa Tewandinê:''' 1) Ji bo mobilan rind e, tablo ne ser maneya peyvê ye. 3) Şûnda maneyan direj dibe 3) Wêne baştir xuya dikin ji ber ku ne bin tabloyê ne. '''Encam''': yek pratîk e, yek jî pedagojîk e [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 19:27, 28 tîrmeh 2026 (UTC)
:::::::::::Di bin beşa Tewandinê de baştir xuya dike... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 20:28, 28 tîrmeh 2026 (UTC)
::::::::::::Erê {{=D}} [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:29, 28 tîrmeh 2026 (UTC)
:::::::::::::Feqat lazim e yên mezin wekî [[mustensîx]] di nav qutîyê de bê wekî [[:en:heval]] di mobîlê de ya me sayfeyê fireh dike, ya îngilîzî de dikarî qutîyê bişemitînî [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:44, 28 tîrmeh 2026 (UTC)
::::::::::::::Formata herî xweş [https://ku.wiktionary.org/wiki/mustens%C3%AEx#Kurmanc%C3%AE] resm jî lê tê tablo jî di cihê xwe de ye. Wekî din wextê tablo li aliyê rastê ye însan naxwaze resmekî jî lê zêde bike. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:54, 28 tîrmeh 2026 (UTC)
:::::::::::::::''overflow'' bi tagên "div"-an rind tên çêkirin. Em ê tabloyên ''NavFrame'' bi kar bînin... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:06, 28 tîrmeh 2026 (UTC)
::::::::::::::::Eger class inflection-table bi kar bînî, bi [[MediaWiki:Gadget-defaultVisibilityToggles.js#L-43]] ê ku dixwaze dikare gîya veşêre an nîşan bide. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:11, 28 tîrmeh 2026 (UTC)
:::::::::::::::::Min fêm nekir, biryara we çi ye? Hemû bin beşa Tewandinê? an jî herdu? Li gor wê şablon tê guherandin. Bi min ferq nake, her du jî baş in... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:19, 28 tîrmeh 2026 (UTC)
::::::::::::::::::Me [[#Beşa Tewandin bo kurmancî|li jor]] gotibû bila hemû di beşa Tewandinê de bin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:21, 28 tîrmeh 2026 (UTC)
:::::::::::::::::::Erê, min xwand Bikarnêner tiştekî din gotibû... Tu bi botê çêdikî? Bi botê hemû tabloyan bê parmetreya "hêl" bike bin beşa "Tewandin"-ê. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:30, 28 tîrmeh 2026 (UTC)
::::::::::::::::::::Va rabim botekê hazir bikim. Bi qasî min jê fam kir, tam nabêje hemû nekin, nabêje hemû bikin jî. Lê em hemû bikin çunkî du kes got erê. Cihê Tewandinê piştî Bi alfabeyên din û Formên alternatîv be an jî beriya wan piştî maneyê (piştî wajeya klasîk) be? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:38, 28 tîrmeh 2026 (UTC)
:::::::::::::::::::::Eger di yekcarê de nayê çêkirin bi parametreya "hêl" ve çêke. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:42, 28 tîrmeh 2026 (UTC)
::::::::::::::::::::::[https://linkcount.toolforge.org/?project=ku.wiktionary.org&page=%C5%9Eablon%3Aku-tew%C3%AEn-nav 27 hezar] car tê bikaranîn, Eger behsa wextê dikî, ne problem e, eger behsa "tenê yên fireh bixin tewandinê" wê carê yên mê û nêr bixim? Te cewaba pirsê cihê tewandinê jî neda? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:48, 28 tîrmeh 2026 (UTC)
:::::::::::::::::::::::Lojîk dibêje ku piştî bi "alfabeyên din", "formên alternatîv" û "Ji wêjeya klasîk" [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:55, 28 tîrmeh 2026 (UTC)
::::::::::::::::::::::::Feqet tabloya tewandinê dûr dikeve... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 22:00, 28 tîrmeh 2026 (UTC)
:::::::::::::::::::::::::Bi min "Bi alfabeyên din" bixin piştî Bilêvkirinê çûnkî @[[Bikarhêner:Ferhengvan|Ferhengvan]] pir caran ji bo nîşandana dengî alfaba erebî bi kar tîne, h3 rengê teal tenê ji bo "Navdêr, Lêker hwd." bi cssê bi kar bînin [https://ku.wiktionary.org/w/index.php?title=Bikarh%C3%AAner:Wikihez/vector-2022.css&diff=prev&oldid=6241199 wekî wisa lê berevajî], Piştî "Ji wêjeyê/klasîk" em tewandinê deynîn, "Formên alternatîv" piştî Tewandinê be û îro nekin, eger dixwazî di ceribandinê de tabloya nû hazir bike, em hefteyek li hêviya hevalên din bisekinin, eger îtîraz nehat, em çêkin? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:15, 28 tîrmeh 2026 (UTC)
::::::::::::::::::::::::::Beşa "Bikaranîn" jî heye... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 22:28, 28 tîrmeh 2026 (UTC)
:::::::::::::::::::::::::::Piştî Bikaranînê bnr. [[:en:Wiktionary:Entry_layout#Headings_after_the_definitions]] [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:37, 28 tîrmeh 2026 (UTC)
::::::::::::::::::::::::::::(h3) Bilêvkirin, Bi alfabeyên din, Sinifa rêzimanî,
::::::::::::::::::::::::::::(h4) Ji wêjeyê/klasîk (divê were xistin bin maneyê), Bikaranîn, Tewandin, Formên alternatîv, Hevmane, Nêzîk, Dijmane, Jê, Têkildar, Etîmolojî (eger du sinifa rêzimanî ji eynî kokê hebe h3) Dûnde, Binêre herwiha, Werger [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:40, 28 tîrmeh 2026 (UTC)
::::1. '''Li ser cinsîyetê:''' Bi min, em malûmatên ekstra yên wek ''"li Dihokê nêr, li Serhedê mê"'' (Serhed:m|Dihok:n) li qismê ''"Bikaranîn/Emilandin"''ê bidin baştir e. Kelîme di ferhengan de wek form û cinsîyet bi halê standard cih digirin, eger li mintiqayek cuda be ew cudahî li qismê "Bikaranîn/Emilandin"ê wek malûmatek ekstra cih bigire çêtir e. Ferhenga ku em vê gavê ji bo standardkirinê esas digirin ''"Ji bo Rastnivîsînê Ferhenga Kurdî (Kurmancî) - Tirkî ya Nû"'' de jî bi yek cinsîyetê cih dane kelîmeyan. Ji xeynî wê di ferhenga standardkirinê ya Weqfa Mezopotamyayê de jî ew kelîme bi yek cinsîyetê cih digirin. Tiştekî din jî bêjim, eger em şablonê wek "mndudil" bi nav bikin mimkin e ku rê bide şaşîyan. Çimkî gava mirov wê dibîne, mirov dibêje qey li ser cinsîyeta kelîmeyê dudilîyek heye, bi qenaeta min dudilîyek bi wî şiklî nîne. Divê her kelîme xwedî cinsîyetekê bin û îstîsnayên mintiqayî -ger were xwestin- ekstra were nîşandan. Lewma bi min halê mewcûd baş e. 2. '''Li ser şablonên tewandinê:''' Ger şablonên tewandinê di xuyabûna mobîl de bibin sedema xirabîyê, em wan şablonan ji bo mobîlan têxin qismê "Tewandin"ê. 3. '''Li ser rêzkirina qisman:''' Bi min divê mane li pêş be û ne hewce ye ku qismê "Bi alfabeyên din" derxin pêş. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:20, 29 tîrmeh 2026 (UTC)
{{outdent|::::::::::::::::::::::::::::}} {{r|Ferhengvan|Bikarhêner|Keyomerd|Zerwanda|Kurdanparez}} Fikir? --[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:42, 28 tîrmeh 2026 (UTC)
:"Bi alfabeyên din" beşeke pirr hewce nîne, niha beşa "mane" li ser rûpelê dûr dikeve. Bi min "Bîlêvkirin" > Mane > Ji wêjeya klasîk (wekî mînak e) > Bikaranîn > Tewandin > Bi alfabeyên din > Formên alternatîv > ... Divê beşên ku herî zêde tên xwastin werin "ronîkirin". [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 03:07, 29 tîrmeh 2026 (UTC)
::''[[bileks|Bîl'eks]],'' "Bi alfabeyên din" gelek muhîm e, ev ji bo kurmancî "formên alternatîv"-a wîkiya îngilîzî ye, başûrî tenê bi alfaba erebî dinivîsin û wextê kelîmeyek digerin çawa zanibin hatin kîjan kelîmeyê? Bi kirîlî ne lazim e lê bi erebî mecbûrî ye. Ji bo nettir bikin, lazim e em beşa "Bi alfabeyên din" baştir bikin. Mane hinek li jêr be ne muhîm e, wîkiya îngilîzî de jî gelek car lazim e herî jêr ji bo dîtina maneyê. "Ronîkirin"/teal xelet tê famkirin, sankî "qismê sereke (h3) lazim e wê be û qismên din werin xistin binê wê" tê famkirin loma em tenê Mane ronî bikin bes e, ka [https://ku.wiktionary.org/w/index.php?title=Bikarh%C3%AAner:Wikihez/common.css&oldid=6291927 vê cssê] biceribîne û dîsa fikrên xwe bibêje. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 07:20, 29 tîrmeh 2026 (UTC)
7djkksnxp8q7kuvhbc419b3gbjetzyr
6291994
6291992
2026-07-29T13:29:40Z
Wikihez
7344
li dawiyê
6291994
wikitext
text/x-wiki
<noinclude>{{Dîwan/arşîv-ser|2026}}</noinclude>
{{clear}}
== Daxwazên standardkirinê ==
https://ku.wiktionary.org/wiki/W%C3%AEk%C3%AEferheng:Daxwaz%C3%AAn_standardkirin%C3%AA, Gelo di vê malperê de peyvên hatîye standart kirin; ji malperê rakin? Zêde tehlîhev e. @[[Bikarhêner:Bikarhêner|Bikarhêner]]@[[Bikarhêner:Guherto|Guherto]] [[Bikarhêner:Rewiye tine|Rewiye tine]] ([[Gotûbêja bikarhêner:Rewiye tine|gotûbêj]]) 10:03, 8 kanûna paşîn 2026 (UTC)
:@[[Bikarhêner:Rewiye tine|Rewiye tine]] [[Taybet:Tercîh#mw-prefsection-gadgets]] li vir amûra [[MediaWiki:Gadget-aWa.js/belgekirin|awa]] aktîv bike û pê re dikarî gotûbêjan arşîv bikî. Li sayfa [[WF:DS]] li kêleka her sernavê gotûbêjê <nowiki>[arşîv bike]</nowiki> derdikeve, pê lê bike û ew ê arşîv bike. Eger nikarî tu tenê şablona {{ş|ds-kirî}} îlawe bike, ez ê dûre arşîv bikim. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:35, 5 tîrmeh 2026 (UTC)
== Standartkirin ==
Sala borî, min pêşnîyazek kiribû. Halî hazir piştî daxwaza standarkirinê em du heftî disekinin, eger kesek fikrek dîyar neke. Raste rast peyv li gor ferhenga standart a mezopotamyayê tê standart kirin. Ji xwe sazîyek vê karî dike çima em vê barî dikin stuyê xwe. Mesela ez çaxe di wîkîferhengê de peyvek digêrim; standart a peyvê jî li cem xwe kontrol dikim. Eger destûr hebe bi germî dikarim wê malperê standart bikim. Benda bûna du heftîyan gelo ne zehmet e? Duyemîn pêşnîyaza min nîşandana standarta peyvê di malpera de ye. Kesek dema malperan binêre, divê li jora malperan bibîne ku ev peyv standart e. Ev jî hîzmet e. Çimkî nivîskar, wergêr, edîtor, rojnemavan hez dikin bi peyvê standart binivîsin. https://ku.wiktionary.org/wiki/k%C3%AAf li vir wekî mînak min daye nîşan. Lê îfade eger wisa be: Standarda Rastnivîsîna Ferhenga Kurdî a Weqfa Mezopotamyayê kêf (r. 253) e yê çetir be. Çimkî îfadeya berê de peyva kurdî-tirkî derbas dibe û di mejîyê mirov de tevlihevî çêdibe.@[[Bikarhêner:Bikarhêner|Bikarhêner]]@[[Bikarhêner:Guherto|Guherto]] [[Bikarhêner:Rewiye tine|Rewiye tine]] ([[Gotûbêja bikarhêner:Rewiye tine|gotûbêj]]) 10:25, 8 kanûna paşîn 2026 (UTC)
:Merheba. Hevalno dîyar e karê standarkirinê li wîkîferhengê rawestîya ye. Min sê peyv ji bo standartkirinê qeyd kir. Kes li ser şîrove nenivîsî. Mehek jî li ser derbas bû. Aniha ez dikarim van rupelan biguherim. Li gor qaîdeya hatine danîn wisa ye. Daxwaza min heta niha jî ew e kelîmeyên di ferhenga standartkirinê de heyî divê em bikaribin rasterast li vir jî bikin standart. An jî demê kurttir bikin. Li weqfa mezapotamyayê 20 mirov digêhin hev li ser peyvekî seetan nîqaş dikin. Ma hewceyê em jî li vir nîqaş bikin? Tevlî vê jî ji xwe kes li ser vê mijare nasekîne van dema. Xeynî vê pêşnîyaza min nîşandana standarta peyvê di malpera de hebû. Li ser malperê 'Standarda Rastnivîsîna Ferhenga Kurdî a Weqfa Mezopotamyayê kêf (r.253) e' Tiştek mîna wî hebe yê gelek kêrî her cure nivîskarê me were. Çimkî hin nivîskarên me hez dike bi kelîmeyên standart binivîse. Di malperê de bila vê hêsanî fam bike çêtir e. @[[Bikarhêner:Bikarhêner|Bikarhêner]]@[[Bikarhêner:Ghybu|Ghybu]] [[Bikarhêner:Rewiye tine|Rewiye tine]] ([[Gotûbêja bikarhêner:Rewiye tine|gotûbêj]]) 18:35, 17 sibat 2026 (UTC)
::Merheba @[[Bikarhêner:Rewiye tine|Rewiye tine]]. Ev format pir xirab dibe. Tu dikarî li beşa Çavkaniyê binivîsî bi şablona {{ş|kitêb}} binivîsî çêtir e û tê eynî maneyê. Lê her kes standarda Weqfa Mezopotamyayê qebûl nakin û ez jî şibhê dikim ku ev websîte bi awayekî kolektîv tê çêkirin an na. Loma em bi ya kitêba rastnivisînê çêkin û eger îtîraz tinebe, şablona {{ş|ds-kirî}} li gotûbêja [[WF:DS]] binivîse, dûre li gotûbêjê arşîv bike, ne hewce ye li hêviya kesên din bisekinî. Eger itirazek hebe, ê ku dixwaze dûre dîsa şablona ds zêde bike. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:30, 5 tîrmeh 2026 (UTC)
:::[https://berwarnews.com/ferhenga-rastnivisine-qonaxeke-giring-a-standardkirina-kurmanci-ye/ Roportaja Mikail Bülbül] li ser proseya standardkirinê. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 00:57, 9 tîrmeh 2026 (UTC)
::::Min nû dît an jî nû hatiye zêdekirin lê meqaleyek bi navê [https://www.ferhengkurdi.com/?q=iltihap&modal=lijne lijneya edîtorîyê] nivîsandine [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 17:40, 22 tîrmeh 2026 (UTC)
== <span lang="en" dir="ltr">Annual review of the Universal Code of Conduct and Enforcement Guidelines</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
I am writing to you to let you know the annual review period for the Universal Code of Conduct and Enforcement Guidelines is open now. You can make suggestions for changes through 9 February 2026. This is the first step of several to be taken for the annual review. [[m:Special:MyLanguage/Universal Code of Conduct/Annual review/2026|Read more information and find a conversation to join on the UCoC page on Meta]].
The [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|Universal Code of Conduct Coordinating Committee]] (U4C) is a global group dedicated to providing an equitable and consistent implementation of the UCoC. This annual review was planned and implemented by the U4C. For more information and the responsibilities of the U4C, [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|you may review the U4C Charter]].
Please share this information with other members in your community wherever else might be appropriate.
-- In cooperation with the U4C, [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]])<section end="announcement-content" />
</div>
21:02, 19 kanûna paşîn 2026 (UTC)
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29905753 -->
== Request for comment (global AI policy) ==
<bdi lang="en" dir="ltr" class="mw-content-ltr">
Apologies for writing in English. {{int:Please-translate}}
A [[:m:Requests for comment/Artificial intelligence policy|request for comment]] is currently being held to decide on a global AI policy. {{int:Feedback-thanks-title}}
[[Bikarhêner:MediaWiki message delivery|MediaWiki message delivery]] ([[Gotûbêja bikarhêner:MediaWiki message delivery|gotûbêj]]) 00:58, 26 nîsan 2026 (UTC)
</bdi>
<!-- Message sent by User:Codename Noreste@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30424282 -->
== Guharto ==
: <small>→ Ji rûpela ''[//ku.wiktionary.org/w/index.php?title=Got%C3%BBb%C3%AAj:berf%C3%AEtik&oldid=6233338 Gotûbêj:berfîtik]'' hatiye girtin.</small>
Silav {{r|Ghybu}} ma hewce ye em guhartoyan jî kategorîze bikin? Li vê [[ژیشک]] binere, tije guhartoyên wê hene, ku em ji gişan re guhandar binivîsin dê 10 navên heman hebin di nav wê kategorîyê de. Tu çi difikirî? [[Bikarhêner:Keyomerd|Keyomerd]] ([[Gotûbêja bikarhêner:Keyomerd|gotûbêj]]) 09:40, 26 nîsan 2026 (UTC)
:{{silav|Keyomerd}}. Erê, problem çî ye? {{=)}} Ew jî tên bikaranîn... Dema ku peyvek tê çêkirin hewce ye ku em hemû agahiyên wan binivîsin: bilêvkirin, bikaranîn, mînak, terîm, herêm, tewandin, etîmolojî...
:Bi min peyvên ku wekî ''guherto'' hatine nivîsandin bi nivîsa {{w|Italic type|îtalîk|ziman=en}} (xwahr) di nav kategoriyan de werin nişan kirin (ji bo cudakirinê). {{ping|Ferhengvan|Bikarhêner}} [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 16:40, 30 nîsan 2026 (UTC)
::Yên '''''nestandard''''' di kategorîyan de biferq werin nîşandan baştir e. Qene em karibin wan ji yên stadard ferq bikin. @[[Bikarhêner:Ghybu|Ghybu]] Xêra xwe hûn sîstemeke wisa çêkin. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:36, 1 gulan 2026 (UTC)
:::Merheba @[[Bikarhêner:Keyomerd|Keyomerd]] û @[[Bikarhêner:Bikarhêner|Bikarhêner]] ev xisûsiyet jixwe di şablonên rêzimanê de heye, wextê {{param|formaalt|1}} dinivîsin, made dikeve Kategoriya [[:Kategorî:Formên alternatîv bi kurmancî]] li gorî koda zimanî jî zimanên din tê çêkirin. Hemû madeyên kurmancî bi alfabeya erebî dikevin vê kategoriyê lê nizanim ev tiştekî rast e Yan xelet e, ji bo nîşandanê min çêkiribû lê min hîn wext nedît ku nîqaşek li ser çêkim. Qaîdeyên bikaranîna vê parametreyê di wîkiya îngilîzî de jî tam ne belî ye. Du gotûbêj [https://en.wiktionary.org/wiki/Wiktionary:Requests_for_moves,_mergers_and_splits#Category:Alternative_forms_by_language] [https://en.wiktionary.org/wiki/Wiktionary:Beer_parlour/2024/June#Decluttering_the_altform_mess] çêkirine lê ji bo îngilîzî ev parametre nehatiye bikaranîn. Min ji bo nîşandanê niha [https://ku.wiktionary.org/w/index.php?title=bax%C3%A7%C3%AA_zarokan&diff=prev&oldid=6241372] ceriband lê bi min xelet e. Em çawa bikin? Kengî vê parametreyê bi kar bînin? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:29, 8 tîrmeh 2026 (UTC)
::::@[[Bikarhêner:Kurdanparez|Kurdanparez]] Tu çi difikirî? Ji bo zazakî [https://ku.wiktionary.org/w/index.php?title=a_c%C4%B1_geyrayene&oldid=6241396 wisa] bikin? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:55, 8 tîrmeh 2026 (UTC)
:::::Kategorîyekê cuda baş dibe. Wextê ku ez li kategorîya "lekêren bi zazakî" dinêrim, ez hem formê bi şikilê Johnsonê û formê standardê dibînim. Zaten wexte ku ez dikevim ê Johnsonê, min dibe formê standardê. Kategorîyekê cuda, bi taybetî ji bo nivîsandinên alternatîf, baş dibe.
:::::Lê em bîr nekin ku wextê ku em bo formên alternatîf yên devokî qal dikin, belkî adil neye ku em ev bişînin derekê din yê ku însan ewqas nabînin. [[Bikarhêner:Kurdanparez|Kurdanparez]] ([[Gotûbêja bikarhêner:Kurdanparez|gotûbêj]]) 22:03, 8 tîrmeh 2026 (UTC)
::::::@[[Bikarhêner:Kurdanparez|Kurdanparez]] Gelo min rast fêm kir? Tu dibêjî formên {{q|ku|kîvroşk}} bi dîqet werin guhartokirin lê bi yên bi alfabeya Jacobsonê hemû bikin {{param|formaalt|1}}? Formên Jacobsonê dê bikevin Kategoriya [[:Kategorî:Lêker bi zazakî|Lêker bi zazakî]] û [[:Kategorî:Lema bi zazakî|Lema bi zazakî]] yan na? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:55, 8 tîrmeh 2026 (UTC)
:::::::Bi min naxwaze di wan kategoriyan de bikeve. Wek tu dibînî dûplîkat pir hene. Bi min çareya baştir yên Johnsonê di katehgorîyekê din bikevin (bila format li rûpelan neyin guherandin, bi tenê kategorî) [[Bikarhêner:Kurdanparez|Kurdanparez]] ([[Gotûbêja bikarhêner:Kurdanparez|gotûbêj]]) 00:37, 9 tîrmeh 2026 (UTC)
== Peyvên soranî bi latînî ([[:Kategorî:Soranî]]) ==
Silav, di nav vê kategoriyê (''[[:Kategorî:Soranî]]'') de pirr peyv tenê bi alfabeya latînî hatine nivîsandin. Divê ew mutleq jî bi alfabeya erebî werin transkrîbe kirin ji ber ku soranî bi alfabeya erebî tê nivîsand... Bikarênerên ku soranî dizanin dikarin wan sererast bikin? Mînakên guhertinan: [//ku.wiktionary.org/w/index.php?title=zor%C3%AEne&curid=6584&diff=6233355&oldid=5859303], [//ku.wiktionary.org/w/index.php?title=s%C3%AAw&diff=6233097&oldid=6233003], [//ku.wiktionary.org/w/index.php?title=sewz&diff=6233313&oldid=6069107], ... Spas! [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 01:16, 2 gulan 2026 (UTC)
== <span lang="en" dir="ltr">Vote now in the 2026 U4C election</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
Eligible voters are asked to participate in the 2026 [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|Universal Code of Conduct Coordinating Committee]] election. More information–including an eligibility check, voting process information, candidate information, and a link to the vote–are available on Meta at the [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026|2026 Election information page]]. The vote closes on 2 June 2026 at [https://zonestamp.toolforge.org/1780358400 00:00 UTC].
Please vote if your account is eligible. Results will be available by 14 June 2026. -- In cooperation with the U4C,<section end="announcement-content" />
</div>
[[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]]) 17:15, 27 gulan 2026 (UTC)
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== RFC about AI-generated content in Wikimedia Commons ==
<bdi lang="en" dir="ltr">Apologies for writing in English, please help translate this message to your language. You are invited to participate in a [[c:Commons:Requests for comment/Policy update for AI content|request for comment on Wikimedia Commons about a policy update for AI content]]. This may affect files that are uploaded to Wikimedia Commons for use on this project. Thank you. [[m:User:Codename Noreste|Codename Noreste]] ([[m:User talk:Codename Noreste|gotûbêj]])</bdi> 17:12, 23 hezîran 2026 (UTC)
<!-- Message sent by User:Codename Noreste@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== <span lang="en" dir="ltr">Deployment of Legal and Safety Contacts Link in the Footer of Your Wiki</span> ==
<div lang="en" dir="ltr">
<section begin="Message"/>
'''Legal & Safety Contacts'''
Hello community, the Wikimedia Foundation has provided a [[wmf:Special:MyLanguage/Legal:Wikimedia Foundation Legal and Safety Contact Information|single legal and safety contact page]], to be linked in the footer of your wiki, to ensure access to accurate legal information. This is a regulatory requirement. We have already rolled out links to English, German, Italian, Spanish and other wikis and we will deploy to your wiki soon. [[m:Special:MyLanguage/Wikimedia_Foundation_Legal_and_Safety_Contacts_FAQ|Please read more on the project page]] and leave any comments in this thread or on the [[m:Special:MyLanguage/Talk:Wikimedia Foundation Legal and Safety Contacts FAQ|talk page]].
<section end="Message"/>
</div>
-- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 13:31, 25 hezîran 2026 (UTC)
<!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:Sannita_(WMF)/Mass_sending_test&oldid=30731267 -->
== Jêbirina ferhenga Sadallah ==
Merheba @[[Bikarhêner:Guherto|Guherto]] Îmkan heye lîsteyeke wisa çêkî ku hemû sayfeyên Cyrusbot çêkir yên ku tê de tenê tercimeyeke îngilîzî heye û ev tercime jî hatibe jêbirin? Nimûne ''[[derdzanî]], [[êşzanî]]'' tenê tercimeya [[pestology]] heye ew jî ji ber heqê telîfê hatiye jêbirin. Nimûneyeke din ''zêrrgeh'', ''zêrrkar'' [[goldsmith]] hatiye jêbirin zêr wekî zêrr hatiye guhartin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 19:48, 26 hezîran 2026 (UTC)
== Beşa Tewandin bo kurmancî ==
Bi ya min şablona {{ş|ku-tewîn-nav}} û ya fiîlê em bixin beşa Tewandinê (wekî [[şodir|zazakî]]. Bi vî awayî hem ji aliyê şiklî ve hem jî ji aliyê bikaranînê ve xweştir xuya bike. Eger di qismê Tewandinê de be, ê ku dixwaze îzah û notên xwe yan jî emilandinên din jî dikare binivîse. Hûn çi dibêjin? @[[Bikarhêner:Ferhengvan|Ferhengvan]], @[[Bikarhêner:Ghybu|Ghybu]], @[[Bikarhêner:Bikarhêner|Bikarhêner]]. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:05, 6 tîrmeh 2026 (UTC)
:Belkî em dikarin Formata şiweyan wekî ya behdînî jî têxin nav şablonê. Pir caran şiklê tabloya Tercimeyan ji ber dirêjbûna şablona teqînê jî xirab dibe wekî [[astrofizîk]]. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:08, 6 tîrmeh 2026 (UTC)
:Min mijarê te li jorê yê xwe dît, fikirên min jî hene eger baş e. Yê ku te gotiye bi min baş dibe, ji ber ku her rûpel ji vê mîna hev dibe. Em ê rindtir jî ferq li nav devokan binivîsin. [[Bikarhêner:Kurdanparez|Kurdanparez]] ([[Gotûbêja bikarhêner:Kurdanparez|gotûbêj]]) 11:44, 7 tîrmeh 2026 (UTC)
::@[[Bikarhêner:Bikarhêner|Bikarhêner]] fikr? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 08:44, 15 tîrmeh 2026 (UTC)
:::Formata ku te teklîf kirîye jî ne xerab e, baş tê xuyan. Feqet bi min halê berê (mewcûd) baştir e. Ji ber ku ev şablon (ku-tewîn-nav) bi piranî kurt in û ji bo her kesî ne mihîm e, lewma li kinarê bi formeke hebe ku karibe were vekirin û girtin baştir e. Lê belê ger şablon dirêjtir bin, em karin wekî ya wîkîya almanî bikin (ew jî wekî teklîfa te ye). -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:50, 15 tîrmeh 2026 (UTC)
== Reşwî ==
Silav ji we gî re, Pirsekê min heye.
Ez difikirim şablonekê din çê bikim boy devokek kurmancî, yê êla Reşwî. Ew lêkerên xwe hinek cuda ditewînin. Mesela te hem "ez dikim" bêjî yan jî "ez dikime", "em dikinî, em tênî, te em kuştinî" (ne "em dikin") dema xwe yek in lê maneyên xwe ne yek in, "ez bikim" "ez ê bikim" "ez bikime" û dewamên xwe hemû demên xwe yek in lê mane dîsa ne yek in.
Eger min çê kir, şûna xwe li ku derê tînim? Ez difikirim li tewandina devokên kurdî yê ku "tabên" xwe hene "kurmancîya rojavayî", "kurmancîya standard" hsw. Lê tewandin ewqes cuda ye dixwaze ku wî şablona tewandina kurdî pir were guherîn.
Hûn çi dibêjin? (R: Hûn dewên çi?) [[Bikarhêner:Kurdanparez|Kurdanparez]] ([[Gotûbêja bikarhêner:Kurdanparez|gotûbêj]]) 11:38, 7 tîrmeh 2026 (UTC)
:{{silav|Kurdanparez}} Binêre mînaka devoka ''rojhilatî'': [[Modul:ku-tewandin#L-135]] / [[Modul:ku-tewandin#L-138|L138]] / [[Modul:ku-tewandin#L-143|L-143]], .. Di nav modula ''ku-tewandin"-ê de tê çêkirin. [[Gotûbêja modulê:ku-tewandin#Paşgirên lêkeran di kurmanciya rojhilatî de]] [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 13:09, 7 tîrmeh 2026 (UTC)
::PS: Dema niha: [[Modul:ku-tewandin#L-128]]; dema borî: [[Modul:ku-tewandin#L-153]] [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 13:15, 7 tîrmeh 2026 (UTC)
:::Merheba @[[Bikarhêner:Ghybu|Ghybu]], Eger mimkin be tu dikarî yên devokî têxî binmodulekê û bila modul load bike, bi vî awayî belkî çêkirina yên nû û famkirina modulê hêsantir be? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 15:09, 7 tîrmeh 2026 (UTC)
:::Lê di devokê reşwî de hem dema niha yê statîk heye (Îng: I do -> Ez dikim) û yê progressîf heye (I am doing -> Eîz (nêr) Ez î (mê) dikime, yan jî Ez î dikime/Ez ê dikime). Reşwî ji yê standardê pirtir bo zayend ferq tîne, hem jî li dema pêşî (Ez ê bikim (Nêr) ez a bikim (Mê)). Dema pêşî jî formên cuda hene (Ezêk bikime (I will be doing it) û ez ê/a bikim (I will do it))
:::Ev di modûlê têhel bê? [[Bikarhêner:Kurdanparez|Kurdanparez]] ([[Gotûbêja bikarhêner:Kurdanparez|gotûbêj]]) 22:09, 8 tîrmeh 2026 (UTC)
== WF:Xebat ==
Min sayfeya [[WF:Xebat]] çêkir, xeletiyên ku hûn ferq dikin ji kerema xwe lê zêde bikin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 11:35, 15 tîrmeh 2026 (UTC)
== Modul:quote ==
@[[Bikarhêner:Ghybu|Ghybu]], @[[Bikarhêner:Bikarhêner|Bikarhêner]], @[[Bikarhêner:Keyomerd|Keyomerd]], @[[Bikarhêner:Ferhengvan|Ferhengvan]] Merheba, ez modula îngilîzî ya jêgirtin û çavkaniyan li gorî şablonên {{ş|jêder}} format dikim û ji bo ku hertişt wekî formata me ya niha be, gelek serê min diêşe. Ez dibêjim bila em dev ji formata niha berdin wekî ya îngilîzî bi kar bînin ji ber ku gelek xisûsiyetên îngilîzî hene ku yekî dikare biemilîne. Hûn ê bibêjin niha ji kû hat bîra tê, min got [[Wîkîferheng:Xebat#MediaWiki:Gadget-start.js|start.js]] nû bikim û min dît otomatîk çavkanî bi riya [[mw:Citoid]]ê bi riya DOI, ISBN û lînk tê çêkirin, min got wiya jî li skrîptê îlawe bikim loma min [[Wîkîferheng:Xebat#Mediawiki:Gadget-citoid-helper.js|Mediawiki:Gadget-citoid-helper.js]] hazir kir lê hin parametreyên Citoidê kêm bûn, min got ka wana rast bikim, min dît formata me ya niha ti standard bi kar nayîne tenê parametreyan bi virgulê li hev dixe.
Ez dibêjim formata îngilîzî baştir e, hem ne îtalîk e ku bi hêsanî tên xwendin, hem jî tarîx û çavkanî herî pêşî tên nîşandan ku ji bo peyitandinê bo min muhîm e. Modula îngilîzî de hema bêje her tişt hatiye çêkirin, eger em rûnin tenê yên lazim li şablona çavkaniyên xwe binivîsin ew ê gelek wext bistîne. Eger em modula îngilîzî bi kar bînin, em ê hem karibin şablonên îngilîzî bi hêsanî û rast kopî bikin hem jî kurdîkirina parametreyan gelek hêsan e. Fikir? --[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:20, 24 tîrmeh 2026 (UTC)
: Ji bo miqayesekirinê bnr. [[:en:Template:quote-book]] / [[Şablon:jêder-kitêb/ceribandin]] --[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:32, 24 tîrmeh 2026 (UTC)
::Bi min bila yê mewcûd jî bimîne, ew jî şiklen xweş û baştir e. Feqet bi min jî yên îngilîzî rehettir in, eger rastkirina yê mewcûd zehmet be, em rasterast wan ji xwe re bînin û tercime bikin. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:41, 24 tîrmeh 2026 (UTC)
:::Ez êvarê ve dixebitim, min nêzîk kiribû lê min got belkî hûn qane bibin lê xuya ye hûn ê hîn serê min gelek biêşînin {{=D}} [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:59, 24 tîrmeh 2026 (UTC)
::::@[[Bikarhêner:Bikarhêner|Bikarhêner]] û @[[Bikarhêner:Ghybu|Ghybu]] Eger îtîrazek tinebe, ez ê îtalîk ji jêgirtinê rakim... Jixwe bi riya [jêgirtin] dikare were veşartin û her daim bi * dest pê dike loma bi hêsanî tê fêmkirin û xwendin rihettir dibe. Bnr. [https://ku.wiktionary.org/w/index.php?title=W%C3%AEk%C3%AEferheng:ceribandin/nim%C3%BBne&oldid=6277132#L%C3%AAker_2 ceribandinê] [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:13, 24 tîrmeh 2026 (UTC)
== Request for comment (the future of Abstract Wikipedia) ==
<bdi lang="en" dir="ltr" class="mw-content-ltr">
Apologies if this has not yet been translated into your wiki's language. {{int:Please-translate}}
You are invited to voice your opinions in a [[:m:Requests for comment/The future of Abstract Wikipedia|request for comment about the future of Abstract Wikipedia]]. {{Int:Feedback-thanks-title}}
[[:m:User:Kowal2701|Kowal2701]] ([[:m:User talk:Kowal2701|talk]]) 12:25, 24 tîrmeh 2026 (UTC)
</bdi>
<!-- Message sent by User:DreamRimmer@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== ''mê'' yan ''nêr'' li gorî maneyê / ''mê'' yan ''nêr'' (bikaranîn dudil e) ==
[//ku.wiktionary.org/w/index.php?title=xelat&diff=prev&oldid=6291766]: Mixabin pirr bikarhêner şûnda parametreya <code>z=m/n</code> ('' m yan n li gorî maneyê'') <code>z=mn</code> (''m yan n (bikaranîn dudil e)'') bi kar tînin ([[Şablon:navdêr#Parametre]]) ji ber ku di nav her du nivîsê de pir ferq nebînin. Nizanim em ê dîsa parametreya <code>z=nt</code> (''nêtar'') çêkin, wekî berê: [//ku.wiktionary.org/w/index.php?title=W%C3%AEk%C3%AEferheng:D%C3%AEwan/ar%C5%9F%C3%AEv_2019&oldid=6104681#Zayend]. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 00:17, 28 tîrmeh 2026 (UTC)
:Merheba {{r|Ghybu}} {{demo|sep=wisa xuya dibe:<br>|<nowiki>{{navdêr|ku|kelîme|c=mn}}</nowiki>}}
Ya din jî; {{demo|sep=wisa xuya dibe:<br>|<nowiki>{{navdêr|ku|kelîme|c=m/n}}</nowiki>}}
Tu dixwazî em wana berevajî bikin? Not: nêtar ji bo kurmancî nabe, mn û m/n baş in. Berê ji ber ku m/n tinebû, her kes li gorî parametreyên heyî dixebitî. Niha hene bi min problem nîne eger em berevajî nekin.--[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 05:32, 28 tîrmeh 2026 (UTC)
: Bi min ev format baştir e:
{{demo|sep=wisa xuya dibe:<br>|<nowiki>{{navdêr|ku|kelîme|c1=m|c1etîk=Mêrdîn|c2=n|c2etîk=Dihok}}</nowiki>}}
Yan jî:
{{demo|sep=wisa xuya dibe:<br>|<nowiki>{{navdêr|ku|zayend|c1=n|c2=m|c1ref={{Jêgirtin/Celadet Alî Bedirxan/HAWAR Cild 1 Hejmar 1-23 (1932-1933)/1998|hejmar=4|sal=1938}}|c2ref={{Zana Farqînî}}}}</nowiki>}}
{{çavkanî}}
:--[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 05:49, 28 tîrmeh 2026 (UTC)
::Feqat em dikarin li şûna {{param2|c|m/n}}, {{param2|c|mn?}} yan {{param2|c|mn!}} çêkin ji bo ku neyên tevlihevkirin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 06:00, 28 tîrmeh 2026 (UTC)
:::Ez jî dizanim ku "nêtar ji bo kurmancî nabe" ([//ku.wiktionary.org/w/index.php?title=Got%C3%BBb%C3%AAj%3Afikirmend&diff=3063789&oldid=3063526]) jixwe min "nêtar" kiribû "[//ku.wiktionary.org/w/index.php?title=Got%C3%BBb%C3%AAj:fikirmend&diff=prev&oldid=3063788 mê an nêr li gorî bikaranînê]". Feqet nizanim çima rind nayê fêm kirin: Ferhengvan jî ew parametreyê bi awayekî rast bi kar nayîne [//ku.wiktionary.org/w/index.php?title=Got%C3%BBb%C3%AAj%3Areh&diff=6235991&oldid=6235985]. {{ping|Bikarhêner}} ? Min heta niha pirr gotar serrerastkir... Em ê hertim kontrol bikinê: pêşta problemeke vitira tine bû :) [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 15:13, 28 tîrmeh 2026 (UTC)
::::Bi rastî kî li vira parametreyên ku te li jor nivîsandine bi kar tîne {{=D}} ? Ji bîr meke em li ser wîkîferhenga kurdî ne... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 15:39, 28 tîrmeh 2026 (UTC)
:::::Ya muhîm hebûna sîstemekê ye, heta niha ti sîstemeke baş nehatiye çêkirin û ti rê nehatiye dayîn ji bikarhêneran re ku hîn bibin, hêdî hêdî em ê çi ji destê me were, çêkin û hîn bikin. Bi min atolyeyek lazim e em hin tiştan ji bikarhênerên din re hîn bikin. Mîsal min <code><nowiki>{{subst:beralîbike}}</nowiki></code> li wîkîpediyayê çêkir û ji bikarhênerekî re nîşan da çawa tê bikaranîn, wî dest bi bikaranînê kir. Ji ber ku bikarhênerekî mobîlê ye, nikaribû bi tenê serê xwe beralîkin çêke her daîm alîkarî ji kesên din dixwast ku pir carî ti kes nedihat. Însanên me ji aliyê teknîkî ve baş nebin jî, wextê bi riyeke baş îzah dikî, fam dikim şikir ji xwedê re.
:::::Welhasil, [https://ku.wiktionary.org/w/index.php?title=reh&diff=prev&oldid=6291839 reh] çêbû? Eger tu nabêjî nêtar be, min daxwaza te fam nekir. Tu çi dixwazî em çawa bikin? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 15:58, 28 tîrmeh 2026 (UTC)
::::::Nivîs dîsa "''mê yan nêr li gorî maneyê''" be (kategorî jî) feqet di nav parametreyê de <code>mn</code> neyê nivîsandin. Parametre wekî {{param2|z/c|nt}} bisekiniyana (an jî navekî din "g" an "c") feqet nivîs û kategorî bihata guhertin... Herwiha profîlên bikarhênerên ku tên vira wekî en.wiki nînin: li vir zêde namînin û tiştên ku hu dikin jî ji bîr dikin. PS: Di zimanê peştûyî de jî (nêzîkî zimanê kurmancî ye) peyvên "mê an nêr" (''common gender'') hene [[:en:Category:Pashto nouns with multiple genders]] [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 17:28, 28 tîrmeh 2026 (UTC)
:::::::"g", "c", "nt" gî behsa cureyekî xisûsî dikin loma nabin, feqat di nav [https://ku.wiktionary.org/w/index.php?title=Modul:r%C3%AAziman&oldid=6115355#L-306 Modul:rêziman] de koda me "mn" otomatîk dike "mnmane" min ji bo back-compatiblity wisa kiribû lê ya rast "mnmane" ya, em "mn" ji bo kurmancî rakin, hemû "mn" bikin "mnmane" û "m/n" jî rakin û bikin "mndudil", nabe? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 17:44, 28 tîrmeh 2026 (UTC)
::::::::OK, bi min baş e:) [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 18:18, 28 tîrmeh 2026 (UTC)
:::::::::Îmkan heye şablona tewandinê jî wisa bikî ku hem di qismê tewandinê de hem jî aliyê rastê were bikaranîn? Wekî me [[Wîkîferheng:Dîwan/2026#Beşa_Tewandin_bo_kurmancî|li vir]] got? Wextê gelek dirêj be yan mndudil be, em dikarin bixin qismê tewandinê bi şiklê "ya mêr" û "ya nêr". Wekî din yên biçûk û standard bila li aliyê rastê bimînin? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 18:54, 28 tîrmeh 2026 (UTC)
::::::::::Erê bi parametreya {{param2|hêl|çep}} tê çêkirin. Belkî bi JSê tiştekî vitra jî tê çêkirin: dema ku tablo pirr fireh ye (>450px) tablo wekî "veşartî" xuya bike...
::::::::::"''Wekî din yên biçûk û standard bila li aliyê rastê bimînin?''": '''Aliyê rast:''' Dema ku tu mînakan dixwînî bi hêsanî tabloya tewandinê jî seh dikî (pedagojîk e). '''Bin beşa Tewandinê:''' 1) Ji bo mobilan rind e, tablo ne ser maneya peyvê ye. 3) Şûnda maneyan direj dibe 3) Wêne baştir xuya dikin ji ber ku ne bin tabloyê ne. '''Encam''': yek pratîk e, yek jî pedagojîk e [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 19:27, 28 tîrmeh 2026 (UTC)
:::::::::::Di bin beşa Tewandinê de baştir xuya dike... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 20:28, 28 tîrmeh 2026 (UTC)
::::::::::::Erê {{=D}} [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:29, 28 tîrmeh 2026 (UTC)
:::::::::::::Feqat lazim e yên mezin wekî [[mustensîx]] di nav qutîyê de bê wekî [[:en:heval]] di mobîlê de ya me sayfeyê fireh dike, ya îngilîzî de dikarî qutîyê bişemitînî [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:44, 28 tîrmeh 2026 (UTC)
::::::::::::::Formata herî xweş [https://ku.wiktionary.org/wiki/mustens%C3%AEx#Kurmanc%C3%AE] resm jî lê tê tablo jî di cihê xwe de ye. Wekî din wextê tablo li aliyê rastê ye însan naxwaze resmekî jî lê zêde bike. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:54, 28 tîrmeh 2026 (UTC)
:::::::::::::::''overflow'' bi tagên "div"-an rind tên çêkirin. Em ê tabloyên ''NavFrame'' bi kar bînin... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:06, 28 tîrmeh 2026 (UTC)
::::::::::::::::Eger class inflection-table bi kar bînî, bi [[MediaWiki:Gadget-defaultVisibilityToggles.js#L-43]] ê ku dixwaze dikare gîya veşêre an nîşan bide. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:11, 28 tîrmeh 2026 (UTC)
:::::::::::::::::Min fêm nekir, biryara we çi ye? Hemû bin beşa Tewandinê? an jî herdu? Li gor wê şablon tê guherandin. Bi min ferq nake, her du jî baş in... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:19, 28 tîrmeh 2026 (UTC)
::::::::::::::::::Me [[#Beşa Tewandin bo kurmancî|li jor]] gotibû bila hemû di beşa Tewandinê de bin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:21, 28 tîrmeh 2026 (UTC)
:::::::::::::::::::Erê, min xwand Bikarnêner tiştekî din gotibû... Tu bi botê çêdikî? Bi botê hemû tabloyan bê parmetreya "hêl" bike bin beşa "Tewandin"-ê. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:30, 28 tîrmeh 2026 (UTC)
::::::::::::::::::::Va rabim botekê hazir bikim. Bi qasî min jê fam kir, tam nabêje hemû nekin, nabêje hemû bikin jî. Lê em hemû bikin çunkî du kes got erê. Cihê Tewandinê piştî Bi alfabeyên din û Formên alternatîv be an jî beriya wan piştî maneyê (piştî wajeya klasîk) be? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:38, 28 tîrmeh 2026 (UTC)
:::::::::::::::::::::Eger di yekcarê de nayê çêkirin bi parametreya "hêl" ve çêke. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:42, 28 tîrmeh 2026 (UTC)
::::::::::::::::::::::[https://linkcount.toolforge.org/?project=ku.wiktionary.org&page=%C5%9Eablon%3Aku-tew%C3%AEn-nav 27 hezar] car tê bikaranîn, Eger behsa wextê dikî, ne problem e, eger behsa "tenê yên fireh bixin tewandinê" wê carê yên mê û nêr bixim? Te cewaba pirsê cihê tewandinê jî neda? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:48, 28 tîrmeh 2026 (UTC)
:::::::::::::::::::::::Lojîk dibêje ku piştî bi "alfabeyên din", "formên alternatîv" û "Ji wêjeya klasîk" [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:55, 28 tîrmeh 2026 (UTC)
::::::::::::::::::::::::Feqet tabloya tewandinê dûr dikeve... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 22:00, 28 tîrmeh 2026 (UTC)
:::::::::::::::::::::::::Bi min "Bi alfabeyên din" bixin piştî Bilêvkirinê çûnkî @[[Bikarhêner:Ferhengvan|Ferhengvan]] pir caran ji bo nîşandana dengî alfaba erebî bi kar tîne, h3 rengê teal tenê ji bo "Navdêr, Lêker hwd." bi cssê bi kar bînin [https://ku.wiktionary.org/w/index.php?title=Bikarh%C3%AAner:Wikihez/vector-2022.css&diff=prev&oldid=6241199 wekî wisa lê berevajî], Piştî "Ji wêjeyê/klasîk" em tewandinê deynîn, "Formên alternatîv" piştî Tewandinê be û îro nekin, eger dixwazî di ceribandinê de tabloya nû hazir bike, em hefteyek li hêviya hevalên din bisekinin, eger îtîraz nehat, em çêkin? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:15, 28 tîrmeh 2026 (UTC)
::::::::::::::::::::::::::Beşa "Bikaranîn" jî heye... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 22:28, 28 tîrmeh 2026 (UTC)
:::::::::::::::::::::::::::Piştî Bikaranînê bnr. [[:en:Wiktionary:Entry_layout#Headings_after_the_definitions]] [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:37, 28 tîrmeh 2026 (UTC)
::::::::::::::::::::::::::::(h3) Bilêvkirin, Bi alfabeyên din, Sinifa rêzimanî,
::::::::::::::::::::::::::::(h4) Ji wêjeyê/klasîk (divê were xistin bin maneyê), Bikaranîn, Tewandin, Formên alternatîv, Hevmane, Nêzîk, Dijmane, Jê, Têkildar, Etîmolojî (eger du sinifa rêzimanî ji eynî kokê hebe h3) Dûnde, Binêre herwiha, Werger [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:40, 28 tîrmeh 2026 (UTC)
{{outdent|::::::::::::::::::::::::::::}} {{r|Ferhengvan|Bikarhêner|Keyomerd|Zerwanda|Kurdanparez}} Fikir? --[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:42, 28 tîrmeh 2026 (UTC)
:"Bi alfabeyên din" beşeke pirr hewce nîne, niha beşa "mane" li ser rûpelê dûr dikeve. Bi min "Bîlêvkirin" > Mane > Ji wêjeya klasîk (wekî mînak e) > Bikaranîn > Tewandin > Bi alfabeyên din > Formên alternatîv > ... Divê beşên ku herî zêde tên xwastin werin "ronîkirin". [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 03:07, 29 tîrmeh 2026 (UTC)
::''[[bileks|Bîl'eks]],'' "Bi alfabeyên din" gelek muhîm e, ev ji bo kurmancî "formên alternatîv"-a wîkiya îngilîzî ye, başûrî tenê bi alfaba erebî dinivîsin û wextê kelîmeyek digerin çawa zanibin hatin kîjan kelîmeyê? Bi kirîlî ne lazim e lê bi erebî mecbûrî ye. Ji bo nettir bikin, lazim e em beşa "Bi alfabeyên din" baştir bikin. Mane hinek li jêr be ne muhîm e, wîkiya îngilîzî de jî gelek car lazim e herî jêr ji bo dîtina maneyê. "Ronîkirin"/teal xelet tê famkirin, sankî "qismê sereke (h3) lazim e wê be û qismên din werin xistin binê wê" tê famkirin loma em tenê Mane ronî bikin bes e, ka [https://ku.wiktionary.org/w/index.php?title=Bikarh%C3%AAner:Wikihez/common.css&oldid=6291927 vê cssê] biceribîne û dîsa fikrên xwe bibêje. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 07:20, 29 tîrmeh 2026 (UTC)
:1. '''Li ser cinsîyetê:''' Bi min, em malûmatên ekstra yên wek ''"li Dihokê nêr, li Serhedê mê"'' (Serhed:m|Dihok:n) li qismê ''"Bikaranîn/Emilandin"''ê bidin baştir e. Kelîme di ferhengan de wek form û cinsîyet bi halê standard cih digirin, eger li mintiqayek cuda be ew cudahî li qismê "Bikaranîn/Emilandin"ê wek malûmatek ekstra cih bigire çêtir e. Ferhenga ku em vê gavê ji bo standardkirinê esas digirin ''"Ji bo Rastnivîsînê Ferhenga Kurdî (Kurmancî) - Tirkî ya Nû"'' de jî bi yek cinsîyetê cih dane kelîmeyan. Ji xeynî wê di ferhenga standardkirinê ya Weqfa Mezopotamyayê de jî ew kelîme bi yek cinsîyetê cih digirin. Tiştekî din jî bêjim, eger em şablonê wek "mndudil" bi nav bikin mimkin e ku rê bide şaşîyan. Çimkî gava mirov wê dibîne, mirov dibêje qey li ser cinsîyeta kelîmeyê dudilîyek heye, bi qenaeta min dudilîyek bi wî şiklî nîne. Divê her kelîme xwedî cinsîyetekê bin û îstîsnayên mintiqayî -ger were xwestin- ekstra were nîşandan. Lewma bi min halê mewcûd baş e. 2. '''Li ser şablonên tewandinê:''' Ger şablonên tewandinê di xuyabûna mobîl de bibin sedema xirabîyê, em wan şablonan ji bo mobîlan têxin qismê "Tewandin"ê. 3. '''Li ser rêzkirina qisman:''' Bi min divê mane li pêş be û ne hewce ye ku qismê "Bi alfabeyên din" derxin pêş. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:20, 29 tîrmeh 2026 (UTC)
gwramtlefn4x317r3n86dgmluxeue1q
6292003
6291994
2026-07-29T13:45:15Z
Wikihez
7344
6292003
wikitext
text/x-wiki
<noinclude>{{Dîwan/arşîv-ser|2026}}</noinclude>
{{clear}}
== Daxwazên standardkirinê ==
https://ku.wiktionary.org/wiki/W%C3%AEk%C3%AEferheng:Daxwaz%C3%AAn_standardkirin%C3%AA, Gelo di vê malperê de peyvên hatîye standart kirin; ji malperê rakin? Zêde tehlîhev e. @[[Bikarhêner:Bikarhêner|Bikarhêner]]@[[Bikarhêner:Guherto|Guherto]] [[Bikarhêner:Rewiye tine|Rewiye tine]] ([[Gotûbêja bikarhêner:Rewiye tine|gotûbêj]]) 10:03, 8 kanûna paşîn 2026 (UTC)
:@[[Bikarhêner:Rewiye tine|Rewiye tine]] [[Taybet:Tercîh#mw-prefsection-gadgets]] li vir amûra [[MediaWiki:Gadget-aWa.js/belgekirin|awa]] aktîv bike û pê re dikarî gotûbêjan arşîv bikî. Li sayfa [[WF:DS]] li kêleka her sernavê gotûbêjê <nowiki>[arşîv bike]</nowiki> derdikeve, pê lê bike û ew ê arşîv bike. Eger nikarî tu tenê şablona {{ş|ds-kirî}} îlawe bike, ez ê dûre arşîv bikim. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:35, 5 tîrmeh 2026 (UTC)
== Standartkirin ==
Sala borî, min pêşnîyazek kiribû. Halî hazir piştî daxwaza standarkirinê em du heftî disekinin, eger kesek fikrek dîyar neke. Raste rast peyv li gor ferhenga standart a mezopotamyayê tê standart kirin. Ji xwe sazîyek vê karî dike çima em vê barî dikin stuyê xwe. Mesela ez çaxe di wîkîferhengê de peyvek digêrim; standart a peyvê jî li cem xwe kontrol dikim. Eger destûr hebe bi germî dikarim wê malperê standart bikim. Benda bûna du heftîyan gelo ne zehmet e? Duyemîn pêşnîyaza min nîşandana standarta peyvê di malpera de ye. Kesek dema malperan binêre, divê li jora malperan bibîne ku ev peyv standart e. Ev jî hîzmet e. Çimkî nivîskar, wergêr, edîtor, rojnemavan hez dikin bi peyvê standart binivîsin. https://ku.wiktionary.org/wiki/k%C3%AAf li vir wekî mînak min daye nîşan. Lê îfade eger wisa be: Standarda Rastnivîsîna Ferhenga Kurdî a Weqfa Mezopotamyayê kêf (r. 253) e yê çetir be. Çimkî îfadeya berê de peyva kurdî-tirkî derbas dibe û di mejîyê mirov de tevlihevî çêdibe.@[[Bikarhêner:Bikarhêner|Bikarhêner]]@[[Bikarhêner:Guherto|Guherto]] [[Bikarhêner:Rewiye tine|Rewiye tine]] ([[Gotûbêja bikarhêner:Rewiye tine|gotûbêj]]) 10:25, 8 kanûna paşîn 2026 (UTC)
:Merheba. Hevalno dîyar e karê standarkirinê li wîkîferhengê rawestîya ye. Min sê peyv ji bo standartkirinê qeyd kir. Kes li ser şîrove nenivîsî. Mehek jî li ser derbas bû. Aniha ez dikarim van rupelan biguherim. Li gor qaîdeya hatine danîn wisa ye. Daxwaza min heta niha jî ew e kelîmeyên di ferhenga standartkirinê de heyî divê em bikaribin rasterast li vir jî bikin standart. An jî demê kurttir bikin. Li weqfa mezapotamyayê 20 mirov digêhin hev li ser peyvekî seetan nîqaş dikin. Ma hewceyê em jî li vir nîqaş bikin? Tevlî vê jî ji xwe kes li ser vê mijare nasekîne van dema. Xeynî vê pêşnîyaza min nîşandana standarta peyvê di malpera de hebû. Li ser malperê 'Standarda Rastnivîsîna Ferhenga Kurdî a Weqfa Mezopotamyayê kêf (r.253) e' Tiştek mîna wî hebe yê gelek kêrî her cure nivîskarê me were. Çimkî hin nivîskarên me hez dike bi kelîmeyên standart binivîse. Di malperê de bila vê hêsanî fam bike çêtir e. @[[Bikarhêner:Bikarhêner|Bikarhêner]]@[[Bikarhêner:Ghybu|Ghybu]] [[Bikarhêner:Rewiye tine|Rewiye tine]] ([[Gotûbêja bikarhêner:Rewiye tine|gotûbêj]]) 18:35, 17 sibat 2026 (UTC)
::Merheba @[[Bikarhêner:Rewiye tine|Rewiye tine]]. Ev format pir xirab dibe. Tu dikarî li beşa Çavkaniyê binivîsî bi şablona {{ş|kitêb}} binivîsî çêtir e û tê eynî maneyê. Lê her kes standarda Weqfa Mezopotamyayê qebûl nakin û ez jî şibhê dikim ku ev websîte bi awayekî kolektîv tê çêkirin an na. Loma em bi ya kitêba rastnivisînê çêkin û eger îtîraz tinebe, şablona {{ş|ds-kirî}} li gotûbêja [[WF:DS]] binivîse, dûre li gotûbêjê arşîv bike, ne hewce ye li hêviya kesên din bisekinî. Eger itirazek hebe, ê ku dixwaze dûre dîsa şablona ds zêde bike. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:30, 5 tîrmeh 2026 (UTC)
:::[https://berwarnews.com/ferhenga-rastnivisine-qonaxeke-giring-a-standardkirina-kurmanci-ye/ Roportaja Mikail Bülbül] li ser proseya standardkirinê. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 00:57, 9 tîrmeh 2026 (UTC)
::::Min nû dît an jî nû hatiye zêdekirin lê meqaleyek bi navê [https://www.ferhengkurdi.com/?q=iltihap&modal=lijne lijneya edîtorîyê] nivîsandine [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 17:40, 22 tîrmeh 2026 (UTC)
== <span lang="en" dir="ltr">Annual review of the Universal Code of Conduct and Enforcement Guidelines</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
I am writing to you to let you know the annual review period for the Universal Code of Conduct and Enforcement Guidelines is open now. You can make suggestions for changes through 9 February 2026. This is the first step of several to be taken for the annual review. [[m:Special:MyLanguage/Universal Code of Conduct/Annual review/2026|Read more information and find a conversation to join on the UCoC page on Meta]].
The [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|Universal Code of Conduct Coordinating Committee]] (U4C) is a global group dedicated to providing an equitable and consistent implementation of the UCoC. This annual review was planned and implemented by the U4C. For more information and the responsibilities of the U4C, [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|you may review the U4C Charter]].
Please share this information with other members in your community wherever else might be appropriate.
-- In cooperation with the U4C, [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]])<section end="announcement-content" />
</div>
21:02, 19 kanûna paşîn 2026 (UTC)
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29905753 -->
== Request for comment (global AI policy) ==
<bdi lang="en" dir="ltr" class="mw-content-ltr">
Apologies for writing in English. {{int:Please-translate}}
A [[:m:Requests for comment/Artificial intelligence policy|request for comment]] is currently being held to decide on a global AI policy. {{int:Feedback-thanks-title}}
[[Bikarhêner:MediaWiki message delivery|MediaWiki message delivery]] ([[Gotûbêja bikarhêner:MediaWiki message delivery|gotûbêj]]) 00:58, 26 nîsan 2026 (UTC)
</bdi>
<!-- Message sent by User:Codename Noreste@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30424282 -->
== Guharto ==
: <small>→ Ji rûpela ''[//ku.wiktionary.org/w/index.php?title=Got%C3%BBb%C3%AAj:berf%C3%AEtik&oldid=6233338 Gotûbêj:berfîtik]'' hatiye girtin.</small>
Silav {{r|Ghybu}} ma hewce ye em guhartoyan jî kategorîze bikin? Li vê [[ژیشک]] binere, tije guhartoyên wê hene, ku em ji gişan re guhandar binivîsin dê 10 navên heman hebin di nav wê kategorîyê de. Tu çi difikirî? [[Bikarhêner:Keyomerd|Keyomerd]] ([[Gotûbêja bikarhêner:Keyomerd|gotûbêj]]) 09:40, 26 nîsan 2026 (UTC)
:{{silav|Keyomerd}}. Erê, problem çî ye? {{=)}} Ew jî tên bikaranîn... Dema ku peyvek tê çêkirin hewce ye ku em hemû agahiyên wan binivîsin: bilêvkirin, bikaranîn, mînak, terîm, herêm, tewandin, etîmolojî...
:Bi min peyvên ku wekî ''guherto'' hatine nivîsandin bi nivîsa {{w|Italic type|îtalîk|ziman=en}} (xwahr) di nav kategoriyan de werin nişan kirin (ji bo cudakirinê). {{ping|Ferhengvan|Bikarhêner}} [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 16:40, 30 nîsan 2026 (UTC)
::Yên '''''nestandard''''' di kategorîyan de biferq werin nîşandan baştir e. Qene em karibin wan ji yên stadard ferq bikin. @[[Bikarhêner:Ghybu|Ghybu]] Xêra xwe hûn sîstemeke wisa çêkin. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:36, 1 gulan 2026 (UTC)
:::Merheba @[[Bikarhêner:Keyomerd|Keyomerd]] û @[[Bikarhêner:Bikarhêner|Bikarhêner]] ev xisûsiyet jixwe di şablonên rêzimanê de heye, wextê {{param|formaalt|1}} dinivîsin, made dikeve Kategoriya [[:Kategorî:Formên alternatîv bi kurmancî]] li gorî koda zimanî jî zimanên din tê çêkirin. Hemû madeyên kurmancî bi alfabeya erebî dikevin vê kategoriyê lê nizanim ev tiştekî rast e Yan xelet e, ji bo nîşandanê min çêkiribû lê min hîn wext nedît ku nîqaşek li ser çêkim. Qaîdeyên bikaranîna vê parametreyê di wîkiya îngilîzî de jî tam ne belî ye. Du gotûbêj [https://en.wiktionary.org/wiki/Wiktionary:Requests_for_moves,_mergers_and_splits#Category:Alternative_forms_by_language] [https://en.wiktionary.org/wiki/Wiktionary:Beer_parlour/2024/June#Decluttering_the_altform_mess] çêkirine lê ji bo îngilîzî ev parametre nehatiye bikaranîn. Min ji bo nîşandanê niha [https://ku.wiktionary.org/w/index.php?title=bax%C3%A7%C3%AA_zarokan&diff=prev&oldid=6241372] ceriband lê bi min xelet e. Em çawa bikin? Kengî vê parametreyê bi kar bînin? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:29, 8 tîrmeh 2026 (UTC)
::::@[[Bikarhêner:Kurdanparez|Kurdanparez]] Tu çi difikirî? Ji bo zazakî [https://ku.wiktionary.org/w/index.php?title=a_c%C4%B1_geyrayene&oldid=6241396 wisa] bikin? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:55, 8 tîrmeh 2026 (UTC)
:::::Kategorîyekê cuda baş dibe. Wextê ku ez li kategorîya "lekêren bi zazakî" dinêrim, ez hem formê bi şikilê Johnsonê û formê standardê dibînim. Zaten wexte ku ez dikevim ê Johnsonê, min dibe formê standardê. Kategorîyekê cuda, bi taybetî ji bo nivîsandinên alternatîf, baş dibe.
:::::Lê em bîr nekin ku wextê ku em bo formên alternatîf yên devokî qal dikin, belkî adil neye ku em ev bişînin derekê din yê ku însan ewqas nabînin. [[Bikarhêner:Kurdanparez|Kurdanparez]] ([[Gotûbêja bikarhêner:Kurdanparez|gotûbêj]]) 22:03, 8 tîrmeh 2026 (UTC)
::::::@[[Bikarhêner:Kurdanparez|Kurdanparez]] Gelo min rast fêm kir? Tu dibêjî formên {{q|ku|kîvroşk}} bi dîqet werin guhartokirin lê bi yên bi alfabeya Jacobsonê hemû bikin {{param|formaalt|1}}? Formên Jacobsonê dê bikevin Kategoriya [[:Kategorî:Lêker bi zazakî|Lêker bi zazakî]] û [[:Kategorî:Lema bi zazakî|Lema bi zazakî]] yan na? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:55, 8 tîrmeh 2026 (UTC)
:::::::Bi min naxwaze di wan kategoriyan de bikeve. Wek tu dibînî dûplîkat pir hene. Bi min çareya baştir yên Johnsonê di katehgorîyekê din bikevin (bila format li rûpelan neyin guherandin, bi tenê kategorî) [[Bikarhêner:Kurdanparez|Kurdanparez]] ([[Gotûbêja bikarhêner:Kurdanparez|gotûbêj]]) 00:37, 9 tîrmeh 2026 (UTC)
== Peyvên soranî bi latînî ([[:Kategorî:Soranî]]) ==
Silav, di nav vê kategoriyê (''[[:Kategorî:Soranî]]'') de pirr peyv tenê bi alfabeya latînî hatine nivîsandin. Divê ew mutleq jî bi alfabeya erebî werin transkrîbe kirin ji ber ku soranî bi alfabeya erebî tê nivîsand... Bikarênerên ku soranî dizanin dikarin wan sererast bikin? Mînakên guhertinan: [//ku.wiktionary.org/w/index.php?title=zor%C3%AEne&curid=6584&diff=6233355&oldid=5859303], [//ku.wiktionary.org/w/index.php?title=s%C3%AAw&diff=6233097&oldid=6233003], [//ku.wiktionary.org/w/index.php?title=sewz&diff=6233313&oldid=6069107], ... Spas! [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 01:16, 2 gulan 2026 (UTC)
== <span lang="en" dir="ltr">Vote now in the 2026 U4C election</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
Eligible voters are asked to participate in the 2026 [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|Universal Code of Conduct Coordinating Committee]] election. More information–including an eligibility check, voting process information, candidate information, and a link to the vote–are available on Meta at the [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026|2026 Election information page]]. The vote closes on 2 June 2026 at [https://zonestamp.toolforge.org/1780358400 00:00 UTC].
Please vote if your account is eligible. Results will be available by 14 June 2026. -- In cooperation with the U4C,<section end="announcement-content" />
</div>
[[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]]) 17:15, 27 gulan 2026 (UTC)
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== RFC about AI-generated content in Wikimedia Commons ==
<bdi lang="en" dir="ltr">Apologies for writing in English, please help translate this message to your language. You are invited to participate in a [[c:Commons:Requests for comment/Policy update for AI content|request for comment on Wikimedia Commons about a policy update for AI content]]. This may affect files that are uploaded to Wikimedia Commons for use on this project. Thank you. [[m:User:Codename Noreste|Codename Noreste]] ([[m:User talk:Codename Noreste|gotûbêj]])</bdi> 17:12, 23 hezîran 2026 (UTC)
<!-- Message sent by User:Codename Noreste@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== <span lang="en" dir="ltr">Deployment of Legal and Safety Contacts Link in the Footer of Your Wiki</span> ==
<div lang="en" dir="ltr">
<section begin="Message"/>
'''Legal & Safety Contacts'''
Hello community, the Wikimedia Foundation has provided a [[wmf:Special:MyLanguage/Legal:Wikimedia Foundation Legal and Safety Contact Information|single legal and safety contact page]], to be linked in the footer of your wiki, to ensure access to accurate legal information. This is a regulatory requirement. We have already rolled out links to English, German, Italian, Spanish and other wikis and we will deploy to your wiki soon. [[m:Special:MyLanguage/Wikimedia_Foundation_Legal_and_Safety_Contacts_FAQ|Please read more on the project page]] and leave any comments in this thread or on the [[m:Special:MyLanguage/Talk:Wikimedia Foundation Legal and Safety Contacts FAQ|talk page]].
<section end="Message"/>
</div>
-- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 13:31, 25 hezîran 2026 (UTC)
<!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:Sannita_(WMF)/Mass_sending_test&oldid=30731267 -->
== Jêbirina ferhenga Sadallah ==
Merheba @[[Bikarhêner:Guherto|Guherto]] Îmkan heye lîsteyeke wisa çêkî ku hemû sayfeyên Cyrusbot çêkir yên ku tê de tenê tercimeyeke îngilîzî heye û ev tercime jî hatibe jêbirin? Nimûne ''[[derdzanî]], [[êşzanî]]'' tenê tercimeya [[pestology]] heye ew jî ji ber heqê telîfê hatiye jêbirin. Nimûneyeke din ''zêrrgeh'', ''zêrrkar'' [[goldsmith]] hatiye jêbirin zêr wekî zêrr hatiye guhartin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 19:48, 26 hezîran 2026 (UTC)
== Beşa Tewandin bo kurmancî ==
Bi ya min şablona {{ş|ku-tewîn-nav}} û ya fiîlê em bixin beşa Tewandinê (wekî [[şodir|zazakî]]. Bi vî awayî hem ji aliyê şiklî ve hem jî ji aliyê bikaranînê ve xweştir xuya bike. Eger di qismê Tewandinê de be, ê ku dixwaze îzah û notên xwe yan jî emilandinên din jî dikare binivîse. Hûn çi dibêjin? @[[Bikarhêner:Ferhengvan|Ferhengvan]], @[[Bikarhêner:Ghybu|Ghybu]], @[[Bikarhêner:Bikarhêner|Bikarhêner]]. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:05, 6 tîrmeh 2026 (UTC)
:Belkî em dikarin Formata şiweyan wekî ya behdînî jî têxin nav şablonê. Pir caran şiklê tabloya Tercimeyan ji ber dirêjbûna şablona teqînê jî xirab dibe wekî [[astrofizîk]]. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:08, 6 tîrmeh 2026 (UTC)
:Min mijarê te li jorê yê xwe dît, fikirên min jî hene eger baş e. Yê ku te gotiye bi min baş dibe, ji ber ku her rûpel ji vê mîna hev dibe. Em ê rindtir jî ferq li nav devokan binivîsin. [[Bikarhêner:Kurdanparez|Kurdanparez]] ([[Gotûbêja bikarhêner:Kurdanparez|gotûbêj]]) 11:44, 7 tîrmeh 2026 (UTC)
::@[[Bikarhêner:Bikarhêner|Bikarhêner]] fikr? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 08:44, 15 tîrmeh 2026 (UTC)
:::Formata ku te teklîf kirîye jî ne xerab e, baş tê xuyan. Feqet bi min halê berê (mewcûd) baştir e. Ji ber ku ev şablon (ku-tewîn-nav) bi piranî kurt in û ji bo her kesî ne mihîm e, lewma li kinarê bi formeke hebe ku karibe were vekirin û girtin baştir e. Lê belê ger şablon dirêjtir bin, em karin wekî ya wîkîya almanî bikin (ew jî wekî teklîfa te ye). -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:50, 15 tîrmeh 2026 (UTC)
== Reşwî ==
Silav ji we gî re, Pirsekê min heye.
Ez difikirim şablonekê din çê bikim boy devokek kurmancî, yê êla Reşwî. Ew lêkerên xwe hinek cuda ditewînin. Mesela te hem "ez dikim" bêjî yan jî "ez dikime", "em dikinî, em tênî, te em kuştinî" (ne "em dikin") dema xwe yek in lê maneyên xwe ne yek in, "ez bikim" "ez ê bikim" "ez bikime" û dewamên xwe hemû demên xwe yek in lê mane dîsa ne yek in.
Eger min çê kir, şûna xwe li ku derê tînim? Ez difikirim li tewandina devokên kurdî yê ku "tabên" xwe hene "kurmancîya rojavayî", "kurmancîya standard" hsw. Lê tewandin ewqes cuda ye dixwaze ku wî şablona tewandina kurdî pir were guherîn.
Hûn çi dibêjin? (R: Hûn dewên çi?) [[Bikarhêner:Kurdanparez|Kurdanparez]] ([[Gotûbêja bikarhêner:Kurdanparez|gotûbêj]]) 11:38, 7 tîrmeh 2026 (UTC)
:{{silav|Kurdanparez}} Binêre mînaka devoka ''rojhilatî'': [[Modul:ku-tewandin#L-135]] / [[Modul:ku-tewandin#L-138|L138]] / [[Modul:ku-tewandin#L-143|L-143]], .. Di nav modula ''ku-tewandin"-ê de tê çêkirin. [[Gotûbêja modulê:ku-tewandin#Paşgirên lêkeran di kurmanciya rojhilatî de]] [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 13:09, 7 tîrmeh 2026 (UTC)
::PS: Dema niha: [[Modul:ku-tewandin#L-128]]; dema borî: [[Modul:ku-tewandin#L-153]] [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 13:15, 7 tîrmeh 2026 (UTC)
:::Merheba @[[Bikarhêner:Ghybu|Ghybu]], Eger mimkin be tu dikarî yên devokî têxî binmodulekê û bila modul load bike, bi vî awayî belkî çêkirina yên nû û famkirina modulê hêsantir be? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 15:09, 7 tîrmeh 2026 (UTC)
:::Lê di devokê reşwî de hem dema niha yê statîk heye (Îng: I do -> Ez dikim) û yê progressîf heye (I am doing -> Eîz (nêr) Ez î (mê) dikime, yan jî Ez î dikime/Ez ê dikime). Reşwî ji yê standardê pirtir bo zayend ferq tîne, hem jî li dema pêşî (Ez ê bikim (Nêr) ez a bikim (Mê)). Dema pêşî jî formên cuda hene (Ezêk bikime (I will be doing it) û ez ê/a bikim (I will do it))
:::Ev di modûlê têhel bê? [[Bikarhêner:Kurdanparez|Kurdanparez]] ([[Gotûbêja bikarhêner:Kurdanparez|gotûbêj]]) 22:09, 8 tîrmeh 2026 (UTC)
== WF:Xebat ==
Min sayfeya [[WF:Xebat]] çêkir, xeletiyên ku hûn ferq dikin ji kerema xwe lê zêde bikin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 11:35, 15 tîrmeh 2026 (UTC)
== Modul:quote ==
@[[Bikarhêner:Ghybu|Ghybu]], @[[Bikarhêner:Bikarhêner|Bikarhêner]], @[[Bikarhêner:Keyomerd|Keyomerd]], @[[Bikarhêner:Ferhengvan|Ferhengvan]] Merheba, ez modula îngilîzî ya jêgirtin û çavkaniyan li gorî şablonên {{ş|jêder}} format dikim û ji bo ku hertişt wekî formata me ya niha be, gelek serê min diêşe. Ez dibêjim bila em dev ji formata niha berdin wekî ya îngilîzî bi kar bînin ji ber ku gelek xisûsiyetên îngilîzî hene ku yekî dikare biemilîne. Hûn ê bibêjin niha ji kû hat bîra tê, min got [[Wîkîferheng:Xebat#MediaWiki:Gadget-start.js|start.js]] nû bikim û min dît otomatîk çavkanî bi riya [[mw:Citoid]]ê bi riya DOI, ISBN û lînk tê çêkirin, min got wiya jî li skrîptê îlawe bikim loma min [[Wîkîferheng:Xebat#Mediawiki:Gadget-citoid-helper.js|Mediawiki:Gadget-citoid-helper.js]] hazir kir lê hin parametreyên Citoidê kêm bûn, min got ka wana rast bikim, min dît formata me ya niha ti standard bi kar nayîne tenê parametreyan bi virgulê li hev dixe.
Ez dibêjim formata îngilîzî baştir e, hem ne îtalîk e ku bi hêsanî tên xwendin, hem jî tarîx û çavkanî herî pêşî tên nîşandan ku ji bo peyitandinê bo min muhîm e. Modula îngilîzî de hema bêje her tişt hatiye çêkirin, eger em rûnin tenê yên lazim li şablona çavkaniyên xwe binivîsin ew ê gelek wext bistîne. Eger em modula îngilîzî bi kar bînin, em ê hem karibin şablonên îngilîzî bi hêsanî û rast kopî bikin hem jî kurdîkirina parametreyan gelek hêsan e. Fikir? --[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:20, 24 tîrmeh 2026 (UTC)
: Ji bo miqayesekirinê bnr. [[:en:Template:quote-book]] / [[Şablon:jêder-kitêb/ceribandin]] --[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:32, 24 tîrmeh 2026 (UTC)
::Bi min bila yê mewcûd jî bimîne, ew jî şiklen xweş û baştir e. Feqet bi min jî yên îngilîzî rehettir in, eger rastkirina yê mewcûd zehmet be, em rasterast wan ji xwe re bînin û tercime bikin. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:41, 24 tîrmeh 2026 (UTC)
:::Ez êvarê ve dixebitim, min nêzîk kiribû lê min got belkî hûn qane bibin lê xuya ye hûn ê hîn serê min gelek biêşînin {{=D}} [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:59, 24 tîrmeh 2026 (UTC)
::::@[[Bikarhêner:Bikarhêner|Bikarhêner]] û @[[Bikarhêner:Ghybu|Ghybu]] Eger îtîrazek tinebe, ez ê îtalîk ji jêgirtinê rakim... Jixwe bi riya [jêgirtin] dikare were veşartin û her daim bi * dest pê dike loma bi hêsanî tê fêmkirin û xwendin rihettir dibe. Bnr. [https://ku.wiktionary.org/w/index.php?title=W%C3%AEk%C3%AEferheng:ceribandin/nim%C3%BBne&oldid=6277132#L%C3%AAker_2 ceribandinê] [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:13, 24 tîrmeh 2026 (UTC)
== Request for comment (the future of Abstract Wikipedia) ==
<bdi lang="en" dir="ltr" class="mw-content-ltr">
Apologies if this has not yet been translated into your wiki's language. {{int:Please-translate}}
You are invited to voice your opinions in a [[:m:Requests for comment/The future of Abstract Wikipedia|request for comment about the future of Abstract Wikipedia]]. {{Int:Feedback-thanks-title}}
[[:m:User:Kowal2701|Kowal2701]] ([[:m:User talk:Kowal2701|talk]]) 12:25, 24 tîrmeh 2026 (UTC)
</bdi>
<!-- Message sent by User:DreamRimmer@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== ''mê'' yan ''nêr'' li gorî maneyê / ''mê'' yan ''nêr'' (bikaranîn dudil e) ==
[//ku.wiktionary.org/w/index.php?title=xelat&diff=prev&oldid=6291766]: Mixabin pirr bikarhêner şûnda parametreya <code>z=m/n</code> ('' m yan n li gorî maneyê'') <code>z=mn</code> (''m yan n (bikaranîn dudil e)'') bi kar tînin ([[Şablon:navdêr#Parametre]]) ji ber ku di nav her du nivîsê de pir ferq nebînin. Nizanim em ê dîsa parametreya <code>z=nt</code> (''nêtar'') çêkin, wekî berê: [//ku.wiktionary.org/w/index.php?title=W%C3%AEk%C3%AEferheng:D%C3%AEwan/ar%C5%9F%C3%AEv_2019&oldid=6104681#Zayend]. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 00:17, 28 tîrmeh 2026 (UTC)
:Merheba {{r|Ghybu}} {{demo|sep=wisa xuya dibe:<br>|<nowiki>{{navdêr|ku|kelîme|c=mn}}</nowiki>}}
Ya din jî; {{demo|sep=wisa xuya dibe:<br>|<nowiki>{{navdêr|ku|kelîme|c=m/n}}</nowiki>}}
Tu dixwazî em wana berevajî bikin? Not: nêtar ji bo kurmancî nabe, mn û m/n baş in. Berê ji ber ku m/n tinebû, her kes li gorî parametreyên heyî dixebitî. Niha hene bi min problem nîne eger em berevajî nekin.--[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 05:32, 28 tîrmeh 2026 (UTC)
: Bi min ev format baştir e:
{{demo|sep=wisa xuya dibe:<br>|<nowiki>{{navdêr|ku|kelîme|c1=m|c1etîk=Mêrdîn|c2=n|c2etîk=Dihok}}</nowiki>}}
Yan jî:
{{demo|sep=wisa xuya dibe:<br>|<nowiki>{{navdêr|ku|zayend|c1=n|c2=m|c1ref={{Jêgirtin/Celadet Alî Bedirxan/HAWAR Cild 1 Hejmar 1-23 (1932-1933)/1998|hejmar=4|sal=1938}}|c2ref={{Zana Farqînî}}}}</nowiki>}}
{{çavkanî}}
:--[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 05:49, 28 tîrmeh 2026 (UTC)
::Feqat em dikarin li şûna {{param2|c|m/n}}, {{param2|c|mn?}} yan {{param2|c|mn!}} çêkin ji bo ku neyên tevlihevkirin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 06:00, 28 tîrmeh 2026 (UTC)
:::Ez jî dizanim ku "nêtar ji bo kurmancî nabe" ([//ku.wiktionary.org/w/index.php?title=Got%C3%BBb%C3%AAj%3Afikirmend&diff=3063789&oldid=3063526]) jixwe min "nêtar" kiribû "[//ku.wiktionary.org/w/index.php?title=Got%C3%BBb%C3%AAj:fikirmend&diff=prev&oldid=3063788 mê an nêr li gorî bikaranînê]". Feqet nizanim çima rind nayê fêm kirin: Ferhengvan jî ew parametreyê bi awayekî rast bi kar nayîne [//ku.wiktionary.org/w/index.php?title=Got%C3%BBb%C3%AAj%3Areh&diff=6235991&oldid=6235985]. {{ping|Bikarhêner}} ? Min heta niha pirr gotar serrerastkir... Em ê hertim kontrol bikinê: pêşta problemeke vitira tine bû :) [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 15:13, 28 tîrmeh 2026 (UTC)
::::Bi rastî kî li vira parametreyên ku te li jor nivîsandine bi kar tîne {{=D}} ? Ji bîr meke em li ser wîkîferhenga kurdî ne... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 15:39, 28 tîrmeh 2026 (UTC)
:::::Ya muhîm hebûna sîstemekê ye, heta niha ti sîstemeke baş nehatiye çêkirin û ti rê nehatiye dayîn ji bikarhêneran re ku hîn bibin, hêdî hêdî em ê çi ji destê me were, çêkin û hîn bikin. Bi min atolyeyek lazim e em hin tiştan ji bikarhênerên din re hîn bikin. Mîsal min <code><nowiki>{{subst:beralîbike}}</nowiki></code> li wîkîpediyayê çêkir û ji bikarhênerekî re nîşan da çawa tê bikaranîn, wî dest bi bikaranînê kir. Ji ber ku bikarhênerekî mobîlê ye, nikaribû bi tenê serê xwe beralîkin çêke her daîm alîkarî ji kesên din dixwast ku pir carî ti kes nedihat. Însanên me ji aliyê teknîkî ve baş nebin jî, wextê bi riyeke baş îzah dikî, fam dikim şikir ji xwedê re.
:::::Welhasil, [https://ku.wiktionary.org/w/index.php?title=reh&diff=prev&oldid=6291839 reh] çêbû? Eger tu nabêjî nêtar be, min daxwaza te fam nekir. Tu çi dixwazî em çawa bikin? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 15:58, 28 tîrmeh 2026 (UTC)
::::::Nivîs dîsa "''mê yan nêr li gorî maneyê''" be (kategorî jî) feqet di nav parametreyê de <code>mn</code> neyê nivîsandin. Parametre wekî {{param2|z/c|nt}} bisekiniyana (an jî navekî din "g" an "c") feqet nivîs û kategorî bihata guhertin... Herwiha profîlên bikarhênerên ku tên vira wekî en.wiki nînin: li vir zêde namînin û tiştên ku hu dikin jî ji bîr dikin. PS: Di zimanê peştûyî de jî (nêzîkî zimanê kurmancî ye) peyvên "mê an nêr" (''common gender'') hene [[:en:Category:Pashto nouns with multiple genders]] [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 17:28, 28 tîrmeh 2026 (UTC)
:::::::"g", "c", "nt" gî behsa cureyekî xisûsî dikin loma nabin, feqat di nav [https://ku.wiktionary.org/w/index.php?title=Modul:r%C3%AAziman&oldid=6115355#L-306 Modul:rêziman] de koda me "mn" otomatîk dike "mnmane" min ji bo back-compatiblity wisa kiribû lê ya rast "mnmane" ya, em "mn" ji bo kurmancî rakin, hemû "mn" bikin "mnmane" û "m/n" jî rakin û bikin "mndudil", nabe? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 17:44, 28 tîrmeh 2026 (UTC)
::::::::OK, bi min baş e:) [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 18:18, 28 tîrmeh 2026 (UTC)
:::::::::Îmkan heye şablona tewandinê jî wisa bikî ku hem di qismê tewandinê de hem jî aliyê rastê were bikaranîn? Wekî me [[Wîkîferheng:Dîwan/2026#Beşa_Tewandin_bo_kurmancî|li vir]] got? Wextê gelek dirêj be yan mndudil be, em dikarin bixin qismê tewandinê bi şiklê "ya mêr" û "ya nêr". Wekî din yên biçûk û standard bila li aliyê rastê bimînin? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 18:54, 28 tîrmeh 2026 (UTC)
::::::::::Erê bi parametreya {{param2|hêl|çep}} tê çêkirin. Belkî bi JSê tiştekî vitra jî tê çêkirin: dema ku tablo pirr fireh ye (>450px) tablo wekî "veşartî" xuya bike...
::::::::::"''Wekî din yên biçûk û standard bila li aliyê rastê bimînin?''": '''Aliyê rast:''' Dema ku tu mînakan dixwînî bi hêsanî tabloya tewandinê jî seh dikî (pedagojîk e). '''Bin beşa Tewandinê:''' 1) Ji bo mobilan rind e, tablo ne ser maneya peyvê ye. 3) Şûnda maneyan direj dibe 3) Wêne baştir xuya dikin ji ber ku ne bin tabloyê ne. '''Encam''': yek pratîk e, yek jî pedagojîk e [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 19:27, 28 tîrmeh 2026 (UTC)
:::::::::::Di bin beşa Tewandinê de baştir xuya dike... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 20:28, 28 tîrmeh 2026 (UTC)
::::::::::::Erê {{=D}} [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:29, 28 tîrmeh 2026 (UTC)
:::::::::::::Feqat lazim e yên mezin wekî [[mustensîx]] di nav qutîyê de bê wekî [[:en:heval]] di mobîlê de ya me sayfeyê fireh dike, ya îngilîzî de dikarî qutîyê bişemitînî [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:44, 28 tîrmeh 2026 (UTC)
::::::::::::::Formata herî xweş [https://ku.wiktionary.org/wiki/mustens%C3%AEx#Kurmanc%C3%AE] resm jî lê tê tablo jî di cihê xwe de ye. Wekî din wextê tablo li aliyê rastê ye însan naxwaze resmekî jî lê zêde bike. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:54, 28 tîrmeh 2026 (UTC)
:::::::::::::::''overflow'' bi tagên "div"-an rind tên çêkirin. Em ê tabloyên ''NavFrame'' bi kar bînin... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:06, 28 tîrmeh 2026 (UTC)
::::::::::::::::Eger class inflection-table bi kar bînî, bi [[MediaWiki:Gadget-defaultVisibilityToggles.js#L-43]] ê ku dixwaze dikare gîya veşêre an nîşan bide. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:11, 28 tîrmeh 2026 (UTC)
:::::::::::::::::Min fêm nekir, biryara we çi ye? Hemû bin beşa Tewandinê? an jî herdu? Li gor wê şablon tê guherandin. Bi min ferq nake, her du jî baş in... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:19, 28 tîrmeh 2026 (UTC)
::::::::::::::::::Me [[#Beşa Tewandin bo kurmancî|li jor]] gotibû bila hemû di beşa Tewandinê de bin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:21, 28 tîrmeh 2026 (UTC)
:::::::::::::::::::Erê, min xwand Bikarnêner tiştekî din gotibû... Tu bi botê çêdikî? Bi botê hemû tabloyan bê parmetreya "hêl" bike bin beşa "Tewandin"-ê. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:30, 28 tîrmeh 2026 (UTC)
::::::::::::::::::::Va rabim botekê hazir bikim. Bi qasî min jê fam kir, tam nabêje hemû nekin, nabêje hemû bikin jî. Lê em hemû bikin çunkî du kes got erê. Cihê Tewandinê piştî Bi alfabeyên din û Formên alternatîv be an jî beriya wan piştî maneyê (piştî wajeya klasîk) be? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:38, 28 tîrmeh 2026 (UTC)
:::::::::::::::::::::Eger di yekcarê de nayê çêkirin bi parametreya "hêl" ve çêke. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:42, 28 tîrmeh 2026 (UTC)
::::::::::::::::::::::[https://linkcount.toolforge.org/?project=ku.wiktionary.org&page=%C5%9Eablon%3Aku-tew%C3%AEn-nav 27 hezar] car tê bikaranîn, Eger behsa wextê dikî, ne problem e, eger behsa "tenê yên fireh bixin tewandinê" wê carê yên mê û nêr bixim? Te cewaba pirsê cihê tewandinê jî neda? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:48, 28 tîrmeh 2026 (UTC)
:::::::::::::::::::::::Lojîk dibêje ku piştî bi "alfabeyên din", "formên alternatîv" û "Ji wêjeya klasîk" [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:55, 28 tîrmeh 2026 (UTC)
::::::::::::::::::::::::Feqet tabloya tewandinê dûr dikeve... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 22:00, 28 tîrmeh 2026 (UTC)
:::::::::::::::::::::::::Bi min "Bi alfabeyên din" bixin piştî Bilêvkirinê çûnkî @[[Bikarhêner:Ferhengvan|Ferhengvan]] pir caran ji bo nîşandana dengî alfaba erebî bi kar tîne, h3 rengê teal tenê ji bo "Navdêr, Lêker hwd." bi cssê bi kar bînin [https://ku.wiktionary.org/w/index.php?title=Bikarh%C3%AAner:Wikihez/vector-2022.css&diff=prev&oldid=6241199 wekî wisa lê berevajî], Piştî "Ji wêjeyê/klasîk" em tewandinê deynîn, "Formên alternatîv" piştî Tewandinê be û îro nekin, eger dixwazî di ceribandinê de tabloya nû hazir bike, em hefteyek li hêviya hevalên din bisekinin, eger îtîraz nehat, em çêkin? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:15, 28 tîrmeh 2026 (UTC)
::::::::::::::::::::::::::Beşa "Bikaranîn" jî heye... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 22:28, 28 tîrmeh 2026 (UTC)
:::::::::::::::::::::::::::Piştî Bikaranînê bnr. [[:en:Wiktionary:Entry_layout#Headings_after_the_definitions]] [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:37, 28 tîrmeh 2026 (UTC)
::::::::::::::::::::::::::::(h3) Bilêvkirin, Bi alfabeyên din, Sinifa rêzimanî,
::::::::::::::::::::::::::::(h4) Ji wêjeyê/klasîk (divê were xistin bin maneyê), Bikaranîn, Tewandin, Formên alternatîv, Hevmane, Nêzîk, Dijmane, Jê, Têkildar, Etîmolojî (eger du sinifa rêzimanî ji eynî kokê hebe h3) Dûnde, Binêre herwiha, Werger [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:40, 28 tîrmeh 2026 (UTC)
{{outdent|::::::::::::::::::::::::::::}} {{r|Ferhengvan|Bikarhêner|Keyomerd|Zerwanda|Kurdanparez}} Fikir? --[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:42, 28 tîrmeh 2026 (UTC)
:"Bi alfabeyên din" beşeke pirr hewce nîne, niha beşa "mane" li ser rûpelê dûr dikeve. Bi min "Bîlêvkirin" > Mane > Ji wêjeya klasîk (wekî mînak e) > Bikaranîn > Tewandin > Bi alfabeyên din > Formên alternatîv > ... Divê beşên ku herî zêde tên xwastin werin "ronîkirin". [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 03:07, 29 tîrmeh 2026 (UTC)
::''[[bileks|Bîl'eks]],'' "Bi alfabeyên din" gelek muhîm e, ev ji bo kurmancî "formên alternatîv"-a wîkiya îngilîzî ye, başûrî tenê bi alfaba erebî dinivîsin û wextê kelîmeyek digerin çawa zanibin hatin kîjan kelîmeyê? Bi kirîlî ne lazim e lê bi erebî mecbûrî ye. Ji bo nettir bikin, lazim e em beşa "Bi alfabeyên din" baştir bikin. Mane hinek li jêr be ne muhîm e, wîkiya îngilîzî de jî gelek car lazim e herî jêr ji bo dîtina maneyê. "Ronîkirin"/teal xelet tê famkirin, sankî "qismê sereke (h3) lazim e wê be û qismên din werin xistin binê wê" tê famkirin loma em tenê Mane ronî bikin bes e, ka [https://ku.wiktionary.org/w/index.php?title=Bikarh%C3%AAner:Wikihez/common.css&oldid=6291927 vê cssê] biceribîne û dîsa fikrên xwe bibêje. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 07:20, 29 tîrmeh 2026 (UTC)
:1. '''Li ser cinsîyetê:''' Bi min, em malûmatên ekstra yên wek ''"li Dihokê nêr, li Serhedê mê"'' (Serhed:m|Dihok:n) li qismê ''"Bikaranîn/Emilandin"''ê bidin baştir e. Kelîme di ferhengan de wek form û cinsîyet bi halê standard cih digirin, eger li mintiqayek cuda be ew cudahî li qismê "Bikaranîn/Emilandin"ê wek malûmatek ekstra cih bigire çêtir e. Ferhenga ku em vê gavê ji bo standardkirinê esas digirin ''"Ji bo Rastnivîsînê Ferhenga Kurdî (Kurmancî) - Tirkî ya Nû"'' de jî bi yek cinsîyetê cih dane kelîmeyan. Ji xeynî wê di ferhenga standardkirinê ya Weqfa Mezopotamyayê de jî ew kelîme bi yek cinsîyetê cih digirin. Tiştekî din jî bêjim, eger em şablonê wek "mndudil" bi nav bikin mimkin e ku rê bide şaşîyan. Çimkî gava mirov wê dibîne, mirov dibêje qey li ser cinsîyeta kelîmeyê dudilîyek heye, bi qenaeta min dudilîyek bi wî şiklî nîne. Divê her kelîme xwedî cinsîyetekê bin û îstîsnayên mintiqayî -ger were xwestin- ekstra were nîşandan. Lewma bi min halê mewcûd baş e. 2. '''Li ser şablonên tewandinê:''' Ger şablonên tewandinê di xuyabûna mobîl de bibin sedema xirabîyê, em wan şablonan ji bo mobîlan têxin qismê "Tewandin"ê. 3. '''Li ser rêzkirina qisman:''' Bi min divê mane li pêş be û ne hewce ye ku qismê "Bi alfabeyên din" derxin pêş. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:20, 29 tîrmeh 2026 (UTC)
:Li ser cinsiyetê erê, eger di ferhenga rastnivîsînê de cinsiyet hatibe nivîsandin ne hewce ye em "mndudil" binivîsin li qismê Bikaranînê behskirin bes e, lê eger tê de ev kelîme tinebe û di ferhengên din de jî dudiliyek li ser bikaranîna cinsiyetê hebe, wê demê "mndudil" lazim e bikaranîn çunkî wîkîferheng lazim e li gorî çavkaniyan were nivîsin. Li ser tewandinê ne mimkûnê em di mobîlê de di qismê Tewandinê de, di sermaseyê de em li qismê maneyê bixin loma lazim e em bi yek şiklî li qismê Tewandinê hemû bixin çêtir e. Li ser "Bi alfabeyên din" ji bo min zêde muhîm nîne, feqat dîsa jî ez dibêjim lazim e were pêşxistin. Tiştekî wisa jî heye eger di sayfeyekê de ji yekî zêdetir sinifên rêzimanî hebe wê demê lazim e Bi alfabeyên din bi sê = were bikaranîn, û cihê wê ne li dawiyê lê divê piştî Bilêvkirinê be.--[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 13:45, 29 tîrmeh 2026 (UTC)
iom0hr9bldcsvkh6us2dvh31ch7i8wf
6292005
6292003
2026-07-29T13:45:28Z
Wikihez
7344
6292005
wikitext
text/x-wiki
<noinclude>{{Dîwan/arşîv-ser|2026}}</noinclude>
{{clear}}
== Daxwazên standardkirinê ==
https://ku.wiktionary.org/wiki/W%C3%AEk%C3%AEferheng:Daxwaz%C3%AAn_standardkirin%C3%AA, Gelo di vê malperê de peyvên hatîye standart kirin; ji malperê rakin? Zêde tehlîhev e. @[[Bikarhêner:Bikarhêner|Bikarhêner]]@[[Bikarhêner:Guherto|Guherto]] [[Bikarhêner:Rewiye tine|Rewiye tine]] ([[Gotûbêja bikarhêner:Rewiye tine|gotûbêj]]) 10:03, 8 kanûna paşîn 2026 (UTC)
:@[[Bikarhêner:Rewiye tine|Rewiye tine]] [[Taybet:Tercîh#mw-prefsection-gadgets]] li vir amûra [[MediaWiki:Gadget-aWa.js/belgekirin|awa]] aktîv bike û pê re dikarî gotûbêjan arşîv bikî. Li sayfa [[WF:DS]] li kêleka her sernavê gotûbêjê <nowiki>[arşîv bike]</nowiki> derdikeve, pê lê bike û ew ê arşîv bike. Eger nikarî tu tenê şablona {{ş|ds-kirî}} îlawe bike, ez ê dûre arşîv bikim. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:35, 5 tîrmeh 2026 (UTC)
== Standartkirin ==
Sala borî, min pêşnîyazek kiribû. Halî hazir piştî daxwaza standarkirinê em du heftî disekinin, eger kesek fikrek dîyar neke. Raste rast peyv li gor ferhenga standart a mezopotamyayê tê standart kirin. Ji xwe sazîyek vê karî dike çima em vê barî dikin stuyê xwe. Mesela ez çaxe di wîkîferhengê de peyvek digêrim; standart a peyvê jî li cem xwe kontrol dikim. Eger destûr hebe bi germî dikarim wê malperê standart bikim. Benda bûna du heftîyan gelo ne zehmet e? Duyemîn pêşnîyaza min nîşandana standarta peyvê di malpera de ye. Kesek dema malperan binêre, divê li jora malperan bibîne ku ev peyv standart e. Ev jî hîzmet e. Çimkî nivîskar, wergêr, edîtor, rojnemavan hez dikin bi peyvê standart binivîsin. https://ku.wiktionary.org/wiki/k%C3%AAf li vir wekî mînak min daye nîşan. Lê îfade eger wisa be: Standarda Rastnivîsîna Ferhenga Kurdî a Weqfa Mezopotamyayê kêf (r. 253) e yê çetir be. Çimkî îfadeya berê de peyva kurdî-tirkî derbas dibe û di mejîyê mirov de tevlihevî çêdibe.@[[Bikarhêner:Bikarhêner|Bikarhêner]]@[[Bikarhêner:Guherto|Guherto]] [[Bikarhêner:Rewiye tine|Rewiye tine]] ([[Gotûbêja bikarhêner:Rewiye tine|gotûbêj]]) 10:25, 8 kanûna paşîn 2026 (UTC)
:Merheba. Hevalno dîyar e karê standarkirinê li wîkîferhengê rawestîya ye. Min sê peyv ji bo standartkirinê qeyd kir. Kes li ser şîrove nenivîsî. Mehek jî li ser derbas bû. Aniha ez dikarim van rupelan biguherim. Li gor qaîdeya hatine danîn wisa ye. Daxwaza min heta niha jî ew e kelîmeyên di ferhenga standartkirinê de heyî divê em bikaribin rasterast li vir jî bikin standart. An jî demê kurttir bikin. Li weqfa mezapotamyayê 20 mirov digêhin hev li ser peyvekî seetan nîqaş dikin. Ma hewceyê em jî li vir nîqaş bikin? Tevlî vê jî ji xwe kes li ser vê mijare nasekîne van dema. Xeynî vê pêşnîyaza min nîşandana standarta peyvê di malpera de hebû. Li ser malperê 'Standarda Rastnivîsîna Ferhenga Kurdî a Weqfa Mezopotamyayê kêf (r.253) e' Tiştek mîna wî hebe yê gelek kêrî her cure nivîskarê me were. Çimkî hin nivîskarên me hez dike bi kelîmeyên standart binivîse. Di malperê de bila vê hêsanî fam bike çêtir e. @[[Bikarhêner:Bikarhêner|Bikarhêner]]@[[Bikarhêner:Ghybu|Ghybu]] [[Bikarhêner:Rewiye tine|Rewiye tine]] ([[Gotûbêja bikarhêner:Rewiye tine|gotûbêj]]) 18:35, 17 sibat 2026 (UTC)
::Merheba @[[Bikarhêner:Rewiye tine|Rewiye tine]]. Ev format pir xirab dibe. Tu dikarî li beşa Çavkaniyê binivîsî bi şablona {{ş|kitêb}} binivîsî çêtir e û tê eynî maneyê. Lê her kes standarda Weqfa Mezopotamyayê qebûl nakin û ez jî şibhê dikim ku ev websîte bi awayekî kolektîv tê çêkirin an na. Loma em bi ya kitêba rastnivisînê çêkin û eger îtîraz tinebe, şablona {{ş|ds-kirî}} li gotûbêja [[WF:DS]] binivîse, dûre li gotûbêjê arşîv bike, ne hewce ye li hêviya kesên din bisekinî. Eger itirazek hebe, ê ku dixwaze dûre dîsa şablona ds zêde bike. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:30, 5 tîrmeh 2026 (UTC)
:::[https://berwarnews.com/ferhenga-rastnivisine-qonaxeke-giring-a-standardkirina-kurmanci-ye/ Roportaja Mikail Bülbül] li ser proseya standardkirinê. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 00:57, 9 tîrmeh 2026 (UTC)
::::Min nû dît an jî nû hatiye zêdekirin lê meqaleyek bi navê [https://www.ferhengkurdi.com/?q=iltihap&modal=lijne lijneya edîtorîyê] nivîsandine [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 17:40, 22 tîrmeh 2026 (UTC)
== <span lang="en" dir="ltr">Annual review of the Universal Code of Conduct and Enforcement Guidelines</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
I am writing to you to let you know the annual review period for the Universal Code of Conduct and Enforcement Guidelines is open now. You can make suggestions for changes through 9 February 2026. This is the first step of several to be taken for the annual review. [[m:Special:MyLanguage/Universal Code of Conduct/Annual review/2026|Read more information and find a conversation to join on the UCoC page on Meta]].
The [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|Universal Code of Conduct Coordinating Committee]] (U4C) is a global group dedicated to providing an equitable and consistent implementation of the UCoC. This annual review was planned and implemented by the U4C. For more information and the responsibilities of the U4C, [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|you may review the U4C Charter]].
Please share this information with other members in your community wherever else might be appropriate.
-- In cooperation with the U4C, [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]])<section end="announcement-content" />
</div>
21:02, 19 kanûna paşîn 2026 (UTC)
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29905753 -->
== Request for comment (global AI policy) ==
<bdi lang="en" dir="ltr" class="mw-content-ltr">
Apologies for writing in English. {{int:Please-translate}}
A [[:m:Requests for comment/Artificial intelligence policy|request for comment]] is currently being held to decide on a global AI policy. {{int:Feedback-thanks-title}}
[[Bikarhêner:MediaWiki message delivery|MediaWiki message delivery]] ([[Gotûbêja bikarhêner:MediaWiki message delivery|gotûbêj]]) 00:58, 26 nîsan 2026 (UTC)
</bdi>
<!-- Message sent by User:Codename Noreste@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30424282 -->
== Guharto ==
: <small>→ Ji rûpela ''[//ku.wiktionary.org/w/index.php?title=Got%C3%BBb%C3%AAj:berf%C3%AEtik&oldid=6233338 Gotûbêj:berfîtik]'' hatiye girtin.</small>
Silav {{r|Ghybu}} ma hewce ye em guhartoyan jî kategorîze bikin? Li vê [[ژیشک]] binere, tije guhartoyên wê hene, ku em ji gişan re guhandar binivîsin dê 10 navên heman hebin di nav wê kategorîyê de. Tu çi difikirî? [[Bikarhêner:Keyomerd|Keyomerd]] ([[Gotûbêja bikarhêner:Keyomerd|gotûbêj]]) 09:40, 26 nîsan 2026 (UTC)
:{{silav|Keyomerd}}. Erê, problem çî ye? {{=)}} Ew jî tên bikaranîn... Dema ku peyvek tê çêkirin hewce ye ku em hemû agahiyên wan binivîsin: bilêvkirin, bikaranîn, mînak, terîm, herêm, tewandin, etîmolojî...
:Bi min peyvên ku wekî ''guherto'' hatine nivîsandin bi nivîsa {{w|Italic type|îtalîk|ziman=en}} (xwahr) di nav kategoriyan de werin nişan kirin (ji bo cudakirinê). {{ping|Ferhengvan|Bikarhêner}} [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 16:40, 30 nîsan 2026 (UTC)
::Yên '''''nestandard''''' di kategorîyan de biferq werin nîşandan baştir e. Qene em karibin wan ji yên stadard ferq bikin. @[[Bikarhêner:Ghybu|Ghybu]] Xêra xwe hûn sîstemeke wisa çêkin. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:36, 1 gulan 2026 (UTC)
:::Merheba @[[Bikarhêner:Keyomerd|Keyomerd]] û @[[Bikarhêner:Bikarhêner|Bikarhêner]] ev xisûsiyet jixwe di şablonên rêzimanê de heye, wextê {{param|formaalt|1}} dinivîsin, made dikeve Kategoriya [[:Kategorî:Formên alternatîv bi kurmancî]] li gorî koda zimanî jî zimanên din tê çêkirin. Hemû madeyên kurmancî bi alfabeya erebî dikevin vê kategoriyê lê nizanim ev tiştekî rast e Yan xelet e, ji bo nîşandanê min çêkiribû lê min hîn wext nedît ku nîqaşek li ser çêkim. Qaîdeyên bikaranîna vê parametreyê di wîkiya îngilîzî de jî tam ne belî ye. Du gotûbêj [https://en.wiktionary.org/wiki/Wiktionary:Requests_for_moves,_mergers_and_splits#Category:Alternative_forms_by_language] [https://en.wiktionary.org/wiki/Wiktionary:Beer_parlour/2024/June#Decluttering_the_altform_mess] çêkirine lê ji bo îngilîzî ev parametre nehatiye bikaranîn. Min ji bo nîşandanê niha [https://ku.wiktionary.org/w/index.php?title=bax%C3%A7%C3%AA_zarokan&diff=prev&oldid=6241372] ceriband lê bi min xelet e. Em çawa bikin? Kengî vê parametreyê bi kar bînin? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:29, 8 tîrmeh 2026 (UTC)
::::@[[Bikarhêner:Kurdanparez|Kurdanparez]] Tu çi difikirî? Ji bo zazakî [https://ku.wiktionary.org/w/index.php?title=a_c%C4%B1_geyrayene&oldid=6241396 wisa] bikin? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:55, 8 tîrmeh 2026 (UTC)
:::::Kategorîyekê cuda baş dibe. Wextê ku ez li kategorîya "lekêren bi zazakî" dinêrim, ez hem formê bi şikilê Johnsonê û formê standardê dibînim. Zaten wexte ku ez dikevim ê Johnsonê, min dibe formê standardê. Kategorîyekê cuda, bi taybetî ji bo nivîsandinên alternatîf, baş dibe.
:::::Lê em bîr nekin ku wextê ku em bo formên alternatîf yên devokî qal dikin, belkî adil neye ku em ev bişînin derekê din yê ku însan ewqas nabînin. [[Bikarhêner:Kurdanparez|Kurdanparez]] ([[Gotûbêja bikarhêner:Kurdanparez|gotûbêj]]) 22:03, 8 tîrmeh 2026 (UTC)
::::::@[[Bikarhêner:Kurdanparez|Kurdanparez]] Gelo min rast fêm kir? Tu dibêjî formên {{q|ku|kîvroşk}} bi dîqet werin guhartokirin lê bi yên bi alfabeya Jacobsonê hemû bikin {{param|formaalt|1}}? Formên Jacobsonê dê bikevin Kategoriya [[:Kategorî:Lêker bi zazakî|Lêker bi zazakî]] û [[:Kategorî:Lema bi zazakî|Lema bi zazakî]] yan na? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:55, 8 tîrmeh 2026 (UTC)
:::::::Bi min naxwaze di wan kategoriyan de bikeve. Wek tu dibînî dûplîkat pir hene. Bi min çareya baştir yên Johnsonê di katehgorîyekê din bikevin (bila format li rûpelan neyin guherandin, bi tenê kategorî) [[Bikarhêner:Kurdanparez|Kurdanparez]] ([[Gotûbêja bikarhêner:Kurdanparez|gotûbêj]]) 00:37, 9 tîrmeh 2026 (UTC)
== Peyvên soranî bi latînî ([[:Kategorî:Soranî]]) ==
Silav, di nav vê kategoriyê (''[[:Kategorî:Soranî]]'') de pirr peyv tenê bi alfabeya latînî hatine nivîsandin. Divê ew mutleq jî bi alfabeya erebî werin transkrîbe kirin ji ber ku soranî bi alfabeya erebî tê nivîsand... Bikarênerên ku soranî dizanin dikarin wan sererast bikin? Mînakên guhertinan: [//ku.wiktionary.org/w/index.php?title=zor%C3%AEne&curid=6584&diff=6233355&oldid=5859303], [//ku.wiktionary.org/w/index.php?title=s%C3%AAw&diff=6233097&oldid=6233003], [//ku.wiktionary.org/w/index.php?title=sewz&diff=6233313&oldid=6069107], ... Spas! [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 01:16, 2 gulan 2026 (UTC)
== <span lang="en" dir="ltr">Vote now in the 2026 U4C election</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
Eligible voters are asked to participate in the 2026 [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|Universal Code of Conduct Coordinating Committee]] election. More information–including an eligibility check, voting process information, candidate information, and a link to the vote–are available on Meta at the [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026|2026 Election information page]]. The vote closes on 2 June 2026 at [https://zonestamp.toolforge.org/1780358400 00:00 UTC].
Please vote if your account is eligible. Results will be available by 14 June 2026. -- In cooperation with the U4C,<section end="announcement-content" />
</div>
[[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]]) 17:15, 27 gulan 2026 (UTC)
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== RFC about AI-generated content in Wikimedia Commons ==
<bdi lang="en" dir="ltr">Apologies for writing in English, please help translate this message to your language. You are invited to participate in a [[c:Commons:Requests for comment/Policy update for AI content|request for comment on Wikimedia Commons about a policy update for AI content]]. This may affect files that are uploaded to Wikimedia Commons for use on this project. Thank you. [[m:User:Codename Noreste|Codename Noreste]] ([[m:User talk:Codename Noreste|gotûbêj]])</bdi> 17:12, 23 hezîran 2026 (UTC)
<!-- Message sent by User:Codename Noreste@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== <span lang="en" dir="ltr">Deployment of Legal and Safety Contacts Link in the Footer of Your Wiki</span> ==
<div lang="en" dir="ltr">
<section begin="Message"/>
'''Legal & Safety Contacts'''
Hello community, the Wikimedia Foundation has provided a [[wmf:Special:MyLanguage/Legal:Wikimedia Foundation Legal and Safety Contact Information|single legal and safety contact page]], to be linked in the footer of your wiki, to ensure access to accurate legal information. This is a regulatory requirement. We have already rolled out links to English, German, Italian, Spanish and other wikis and we will deploy to your wiki soon. [[m:Special:MyLanguage/Wikimedia_Foundation_Legal_and_Safety_Contacts_FAQ|Please read more on the project page]] and leave any comments in this thread or on the [[m:Special:MyLanguage/Talk:Wikimedia Foundation Legal and Safety Contacts FAQ|talk page]].
<section end="Message"/>
</div>
-- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 13:31, 25 hezîran 2026 (UTC)
<!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:Sannita_(WMF)/Mass_sending_test&oldid=30731267 -->
== Jêbirina ferhenga Sadallah ==
Merheba @[[Bikarhêner:Guherto|Guherto]] Îmkan heye lîsteyeke wisa çêkî ku hemû sayfeyên Cyrusbot çêkir yên ku tê de tenê tercimeyeke îngilîzî heye û ev tercime jî hatibe jêbirin? Nimûne ''[[derdzanî]], [[êşzanî]]'' tenê tercimeya [[pestology]] heye ew jî ji ber heqê telîfê hatiye jêbirin. Nimûneyeke din ''zêrrgeh'', ''zêrrkar'' [[goldsmith]] hatiye jêbirin zêr wekî zêrr hatiye guhartin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 19:48, 26 hezîran 2026 (UTC)
== Beşa Tewandin bo kurmancî ==
Bi ya min şablona {{ş|ku-tewîn-nav}} û ya fiîlê em bixin beşa Tewandinê (wekî [[şodir|zazakî]]. Bi vî awayî hem ji aliyê şiklî ve hem jî ji aliyê bikaranînê ve xweştir xuya bike. Eger di qismê Tewandinê de be, ê ku dixwaze îzah û notên xwe yan jî emilandinên din jî dikare binivîse. Hûn çi dibêjin? @[[Bikarhêner:Ferhengvan|Ferhengvan]], @[[Bikarhêner:Ghybu|Ghybu]], @[[Bikarhêner:Bikarhêner|Bikarhêner]]. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:05, 6 tîrmeh 2026 (UTC)
:Belkî em dikarin Formata şiweyan wekî ya behdînî jî têxin nav şablonê. Pir caran şiklê tabloya Tercimeyan ji ber dirêjbûna şablona teqînê jî xirab dibe wekî [[astrofizîk]]. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:08, 6 tîrmeh 2026 (UTC)
:Min mijarê te li jorê yê xwe dît, fikirên min jî hene eger baş e. Yê ku te gotiye bi min baş dibe, ji ber ku her rûpel ji vê mîna hev dibe. Em ê rindtir jî ferq li nav devokan binivîsin. [[Bikarhêner:Kurdanparez|Kurdanparez]] ([[Gotûbêja bikarhêner:Kurdanparez|gotûbêj]]) 11:44, 7 tîrmeh 2026 (UTC)
::@[[Bikarhêner:Bikarhêner|Bikarhêner]] fikr? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 08:44, 15 tîrmeh 2026 (UTC)
:::Formata ku te teklîf kirîye jî ne xerab e, baş tê xuyan. Feqet bi min halê berê (mewcûd) baştir e. Ji ber ku ev şablon (ku-tewîn-nav) bi piranî kurt in û ji bo her kesî ne mihîm e, lewma li kinarê bi formeke hebe ku karibe were vekirin û girtin baştir e. Lê belê ger şablon dirêjtir bin, em karin wekî ya wîkîya almanî bikin (ew jî wekî teklîfa te ye). -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:50, 15 tîrmeh 2026 (UTC)
== Reşwî ==
Silav ji we gî re, Pirsekê min heye.
Ez difikirim şablonekê din çê bikim boy devokek kurmancî, yê êla Reşwî. Ew lêkerên xwe hinek cuda ditewînin. Mesela te hem "ez dikim" bêjî yan jî "ez dikime", "em dikinî, em tênî, te em kuştinî" (ne "em dikin") dema xwe yek in lê maneyên xwe ne yek in, "ez bikim" "ez ê bikim" "ez bikime" û dewamên xwe hemû demên xwe yek in lê mane dîsa ne yek in.
Eger min çê kir, şûna xwe li ku derê tînim? Ez difikirim li tewandina devokên kurdî yê ku "tabên" xwe hene "kurmancîya rojavayî", "kurmancîya standard" hsw. Lê tewandin ewqes cuda ye dixwaze ku wî şablona tewandina kurdî pir were guherîn.
Hûn çi dibêjin? (R: Hûn dewên çi?) [[Bikarhêner:Kurdanparez|Kurdanparez]] ([[Gotûbêja bikarhêner:Kurdanparez|gotûbêj]]) 11:38, 7 tîrmeh 2026 (UTC)
:{{silav|Kurdanparez}} Binêre mînaka devoka ''rojhilatî'': [[Modul:ku-tewandin#L-135]] / [[Modul:ku-tewandin#L-138|L138]] / [[Modul:ku-tewandin#L-143|L-143]], .. Di nav modula ''ku-tewandin"-ê de tê çêkirin. [[Gotûbêja modulê:ku-tewandin#Paşgirên lêkeran di kurmanciya rojhilatî de]] [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 13:09, 7 tîrmeh 2026 (UTC)
::PS: Dema niha: [[Modul:ku-tewandin#L-128]]; dema borî: [[Modul:ku-tewandin#L-153]] [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 13:15, 7 tîrmeh 2026 (UTC)
:::Merheba @[[Bikarhêner:Ghybu|Ghybu]], Eger mimkin be tu dikarî yên devokî têxî binmodulekê û bila modul load bike, bi vî awayî belkî çêkirina yên nû û famkirina modulê hêsantir be? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 15:09, 7 tîrmeh 2026 (UTC)
:::Lê di devokê reşwî de hem dema niha yê statîk heye (Îng: I do -> Ez dikim) û yê progressîf heye (I am doing -> Eîz (nêr) Ez î (mê) dikime, yan jî Ez î dikime/Ez ê dikime). Reşwî ji yê standardê pirtir bo zayend ferq tîne, hem jî li dema pêşî (Ez ê bikim (Nêr) ez a bikim (Mê)). Dema pêşî jî formên cuda hene (Ezêk bikime (I will be doing it) û ez ê/a bikim (I will do it))
:::Ev di modûlê têhel bê? [[Bikarhêner:Kurdanparez|Kurdanparez]] ([[Gotûbêja bikarhêner:Kurdanparez|gotûbêj]]) 22:09, 8 tîrmeh 2026 (UTC)
== WF:Xebat ==
Min sayfeya [[WF:Xebat]] çêkir, xeletiyên ku hûn ferq dikin ji kerema xwe lê zêde bikin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 11:35, 15 tîrmeh 2026 (UTC)
== Modul:quote ==
@[[Bikarhêner:Ghybu|Ghybu]], @[[Bikarhêner:Bikarhêner|Bikarhêner]], @[[Bikarhêner:Keyomerd|Keyomerd]], @[[Bikarhêner:Ferhengvan|Ferhengvan]] Merheba, ez modula îngilîzî ya jêgirtin û çavkaniyan li gorî şablonên {{ş|jêder}} format dikim û ji bo ku hertişt wekî formata me ya niha be, gelek serê min diêşe. Ez dibêjim bila em dev ji formata niha berdin wekî ya îngilîzî bi kar bînin ji ber ku gelek xisûsiyetên îngilîzî hene ku yekî dikare biemilîne. Hûn ê bibêjin niha ji kû hat bîra tê, min got [[Wîkîferheng:Xebat#MediaWiki:Gadget-start.js|start.js]] nû bikim û min dît otomatîk çavkanî bi riya [[mw:Citoid]]ê bi riya DOI, ISBN û lînk tê çêkirin, min got wiya jî li skrîptê îlawe bikim loma min [[Wîkîferheng:Xebat#Mediawiki:Gadget-citoid-helper.js|Mediawiki:Gadget-citoid-helper.js]] hazir kir lê hin parametreyên Citoidê kêm bûn, min got ka wana rast bikim, min dît formata me ya niha ti standard bi kar nayîne tenê parametreyan bi virgulê li hev dixe.
Ez dibêjim formata îngilîzî baştir e, hem ne îtalîk e ku bi hêsanî tên xwendin, hem jî tarîx û çavkanî herî pêşî tên nîşandan ku ji bo peyitandinê bo min muhîm e. Modula îngilîzî de hema bêje her tişt hatiye çêkirin, eger em rûnin tenê yên lazim li şablona çavkaniyên xwe binivîsin ew ê gelek wext bistîne. Eger em modula îngilîzî bi kar bînin, em ê hem karibin şablonên îngilîzî bi hêsanî û rast kopî bikin hem jî kurdîkirina parametreyan gelek hêsan e. Fikir? --[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:20, 24 tîrmeh 2026 (UTC)
: Ji bo miqayesekirinê bnr. [[:en:Template:quote-book]] / [[Şablon:jêder-kitêb/ceribandin]] --[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:32, 24 tîrmeh 2026 (UTC)
::Bi min bila yê mewcûd jî bimîne, ew jî şiklen xweş û baştir e. Feqet bi min jî yên îngilîzî rehettir in, eger rastkirina yê mewcûd zehmet be, em rasterast wan ji xwe re bînin û tercime bikin. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:41, 24 tîrmeh 2026 (UTC)
:::Ez êvarê ve dixebitim, min nêzîk kiribû lê min got belkî hûn qane bibin lê xuya ye hûn ê hîn serê min gelek biêşînin {{=D}} [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:59, 24 tîrmeh 2026 (UTC)
::::@[[Bikarhêner:Bikarhêner|Bikarhêner]] û @[[Bikarhêner:Ghybu|Ghybu]] Eger îtîrazek tinebe, ez ê îtalîk ji jêgirtinê rakim... Jixwe bi riya [jêgirtin] dikare were veşartin û her daim bi * dest pê dike loma bi hêsanî tê fêmkirin û xwendin rihettir dibe. Bnr. [https://ku.wiktionary.org/w/index.php?title=W%C3%AEk%C3%AEferheng:ceribandin/nim%C3%BBne&oldid=6277132#L%C3%AAker_2 ceribandinê] [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:13, 24 tîrmeh 2026 (UTC)
== Request for comment (the future of Abstract Wikipedia) ==
<bdi lang="en" dir="ltr" class="mw-content-ltr">
Apologies if this has not yet been translated into your wiki's language. {{int:Please-translate}}
You are invited to voice your opinions in a [[:m:Requests for comment/The future of Abstract Wikipedia|request for comment about the future of Abstract Wikipedia]]. {{Int:Feedback-thanks-title}}
[[:m:User:Kowal2701|Kowal2701]] ([[:m:User talk:Kowal2701|talk]]) 12:25, 24 tîrmeh 2026 (UTC)
</bdi>
<!-- Message sent by User:DreamRimmer@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== ''mê'' yan ''nêr'' li gorî maneyê / ''mê'' yan ''nêr'' (bikaranîn dudil e) ==
[//ku.wiktionary.org/w/index.php?title=xelat&diff=prev&oldid=6291766]: Mixabin pirr bikarhêner şûnda parametreya <code>z=m/n</code> ('' m yan n li gorî maneyê'') <code>z=mn</code> (''m yan n (bikaranîn dudil e)'') bi kar tînin ([[Şablon:navdêr#Parametre]]) ji ber ku di nav her du nivîsê de pir ferq nebînin. Nizanim em ê dîsa parametreya <code>z=nt</code> (''nêtar'') çêkin, wekî berê: [//ku.wiktionary.org/w/index.php?title=W%C3%AEk%C3%AEferheng:D%C3%AEwan/ar%C5%9F%C3%AEv_2019&oldid=6104681#Zayend]. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 00:17, 28 tîrmeh 2026 (UTC)
:Merheba {{r|Ghybu}} {{demo|sep=wisa xuya dibe:<br>|<nowiki>{{navdêr|ku|kelîme|c=mn}}</nowiki>}}
Ya din jî; {{demo|sep=wisa xuya dibe:<br>|<nowiki>{{navdêr|ku|kelîme|c=m/n}}</nowiki>}}
Tu dixwazî em wana berevajî bikin? Not: nêtar ji bo kurmancî nabe, mn û m/n baş in. Berê ji ber ku m/n tinebû, her kes li gorî parametreyên heyî dixebitî. Niha hene bi min problem nîne eger em berevajî nekin.--[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 05:32, 28 tîrmeh 2026 (UTC)
: Bi min ev format baştir e:
{{demo|sep=wisa xuya dibe:<br>|<nowiki>{{navdêr|ku|kelîme|c1=m|c1etîk=Mêrdîn|c2=n|c2etîk=Dihok}}</nowiki>}}
Yan jî:
{{demo|sep=wisa xuya dibe:<br>|<nowiki>{{navdêr|ku|zayend|c1=n|c2=m|c1ref={{Jêgirtin/Celadet Alî Bedirxan/HAWAR Cild 1 Hejmar 1-23 (1932-1933)/1998|hejmar=4|sal=1938}}|c2ref={{Zana Farqînî}}}}</nowiki>}}
{{çavkanî}}
:--[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 05:49, 28 tîrmeh 2026 (UTC)
::Feqat em dikarin li şûna {{param2|c|m/n}}, {{param2|c|mn?}} yan {{param2|c|mn!}} çêkin ji bo ku neyên tevlihevkirin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 06:00, 28 tîrmeh 2026 (UTC)
:::Ez jî dizanim ku "nêtar ji bo kurmancî nabe" ([//ku.wiktionary.org/w/index.php?title=Got%C3%BBb%C3%AAj%3Afikirmend&diff=3063789&oldid=3063526]) jixwe min "nêtar" kiribû "[//ku.wiktionary.org/w/index.php?title=Got%C3%BBb%C3%AAj:fikirmend&diff=prev&oldid=3063788 mê an nêr li gorî bikaranînê]". Feqet nizanim çima rind nayê fêm kirin: Ferhengvan jî ew parametreyê bi awayekî rast bi kar nayîne [//ku.wiktionary.org/w/index.php?title=Got%C3%BBb%C3%AAj%3Areh&diff=6235991&oldid=6235985]. {{ping|Bikarhêner}} ? Min heta niha pirr gotar serrerastkir... Em ê hertim kontrol bikinê: pêşta problemeke vitira tine bû :) [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 15:13, 28 tîrmeh 2026 (UTC)
::::Bi rastî kî li vira parametreyên ku te li jor nivîsandine bi kar tîne {{=D}} ? Ji bîr meke em li ser wîkîferhenga kurdî ne... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 15:39, 28 tîrmeh 2026 (UTC)
:::::Ya muhîm hebûna sîstemekê ye, heta niha ti sîstemeke baş nehatiye çêkirin û ti rê nehatiye dayîn ji bikarhêneran re ku hîn bibin, hêdî hêdî em ê çi ji destê me were, çêkin û hîn bikin. Bi min atolyeyek lazim e em hin tiştan ji bikarhênerên din re hîn bikin. Mîsal min <code><nowiki>{{subst:beralîbike}}</nowiki></code> li wîkîpediyayê çêkir û ji bikarhênerekî re nîşan da çawa tê bikaranîn, wî dest bi bikaranînê kir. Ji ber ku bikarhênerekî mobîlê ye, nikaribû bi tenê serê xwe beralîkin çêke her daîm alîkarî ji kesên din dixwast ku pir carî ti kes nedihat. Însanên me ji aliyê teknîkî ve baş nebin jî, wextê bi riyeke baş îzah dikî, fam dikim şikir ji xwedê re.
:::::Welhasil, [https://ku.wiktionary.org/w/index.php?title=reh&diff=prev&oldid=6291839 reh] çêbû? Eger tu nabêjî nêtar be, min daxwaza te fam nekir. Tu çi dixwazî em çawa bikin? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 15:58, 28 tîrmeh 2026 (UTC)
::::::Nivîs dîsa "''mê yan nêr li gorî maneyê''" be (kategorî jî) feqet di nav parametreyê de <code>mn</code> neyê nivîsandin. Parametre wekî {{param2|z/c|nt}} bisekiniyana (an jî navekî din "g" an "c") feqet nivîs û kategorî bihata guhertin... Herwiha profîlên bikarhênerên ku tên vira wekî en.wiki nînin: li vir zêde namînin û tiştên ku hu dikin jî ji bîr dikin. PS: Di zimanê peştûyî de jî (nêzîkî zimanê kurmancî ye) peyvên "mê an nêr" (''common gender'') hene [[:en:Category:Pashto nouns with multiple genders]] [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 17:28, 28 tîrmeh 2026 (UTC)
:::::::"g", "c", "nt" gî behsa cureyekî xisûsî dikin loma nabin, feqat di nav [https://ku.wiktionary.org/w/index.php?title=Modul:r%C3%AAziman&oldid=6115355#L-306 Modul:rêziman] de koda me "mn" otomatîk dike "mnmane" min ji bo back-compatiblity wisa kiribû lê ya rast "mnmane" ya, em "mn" ji bo kurmancî rakin, hemû "mn" bikin "mnmane" û "m/n" jî rakin û bikin "mndudil", nabe? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 17:44, 28 tîrmeh 2026 (UTC)
::::::::OK, bi min baş e:) [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 18:18, 28 tîrmeh 2026 (UTC)
:::::::::Îmkan heye şablona tewandinê jî wisa bikî ku hem di qismê tewandinê de hem jî aliyê rastê were bikaranîn? Wekî me [[Wîkîferheng:Dîwan/2026#Beşa_Tewandin_bo_kurmancî|li vir]] got? Wextê gelek dirêj be yan mndudil be, em dikarin bixin qismê tewandinê bi şiklê "ya mêr" û "ya nêr". Wekî din yên biçûk û standard bila li aliyê rastê bimînin? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 18:54, 28 tîrmeh 2026 (UTC)
::::::::::Erê bi parametreya {{param2|hêl|çep}} tê çêkirin. Belkî bi JSê tiştekî vitra jî tê çêkirin: dema ku tablo pirr fireh ye (>450px) tablo wekî "veşartî" xuya bike...
::::::::::"''Wekî din yên biçûk û standard bila li aliyê rastê bimînin?''": '''Aliyê rast:''' Dema ku tu mînakan dixwînî bi hêsanî tabloya tewandinê jî seh dikî (pedagojîk e). '''Bin beşa Tewandinê:''' 1) Ji bo mobilan rind e, tablo ne ser maneya peyvê ye. 3) Şûnda maneyan direj dibe 3) Wêne baştir xuya dikin ji ber ku ne bin tabloyê ne. '''Encam''': yek pratîk e, yek jî pedagojîk e [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 19:27, 28 tîrmeh 2026 (UTC)
:::::::::::Di bin beşa Tewandinê de baştir xuya dike... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 20:28, 28 tîrmeh 2026 (UTC)
::::::::::::Erê {{=D}} [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:29, 28 tîrmeh 2026 (UTC)
:::::::::::::Feqat lazim e yên mezin wekî [[mustensîx]] di nav qutîyê de bê wekî [[:en:heval]] di mobîlê de ya me sayfeyê fireh dike, ya îngilîzî de dikarî qutîyê bişemitînî [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:44, 28 tîrmeh 2026 (UTC)
::::::::::::::Formata herî xweş [https://ku.wiktionary.org/wiki/mustens%C3%AEx#Kurmanc%C3%AE] resm jî lê tê tablo jî di cihê xwe de ye. Wekî din wextê tablo li aliyê rastê ye însan naxwaze resmekî jî lê zêde bike. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:54, 28 tîrmeh 2026 (UTC)
:::::::::::::::''overflow'' bi tagên "div"-an rind tên çêkirin. Em ê tabloyên ''NavFrame'' bi kar bînin... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:06, 28 tîrmeh 2026 (UTC)
::::::::::::::::Eger class inflection-table bi kar bînî, bi [[MediaWiki:Gadget-defaultVisibilityToggles.js#L-43]] ê ku dixwaze dikare gîya veşêre an nîşan bide. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:11, 28 tîrmeh 2026 (UTC)
:::::::::::::::::Min fêm nekir, biryara we çi ye? Hemû bin beşa Tewandinê? an jî herdu? Li gor wê şablon tê guherandin. Bi min ferq nake, her du jî baş in... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:19, 28 tîrmeh 2026 (UTC)
::::::::::::::::::Me [[#Beşa Tewandin bo kurmancî|li jor]] gotibû bila hemû di beşa Tewandinê de bin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:21, 28 tîrmeh 2026 (UTC)
:::::::::::::::::::Erê, min xwand Bikarnêner tiştekî din gotibû... Tu bi botê çêdikî? Bi botê hemû tabloyan bê parmetreya "hêl" bike bin beşa "Tewandin"-ê. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:30, 28 tîrmeh 2026 (UTC)
::::::::::::::::::::Va rabim botekê hazir bikim. Bi qasî min jê fam kir, tam nabêje hemû nekin, nabêje hemû bikin jî. Lê em hemû bikin çunkî du kes got erê. Cihê Tewandinê piştî Bi alfabeyên din û Formên alternatîv be an jî beriya wan piştî maneyê (piştî wajeya klasîk) be? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:38, 28 tîrmeh 2026 (UTC)
:::::::::::::::::::::Eger di yekcarê de nayê çêkirin bi parametreya "hêl" ve çêke. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:42, 28 tîrmeh 2026 (UTC)
::::::::::::::::::::::[https://linkcount.toolforge.org/?project=ku.wiktionary.org&page=%C5%9Eablon%3Aku-tew%C3%AEn-nav 27 hezar] car tê bikaranîn, Eger behsa wextê dikî, ne problem e, eger behsa "tenê yên fireh bixin tewandinê" wê carê yên mê û nêr bixim? Te cewaba pirsê cihê tewandinê jî neda? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:48, 28 tîrmeh 2026 (UTC)
:::::::::::::::::::::::Lojîk dibêje ku piştî bi "alfabeyên din", "formên alternatîv" û "Ji wêjeya klasîk" [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 21:55, 28 tîrmeh 2026 (UTC)
::::::::::::::::::::::::Feqet tabloya tewandinê dûr dikeve... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 22:00, 28 tîrmeh 2026 (UTC)
:::::::::::::::::::::::::Bi min "Bi alfabeyên din" bixin piştî Bilêvkirinê çûnkî @[[Bikarhêner:Ferhengvan|Ferhengvan]] pir caran ji bo nîşandana dengî alfaba erebî bi kar tîne, h3 rengê teal tenê ji bo "Navdêr, Lêker hwd." bi cssê bi kar bînin [https://ku.wiktionary.org/w/index.php?title=Bikarh%C3%AAner:Wikihez/vector-2022.css&diff=prev&oldid=6241199 wekî wisa lê berevajî], Piştî "Ji wêjeyê/klasîk" em tewandinê deynîn, "Formên alternatîv" piştî Tewandinê be û îro nekin, eger dixwazî di ceribandinê de tabloya nû hazir bike, em hefteyek li hêviya hevalên din bisekinin, eger îtîraz nehat, em çêkin? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:15, 28 tîrmeh 2026 (UTC)
::::::::::::::::::::::::::Beşa "Bikaranîn" jî heye... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 22:28, 28 tîrmeh 2026 (UTC)
:::::::::::::::::::::::::::Piştî Bikaranînê bnr. [[:en:Wiktionary:Entry_layout#Headings_after_the_definitions]] [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:37, 28 tîrmeh 2026 (UTC)
::::::::::::::::::::::::::::(h3) Bilêvkirin, Bi alfabeyên din, Sinifa rêzimanî,
::::::::::::::::::::::::::::(h4) Ji wêjeyê/klasîk (divê were xistin bin maneyê), Bikaranîn, Tewandin, Formên alternatîv, Hevmane, Nêzîk, Dijmane, Jê, Têkildar, Etîmolojî (eger du sinifa rêzimanî ji eynî kokê hebe h3) Dûnde, Binêre herwiha, Werger [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:40, 28 tîrmeh 2026 (UTC)
{{outdent|::::::::::::::::::::::::::::}} {{r|Ferhengvan|Bikarhêner|Keyomerd|Zerwanda|Kurdanparez}} Fikir? --[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:42, 28 tîrmeh 2026 (UTC)
:"Bi alfabeyên din" beşeke pirr hewce nîne, niha beşa "mane" li ser rûpelê dûr dikeve. Bi min "Bîlêvkirin" > Mane > Ji wêjeya klasîk (wekî mînak e) > Bikaranîn > Tewandin > Bi alfabeyên din > Formên alternatîv > ... Divê beşên ku herî zêde tên xwastin werin "ronîkirin". [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 03:07, 29 tîrmeh 2026 (UTC)
::''[[bileks|Bîl'eks]],'' "Bi alfabeyên din" gelek muhîm e, ev ji bo kurmancî "formên alternatîv"-a wîkiya îngilîzî ye, başûrî tenê bi alfaba erebî dinivîsin û wextê kelîmeyek digerin çawa zanibin hatin kîjan kelîmeyê? Bi kirîlî ne lazim e lê bi erebî mecbûrî ye. Ji bo nettir bikin, lazim e em beşa "Bi alfabeyên din" baştir bikin. Mane hinek li jêr be ne muhîm e, wîkiya îngilîzî de jî gelek car lazim e herî jêr ji bo dîtina maneyê. "Ronîkirin"/teal xelet tê famkirin, sankî "qismê sereke (h3) lazim e wê be û qismên din werin xistin binê wê" tê famkirin loma em tenê Mane ronî bikin bes e, ka [https://ku.wiktionary.org/w/index.php?title=Bikarh%C3%AAner:Wikihez/common.css&oldid=6291927 vê cssê] biceribîne û dîsa fikrên xwe bibêje. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 07:20, 29 tîrmeh 2026 (UTC)
:1. '''Li ser cinsîyetê:''' Bi min, em malûmatên ekstra yên wek ''"li Dihokê nêr, li Serhedê mê"'' (Serhed:m|Dihok:n) li qismê ''"Bikaranîn/Emilandin"''ê bidin baştir e. Kelîme di ferhengan de wek form û cinsîyet bi halê standard cih digirin, eger li mintiqayek cuda be ew cudahî li qismê "Bikaranîn/Emilandin"ê wek malûmatek ekstra cih bigire çêtir e. Ferhenga ku em vê gavê ji bo standardkirinê esas digirin ''"Ji bo Rastnivîsînê Ferhenga Kurdî (Kurmancî) - Tirkî ya Nû"'' de jî bi yek cinsîyetê cih dane kelîmeyan. Ji xeynî wê di ferhenga standardkirinê ya Weqfa Mezopotamyayê de jî ew kelîme bi yek cinsîyetê cih digirin. Tiştekî din jî bêjim, eger em şablonê wek "mndudil" bi nav bikin mimkin e ku rê bide şaşîyan. Çimkî gava mirov wê dibîne, mirov dibêje qey li ser cinsîyeta kelîmeyê dudilîyek heye, bi qenaeta min dudilîyek bi wî şiklî nîne. Divê her kelîme xwedî cinsîyetekê bin û îstîsnayên mintiqayî -ger were xwestin- ekstra were nîşandan. Lewma bi min halê mewcûd baş e. 2. '''Li ser şablonên tewandinê:''' Ger şablonên tewandinê di xuyabûna mobîl de bibin sedema xirabîyê, em wan şablonan ji bo mobîlan têxin qismê "Tewandin"ê. 3. '''Li ser rêzkirina qisman:''' Bi min divê mane li pêş be û ne hewce ye ku qismê "Bi alfabeyên din" derxin pêş. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:20, 29 tîrmeh 2026 (UTC)
::Li ser cinsiyetê erê, eger di ferhenga rastnivîsînê de cinsiyet hatibe nivîsandin ne hewce ye em "mndudil" binivîsin li qismê Bikaranînê behskirin bes e, lê eger tê de ev kelîme tinebe û di ferhengên din de jî dudiliyek li ser bikaranîna cinsiyetê hebe, wê demê "mndudil" lazim e bikaranîn çunkî wîkîferheng lazim e li gorî çavkaniyan were nivîsin. Li ser tewandinê ne mimkûnê em di mobîlê de di qismê Tewandinê de, di sermaseyê de em li qismê maneyê bixin loma lazim e em bi yek şiklî li qismê Tewandinê hemû bixin çêtir e. Li ser "Bi alfabeyên din" ji bo min zêde muhîm nîne, feqat dîsa jî ez dibêjim lazim e were pêşxistin. Tiştekî wisa jî heye eger di sayfeyekê de ji yekî zêdetir sinifên rêzimanî hebe wê demê lazim e Bi alfabeyên din bi sê = were bikaranîn, û cihê wê ne li dawiyê lê divê piştî Bilêvkirinê be.--[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 13:45, 29 tîrmeh 2026 (UTC)
f5rrsu6o0zxy491x4e1nrwmsgwa3srn
Şablon:zza-tewîn-lk
10
1357452
6292014
6242372
2026-07-29T14:59:29Z
Ghybu
1393
{tabloya-tewandinê-ser}}
6292014
wikitext
text/x-wiki
<includeonly>{{tabloya-tewandinê-ser|title=Tewandina ''{{{1|{{SUBPAGENAME}}}}}''|palette=purple|tall=yes}}
! colspan="6" class="outer" style="font-size:95%;" | {{nobold|Rehê dema niha:}} '''{{{reh|}}}-''' <br> {{nobold|Navbenda dema niha:}} '''-{{{infix|n}}}-'''
|-
! style="font-size:85%;" | Dem
! colspan="2" style="font-size:85%;" | Kes
! style="font-size:85%;" | {{w|Kirmanckî}}
! style="font-size:85%;" | {{w|Dimilî}}
|-
! rowspan="10" | Niha
|-
! rowspan="2" style="background-color:#f2f2f2" | ez
! style="background-color:#f2f2f2"| {{nobold|''nêr''}}
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_1s|a}}}(ne)/<br/>{{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_1s|u}}}(ne) || {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{dim_1s|o}}}
|-
! style="background-color:#f2f2f2"| {{nobold|''mê''}}
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_1s|a}}}(ne)/<br/>{{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_1s|u}}}(ne) || {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{dim_1s|a}}}
|-
! rowspan="2" style="background-color:#f2f2f2"| ti
! style="background-color:#f2f2f2"| {{nobold|''nêr''}}
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_2s|a}}} || {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{dim_2s|ê}}}
|-
! style="background-color:#f2f2f2"| {{nobold|''mê''}}
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_2s|a}}} || {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{dim_2s|a}}}
|-
! rowspan="2" style="background-color:#f2f2f2"| <span style="cursor:help; border-bottom: 1px dotted #555555;" title="Kesê 3em yekjimar">3y</span>
! style="background-color:#f2f2f2" | o {{nobold|''(nêr)''}}
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_3sm|o}}} || {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{dim_3sm|o}}}
|-
! style="background-color:#f2f2f2" | a {{nobold|''(mê)''}}
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_3sf|a}}} || {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{dim_3sf|a}}}
|-
!colspan="2" style="background-color:#f2f2f2" | ma
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_1p|îme}}} || {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{dim_1p|ê}}}
|-
! colspan="2" style="background-color:#f2f2f2" | şima
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_2p|ê}}} || {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{dim_2p|ê}}}
|-
! colspan="2" style="background-color:#f2f2f2" | ê
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_3p|ê}}} || {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{dim_3p|ê}}}
|-
! rowspan="3" | Fermanî
|-
! colspan="2" style="background-color:#f2f2f2" | <small>{{nobold|Yekjimar}}</small>
| {{#if:{{{kiu.imp.y|}}} | {{{kiu.imp.y}}} | {{{aux|}}} {{#if: {{{aux|}}} {{{prefix|}}} | {{{prefix|}}} | bi}}{{{reh|}}}{{#ifeq: {{#invoke:String|len|s={{{reh|}}} }} | 1
| e
| {{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û =
| #default =
}}}} }} || {{#if:{{{diq.imp.y|}}} | {{{diq.imp.y}}} | {{{aux|}}} {{#if: {{{aux|}}} {{{prefix|}}} | {{{prefix|}}} | bi}}{{{reh|}}}{{#ifeq: {{#invoke:String|len|s={{{reh|}}} }} | 1
| i
| {{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û =
| #default = i
}}}} }}
|-
! colspan="2" style="background-color:#f2f2f2" | <small>{{nobold|Pirjimar}}</small>
| {{#if:{{{kiu.imp.p|}}} | {{{kiu.imp.p}}} | {{{aux|}}} {{#if: {{{aux|}}} {{{prefix|}}} | {{{prefix|}}} | bi}}{{{reh|}}}{{#ifeq: {{#invoke:String|len|s={{{reh|}}} }} | 1
| erê
| {{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = rê
| #default = ê
}} }} }}|| {{#if:{{{diq.imp.p|}}} | {{{diq.imp.p}}} | {{{aux|}}} {{#if: {{{aux|}}} {{{prefix|}}} | {{{prefix|}}} | bi}}{{{reh|}}}{{#ifeq: {{#invoke:String|len|s={{{reh|}}} }} | 1
| irê
| {{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = rê
| #default = ê
}}
}} }}
{{tabloya-tewandinê-bin}}</includeonly><noinclude>
{{belgekirin}}
</noinclude>
jh154ejky3bc6g3sqv4zethztjl9gzp
Şablon:zza-tewîn-nav
10
1357477
6292047
6240012
2026-07-29T18:42:18Z
Ghybu
1393
6292047
wikitext
text/x-wiki
<includeonly>
{| class="zza-tewîn-nav"
|-
|valign="top" | {{#invoke:diq-tewîn-nav|show}}
|valign="top" | {{#invoke:kiu-tewîn-nav|show}}
|}</includeonly><noinclude>{{belgekirin}}</noinclude>
kob95gbfpe61sj6g7fqylfgzvtzsq1b
6292052
6292047
2026-07-29T18:59:55Z
Ghybu
1393
Guhartoya [[Special:Diff/6292047|6292047]] yê [[Special:Contributions/Ghybu|Ghybu]] ([[User talk:Ghybu|gotûbêj]]) şûnde kir
6292052
wikitext
text/x-wiki
<templatestyles src="zza-tewîn-nav/style.css"/><includeonly>
{| class="zza-tewîn-nav"
|-
|valign="top" | {{#invoke:diq-tewîn-nav|show}}
|valign="top" | {{#invoke:kiu-tewîn-nav|show}}
|}</includeonly><noinclude>{{belgekirin}}</noinclude>
prhdvfn4sn1i69rk0gv3290rb3k94ak
Modul:kiu-tewîn-nav
828
1357479
6292046
6240006
2026-07-29T18:40:44Z
Ghybu
1393
kod
6292046
Scribunto
text/plain
local export = {}
local u = require("Module:diq-tewîn-nav/utils")
-- single label + single value spanning the two value columns
local function rowSpan2(label, val)
return '\n|- ' ..
'\n! ' .. label ..
'\n| colspan="2" | ' .. val
end
-- case row: label + singular value + plural value (three columns)
local function row3(label, sing, plural)
return '|-' ..
'\n! ' .. label ..
'\n| ' .. sing ..
'\n| ' .. plural
end
local function sectionHead(text)
return '|-\n! colspan="3" class="outer" | ' .. text
end
function export.show(frame)
local args = frame:getParent().args
local word = args[1]
if not word or mw.text.trim(word) == "" then
word = mw.title.getCurrentTitle().text
else
word = mw.text.trim(word)
end
local gender = args.gender or args.g or args.z or "n"
gender = mw.ustring.lower(mw.text.trim(gender))
local last = u.lastChar(word)
local endsVowel = u.endsInVowel(word)
local endsE = (last == "e")
local endsA = (last == "a")
-- indefinite
local indef
if endsE then
indef = u.dropLast(word) .. "ê"
elseif endsVowel then
indef = word .. "yê"
else
indef = word .. "ê"
end
-- singular
local nom = word
local obl, voc
if gender == "n" then
obl = endsVowel and (word .. "yî") or (word .. "î")
voc = endsVowel and (word .. "yo") or (word .. "o")
else
obl = word
if endsE then
voc = u.dropLast(word) .. "ê"
elseif endsVowel then
voc = word .. "yê"
else
voc = word .. "ê"
end
end
-- plural (drop final -e first if the noun is feminine)
local pBase = word
if gender == "m" and endsE then
pBase = u.dropLast(word)
end
local pEndsVowel = u.endsInVowel(pBase)
local pEndsA = u.endsIn(pBase, "a")
local plNom
if pEndsA then
plNom = u.dropLast(pBase) .. "ê"
elseif pEndsVowel then
plNom = pBase .. "yî"
else
plNom = pBase .. "î"
end
local plObl = pEndsVowel and (pBase .. "yan") or (pBase .. "an")
local plVoc = pEndsVowel and (pBase .. "yêno") or (pBase .. "êno")
-- izafe
local izM = endsVowel and (word .. "yê") or (word .. "ê")
local izF
if endsE then
izF = u.dropLast(word) .. "a"
elseif endsVowel then
izF = word .. "ya"
else
izF = word .. "a"
end
local izPl = pEndsVowel and (pBase .. "yê") or (pBase .. "ê")
local genderLabel = (gender == "n") and "nêr" or "mê"
local tableHeader = mw.getCurrentFrame():expandTemplate{
title = 'tabloya-tewandinê-ser',
args = {
title = 'Dimilî: tewandina <i>'.. word .. '</i> (' .. genderLabel.. ')',
palette = 'purple',
tall = 'yes',
}
}
local tableFooter = mw.getCurrentFrame():expandTemplate{ title = 'tabloya-tewandinê-bin' }
local out = {}
table.insert(out, tableHeader)
table.insert(out, sectionHead("Nebinavkirî"))
table.insert(out, '|-\n| colspan="3" |' .. indef)
table.insert(out, sectionHead("Binavkirî"))
table.insert(out, '|-\n! Rewş\n! Yekjimar\n! Pirjimar')
table.insert(out, row3("Navkî", nom, plNom))
table.insert(out, row3("Çemandî", obl, plObl))
table.insert(out, row3("Bangkirin", voc, plVoc))
table.insert(out, sectionHead("Îzafe"))
if gender == "n" then
table.insert(out, rowSpan2("Nêr", izM))
else
table.insert(out, rowSpan2("Mê", izF))
end
table.insert(out, rowSpan2("Pirjimar", izPl))
if gender == "n" then
local izIndef
if endsVowel then
izIndef = word .. "yêda / " .. word .. "yêka"
else
izIndef = word .. "êda / " .. word .. "êka"
end
table.insert(out, rowSpan2("Nêr (b.n)", izIndef))
end
table.insert(out, tableFooter)
return table.concat(out, "\n")
end
return export
6byjm3059dcgtffgjvfzho5i24485ak
6292049
6292046
2026-07-29T18:47:30Z
Ghybu
1393
6292049
Scribunto
text/plain
local export = {}
local u = require("Module:diq-tewîn-nav/utils")
-- single label + single value spanning the two value columns
local function rowSpan2(label, val)
return '\n|- ' ..
'\n! ' .. label ..
'\n| colspan="2" | ' .. val
end
-- case row: label + singular value + plural value (three columns)
local function row3(label, sing, plural)
return '|-' ..
'\n! ' .. label ..
'\n| ' .. sing ..
'\n| ' .. plural
end
local function sectionHead(text)
return '|-\n! colspan="3" class="outer" | ' .. text
end
function export.show(frame)
local args = frame:getParent().args
local word = args[1]
if not word or mw.text.trim(word) == "" then
word = mw.title.getCurrentTitle().text
else
word = mw.text.trim(word)
end
local gender = args.gender or args.g or args.z or "n"
gender = mw.ustring.lower(mw.text.trim(gender))
local last = u.lastChar(word)
local endsVowel = u.endsInVowel(word)
local endsE = (last == "e")
local endsA = (last == "a")
-- indefinite
local indef
if endsE then
indef = u.dropLast(word) .. "ê"
elseif endsVowel then
indef = word .. "yê"
else
indef = word .. "ê"
end
-- singular
local nom = word
local obl, voc
if gender == "n" then
obl = endsVowel and (word .. "yî") or (word .. "î")
voc = endsVowel and (word .. "yo") or (word .. "o")
else
obl = word
if endsE then
voc = u.dropLast(word) .. "ê"
elseif endsVowel then
voc = word .. "yê"
else
voc = word .. "ê"
end
end
-- plural (drop final -e first if the noun is feminine)
local pBase = word
if gender == "m" and endsE then
pBase = u.dropLast(word)
end
local pEndsVowel = u.endsInVowel(pBase)
local pEndsA = u.endsIn(pBase, "a")
local plNom
if pEndsA then
plNom = u.dropLast(pBase) .. "ê"
elseif pEndsVowel then
plNom = pBase .. "yî"
else
plNom = pBase .. "î"
end
local plObl = pEndsVowel and (pBase .. "yan") or (pBase .. "an")
local plVoc = pEndsVowel and (pBase .. "yêno") or (pBase .. "êno")
-- izafe
local izM = endsVowel and (word .. "yê") or (word .. "ê")
local izF
if endsE then
izF = u.dropLast(word) .. "a"
elseif endsVowel then
izF = word .. "ya"
else
izF = word .. "a"
end
local izPl = pEndsVowel and (pBase .. "yê") or (pBase .. "ê")
local genderLabel = (gender == "n") and "nêr" or "mê"
local tableHeader = mw.getCurrentFrame():expandTemplate{
title = 'tabloya-tewandinê-ser',
args = {
title = 'Tewandina <i>'.. word .. '</i> (' .. genderLabel.. ')<br> — Devok: [[kirmanckî]]',
palette = 'purple',
tall = 'yes',
}
}
local tableFooter = mw.getCurrentFrame():expandTemplate{ title = 'tabloya-tewandinê-bin' }
local out = {}
table.insert(out, tableHeader)
table.insert(out, sectionHead("Nebinavkirî"))
table.insert(out, '|-\n| colspan="3" |' .. indef)
table.insert(out, sectionHead("Binavkirî"))
table.insert(out, '|-\n! Rewş\n! Yekjimar\n! Pirjimar')
table.insert(out, row3("Navkî", nom, plNom))
table.insert(out, row3("Çemandî", obl, plObl))
table.insert(out, row3("Bangkirin", voc, plVoc))
table.insert(out, sectionHead("Îzafe"))
if gender == "n" then
table.insert(out, rowSpan2("Nêr", izM))
else
table.insert(out, rowSpan2("Mê", izF))
end
table.insert(out, rowSpan2("Pirjimar", izPl))
if gender == "n" then
local izIndef
if endsVowel then
izIndef = word .. "yêda / " .. word .. "yêka"
else
izIndef = word .. "êda / " .. word .. "êka"
end
table.insert(out, rowSpan2("Nêr (b.n)", izIndef))
end
table.insert(out, tableFooter)
return table.concat(out, "\n")
end
return export
d4yb2bmu7cqd53lrv1g8nfov2gurir3
Modul:diq-tewîn-nav
828
1357480
6292044
6240005
2026-07-29T18:33:10Z
Ghybu
1393
{{tabloya-tewandinê-ser}}
6292044
Scribunto
text/plain
local export = {}
local u = require("Module:diq-tewîn-nav/utils")
local function rowSpan2(label, val)
return '\n|- ' ..
'\n! ' .. label ..
'\n| colspan="2" | ' .. val
end
local function row3(label, sing, plural)
return '|-' ..
'\n! ' .. label ..
'\n| ' .. sing ..
'\n| ' .. plural
end
local function sectionHead(text)
return '|-\n! colspan="3" class="outer" | ' .. text
end
function export.show(frame)
local args = frame:getParent().args
local word = args[1]
if not word or mw.text.trim(word) == "" then
word = mw.title.getCurrentTitle().text
else
word = mw.text.trim(word)
end
local gender = args.gender or args.g or args.z or "n"
gender = mw.ustring.lower(mw.text.trim(gender))
local last = u.lastChar(word)
local endsVowel = u.endsInVowel(word)
local endsE = (last == "e")
-- indefinite
local indefSuf = endsVowel and (word .. "yê") or (word .. "ê")
local indefAlt = "jû " .. word
-- singular
local nom = word
local obl, voc
if gender == "n" then
obl = endsVowel and (word .. "yî") or (word .. "î")
voc = endsVowel and (word .. "yo") or (word .. "o")
else
obl = endsVowel and (word .. "r") or (word .. "er")
if endsE then
local base = u.dropLast(word)
voc = base .. "ê" .. " / " .. base .. "î"
elseif endsVowel then
voc = word .. "yê" .. " / " .. word .. "yî"
else
voc = word .. "ê" .. " / " .. word .. "î"
end
end
-- plural (drop final -e first if the noun is feminine)
local pBase = word
if gender == "m" and endsE then
pBase = u.dropLast(word)
end
local pEndsVowel = u.endsInVowel(pBase)
local plNom = pEndsVowel and (pBase .. "yî") or (pBase .. "î")
local plObl = pEndsVowel and (pBase .. "ya") or (pBase .. "a")
local plVoc = pEndsVowel and (pBase .. "yêno") or (pBase .. "êno")
-- izafe
local izMGen = endsVowel and (word .. "yê") or (word .. "ê")
local izMDesc = endsVowel and (word .. "yê") or (word .. "ê")
local izF
if endsE then
izF = u.dropLast(word) .. "a"
elseif endsVowel then
izF = word .. "ya"
else
izF = word .. "a"
end
local izPl = pEndsVowel and (pBase .. "yê") or (pBase .. "ê")
local genderLabel = (gender == "n") and "nêr" or "mê"
local tableHeader = mw.getCurrentFrame():expandTemplate{
title = 'tabloya-tewandinê-ser',
args = {
title = 'Dimilî: tewandina <i>'.. word .. '</i> (' .. genderLabel.. ')',
palette = 'purple',
tall = 'yes',
}
}
local tableFooter = mw.getCurrentFrame():expandTemplate{ title = 'tabloya-tewandinê-bin' }
local out = {}
table.insert(out, tableHeader)
table.insert(out, sectionHead("Nebinavkirî"))
table.insert(out, '|-\n| colspan="3" style="background:#fff"|' .. indefSuf .. ' / ' .. indefAlt)
table.insert(out, sectionHead("Binavkirî"))
table.insert(out, '|-\n! Rewş\n! | Yekjimar\n! | Pirjimar')
table.insert(out, row3("Navkî", nom, plNom))
table.insert(out, row3("Çemandî", obl, plObl))
table.insert(out, row3("Bangkirin", voc, plVoc))
table.insert(out, sectionHead("Îzafe"))
if gender == "n" then
table.insert(out, rowSpan2("Nêr (genetîv)", izMGen))
table.insert(out, rowSpan2("Nêr (pênasinî)", izMDesc))
else
table.insert(out, rowSpan2("Mê", izF))
end
table.insert(out, rowSpan2("Pirjimar", izPl))
table.insert(out, tableFooter)
return table.concat(out, "\n")
end
return export
o5i6sq26mx19zwjfippcarvz7pelup2
6292045
6292044
2026-07-29T18:38:42Z
Ghybu
1393
6292045
Scribunto
text/plain
local export = {}
local u = require("Module:diq-tewîn-nav/utils")
local function rowSpan2(label, val)
return '\n|- ' ..
'\n! ' .. label ..
'\n| colspan="2" | ' .. val
end
local function row3(label, sing, plural)
return '|-' ..
'\n! ' .. label ..
'\n| ' .. sing ..
'\n| ' .. plural
end
local function sectionHead(text)
return '|-\n! colspan="3" class="outer" | ' .. text
end
function export.show(frame)
local args = frame:getParent().args
local word = args[1]
if not word or mw.text.trim(word) == "" then
word = mw.title.getCurrentTitle().text
else
word = mw.text.trim(word)
end
local gender = args.gender or args.g or args.z or "n"
gender = mw.ustring.lower(mw.text.trim(gender))
local last = u.lastChar(word)
local endsVowel = u.endsInVowel(word)
local endsE = (last == "e")
-- indefinite
local indefSuf = endsVowel and (word .. "yê") or (word .. "ê")
local indefAlt = "jû " .. word
-- singular
local nom = word
local obl, voc
if gender == "n" then
obl = endsVowel and (word .. "yî") or (word .. "î")
voc = endsVowel and (word .. "yo") or (word .. "o")
else
obl = endsVowel and (word .. "r") or (word .. "er")
if endsE then
local base = u.dropLast(word)
voc = base .. "ê" .. " / " .. base .. "î"
elseif endsVowel then
voc = word .. "yê" .. " / " .. word .. "yî"
else
voc = word .. "ê" .. " / " .. word .. "î"
end
end
-- plural (drop final -e first if the noun is feminine)
local pBase = word
if gender == "m" and endsE then
pBase = u.dropLast(word)
end
local pEndsVowel = u.endsInVowel(pBase)
local plNom = pEndsVowel and (pBase .. "yî") or (pBase .. "î")
local plObl = pEndsVowel and (pBase .. "ya") or (pBase .. "a")
local plVoc = pEndsVowel and (pBase .. "yêno") or (pBase .. "êno")
-- izafe
local izMGen = endsVowel and (word .. "yê") or (word .. "ê")
local izMDesc = endsVowel and (word .. "yê") or (word .. "ê")
local izF
if endsE then
izF = u.dropLast(word) .. "a"
elseif endsVowel then
izF = word .. "ya"
else
izF = word .. "a"
end
local izPl = pEndsVowel and (pBase .. "yê") or (pBase .. "ê")
local genderLabel = (gender == "n") and "nêr" or "mê"
local tableHeader = mw.getCurrentFrame():expandTemplate{
title = 'tabloya-tewandinê-ser',
args = {
title = 'Dimilî: tewandina <i>'.. word .. '</i> (' .. genderLabel.. ')',
palette = 'purple',
tall = 'yes',
}
}
local tableFooter = mw.getCurrentFrame():expandTemplate{ title = 'tabloya-tewandinê-bin' }
local out = {}
table.insert(out, tableHeader)
table.insert(out, sectionHead("Nebinavkirî"))
table.insert(out, '|-\n| colspan="3" |' .. indefSuf .. ' / ' .. indefAlt)
table.insert(out, sectionHead("Binavkirî"))
table.insert(out, '|-\n! Rewş\n! Yekjimar\n! Pirjimar')
table.insert(out, row3("Navkî", nom, plNom))
table.insert(out, row3("Çemandî", obl, plObl))
table.insert(out, row3("Bangkirin", voc, plVoc))
table.insert(out, sectionHead("Îzafe"))
if gender == "n" then
table.insert(out, rowSpan2("Nêr (genetîv)", izMGen))
table.insert(out, rowSpan2("Nêr (pênasinî)", izMDesc))
else
table.insert(out, rowSpan2("Mê", izF))
end
table.insert(out, rowSpan2("Pirjimar", izPl))
table.insert(out, tableFooter)
return table.concat(out, "\n")
end
return export
sjx1yb9923rdf44pou1ukmq5fze9xyo
6292048
6292045
2026-07-29T18:45:57Z
Ghybu
1393
6292048
Scribunto
text/plain
local export = {}
local u = require("Module:diq-tewîn-nav/utils")
local function rowSpan2(label, val)
return '\n|- ' ..
'\n! ' .. label ..
'\n| colspan="2" | ' .. val
end
local function row3(label, sing, plural)
return '|-' ..
'\n! ' .. label ..
'\n| ' .. sing ..
'\n| ' .. plural
end
local function sectionHead(text)
return '|-\n! colspan="3" class="outer" | ' .. text
end
function export.show(frame)
local args = frame:getParent().args
local word = args[1]
if not word or mw.text.trim(word) == "" then
word = mw.title.getCurrentTitle().text
else
word = mw.text.trim(word)
end
local gender = args.gender or args.g or args.z or "n"
gender = mw.ustring.lower(mw.text.trim(gender))
local last = u.lastChar(word)
local endsVowel = u.endsInVowel(word)
local endsE = (last == "e")
-- indefinite
local indefSuf = endsVowel and (word .. "yê") or (word .. "ê")
local indefAlt = "jû " .. word
-- singular
local nom = word
local obl, voc
if gender == "n" then
obl = endsVowel and (word .. "yî") or (word .. "î")
voc = endsVowel and (word .. "yo") or (word .. "o")
else
obl = endsVowel and (word .. "r") or (word .. "er")
if endsE then
local base = u.dropLast(word)
voc = base .. "ê" .. " / " .. base .. "î"
elseif endsVowel then
voc = word .. "yê" .. " / " .. word .. "yî"
else
voc = word .. "ê" .. " / " .. word .. "î"
end
end
-- plural (drop final -e first if the noun is feminine)
local pBase = word
if gender == "m" and endsE then
pBase = u.dropLast(word)
end
local pEndsVowel = u.endsInVowel(pBase)
local plNom = pEndsVowel and (pBase .. "yî") or (pBase .. "î")
local plObl = pEndsVowel and (pBase .. "ya") or (pBase .. "a")
local plVoc = pEndsVowel and (pBase .. "yêno") or (pBase .. "êno")
-- izafe
local izMGen = endsVowel and (word .. "yê") or (word .. "ê")
local izMDesc = endsVowel and (word .. "yê") or (word .. "ê")
local izF
if endsE then
izF = u.dropLast(word) .. "a"
elseif endsVowel then
izF = word .. "ya"
else
izF = word .. "a"
end
local izPl = pEndsVowel and (pBase .. "yê") or (pBase .. "ê")
local genderLabel = (gender == "n") and "nêr" or "mê"
local tableHeader = mw.getCurrentFrame():expandTemplate{
title = 'tabloya-tewandinê-ser',
args = {
title = 'Tewandina <i>'.. word .. '</i> (' .. genderLabel.. ')<br> — Devok: [[dimilî]]',
palette = 'purple',
tall = 'yes',
}
}
local tableFooter = mw.getCurrentFrame():expandTemplate{ title = 'tabloya-tewandinê-bin' }
local out = {}
table.insert(out, tableHeader)
table.insert(out, sectionHead("Nebinavkirî"))
table.insert(out, '|-\n| colspan="3" |' .. indefSuf .. ' / ' .. indefAlt)
table.insert(out, sectionHead("Binavkirî"))
table.insert(out, '|-\n! Rewş\n! Yekjimar\n! Pirjimar')
table.insert(out, row3("Navkî", nom, plNom))
table.insert(out, row3("Çemandî", obl, plObl))
table.insert(out, row3("Bangkirin", voc, plVoc))
table.insert(out, sectionHead("Îzafe"))
if gender == "n" then
table.insert(out, rowSpan2("Nêr (genetîv)", izMGen))
table.insert(out, rowSpan2("Nêr (pênasinî)", izMDesc))
else
table.insert(out, rowSpan2("Mê", izF))
end
table.insert(out, rowSpan2("Pirjimar", izPl))
table.insert(out, tableFooter)
return table.concat(out, "\n")
end
return export
qlt8eekpq8vuvt8ul6352b3lscc73xy
Şablon:zza-tewîn-nav/style.css
10
1357500
6292051
6240010
2026-07-29T18:59:48Z
Ghybu
1393
6292051
sanitized-css
text/css
@media screen and ( max-width: 748px ) {
.zza-tewîn-nav,
.zza-tewîn-nav > tbody,
.zza-tewîn-nav > tbody > tr,
.zza-tewîn-nav > tbody > tr > td {
display: block;
width: 100% !important;
height: auto;
box-sizing: border-box;
}
}
0fva5c2ucz1o5toapioxy2xsy3eahls
şîyayene
0
1357522
6292012
6260961
2026-07-29T14:01:18Z
Kurdanparez
14556
6292012
wikitext
text/x-wiki
=={{ziman|zza}}==
===Bilêvkirin===
* {{zza-IPA|şî"yaene}}
* {{zza-kîte}}
===Lêker===
{{lêker|zza}}
# {{g|ku|çûn}}, {{g|ku|çûyîn}}
==== Formên alternatîv ====
* {{g|zza|şîyene}}
====Jê====
{{kol3|ku
| {{g|zza|şîyaye}}
| {{g|zza|şîyayîş}}
| {{g|zza|şîyayîye}}
| {{g|zza|şîyayox|z=n}}
| {{g|zza|şîyayoxe|z=m}}
}}
====Tewandin====
{{diq-tewîn-lk|şîyayene (Kirmanckî, ''Dêrsim'')|dem =niha
| ez = sona(ne)
| ti = sona
| o = sono
| a = son
| ma = sonîme
| şima = sonê
| ê = sonê
}}
{{diq-tewîn-lk|şîyayene (Dimilî, ''Sêwreg'')|dem = niha
| ez = şino (n)<br/>şina (m)
| ti = şinê (n)<br/>şina (m)
| o = şino
| a = şina
| ma = şinê/<br/>şinim
| şima = şinê
| ê = şinê
}}
====Etîmolojî====
Ji {{ji|ine-pro|zza|*ḱey-}}.
Hevreha {{hv|ku|çûn}}, {{hv|ckb|چوون}}, [[kurdiya başûrî]] ''[[çûn]]'', [[şêxbizinî]] ''[[cigin]]'', goranî/hewramî ''[[şiyay]]'', osetî [[цӕуын]] (çæwyn), {{hv|fa|شدن|tr=berê /şuden/ bi wateya ''çûn'', niha /şoden/ bi manaya ''bûn, bûn tiştek''}}, tacikî [[шудан]] (şudan), {{hv|pal||şuten|sc=Latn}}, hexamenişî [[𐎠𐏁𐎡𐎹𐎺𐎶]] (š(i)yav-, /şiyev/), peştûyî {{g|ps|شول|tr=şwəl}}, {{hv|ae||ş(ii)aw-|sc=Latn}} (/şyew-/), {{hv|sa|च्य्अवते}} (cyávate: [[ketin]]), {{hv|grc|σεύω}} (seúō: [[dan pey]], li [[pey]] çûn; [[lezîn]]) û [[κῐ́ω]] (kíō: çûn) û [[κῑνέω]] (kīnéō: [[livandin]]), latînî ''[[cieō]]'' ([[livandin]]), albanî ''[[qoj]]'' (bixwîne: /çoy/, [[hişyar]] kirin)...
;{{biçûk|Çavkanî:
* {{Cheung}}
* {{Chyet}}
* {{Lubotsky}}
* {{Tsabolov}}
}}
24ramuwjzkyqgirl061lyvcqoyi8i2h
6292017
6292012
2026-07-29T15:20:46Z
Ghybu
1393
/* Tewandin */
6292017
wikitext
text/x-wiki
=={{ziman|zza}}==
===Bilêvkirin===
* {{zza-IPA|şî"yaene}}
* {{zza-kîte}}
===Lêker===
{{lêker|zza}}
# {{g|ku|çûn}}, {{g|ku|çûyîn}}
==== Formên alternatîv ====
* {{g|zza|şîyene}}
====Jê====
{{kol3|ku
| {{g|zza|şîyaye}}
| {{g|zza|şîyayîş}}
| {{g|zza|şîyayîye}}
| {{g|zza|şîyayox|z=n}}
| {{g|zza|şîyayoxe|z=m}}
}}
====Tewandin====
{{diq-tewîn-lk|dem=Dema niha|devok=Kirmanckî, ''Dêrsim''
| ez = sona(ne)
| ti = sona
| o = sono
| a = son
| ma = sonîme
| şima = sonê
| ê = sonê
}}
{{diq-tewîn-lk|dem=Dema niha|devok=Dimilî, ''Sêwreg''
| ez = şino (n)<br/>şina (m)
| ti = şinê (n)<br/>şina (m)
| o = şino
| a = şina
| ma = şinê/<br/>şinim
| şima = şinê
| ê = şinê
}}
====Etîmolojî====
Ji {{ji|ine-pro|zza|*ḱey-}}.
Hevreha {{hv|ku|çûn}}, {{hv|ckb|چوون}}, [[kurdiya başûrî]] ''[[çûn]]'', [[şêxbizinî]] ''[[cigin]]'', goranî/hewramî ''[[şiyay]]'', osetî [[цӕуын]] (çæwyn), {{hv|fa|شدن|tr=berê /şuden/ bi wateya ''çûn'', niha /şoden/ bi manaya ''bûn, bûn tiştek''}}, tacikî [[шудан]] (şudan), {{hv|pal||şuten|sc=Latn}}, hexamenişî [[𐎠𐏁𐎡𐎹𐎺𐎶]] (š(i)yav-, /şiyev/), peştûyî {{g|ps|شول|tr=şwəl}}, {{hv|ae||ş(ii)aw-|sc=Latn}} (/şyew-/), {{hv|sa|च्य्अवते}} (cyávate: [[ketin]]), {{hv|grc|σεύω}} (seúō: [[dan pey]], li [[pey]] çûn; [[lezîn]]) û [[κῐ́ω]] (kíō: çûn) û [[κῑνέω]] (kīnéō: [[livandin]]), latînî ''[[cieō]]'' ([[livandin]]), albanî ''[[qoj]]'' (bixwîne: /çoy/, [[hişyar]] kirin)...
;{{biçûk|Çavkanî:
* {{Cheung}}
* {{Chyet}}
* {{Lubotsky}}
* {{Tsabolov}}
}}
ev45veotnwsp9pg6bq0b7ymmmo32ieg
6292021
6292017
2026-07-29T15:25:43Z
Ghybu
1393
/* Tewandin */
6292021
wikitext
text/x-wiki
=={{ziman|zza}}==
===Bilêvkirin===
* {{zza-IPA|şî"yaene}}
* {{zza-kîte}}
===Lêker===
{{lêker|zza}}
# {{g|ku|çûn}}, {{g|ku|çûyîn}}
==== Formên alternatîv ====
* {{g|zza|şîyene}}
====Jê====
{{kol3|ku
| {{g|zza|şîyaye}}
| {{g|zza|şîyayîş}}
| {{g|zza|şîyayîye}}
| {{g|zza|şîyayox|z=n}}
| {{g|zza|şîyayoxe|z=m}}
}}
====Tewandin====
{{diq-tewîn-lk|dem=Dema niha|devok=[[kirmanckî]], ''[[Dêrsim]]''
| ez = sona(ne)
| ti = sona
| o = sono
| a = son
| ma = sonîme
| şima = sonê
| ê = sonê
}}
{{diq-tewîn-lk|dem=Dema niha|devok=[[dimilî]], ''[[Sêwreg]]''
| ez = şino (n)<br/>şina (m)
| ti = şinê (n)<br/>şina (m)
| o = şino
| a = şina
| ma = şinê/<br/>şinim
| şima = şinê
| ê = şinê
}}
====Etîmolojî====
Ji {{ji|ine-pro|zza|*ḱey-}}.
Hevreha {{hv|ku|çûn}}, {{hv|ckb|چوون}}, [[kurdiya başûrî]] ''[[çûn]]'', [[şêxbizinî]] ''[[cigin]]'', goranî/hewramî ''[[şiyay]]'', osetî [[цӕуын]] (çæwyn), {{hv|fa|شدن|tr=berê /şuden/ bi wateya ''çûn'', niha /şoden/ bi manaya ''bûn, bûn tiştek''}}, tacikî [[шудан]] (şudan), {{hv|pal||şuten|sc=Latn}}, hexamenişî [[𐎠𐏁𐎡𐎹𐎺𐎶]] (š(i)yav-, /şiyev/), peştûyî {{g|ps|شول|tr=şwəl}}, {{hv|ae||ş(ii)aw-|sc=Latn}} (/şyew-/), {{hv|sa|च्य्अवते}} (cyávate: [[ketin]]), {{hv|grc|σεύω}} (seúō: [[dan pey]], li [[pey]] çûn; [[lezîn]]) û [[κῐ́ω]] (kíō: çûn) û [[κῑνέω]] (kīnéō: [[livandin]]), latînî ''[[cieō]]'' ([[livandin]]), albanî ''[[qoj]]'' (bixwîne: /çoy/, [[hişyar]] kirin)...
;{{biçûk|Çavkanî:
* {{Cheung}}
* {{Chyet}}
* {{Lubotsky}}
* {{Tsabolov}}
}}
9cy6an2446axd4a8qwpivqymt3z0v6x
6292050
6292021
2026-07-29T18:55:02Z
Ghybu
1393
6292050
wikitext
text/x-wiki
== {{ziman|zza}} ==
=== Bilêvkirin ===
* {{zza-IPA|şî"yaene}}
* {{zza-kîte}}
=== Lêker ===
{{lêker|zza|c=x-ngh}}
# {{g|ku|çûn}}, {{g|ku|çûyîn}}
==== Formên alternatîv ====
* {{g|zza|şîyene}}
==== Jê ====
{{kol3|ku
| {{g|zza|şîyaye}}
| {{g|zza|şîyayîş}}
| {{g|zza|şîyayîye}}
| {{g|zza|şîyayox|z=n}}
| {{g|zza|şîyayoxe|z=m}}
}}
==== Tewandin ====
{{diq-tewîn-lk|dem=Dema niha|devok=[[kirmanckî]], ''[[Dêrsim]]''
| ez = sona(ne)
| ti = sona
| o = sono
| a = son
| ma = sonîme
| şima = sonê
| ê = sonê
}}
{{diq-tewîn-lk|dem=Dema niha|devok=[[dimilî]], ''[[Sêwreg]]''
| ez = şino (n)<br>şina (m)
| ti = şinê (n)<br>şina (m)
| o = şino
| a = şina
| ma = şinê/<br>şinim
| şima = şinê
| ê = şinê
}}
==== Etîmolojî ====
Ji {{ji|ine-pro|zza|*ḱey-}}.
Hevreha {{hv|ku|çûn}}, {{hv|ckb|چوون}}, [[kurdiya başûrî]] ''[[çûn]]'', [[şêxbizinî]] ''[[cigin]]'', goranî/hewramî ''[[şiyay]]'', osetî [[цӕуын]] (çæwyn), {{hv|fa|شدن|tr=berê /şuden/ bi wateya ''çûn'', niha /şoden/ bi manaya ''bûn, bûn tiştek''}}, tacikî [[шудан]] (şudan), {{hv|pal||şuten|sc=Latn}}, hexamenişî [[𐎠𐏁𐎡𐎹𐎺𐎶]] (š(i)yav-, /şiyev/), peştûyî {{g|ps|شول|tr=şwəl}}, {{hv|ae||ş(ii)aw-|sc=Latn}} (/şyew-/), {{hv|sa|च्य्अवते}} (cyávate: [[ketin]]), {{hv|grc|σεύω}} (seúō: [[dan pey]], li [[pey]] çûn; [[lezîn]]) û [[κῐ́ω]] (kíō: çûn) û [[κῑνέω]] (kīnéō: [[livandin]]), latînî ''[[cieō]]'' ([[livandin]]), albanî ''[[qoj]]'' (bixwîne: /çoy/, [[hişyar]] kirin)...
;{{biçûk|Çavkanî:
* {{Cheung}}
* {{Chyet}}
* {{Lubotsky}}
* {{Tsabolov}}
}}
hrapatcs0n3in4qz1otqug20qcaoc7l
MediaWiki:Gadget-start.js/data.json
8
1357737
6292076
6291586
2026-07-29T20:26:12Z
Wikihez
7344
6292076
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î"
},
"posChoices": {
"navdêr": "Navdêr (îsm)",
"lêker": "Lêker (fiîl)",
"rengdêr": "Rengdêr (sifet)",
"hoker": "Hoker (zerf)",
"serenav": "Serenav (îsmê xisûsî)",
"artîkel": "Artîkel",
"baneşan": "Baneşan (nîda)",
"bazinedaçek": "Bazinedaçek",
"cînav": "Cînav (zemîr)",
"daçek": "Daçek (edat)",
"girêdek": "Girêdek",
"gotineke pêşiyan": "Gotineke pêşiyan",
"hejmar": "Hejmar",
"hevok": "Hevok (cimle)",
"îfade": "Îfade",
"kurtenav": "Kurtenav",
"navgir": "Navgir",
"paşdaçek": "Paşdaçek",
"paşgir": "Paşgir",
"pêşdaçek": "Pêşdaçek",
"pêşgir": "Pêşgir",
"pirtik": "Pirtik",
"reh": "Reh",
"sembol": "Sembol",
"tîp": "Tîp (herf)"
},
"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ê û nêr",
"mnmane": "mê yan nêr li gorî maneyê",
"g": "giştî",
"y": "yekjimar",
"p": "pirjimar"
},
"tplDefs": {
"awayê Jacobsonê": {
"langs": [
"zza"
]
},
"rastnivîs": {
"langs": [
"ku"
],
"noLang": true
},
"ku-Latn": {
"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
},
"awayekî din": {
"langs": null
},
"guharto": {
"langs": null
},
"hevmaneya": {
"langs": null
},
"kevnbûyî": {
"langs": null
},
"kêmpeyda": {
"langs": null
},
"şaşnivîs": {
"langs": null
}
},
"jederDefs": {
"jêder-kitêb": {
"label": "Kitêb",
"fields": {
"nivîskar": "Nivîskar",
"sernav": "Sernav",
"sernavê orjînal": "Sernavê orjînal",
"terciman": "Terciman",
"weşanxane": "Weşanxane",
"cih": "Cih",
"sal": "Sal",
"çap": "Çap",
"rûpel": "Rûpel",
"isbn": "ISBN",
"url": "URL"
}
},
"jêder-kovar": {
"label": "Kovar",
"fields": {
"nivîskar": "Nivîskar",
"nivîskar2": "Nivîskar 2",
"sernav": "Sernav",
"sernavê orjînal": "Sernavê orjînal",
"kovar": "Kovar",
"terciman": "Terciman",
"weşanxane": "Weşanxane",
"cild": "Cild",
"hejmar": "Hejmar",
"sal": "Sal",
"rûpel": "Rûpel",
"url": "URL"
}
},
"jêder-websîte": {
"label": "Websîte",
"fields": {
"nivîskar": "Nivîskar",
"sernav": "Sernav",
"terciman": "Terciman",
"websîte": "Websîte",
"url": "URL",
"arşîv": "Arşîva URLê",
"sal": "Sal",
"tarîx": "Tarîx"
}
}
},
"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|/…/}}"
},
"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": {
"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 bi pêşgir, paşgir û hevedudanî — {{qertaf|kod|pêşgir-|reh}}",
"snippet": "{{qertaf|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}}"
}
},
"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",
"mn",
"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"
}
},
"ziman": {
"aa": "afarî",
"aaa": "gotuoyî",
"aab": "alumu-tesuyî",
"aac": "ariyî",
"aad": "amalî",
"aaf": "aranadanî",
"aag": "ambrakî",
"aah": "abu' arapeşî",
"aai": "arîfama-mînîafîayî",
"aak": "ankaveyî",
"aal": "afadeyî",
"aan": "anambeyî",
"aao": "erebiya sahrayî ya cezayirî",
"aap": "pará arárayî",
"aaq": "penobskotî",
"aas": "aasayî",
"aau": "abauyî",
"aav-khs-pro": "proto-xasî",
"aav-nic-pro": "proto-nîkobarî",
"aav-pkl-pro": "proto-pnar-xasî-lîngngamî",
"aav-pro": "proto-awistroasyayî",
"aaw": "solongyî",
"aax": "mandobo atas",
"aaz": "amarasî",
"ab": "abxazî",
"aba": "abeyî",
"abb": "bankonî",
"abc": "ambala ayta",
"abd": "manîdeyî",
"abe": "abenakî",
"abf": "abaî sungayî",
"abg": "abagayî",
"abh": "erebiya tajîkî",
"abi": "abîdjî",
"abj": "aka-beayî",
"abl": "abûngî",
"abm": "abanyomî",
"abn": "abuayî",
"abo": "abonî",
"abp": "abenlen ayta",
"abq": "abazayî",
"abr": "abronî",
"abs": "ambonezî-malezî",
"abt": "ambulasî",
"abu": "abureyî",
"abv": "erebiya bahranî",
"abw": "pal",
"abx": "abaknonî",
"aby": "aneme wakeyî",
"abz": "abuiyî",
"aca": "açaguwayî",
"acb": "ancáyî",
"acd": "gîkyodeyî",
"ace": "açehî",
"ach": "açolî",
"aci": "aka-karî",
"ack": "aka-korayî",
"acl": "akar-baleyî",
"acm": "erebiya iraqî",
"acn": "açangî",
"acp": "akîpayiya rojhilatî",
"acq": "erebiya ta'îzzî adenî",
"acr": "açiyî",
"acs": "akroáyî",
"acu": "açuarî",
"acv": "açumawî",
"acw": "erebiya hîcazî",
"acx": "erebiya ummanî",
"acy": "erebiya qibrisî",
"acz": "açeronî",
"ada": "adangmeyî",
"adb": "adabeyî",
"add": "dzodinkayî",
"ade": "adeleyî",
"adf": "erebîya zufarî",
"adg": "andegerebînhayî",
"adh": "adholayî",
"adi": "adî",
"adj": "adyukruyî",
"adl": "gallongî",
"adn": "adangî",
"ado": "abuyî",
"adp": "adapî",
"adq": "adangbeyî",
"adr": "adonarayî",
"ads": "zimanê destan ê adamorobeyî",
"adt": "adnyamatanhayî",
"adu": "adugeyî",
"adw": "amondawayî",
"ady": "adîgeyî",
"adz": "adzerayî",
"ae": "avestayî",
"aea": "arebayî",
"aeb": "erebiya tunusî",
"aec": "erebiya sa'îdî",
"aed": "zimanê destan li arjentînê",
"aee": "paşayiya bakur-rojhilat",
"aek": "haekeyî",
"ael": "ambeleyî",
"aem": "aremî",
"aen": "zimanê destan ê ermenî",
"aeq": "aerî",
"aer": "arrernteyiya rojavayî",
"aes": "alseayî",
"aeu": "akeuyî",
"aew": "ambakîç",
"aey": "ameleyî",
"aez": "aekayî",
"af": "afrîkansî",
"afa-pro": "proto-afroasyayî",
"afb": "erebiya kendavî",
"afd": "andaî",
"afe": "putukwamî",
"afg": "zimanê destan ê afganî",
"afh": "afrîhîlî",
"afi": "akrukayî",
"afk": "nanubayî",
"afn": "defakayî",
"afo": "eloyî",
"afp": "tapeî",
"afs": "kreyoliya afro-semînolî",
"aft": "afîttî",
"afu": "awutuyî",
"afz": "obokuîtayî",
"aga": "aguanoyî",
"agb": "legboyî",
"agc": "agatuyî",
"agd": "agarabiyî",
"age": "angalî",
"agf": "argunî",
"agg": "angorî",
"agh": "ngelîmayî",
"agi": "agarîyayî",
"agj": "argobbayî",
"agk": "îsarog agtayî",
"agl": "fembeyî",
"agm": "angaatahayî",
"agn": "agutaynenî",
"ago": "taînaeyî",
"agq": "aghemî",
"agr": "aguarunayî",
"ags": "esîmbî",
"agt": "agtayiya kagayanî ya navendî",
"agu": "agwakatekî",
"agv": "remontado agta",
"agw": "kahuayî",
"agx": "aghulî",
"agy": "altaya başûrî",
"agz": "mount îrîga agta",
"aha": "ahanta",
"ahb": "axamb",
"ahg": "qimant",
"ahh": "aghu",
"ahi": "tîagbamrîn aîzî",
"ahk": "akha",
"ahl": "îgo",
"ahm": "mobumrîn aîzî",
"ahn": "ahàn",
"aho": "ahomî",
"ahp": "aproumu aîzî",
"ahr": "ahîranî",
"ahs": "aşeyî",
"aht": "ahtnayî",
"aia": "arosî",
"aib": "aynuyî",
"aic": "aînbaî",
"aid": "alngîthî",
"aie": "amarayî",
"aif": "agî",
"aig": "îngilîziya kreyolî ya antîgua û barbud",
"aih": "aî-çamî",
"aii": "aramiya nû ya asûrî",
"aij": "lîşanîd noşan",
"aik": "akeyî",
"ail": "aîmeleyî",
"aim": "aîmolî",
"ain": "aynuyî",
"aio": "aytonî",
"aip": "burumakokî",
"air": "ayroranî",
"ait": "arîkemî",
"aiw": "aarî",
"aix": "ayghonî",
"aiy": "aliyî",
"aja": "ajayî",
"ajg": "adjayî",
"aji": "ajië",
"ajn": "andajînî",
"ajp": "erebiya başûrê şamê",
"ajt": "erebiya cihû-tunusî",
"aju": "erebiya cihû-fasî",
"ajw": "ajawayî",
"ajz": "amrî karbî",
"ak": "akanî",
"akb": "angkola batakî",
"akc": "mpur",
"akd": "ukpet-ehom",
"ake": "akawaîo",
"akf": "akpayî",
"akg": "anakalunguyî",
"akh": "angal heneng",
"aki": "aiome",
"akj": "jeru",
"akk": "akadî",
"akl": "aklanon",
"akm": "aka-bo",
"ako": "akurio",
"akp": "siwu",
"akq": "ak",
"akr": "arakî",
"aks": "akaselem",
"akt": "akolet",
"aku": "akum",
"akv": "axvaxî",
"akw": "akwa",
"akx": "aka-kede",
"aky": "aka-kol",
"akz": "alabamayî",
"ala": "alago",
"alc": "kawésqar",
"ald": "alladînî",
"ale": "alêwîtî",
"alf": "alegeyî",
"alg-aga": "agawamî",
"alg-pro": "proto-algonkînî",
"alh": "alawayî",
"ali": "amaimonî",
"alj": "alanganî",
"alk": "alakî",
"all": "allarî",
"alm": "amblongî",
"alo": "larike-wakasihu",
"alp": "aluneyî",
"alq": "algonquinî",
"alr": "alutor",
"alt": "altayiya başûrî",
"alu": "areareyî",
"alv-ama": "amasî",
"alv-bgu": "baïnounk gubëeherî",
"alv-bua-pro": "proto-buayî",
"alv-cng-pro": "proto-kangînî",
"alv-edo-pro": "proto-edoidî",
"alv-fli-pro": "proto-faliyî",
"alv-gbe-pro": "proto-gbeyî",
"alv-gng-pro": "proto-guangî",
"alv-gtm-pro": "proto-togoyiya navendî",
"alv-gwa": "gwarayî",
"alv-hei-pro": "proto-heybanî",
"alv-igb-pro": "proto-îgboyidî",
"alv-kwa-pro": "proto-kwayî",
"alv-mum-pro": "proto-mumuyeyî",
"alv-nup-pro": "proto-nupoyidî",
"alv-pro": "proto-atlantîk-kongoyî",
"alv-yor-pro": "proto-yoruboyidî",
"alw": "alaba",
"alx": "amol",
"aly": "alyawarr",
"alz": "alur",
"am": "amharî",
"ama": "amanayé",
"amb": "ambo",
"amc": "amahuaca",
"ame": "yaneşa'",
"amf": "hamer-banna",
"amg": "amurdag",
"ami": "amîs",
"amj": "amdang",
"amk": "ambayî",
"aml": "war-jaîntî",
"amm": "amayî",
"amn": "amanabî",
"amo": "amoyî",
"amp": "alamblakî",
"amq": "amahaî",
"amr": "amarakaerî",
"ams": "amamî-oşîmayiya başûrî",
"amt": "amto",
"amu": "amuzgoyî",
"amv": "ambelau",
"amw": "neo-aramiya rojavayî",
"amx": "anmatyerre",
"amy": "amî",
"amz": "atampaya",
"an": "aragonî",
"ana": "andaquyî",
"anb": "andoa",
"anc": "ngas",
"and": "ansus",
"ane": "xârâcùù",
"anf": "anîmere",
"ang": "îngilîziya kevn",
"anh": "nendî",
"ani": "andî",
"anj": "anor",
"ank": "goemayî",
"anl": "anu",
"anm": "analî",
"ann": "obolo",
"ano": "andoque",
"anp": "angîka",
"anq": "jarawa",
"anr": "andhî",
"ans": "anserma",
"ant": "antakarînyayî",
"anu": "anuak",
"anv": "denya",
"anw": "anaang",
"anx": "andra-hus",
"any": "anyî",
"anz": "anem",
"aoa": "angolar",
"aob": "abom",
"aoc": "pemon",
"aod": "andarum",
"aoe": "angal enen",
"aof": "bragat",
"aog": "angoram",
"aoh": "arma",
"aoi": "anîndîlyakwa",
"aoj": "mufiyî",
"aok": "arhö",
"aol": "alor",
"aom": "ömie",
"aon": "bumbîta arapeş",
"aor": "aore",
"aos": "taykatî",
"aot": "atong (Hindistan)",
"aou": "a'ou",
"aox": "atorada",
"aoz": "uab meto",
"apa-pro": "proto-apaçî",
"apb": "sa'a",
"apc": "erebiya bakûrê şamê",
"apd": "erebiya sudanî",
"ape": "bukiyîpî",
"apf": "pahanan agta",
"apg": "ampanangî",
"aph": "athpare",
"api": "apiaká",
"apj": "xîkarîyayî",
"apk": "apaçiya deştan",
"apl": "lipan",
"apm": "çîrîkawayî",
"apn": "apinayé",
"apo": "ambul",
"app": "apma",
"apq": "a-pucikwar",
"apr": "arop-lokep",
"aps": "arop-sissano",
"apt": "apatanî",
"apu": "apurinã",
"apv": "alapmunte",
"apw": "apaçiya rojava",
"apx": "aputayî",
"apy": "apalayî",
"apz": "safeyoka",
"aqc": "arçî",
"aqd": "amparî dogon",
"aqg": "arîgîdî",
"aql-pro": "proto-algîkî",
"aqm": "atohwaim",
"aqn": "altaya bakurî",
"aqp": "atakapa",
"aqr": "arhâ",
"aqt": "angaité",
"aqz": "akuntsu",
"ar": "erebî",
"arc": "aramî",
"ard": "arabana",
"are": "arrernteya rojavayî",
"arh": "arhuako",
"ari": "arîkara",
"arj": "arapaso",
"ark": "arîkapûyî",
"arl": "arabela",
"arn": "mapuçî",
"aro": "araona",
"arp": "arapaho",
"arq": "erebiya cezayirî",
"arr": "arara-karo",
"ars": "erebiya necdî",
"art-blk": "bolakî",
"art-bsp": "black speech",
"art-com": "communicationssprache",
"art-dtk": "dothrakî",
"art-elo": "eloî",
"art-gld": "goa'uldî",
"art-lap": "lapineyî",
"art-man": "mandalorî",
"art-mun": "mundolincoyî",
"art-nav": "na'vî",
"art-nox": "noxiloyî",
"art-top": "toki ponayî",
"art-una": "unasî",
"aru": "arua",
"arv": "arbore",
"arw": "arawak",
"arx": "aruá",
"ary": "erebiya fasî",
"arz": "erebiya misrî",
"as": "asamî",
"asa": "pare",
"asb": "assînîboyî",
"asc": "asmatiya casuarina coast",
"ase": "zimanê destan ê emerîkî",
"asf": "zimanê destan ê awistralyayî",
"asg": "kîşîngînî",
"ash": "abîşîra",
"asi": "buruwayî",
"asj": "nsarî",
"ask": "aşkunî",
"asl": "asîluluyî",
"asn": "xingú asuriní",
"aso": "dano",
"asp": "zimanê destan ê cezayirî",
"asq": "zimanê destan ê awistiryayî",
"asr": "asur",
"ass": "îpulo",
"ast": "astûrî",
"asu": "tocantins asurînî",
"asv": "asoa",
"asw": "zimanê destan ê aborjîniyên awistralyayî",
"asx": "muratayak",
"asy": "yaosakor asmat",
"asz": "as",
"ata": "pele-ata",
"atb": "zaiwa",
"atc": "atsahuaka",
"atd": "ata manobo",
"ate": "atemble",
"atg": "okpela",
"ath-nic": "nicolayî",
"ath-pro": "proto-atabaskanî",
"ati": "attié",
"atj": "atîkamekwî",
"atk": "atî",
"atl": "agtaya çiyaya iraya",
"atm": "ata",
"ato": "atong (Kamerun)",
"atp": "pudtol atta",
"atq": "aralle-tabulahan",
"atr": "waîmîrî-atroarî",
"ats": "gros ventre",
"att": "pamplona atta",
"atu": "reel",
"atv": "altayiya bakurî",
"atw": "atsugewî",
"atx": "arutanî",
"aty": "aneityum",
"atz": "arta",
"aua": "asumboayî",
"aub": "alugu",
"auc": "huaoranî",
"aud": "anuta",
"auf-pro": "proto-arawayî",
"aug": "aguna",
"auh": "auşî",
"aui": "anukî",
"auj": "awjîla",
"auk": "heyo",
"aul": "aulua",
"aum": "asu",
"aun": "molmo one",
"auo": "auyokawa",
"aup": "makayam",
"auq": "anusî",
"aur": "aruek",
"aus-alu": "alungulî",
"aus-and": "andjingithî",
"aus-ang": "angkulayî",
"aus-arn-pro": "proto-arnhemî",
"aus-bra": "barranbinyayî",
"aus-brm": "barunggamî",
"aus-bru": "bruny islandî",
"aus-cww-pro": "proto-central new south wales",
"aus-dal-pro": "proto-dalî",
"aus-guw": "guwarî",
"aus-lsw": "little swanportî",
"aus-mbi": "mbiywomî",
"aus-ngk": "ngkothî",
"aus-nyu-pro": "proto-nyulnyulanî",
"aus-pam-pro": "proto-pama-nyungan",
"aus-par": "paredarermeyî",
"aus-pee": "peerapperî",
"aus-psl": "port sorellî",
"aus-pye": "pyemmairreyî",
"aus-set": "tasmaniya başûr-rojhilat",
"aus-tom": "tommeginneyî",
"aus-too": "toogeeyî",
"aus-tul": "tuluayî",
"aus-uwi": "uwinymilî",
"aus-wdj-pro": "proto-iwaidjanî",
"aus-won": "wong-gieyî",
"aus-wul": "wulguruyî",
"aus-ynk": "yangkaalî",
"aut": "austral",
"auu": "auye",
"auw": "awyî",
"aux": "aurá",
"auy": "auyana",
"auz": "erebiya ozbekî",
"av": "avarî",
"avb": "avau",
"avd": "elwîrî-wîderî",
"avi": "avîkam",
"avk": "kotavayî",
"avl": "erebiya misriya rojhilatî ya bedewî",
"avm": "angkamuthî",
"avn": "avatime",
"avo": "agavotaguerra",
"avs": "auşîrî",
"avt": "au",
"avu": "avokaya",
"avv": "avá-kanoeîro",
"awa": "awadhî",
"awb": "awa (Gîneya nû)",
"awc": "cicipu",
"awd-ama": "amarizanayî",
"awd-amc-pro": "proto-amuesha-çamicuro",
"awd-ana": "anauyayî",
"awd-apo": "apolistayî",
"awd-cav": "cavereyî",
"awd-gnu": "guinauyî",
"awd-kar": "cariayî",
"awd-kaw": "kawişanayî",
"awd-kmp-pro": "proto-kampayî",
"awd-kus": "kustenauyî",
"awd-man": "manaoyî",
"awd-mar": "marawanî",
"awd-mpr": "maypureyî",
"awd-mrt": "mariateyî",
"awd-nwk-pro": "proto-nawikî",
"awd-pai": "paikonekayî",
"awd-pas": "passeyî",
"awd-pro": "proto-arawakî",
"awd-prw-pro": "proto-paresî-waurayî",
"awd-she": "şebayoyî",
"awd-taa-pro": "proto-ta-arawak",
"awd-wai": "wainumayî",
"awd-yum": "yumanayî",
"awe": "awetí",
"awg": "anguthimrî",
"awh": "awbono",
"awi": "aekyom",
"awk": "awabakal",
"awm": "arawum",
"awn": "awngî",
"awo": "awak",
"awr": "awera",
"aws": "awyuya başûrî",
"awt": "araweté",
"awu": "awyuya navendî",
"awv": "awyuya jair",
"aww": "awun",
"awx": "awara",
"awy": "awyuya edura",
"axb": "abipon",
"axe": "ayerrerenge",
"axg": "mato grosso arára",
"axk": "aka (Afrîkaya navendî)",
"axl": "arandayiya başûrî ya jêrîn",
"axm": "ermeniya navîn",
"axx": "xaragure",
"ay": "aymarayî",
"aya": "awar",
"ayb": "ayizo",
"ayd": "ayabadhu",
"aye": "ayere",
"ayg": "nyanga (Togo)",
"ayh": "erebiya hedramî",
"ayi": "leyîhayî",
"ayk": "akukuyî",
"ayl": "erebiya lîbyayî",
"ayn": "erebiya sanaanî",
"ayo": "ayoreoyî",
"ayp": "erebiya mezopotamyayî ya bakur",
"ayq": "ayî",
"ays": "sorsogon aytayî",
"ayt": "bataan aytayî",
"ayu": "ayuyî",
"ayy": "tayabas aytayî",
"ayz": "maybratî",
"az": "azerî",
"aza": "azhayî",
"azc-caz": "cazcanî",
"azc-cup-pro": "proto-cupanî",
"azc-ktn": "kitanemukî",
"azc-nah-pro": "proto-nahuyanî",
"azc-num-pro": "proto-numîkî",
"azc-pro": "proto-uto-aztekî",
"azc-tak-pro": "proto-takîkî",
"azc-tat": "tataviamî",
"azd": "durango nahuatliya rojavayî",
"azg": "san pedro amuzgos amuzgo",
"azm": "amuzgoyiya îpalapayî",
"azn": "durango nahuatliya rojavayî ya jêrîn",
"azo": "awîngî",
"azt": "faîre atta",
"azz": "puebla nahuatliya çiyayî",
"ba": "başkîrî",
"baa": "babatanayî",
"bab": "bainouk-gunyuño",
"bac": "baduî",
"bae": "baré",
"baf": "nubaca",
"bag": "tukî",
"bah": "kreyoliya bahamayî",
"baj": "barakaî",
"bal": "belûçî",
"ban": "balînî",
"bao": "waîmaha",
"bap": "bantawa",
"bar": "bayerî",
"bas": "basayî",
"bau": "badançî",
"bav": "babungoyî",
"baw": "bambîlî-bambuî",
"bax": "bamumî",
"bay": "batuleyî",
"bba": "baatonumî",
"bbb": "barayî",
"bbc": "bataktobayî",
"bbd": "bauyî",
"bbe": "bangbayî",
"bbf": "baybayî",
"bbg": "baramayî",
"bbh": "buganî",
"bbi": "barombî",
"bbj": "ghomalayî'",
"bbk": "babankî",
"bbl": "batsbî",
"bbm": "babangoyî",
"bbn": "uneapayî",
"bbo": "konabereyî",
"bbp": "bandayiya rojavayî ya navendî",
"bbq": "bamalî",
"bbr": "girawayî",
"bbs": "bakpinkayî",
"bbt": "mburkuyî",
"bbu": "bakulungî",
"bbv": "karnaî",
"bbw": "babayî",
"bbx": "bubîayî",
"bby": "befangî",
"bbz": "erebiya kreyoliya babaliya",
"bca": "bayiya navendî",
"bcb": "bainûk-samîk",
"bcd": "babariya bakur",
"bce": "bamenyamî",
"bcf": "bamuyî",
"bcg": "baga pokurî",
"bch": "bariyayî",
"bci": "bawuleyî",
"bcj": "bardî",
"bck": "bunabayî",
"bcl": "bîkoliya naverast",
"bcm": "banonî",
"bcn": "bîbaalî",
"bco": "kalulî",
"bcp": "balî",
"bcq": "bençî",
"bcr": "babine-witsuwit'enî",
"bcs": "kohumonoyî",
"bct": "bendî",
"bcu": "bîlîwayî",
"bcv": "şoo-mînda-nye",
"bcw": "banayî",
"bcy": "bacamayî",
"bcz": "baînouk-gunyaamoloyî",
"bda": "bayotî",
"bdb": "basapî",
"bdc": "embera-baudoyî",
"bdd": "bunamayî",
"bde": "badeyî",
"bdf": "bîageyî",
"bdg": "bangî",
"bdh": "tara bakayî",
"bdi": "burunî",
"bdj": "bayî",
"bdk": "buduxî",
"bdl": "bajwayiya endonezyayî",
"bdm": "budumayî",
"bdn": "baldemuyî",
"bdo": "moromî",
"bdp": "bendeyî",
"bdq": "bahnarî",
"bdr": "bajwayiya kendava rojava",
"bds": "burungeyî",
"bdt": "bokotoyî",
"bdu": "orokoyî",
"bdv": "bodo parjayî",
"bdw": "bahamî",
"bdx": "budong-budongî",
"bdy": "bandjalangî",
"bdz": "badeşî",
"be": "belarusî",
"bea": "beaverî",
"beb": "bebeleyî",
"bec": "iceve-macî",
"bed": "bedoanasî",
"bee": "byangsî",
"bef": "benabenayî",
"beg": "belaîtî",
"beh": "biyalî",
"bei": "bekatî'",
"bej": "bejayî",
"bek": "bebelî",
"bem": "bembayî",
"beo": "beamî",
"bep": "besoayî",
"beq": "beembeyî",
"ber-pro": "proto-berberî",
"bes": "besmeyî",
"bet": "gûberowa beteyî",
"beu": "blagarî",
"bev": "daloa beteyî",
"bew": "betawî",
"bex": "jûr modoyî",
"bey": "akuwagelî",
"bez": "kîbenayî",
"bfa": "bariyî",
"bfb": "paurî barelî",
"bfc": "bayiya bakurî",
"bfd": "bafutî",
"bfe": "betafî",
"bff": "bofî",
"bfg": "busang kayanî",
"bfh": "blafeyî",
"bfi": "zimanê destan ê brîtanî",
"bfj": "bafanjî",
"bfk": "zimanê destan ê ban khor",
"bfl": "banda-ndeleyî",
"bfm": "mmenî",
"bfn": "bunakî",
"bfo": "malba bîrîforî",
"bfp": "bebayî",
"bfq": "badagayî",
"bfr": "bazîgarî",
"bfs": "bayiya başûrî",
"bft": "baltî",
"bfu": "gahrî",
"bfw": "bondoyî",
"bfx": "bantayanonî",
"bfy": "baghelî",
"bfz": "mahasu paharî",
"bg": "bulgarî",
"bga": "gwamhî-wurî",
"bgb": "bobongko",
"bgc": "haryanvî",
"bgd": "rathwî barelî",
"bge": "bawriyayî",
"bgf": "banganduyî",
"bgg": "bugunî",
"bgi": "giyanganî",
"bgj": "bangolanî",
"bgk": "bîtî",
"bgl": "boyî",
"bgo": "baga kogayî",
"bgq": "bagrî",
"bgr": "bawm çînî",
"bgs": "tagabawayî",
"bgt": "bugotûyî",
"bgu": "mbongnoyî",
"bgv": "warkay-bîpîmî",
"bgw": "bhatrî",
"bgx": "tirkiya gagawizî ya balkanan",
"bgy": "benggoî",
"bgz": "banggaî",
"bh": "biharî",
"bha": "bhariyayî",
"bhb": "bhîlî",
"bhc": "bîga",
"bhd": "bhadrawahî",
"bhe": "bhayayî",
"bhf": "odîaî",
"bhg": "bînandereyî",
"bhh": "buxarî",
"bhi": "bhilalî",
"bhj": "bahingî",
"bhl": "bimînî",
"bhm": "batharî",
"bhn": "aramiya nû ya botanî",
"bho": "bojpûrî",
"bhp": "bîmayî",
"bhq": "tukang besî başûr",
"bhs": "buwalî",
"bht": "bhattiyalî",
"bhu": "bhunjiyayî",
"bhv": "bahauyî",
"bhw": "biyakî",
"bhx": "bhalayî",
"bhy": "bheleyî",
"bhz": "badayî",
"bi": "bîslamayî",
"bia": "badimayayî",
"bib": "bîssayî",
"bic": "bikaruyî",
"bid": "bidiyoyî",
"bie": "bepourî",
"bif": "biafadayî",
"big": "biangaî",
"bij": "kwankayî",
"bil": "bileyî",
"bim": "bimobayî",
"bin": "edoyî",
"bio": "nai",
"bip": "bila",
"biq": "bipî",
"bir": "bisorio",
"bit": "berinomo",
"biu": "biete",
"biv": "biriforiya başûr",
"biw": "kol (Kamerun)",
"bix": "bijorî",
"biy": "birhor",
"biz": "baloî",
"bja": "budza",
"bjb": "barngarla",
"bjc": "barijî",
"bje": "biao-jiao mien",
"bjf": "neo-aramiya cihû ya barzanê",
"bjg": "bidyogo",
"bjh": "bahinemo",
"bji": "burjî",
"bjj": "kannaujî",
"bjk": "barok",
"bjl": "bulu (Gîneya nû)",
"bjm": "bajelanî",
"bjn": "banjarî",
"bjo": "bandayiya başûr-navendî",
"bjp": "fanamaket",
"bjr": "binumarî",
"bjs": "bajan",
"bjt": "balanta-ganjayî",
"bju": "busuu",
"bjv": "bedjond",
"bjw": "bakwé",
"bjx": "banao îtneg",
"bjy": "bayalî",
"bjz": "baruga",
"bka": "kyak",
"bkc": "baka",
"bkd": "binukid",
"bkf": "beeke",
"bkg": "buraka",
"bkh": "bakoko",
"bki": "bakî",
"bkj": "pande",
"bkk": "brokskat",
"bkl": "berik",
"bkm": "komiya kamerûnî",
"bkn": "bukîtan",
"bko": "kwa'",
"bkp": "îboko",
"bkq": "bakairí",
"bkr": "bakumpaî",
"bks": "masbate sorsogon",
"bkt": "bolokî",
"bku": "buhid",
"bkv": "bekwarra",
"bkw": "bekwel",
"bkx": "baikeno",
"bky": "bokyî",
"bkz": "bungku",
"bla": "blakfotî",
"blb": "bilua",
"blc": "bella koola",
"bld": "bolango",
"ble": "balanta-kentohe",
"blf": "buol",
"blg": "balau",
"blh": "kuwaa",
"bli": "bolia",
"blj": "bolonî",
"blk": "pa'o karen",
"bll": "biloxî",
"blm": "belî",
"bln": "bîkolanoyiya başûr katanduanî",
"blo": "anîî",
"blp": "blablanga",
"blq": "baluan-pam",
"blr": "blang",
"bls": "balaesang",
"blt": "tay dam",
"blv": "kibala",
"blw": "balangao",
"blx": "mag-îndî ayta",
"bly": "notre",
"blz": "balantak",
"bm": "bambarayî",
"bma": "lame",
"bmb": "bembe",
"bmc": "biem",
"bmd": "baga mandurî",
"bme": "limassa",
"bmf": "bom",
"bmg": "bamwe",
"bmh": "kein",
"bmi": "bagirmî",
"bmj": "bote-majhî",
"bmk": "ghayavî",
"bml": "bombolî",
"bmn": "bîna",
"bmo": "bambalang",
"bmp": "bulgebî",
"bmq": "bomu",
"bmr": "muinanî",
"bmt": "biao mon",
"bmu": "somba-siawarî",
"bmv": "bum",
"bmw": "bomwalî",
"bmx": "baimak",
"bmz": "baramu",
"bn": "bengalî",
"bna": "boneratî",
"bnb": "bookan",
"bnd": "banda",
"bne": "bintauna",
"bnf": "masiwang",
"bng": "benga",
"bni": "bangî",
"bnj": "tawbuîdiya rojhilatî",
"bnk": "biereboyî",
"bnl": "boon",
"bnm": "batangayî",
"bnn": "bununî",
"bno": "asî",
"bnp": "bolayî",
"bnq": "bantîkî",
"bnr": "butmas-turî",
"bns": "bundelî",
"bnt-bal": "balongî",
"bnt-cmw": "çimwiinî",
"bnt-ind": "indangayî",
"bnt-lal": "lalayî (Afrîkaya başûr)",
"bnt-lwl": "lwelî",
"bnt-mpi": "mpiinî",
"bnt-ngu-pro": "proto-ngunî",
"bnt-phu": "phuthî",
"bnt-pro": "proto-bantuyî",
"bnt-sts-pro": "proto-sotho-tswana",
"bnu": "bentongî",
"bnv": "benerafî",
"bnw": "bisisî",
"bnx": "bangubanguyî",
"bny": "bintuluyî",
"bnz": "beezenî",
"bo": "tîbetî",
"boa": "borayî",
"bob": "aweerî",
"boe": "mundablî",
"bof": "bolonî",
"bog": "zimanê destan ê bamakoyî",
"boh": "bomayî",
"boi": "barbarenyoyî",
"boj": "ancamî",
"bok": "boncoyî",
"bol": "boleyî",
"bom": "beromî",
"bon": "bineyî",
"boo": "bozoyoya tiemacewe",
"bop": "bonkimanî",
"boq": "bogayayî",
"bor": "bororoyî",
"bot": "bongoyî",
"bou": "bondeyî",
"bov": "tuwulî",
"bow": "remayî",
"box": "buamuyî",
"boy": "bodoyî (Afrîkaya navendî)",
"boz": "bozoyiya tieyaxo",
"bpa": "dakakayî",
"bpb": "barbakoasî",
"bpd": "banda-bandayî",
"bpg": "bonggoyî",
"bph": "botlixî",
"bpi": "bagupî",
"bpj": "binjî",
"bpk": "oroweyî",
"bpl": "broome pearling lugger pidginî",
"bpm": "biyomî",
"bpn": "dzao minî",
"bpo": "anasî",
"bpp": "kaureyî",
"bpq": "banda malayî",
"bpr": "koronadal blaanî",
"bps": "saranganî blaanî",
"bpt": "barrow pointî",
"bpu": "bonguyî",
"bpv": "bian marindî",
"bpx": "palya bareliyî",
"bpy": "manîpûriya bîşnûpriyayî",
"bpz": "bilbayî",
"bqa": "tchumbuliyî",
"bqb": "bagusayî",
"bqc": "bokoyî",
"bqd": "bungî",
"bqf": "baga kaloumî",
"bqg": "bago-kusuntuyî",
"bqh": "baimayî",
"bqi": "bextiyarî",
"bqj": "bandialî",
"bqk": "banda-mbrèsî",
"bql": "bilakurayî",
"bqm": "wumbokoyî",
"bqn": "zimanê destan ê bulgarî",
"bqo": "baloyî",
"bqp": "busayî",
"bqq": "biritaiyî",
"bqr": "burusuyî",
"bqs": "bosngunî",
"bqt": "bamukumbitî",
"bqu": "boguruyî",
"bqv": "begbere-ejarî",
"bqw": "buruyî (Nîjerya)",
"bqx": "baangiyî",
"bqy": "zimanê destan ê bengkalayî",
"bqz": "bakakayî",
"br": "bretonî",
"bra": "brajî",
"brb": "laveyî",
"brc": "kreyoliya holendî ya berbiceyî",
"brd": "baraamuyî",
"brf": "berayî",
"brg": "baureyî",
"brh": "brahuiyî",
"bri": "mokpweyî",
"brj": "bieriayî",
"brk": "birgidî",
"brl": "birwayî",
"brm": "barambuyî",
"brn": "borucayî",
"bro": "brokkatî",
"brp": "barapasiyî",
"brq": "breriyî",
"brr": "biraoyî",
"brs": "barasî",
"brt": "bitareyî",
"bru": "bruyiya rojhilatî",
"brv": "bruyiya rojavayî",
"brw": "bellariyî",
"brx": "bodoyî (Hindistan)",
"bry": "buruiyî",
"brz": "bîlbîlî",
"bsa": "abînomnî",
"bsb": "bisayayiya bruneyî",
"bsc": "bassariyî",
"bse": "wushiyî",
"bsf": "bawçiyî",
"bsg": "başkardiyî",
"bsh": "kamkata-viriyî",
"bsi": "bassossiyî",
"bsj": "bangwinjiyî",
"bsk": "buruşaskiyî",
"bsl": "basa-gumnayî",
"bsm": "busamiyî",
"bsn": "barasanayî",
"bso": "busoyî",
"bsp": "baga sitemuyî",
"bsq": "bassayî",
"bsr": "bassa-kontagorayî",
"bss": "akooseyî",
"bst": "basketoyî",
"bsu": "bahonswayî",
"bsv": "baga sobaneyî",
"bsw": "baysoyî",
"bsx": "yangkamî",
"bsy": "sabah bisayayî",
"bta": "batayî",
"btc": "batî (Kamerûn)",
"btd": "batakiya dairî",
"bte": "gamo-ningiyî",
"btf": "birgîtî",
"btg": "gagnoa betî",
"bth": "biatah bidayuhî",
"bti": "burateyî",
"btj": "malayiya bakanîsî",
"btk-pro": "proto-batakî",
"btm": "batakiya mandaîlîng",
"btn": "ratagnonî",
"bto": "iriga bikolanoyî",
"btp": "budibudî",
"btq": "batekî",
"btr": "baetorayî",
"bts": "batakiya simalungun",
"btt": "bete-bendiyî",
"btu": "batuyî",
"btv": "bateriyî",
"btw": "butuanonî",
"btx": "batakiya karo",
"bty": "bobotî",
"btz": "batakiya alas-kluet",
"bua": "buryatî",
"bub": "buayî",
"bud": "ntçamî",
"bue": "beothukî",
"buf": "buşûngî",
"bug": "bugî",
"buh": "younuo bunuyî",
"bui": "bongiliyî",
"buj": "basa-gurmanayî",
"buk": "bukawayî",
"bum": "buluyî (Kamerûn)",
"bun": "şerbroyî",
"buo": "tereiyî",
"bup": "busoayî",
"buq": "bremî",
"bus": "bokobaruyî",
"but": "bungainî",
"buu": "buduyî",
"buv": "bunî",
"buw": "bubiyî",
"bux": "boghomî",
"buy": "mmaniyî",
"bva": "bareinî",
"bvb": "bubeyî",
"bvc": "baeleleayî",
"bvd": "baegguyî",
"bve": "malayiya berau",
"bvf": "boorî",
"bvg": "bonkengî",
"bvh": "bureyî",
"bvi": "belanda viriyî",
"bvj": "baanî",
"bvk": "bukatî",
"bvl": "zimanê destan ê bolîvyayî",
"bvm": "bamunkayî",
"bvn": "bunayî",
"bvo": "bolgoyî",
"bvp": "bumangî",
"bvq": "birriyî",
"bvr": "burarrayî",
"bvt": "batî (Endonezya)",
"bvu": "malayiya bukitî",
"bvv": "banivayî",
"bvw": "bogayî",
"bvx": "baboleyî",
"bvy": "baybayanonî",
"bvz": "bawziyî",
"bwa": "bwatûyî",
"bwb": "namosî-naytasîrî-serwayî",
"bwc": "bwileyî",
"bwd": "biwaydokayî",
"bwe": "bwe karenî",
"bwf": "boselewayî",
"bwg": "barweyî",
"bwh": "bişuoyî",
"bwi": "baniwayî",
"bwj": "laa laa bwamuyî",
"bwk": "bauwakiyî",
"bwl": "bwelayî",
"bwm": "biwatî",
"bwn": "wunay bunuyî",
"bwo": "şinaşayî",
"bwp": "mandobo bawahî",
"bwq": "boboyiya başûrî",
"bwr": "burayî",
"bws": "bombomayî",
"bwt": "bafawî",
"bwu": "bulî (Gana)",
"bww": "bwayî",
"bwx": "bu-nao bunuyî",
"bwy": "cwi bwamuyî",
"bwz": "bwisiyî",
"bxa": "bauroyî",
"bxb": "belanda borî",
"bxc": "molengueyî",
"bxd": "pelayî",
"bxe": "ongotayî",
"bxf": "bilurî",
"bxg": "bangalayî",
"bxh": "buhutuyî",
"bxi": "pirlatapayî",
"bxj": "bayunguyî",
"bxk": "bukusuyî",
"bxl": "jalkunanî",
"bxn": "burdunayî",
"bxo": "barikançîyî",
"bxp": "bebilî",
"bxq": "beeleyî",
"bxs": "busamî",
"bxv": "berakouyî",
"bxw": "bankayî",
"bxz": "binahariyî",
"bya": "batakiya palawan",
"byb": "bikyayî",
"byc": "ubaxarayî",
"byd": "benyadu'",
"bye": "pouyeyî",
"byf": "beteyî",
"byg": "baygoyî",
"byh": "bujhyalî",
"byi": "buyuyî",
"byj": "binawayî",
"byk": "biaoyî",
"byl": "bayonoyî",
"bym": "bidyarayî",
"byn": "blinî",
"byo": "biyoyî",
"byp": "bumajiyî",
"byq": "basayî",
"byr": "baruyayî",
"bys": "burakî",
"byt": "bertiyî",
"byv": "medumbayî",
"byw": "belhariyayî",
"byx": "qaqetî",
"byz": "banaroyî",
"bza": "bandiyî",
"bzb": "andioyî",
"bzd": "bribriyî",
"bze": "jenaama bozoyî",
"bzf": "boikinî",
"bzg": "babuzayî",
"bzh": "mapos buangî",
"bzi": "bisuyî",
"bzj": "kreyoliya belizeyî",
"bzk": "kreyoliya nîkaraguayî",
"bzl": "boanoyî (sulawesî)",
"bzm": "bolondoyî",
"bzn": "boanoyî (Maluku)",
"bzo": "bozabayî",
"bzp": "kemberanoyî",
"bzq": "bulî",
"bzr": "biriyî",
"bzs": "zimanê destan ê brezîlî",
"bzu": "burmesoyî",
"bzv": "bebeyî",
"bzw": "basayî",
"bzx": "bozoyiya hainyaxo",
"bzy": "obanlikuyî",
"bzz": "evantî",
"ca": "katalanî",
"caa": "ç'orti'",
"cab": "garîfunayî",
"cac": "çujî",
"cad": "caddoyî",
"cae": "laalaayî",
"caf": "karrieriya başûrî",
"cag": "nivacleyî",
"cah": "cahuaranoyî",
"caj": "çaneyî",
"cak": "kaqçikelî",
"cal": "karolînî",
"cam": "cemuhî",
"can": "çambriyî",
"cao": "çacoboyî",
"cap": "çipayayî",
"caq": "car nicobareseyî",
"car": "galîbî karîbî",
"cas": "tsimaneyî",
"cau-abz-pro": "proto-abxazî-abazayî",
"cau-ava-pro": "proto-avaro-andî",
"cau-cir-pro": "proto-çerkezî",
"cau-drg-pro": "proto-dargwayî",
"cau-lzg-pro": "proto-lezghî",
"cau-nec-pro": "proto-qefqaziya bakur-rojhilatî",
"cau-nkh-pro": "proto-nakhî",
"cau-nwc-pro": "proto-qefqaziya bakur-rojavayî",
"cau-tsz-pro": "proto-tsezî",
"cav": "cavineñayî",
"caw": "callawallayî",
"cax": "çiquitanoyî",
"cay": "cayugayî",
"caz": "caniçanayî",
"cba-ata": "atanquesî",
"cba-cat": "catio çibçayî",
"cba-dor": "dorasqueyî",
"cba-dui": "duitî",
"cba-hue": "huetarî",
"cba-nut": "nutabeyî",
"cba-pro": "proto-çîbçanî",
"cbb": "cabiyariyî",
"cbc": "carapanayî",
"cbd": "carijonayî",
"cbg": "çimilayî",
"cbi": "çaçiyî",
"cbj": "ede cabeyî",
"cbk": "çavacanoyî",
"cbl": "bualkhaw çinî",
"cbn": "nyah kurî",
"cbo": "izorayî",
"cbq": "şubayî",
"cbr": "caşibo-cacataiboyî",
"cbs": "caşinahuayî",
"cbt": "çayahuitayî",
"cbu": "candoşi-şaprayî",
"cbv": "cacuayî",
"cbw": "kinabalianî",
"cby": "carabayoyî",
"cca": "caucayî",
"ccc": "çamicuroyî",
"ccd": "cafundóî",
"cce": "çopiyî",
"ccg": "çamba dakayî",
"cch": "atsamî",
"ccj": "kasangayî",
"ccl": "cutçi-swahiliyî",
"ccm": "malaccan creole malayî",
"ccn-pro": "proto-qefqaziya bakurî",
"cco": "comaltepec çinantecî",
"ccp": "çakmayî",
"ccr": "cacaoperayî",
"ccs-gzn-pro": "proto-gurcî-zanî",
"ccs-pro": "proto-kartvelî",
"cda": "çoniyî",
"cdc-cbm-pro": "proto-çadîkiya navendî",
"cdc-mas-pro": "proto-masayî",
"cdc-pro": "proto-çadîkî",
"cdd-pro": "proto-kaddoanî",
"cde": "çençuyî",
"cdf": "çiruyî",
"cdh": "çambealiyî",
"cdi": "çodriyî",
"cdj": "çurahiyî",
"cdm": "çepangî",
"cdn": "çaudangsiyî",
"cdo": "min dongî",
"cdr": "cinda-regî-tiyalî",
"cds": "zimanê destan ê çadî",
"cdy": "çadongî",
"cdz": "kodayî",
"ce": "çeçenî",
"cea": "çehalîsiya jêrîn",
"ceb": "sebwanoyî",
"ceg": "çamacocoyî",
"cel-bry-pro": "proto-brîtonî",
"cel-gal": "gallaesî",
"cel-gau": "gaulisî",
"cel-pro": "proto-keltî",
"cen": "cenî",
"cet": "centúúmî",
"cfa": "dijim-bwilimî",
"cfd": "carayî",
"cfg": "como karimî",
"cfm": "falam çinî",
"cga": "çangriwayî",
"cgc": "kagayanenî",
"cgg": "rukîgayî",
"cgk": "çocangacayî",
"ch": "çamoroyî",
"chb": "çibçayî",
"chc": "katawbayî",
"chd": "highland oaxaca çontalî",
"chf": "tabasco çontalî",
"chg": "çaxatayî",
"chh": "çinookî",
"chi-pro": "proto-çimakuanî",
"chj": "ojitlan çinantecî",
"chk": "çûkî",
"chl": "cahuillayî",
"chm": "marî",
"chn": "çinook jargonî",
"cho": "çoktawî",
"chp": "çîpewî",
"chq": "quiotepec çinantecî",
"chr": "çerokî",
"cht": "çolónî",
"chw": "çuaboyî",
"chx": "çantyalî",
"chy": "çeyenî",
"chz": "ozumacin çinantecî",
"cia": "cia-ciayî",
"cib": "ci gbeyî",
"cic": "çîkasawî",
"cid": "çimarikoyî",
"cie": "cineniyî",
"cih": "çinaliyî",
"cik": "çitkuli kinnauriyî",
"cim": "cimbrî",
"cin": "cinta largayî",
"cip": "çiapanecî",
"cir": "tiriyî",
"ciy": "çaimayî",
"cja": "çamiya rojavayî",
"cje": "çruyî",
"cjh": "çehalîsiya jorîn",
"cji": "çamalalî",
"cjk": "çokweyî",
"cjm": "çamiya rojhilatî",
"cjn": "çenapianî",
"cjo": "aşeninka pajonalî",
"cjp": "cabecarî",
"cjs": "şorî",
"cjv": "çuaveyî",
"cjy": "jinî",
"ckb": "soranî",
"ckh": "çakî",
"ckl": "cibakî",
"ckn": "kaang çinî",
"cko": "anufoyî",
"ckq": "kajakseyî",
"ckr": "kairakî",
"cks": "tayoyî",
"ckt": "çukçî",
"cku": "koasatî",
"ckv": "kavalanî",
"ckx": "cakayî",
"cky": "cakfem-muşereyî",
"ckz": "cakçiquel-quiçe mixed languageyî",
"cla": "ronî",
"clc": "çilcotinî",
"cld": "çaldean neo-aramaicî",
"cle": "lealao çinantecî",
"clh": "çilissoyî",
"cli": "çakaliyî",
"clj": "laitu çinî",
"clk": "iduyî",
"cll": "çalayî",
"clm": "klallamî",
"clo": "lowland oaxaca çontalî",
"clt": "lautu çinî",
"clu": "caluyanunî",
"clw": "çulymî",
"cly": "çatinoyiya eastern highland",
"cma": "maayî",
"cmc-pro": "proto-çamîkî",
"cme": "cermayî",
"cmg": "mongoliya klasîk",
"cmi": "embera-çamiyî",
"cml": "campalagianî",
"cmm": "miçigameayî",
"cmn": "mandarînî",
"cmo": "mnongiya navendî",
"cmr": "mro çinî",
"cms": "messapicî",
"cmt": "camthoyî",
"cna": "çangthangî",
"cnb": "çinbon çinî",
"cnc": "côôngî",
"cng": "qiangiya bakurî",
"cnh": "laiyî",
"cni": "aşanînkayî",
"cnk": "khumi çinî",
"cnl": "lalana çinantecî",
"cno": "conî",
"cns": "asmatiya navendî",
"cnt": "tepetotutla çinantecî",
"cnu": "çenouayî",
"cnw": "ngawn çinî",
"cnx": "korniya navîn",
"co": "korsîkayî",
"coa": "cocos islands malayî",
"cob": "çicomuceltecî",
"coc": "cocopayî",
"cod": "cocamayî",
"coe": "koreguajeyî",
"cof": "tsafikiyî",
"cog": "çongî",
"coh": "çiçonyi-çidzihana-çikauma",
"coj": "coçimiyî",
"cok": "santa teresa corayî",
"col": "columbia-wenatçiyî",
"com": "komançî",
"con": "cofanî",
"coo": "comoxî",
"cop": "qiptî",
"coq": "coquilleyî",
"cot": "caquinteyî",
"cou": "wameyî",
"cov": "cao miaoyî",
"cow": "cowlitzî",
"cox": "nantiyî",
"coy": "coyaimayî",
"coz": "çoçotecî",
"cpa": "palantla çinantecî",
"cpb": "ucayali-yurúa aşeninkayî",
"cpc": "ajyininka apurucayaliyî",
"cpe-mar": "zimanê maroon spirit",
"cpe-spp": "samoan plantation pidginî",
"cpg": "yûnaniya kapadokyayî",
"cpi": "îngilîziya pîdgînî ya çînî",
"cpn": "çereponî",
"cpo": "kpeeyî",
"cps": "capiznonî",
"cpu": "piçis aşeninkayî",
"cpx": "puxianî",
"cpy": "south ucayali aşeninkayî",
"cqd": "çuanqiandian cluster miaoyî",
"cr": "krî",
"cra": "çarayî",
"crb": "island caribî",
"crc": "lonwolwolî",
"crd": "coeur d'aleneyî",
"crf": "caramantayî",
"crg": "mîçîfî",
"crh": "teteriya krîmî",
"cri": "sãotomenseyî",
"crj": "kriya rojhilat ya başûrî",
"crk": "kriya bejayî",
"crl": "kriya rojhilat ya bakurî",
"crm": "kriya mûsî",
"crn": "corayî",
"cro": "crowî",
"crp-gep": "greenlandic pidginî",
"crp-mpp": "macau pidgin portugalî",
"crp-rsn": "russenorskî",
"crp-tpr": "taimyr pidgin rûsî",
"crq": "iyo'wujwa çoroteyî",
"crr": "carolina algonquianî",
"crs": "kreyoliya seyşelî",
"crt": "iyojwa'ja çoroteyî",
"crv": "çaurayî",
"crw": "çrauyî",
"crx": "karriyerî",
"cry": "coriyî",
"crz": "cruzeñoyî",
"cs": "çekî",
"csa": "çiltepec çinantecî",
"csb": "kaşûbî",
"csc": "zimanê destan ê katalanî",
"csd": "zimanê destan ê çiangmayî",
"cse": "zimanê destan ê çekî",
"csf": "zimanê destan ê kûbayî",
"csg": "zimanê destan ê şîlîyî",
"csh": "aşo çinî",
"csi": "coast miwokî",
"csj": "songlai çinî",
"csk": "jola-kasayî",
"csl": "zimanê destan ê çînî",
"csm": "sierra mîwokiya navendî",
"csn": "zimanê destan ê kolombiyayî",
"cso": "soçiapam çinantecî",
"csq": "zimanê destan ê xirwatî",
"csr": "zimanê destan ê kosta rîkayî",
"css": "ohloniya başûr",
"cst": "ohloniya bakur",
"csu-bba-pro": "proto-bongo-bagirmî",
"csu-maa-pro": "proto-mangbetuyî",
"csu-pro": "proto-sudanîkiya navendî",
"csu-sar-pro": "proto-sarayî",
"csv": "sumtu çinî",
"csw": "kriya swampî",
"csy": "siyin çinî",
"csz": "coosî",
"cta": "tataltepec çatinoyî",
"ctc": "çetco-tolowayî",
"ctd": "tedim çinî",
"cte": "tepinapa çinantecî",
"ctg": "çittagonianî",
"cth": "thaiphum çinî",
"ctl": "tlacoatzintepec çinantecî",
"ctm": "çitimaçayî",
"ctn": "çhintangeyî",
"cto": "embera-catioyî",
"ctp": "çatinoyiya western highland",
"ctp-san": "san juan quiahije çatinoyî",
"cts": "bicolanoyiya northern catanduanes",
"ctt": "wayanad çettiyî",
"ctu": "çolî",
"ctz": "zacatepec çatinoyî",
"cu": "slaviya kevn",
"cua": "cuayî",
"cub": "cubeoyî",
"cuc": "usila çinantecî",
"cug": "cungî",
"cuh": "çukayî",
"cui": "cuibayî",
"cuj": "maşco piroyî",
"cuk": "kunayî",
"cul": "culinayî",
"cuo": "cumanagotoyî",
"cup": "cupeñoyî",
"cuq": "cunî",
"cur": "çhulungî",
"cus-ash": "aşraafî",
"cus-pro": "proto-kuşîtî",
"cut": "teutila cuicatecî",
"cuu": "tai yayî",
"cuv": "cuvokî",
"cuw": "çukwayî",
"cux": "tepeuxila cuicatecî",
"cuy": "cuitlatecî",
"cv": "çuvaşî",
"cvg": "çugî",
"cvn": "valle nacional çinantecî",
"cwa": "kabwayî",
"cwb": "maindoyî",
"cwd": "kriya woods",
"cwe": "kwereyî",
"cwg": "çewongî",
"cwt": "kuwaataayî",
"cy": "weylsî",
"cya": "nopala çatinoyî",
"cyb": "cayubabayî",
"cyo": "cuyunonî",
"czh": "huizhouyî",
"czk": "knaanicî",
"czn": "zenzontepekiya çatîno",
"czo": "min zhongî",
"czt": "zotung çinî",
"da": "danmarkî",
"daa": "dangaleatî",
"dac": "dambiyî",
"dad": "marikî",
"dae": "duupayî",
"dag": "dagbaniyî",
"dah": "gwahatikeyî",
"dai": "dayî",
"daj": "dar fur dajuyî",
"dak": "dakotayî",
"dal": "dahaloyî",
"dam": "damakawayî",
"dao": "daai çinî",
"daq": "dandami mariayî",
"dar": "dargwayî",
"das": "daho-dooyî",
"dau": "dar sila dajuyî",
"dav": "taitayî",
"daw": "davawenyoyî",
"dax": "dayiyî",
"daz": "daoyî",
"dba": "bangi meyî",
"dbb": "denoyî",
"dbd": "dadiyayî",
"dbe": "dabeyî",
"dbf": "edopiyî",
"dbg": "dogul domî",
"dbi": "dokayî",
"dbj": "ida'anî",
"dbl": "diyirbalî",
"dbm": "dugurî",
"dbn": "duriankereyî",
"dbo": "dulbuyî",
"dbp": "duwaiyî",
"dbq": "dabayî",
"dbr": "dabarreyî",
"dbt": "ben teyî",
"dbu": "bondum dom dogonî",
"dbv": "dunguyî",
"dbw": "bankan tey dogonî",
"dby": "dibiyasoyî",
"dcc": "deccaniyî",
"dcr": "negerhollandsî",
"dda": "dadi dadiyî",
"ddd": "dongotonoyî",
"dde": "doondoyî",
"ddg": "fatalukuyî",
"ddi": "diodioyî",
"ddj": "jaruyî",
"ddn": "dendiyî",
"ddo": "tsezî",
"ddr": "dhudhuroayî",
"dds": "donno so dogonî",
"ddw": "dawera-daweloorî",
"de": "almanî",
"dec": "dagikî",
"ded": "deduayî",
"dee": "dewoinî",
"def": "dezfuliyî",
"deg": "degemayî",
"deh": "dehwariyî",
"dei": "demisayî",
"dek": "dekî",
"dem": "demî",
"den": "slaveyî",
"dep": "pidgin delawareyî",
"der": "deoriyî",
"des": "desanoyî",
"dev": "domungî",
"dez": "dengeseyî",
"dga": "dagaareyiya başûrî",
"dgb": "bunogeyî",
"dgc": "casiguran dumagat agtayî",
"dgd": "dagarî",
"dge": "degenanî",
"dgg": "dogayî",
"dgh": "dghwedeyî",
"dgi": "dagarayiya bakurî",
"dgk": "dagbayî",
"dgn": "dagomanî",
"dgo": "hindi dogriyî",
"dgr": "dogrîbî",
"dgs": "dogosoyî",
"dgt": "ntra'ngithî",
"dgw": "daungwurrungî",
"dgx": "doghoroyî",
"dgz": "dagayî",
"dhg": "dhanguyî",
"dhi": "dhimalî",
"dhl": "dhalandjiyî",
"dhm": "zembayî",
"dhn": "dhankiyî",
"dho": "dhodiayî",
"dhr": "tharrgariyî",
"dhs": "dhaisoyî",
"dhu": "dhurgayî",
"dhv": "dehûyî",
"dhw": "danuwarî",
"dhx": "dhungalooyî",
"dia": "diayî",
"dib": "dinkayiya navendî ya başûr",
"dic": "lakota didayî",
"did": "dîdîngayî",
"dif": "dieriyî",
"dig": "digoyî",
"dii": "dimbongî",
"dij": "daiyî",
"dik": "dinkayiya başûr-rojavayî",
"dil": "dillingî",
"dim": "dimeyî",
"din": "dinkayî",
"dio": "diboyî",
"dip": "dinkayiya bakur-rojhilatî",
"dir": "dirimî",
"dis": "dimasayî",
"diu": "gcirikuyî",
"diw": "dinkayiya bakur-rojavayî",
"dix": "dixon reefî",
"diy": "diuweyî",
"diz": "dingî",
"dja": "djadjawurrungî",
"djb": "djinbayî",
"djc": "dar daju dajuyî",
"djd": "jaminjungî",
"dje": "zarmayî",
"djf": "djangunî",
"dji": "djinangî",
"djj": "ndjebbanayî",
"djk": "aukanî",
"djl": "djiwarliyî",
"djm": "jamsayî",
"djn": "djauanî",
"djo": "jangkangî",
"djr": "djambarrpuynguyî",
"dju": "kaprimanî",
"djw": "djawiyî",
"dka": "dakpayî",
"dkk": "dakkayî",
"dkr": "kuijauyî",
"dks": "dinkayiya başûr-rojhilatî",
"dkx": "mazagwayî",
"dlg": "dolganî",
"dlk": "dahalikî",
"dlm": "dalmatî",
"dln": "darlongî",
"dma": "dumayî",
"dmb": "mombo dogonî",
"dmc": "gavakî",
"dmd": "madhi madhiyî",
"dme": "dugworî",
"dmg": "kinabatanganiya jorîn",
"dmk": "domaakiyî",
"dml": "dameliyî",
"dmm": "damayî (Nîjerya)",
"dmn-dam": "damayî (Sierra leone)",
"dmn-mdw-pro": "proto-mandeyiya rojavayî",
"dmn-pro": "proto-mandeyî",
"dmo": "kemezungî",
"dmr": "damariya rojhilat",
"dms": "dampelasî",
"dmu": "dubuyî",
"dmv": "dumpasî",
"dmw": "mudburrayî",
"dmx": "demayî",
"dmy": "demtayî",
"dna": "daniya geliya grand a jorîn",
"dnd": "daondayî",
"dne": "ndendeuleyî",
"dng": "dunganî",
"dni": "daniya geliya grand a jêrîn",
"dnj": "danî",
"dnk": "dengkayî",
"dnn": "dzuunî",
"dno": "ndruloyî",
"dnr": "danaruyî",
"dnt": "daniya geliya grand a naverast",
"dnu": "danauyî",
"dnv": "danuyî",
"dnw": "daniya rojavayî",
"dny": "deniyî",
"doa": "domî",
"dob": "dobûyî",
"doc": "kamiya bakurî",
"doe": "doeyî",
"dof": "domuyî",
"dog": "dogonî",
"doh": "dongî",
"doi": "dogriyî",
"dok": "dondoyî",
"dol": "dosoyî",
"don": "dourayî",
"doo": "dongoyî",
"dop": "lukpayî",
"doq": "zimanê destan ê domînîkî",
"dor": "dori'oyî",
"dos": "dogoseyî",
"dot": "dassî",
"dov": "toka-leyayî",
"dow": "doyayoyî",
"dox": "bussayî",
"doy": "dompoyî",
"doz": "dorzeyî",
"dpp": "paparî",
"dra-mkn": "kannadayiya navîn",
"dra-okn": "kannadayiya kevn",
"dra-pro": "proto-dravidî",
"drb": "dairî",
"drc": "mindericoyî",
"drd": "darmiyayî",
"drg": "rungusî",
"dri": "lelayî",
"drl": "baagandjiyî",
"drn": "damariya rojava",
"dro": "daro-matu melanauyî",
"drq": "durayî",
"drs": "gedeoyî",
"dru": "rukaiyî",
"dru-pro": "proto-rukaî",
"dry": "daraiyî",
"dsb": "sorbiya jêrîn",
"dse": "zimanê destan ê holendî",
"dsh": "daasanaçî",
"dsi": "disayî",
"dsl": "zimanê destan ê danmarkî",
"dsn": "dusnerî",
"dso": "desiyayî",
"dsq": "tadaksahakî",
"dta": "daurî",
"dtb": "labuk-kinabatangan kadazanî",
"dtd": "ditidahtî",
"dth": "adithinngithighî",
"dti": "ana tinga dogonî",
"dtk": "tene kan dogonî",
"dtm": "tomo kan dogonî",
"dto": "tommo soyî",
"dtp": "dusuniya navendî",
"dtr": "lotudî",
"dts": "toro so dogonî",
"dtt": "toro tegu dogonî",
"dtu": "tebul ure dogonî",
"dty": "doteliyî",
"dua": "diwalayî",
"dub": "dubliyî",
"duc": "dunayî",
"due": "umiray dumaget agtayî",
"duf": "dumbeayî",
"dug": "çidurumayî",
"duh": "dungra bhilî",
"dui": "dumunî",
"duk": "uyajitayayî",
"dul": "alabat island agtayî",
"dum": "holendiya navîn",
"dun": "dusun deyahî",
"duo": "dupaningan agtayî",
"dup": "duanoyî",
"duq": "dusun malangî",
"dur": "diiyî",
"dus": "dumiyî",
"duu": "drungî",
"duv": "duvleyî",
"duw": "dusun wituyî",
"dux": "duunî",
"duy": "dicamay agtayî",
"duz": "duliyî",
"dv": "divehî",
"dva": "duauyî",
"dwa": "diriyî",
"dwr": "dawroyî",
"dwu": "dhuwalî",
"dww": "dawawayî",
"dwy": "dhuwayayî",
"dwz": "dewas raiyî",
"dya": "dyanî",
"dyb": "dyaberdyaberî",
"dyd": "dyugunî",
"dyg": "villa viciosa agtayî",
"dyi": "djiminiyî",
"dym": "yanda dogonî",
"dyn": "dyangadiyî",
"dyo": "jola-fonyiyî",
"dyu": "dyulayî",
"dyy": "dyaabugayî",
"dz": "conxayî",
"dza": "tunzuyî",
"dzg": "dazagayî",
"dzl": "dzalayî",
"dzn": "dzandoyî",
"ebg": "ebughuyî",
"ebk": "bontociya rojhilatî",
"ebr": "ebrieyî",
"ebu": "embuyî",
"ecr": "eteocretanî",
"ecs": "zimanê destan ê ekwadorî",
"ecy": "eteoqibrisî",
"ee": "eweyî",
"eee": "eyî",
"efa": "efaiyî",
"efe": "efeyî",
"efi": "efikî",
"ega": "egayî",
"egl": "emilî",
"ego": "eggonî",
"egx-dem": "demotîkî",
"egy": "misrî",
"ehu": "ehueunî",
"eip": "eipomekî",
"eit": "eitiepî",
"eiv": "askopanî",
"eja": "ejamatî",
"eka": "ekajukî",
"eke": "ekitî",
"ekg": "ekariyî",
"eki": "ekiyî",
"ekl": "kolheyî",
"ekm": "elipî",
"eko": "kotiyî",
"ekp": "ekpeyeyî",
"ekr": "yaceyî",
"eky": "kayahiya rojhilatî",
"el": "yûnanî",
"ele": "elepiyî",
"elh": "el hugeiratî",
"eli": "ndingî",
"elk": "elkeiyî",
"elm": "elemeyî",
"elo": "el moloyî",
"elu": "eluyî",
"elu-prk": "heluyî",
"elx": "îlamî",
"ema": "emaiyî",
"emb": "embalohî",
"eme": "emerillonî",
"emg": "meohangiya rojhilatî",
"emi": "mûssaû-emîrakî",
"emk": "maninkakaniya rojhilatî",
"emm": "mamuliqueyî",
"emn": "emanî",
"emp": "emberayiya bakurî",
"ems": "alutîqî",
"emu": "muriayiya rojhilatî",
"emw": "emplawasî",
"emx": "erromintxelayî",
"emy": "mayaniya epigrafîk",
"en": "îngilîzî",
"ena": "apaliyî",
"enb": "markweetayî",
"enc": "enî",
"end": "endeyî",
"enf": "forest enetsî",
"enh": "tundra enetsî",
"enl": "enlhetî",
"enm": "îngilîziya navîn",
"enn": "engenniyî",
"eno": "engganoyî",
"enq": "engayî",
"enr": "ememî",
"enu": "enuyî",
"env": "enwanî",
"enw": "enwangî",
"enx": "enxetî",
"eo": "esperantoyî",
"eot": "eotileyî",
"epi": "epieyî",
"era": "eravallanî",
"erg": "sieyî",
"erh": "eruwayî",
"eri": "ogeayî",
"erk": "efateyiya başûr",
"ero": "horpayî",
"err": "erreyî",
"ers": "ersuyî",
"ert": "eritaiyî",
"erw": "erokwanasî",
"es": "spanî",
"ese": "ese ejjayî",
"esh": "iştihardî",
"esi": "înupiatuniya bakurê alaskayê",
"esk": "înupiatuniya bakur-rojavaya alaskayê",
"esl": "zimanê destan ê misrî",
"esm": "esumayî",
"esn": "zimanê destan ê salvadorî",
"eso": "zimanê destan ê estonî",
"esq": "esselenî",
"ess": "yupikiya sîberyaya navendî",
"esu": "yupîkiya navendî",
"esx-esk-pro": "proto-eskîmo",
"esx-inu-pro": "proto-înuîtî",
"esx-pro": "proto-eskîmo-alêwîtî",
"esy": "eskayanî",
"et": "estonî",
"etb": "etebiyî",
"etc": "etçeminî",
"eth": "zimanê destan ê etîyopyî",
"etn": "etonî (Vanuatu)",
"eto": "etonî (Kamerûn)",
"etr": "edoloyî",
"ets": "yekheeyî",
"ett": "etrûskî",
"etu": "ejaghamî",
"etx": "etenî",
"etz": "semimiyî",
"eu": "baskî",
"euq-pro": "proto-baskî",
"eve": "evenî",
"evh": "uvbieyî",
"evn": "evenkî",
"ewo": "ewondoyî",
"ext": "extremaduranî",
"eya": "eyakî",
"eyo": "keiyoyî",
"eza": "ezaayî",
"eze": "uzekweyî",
"fa": "farisî",
"faa": "fasuyî",
"fab": "annoboneseyî",
"fad": "wagiyî",
"faf": "faganiyî",
"fag": "finonganî",
"fah": "baissa faliyî",
"fai": "faiwolî",
"faj": "faitayî",
"fak": "fangî (Beboid)",
"fal": "faliyiya başûr",
"fam": "famî",
"fan": "fangî (Bantu)",
"fap": "palorî",
"far": "fatalekayî",
"fau": "fayuyî",
"fax": "falayî",
"fay": "farsiya başûr-rojavayî",
"faz": "farsiya bakur-rojavayî",
"fbl": "west albay bikolî",
"fcs": "zimanê destan ê qubekî",
"fer": "ferogeyî",
"ff": "fulahî",
"ffi": "foia foiayî",
"fgr": "fongoroyî",
"fi": "fînî",
"fia": "nobiinî",
"fie": "fyerî",
"fip": "fipayî",
"fir": "firanî",
"fit": "meänkiyelî",
"fiu-fin-pro": "proto-fînî",
"fiw": "fiwagayî",
"fj": "fîjî",
"fkk": "kirya-konzelî",
"fkv": "kvenî",
"fla": "montana salişî",
"flh": "foauyî",
"fli": "faliyî",
"fll": "faliyiya bakur",
"fln": "flinders islandî",
"flr": "fuliiruyî",
"fly": "tsotsitaalî",
"fmp": "fe'fe'",
"fmu": "muriayiya rojava ya dûr",
"fng": "fanagaloyî",
"fni": "faniayî",
"fo": "ferî",
"fod": "foodoyî",
"foi": "foiyî",
"fom": "fomayî",
"fon": "fonî",
"for": "foreyî",
"fos": "sirayayî",
"fpe": "piçinglisî",
"fqs": "fasî",
"fr": "fransî",
"frd": "fordatayî",
"frm": "fransiya navîn",
"fro": "fransiya kevn",
"frp": "frankoprovansî",
"frq": "forakî",
"frr": "frîsiya bakur",
"frt": "fortsenalî",
"fse": "zimanê destan ê fînî",
"fsl": "zimanê destan li Fransayê",
"fss": "zimanê destan ê fînî-swêdî",
"fud": "futunî",
"fuj": "koyî",
"fum": "fumî",
"fun": "fulniôî",
"fur": "friyolî",
"fut": "futuna-anîwayî",
"fuu": "furuyî",
"fuy": "fuyugî",
"fvr": "furî",
"fwa": "fwâiyî",
"fwe": "fweyî",
"fy": "frîsî",
"ga": "îrlendî",
"gaa": "gayî",
"gab": "gabriyî",
"gac": "andamaniya mezin a têkel",
"gad": "gaddangî",
"gae": "warekenayî",
"gaf": "gendeyî",
"gag": "gagawzî",
"gah": "alekanoyî",
"gai": "boreiyî",
"gaj": "gadsupî",
"gak": "gamkonorayî",
"gal": "galoliyî",
"gam": "kandawoyî",
"gan": "ganî",
"gao": "gantsî",
"gap": "galî",
"gaq": "gata'",
"gar": "galeyayî",
"gas": "adiwasi garasiayî",
"gat": "kenatiyî",
"gau": "kondekorî",
"gaw": "nobonobî",
"gay": "gayoyî",
"gba": "gbayayî",
"gbb": "kaytetyeyî",
"gbd": "karadjeriyî",
"gbe": "niksekî",
"gbf": "gaikundiyî",
"gbg": "gbanziriyî",
"gbh": "defi gbeyî",
"gbi": "galelayî",
"gbj": "bodo gadabayî",
"gbk": "gaddiyî",
"gbl": "gamitî",
"gbm": "garhwaliyî",
"gbn": "mo'dayî",
"gbo": "greboyiya bakurî",
"gbp": "gbaya-bossangoayî",
"gbq": "gbaya-bozoumî",
"gbr": "gbagyiyî",
"gbs": "gbesi gbeyî",
"gbu": "gagaduyî",
"gbv": "gbanuyî",
"gbw": "gabiyî",
"gbx": "xwla gbeyiya rojhilatî",
"gby": "gbariyî",
"gcc": "malîkî",
"gcd": "ganggalidayî",
"gce": "galiceyî",
"gcf": "kreyoliya antîlleyî",
"gcl": "kreyoliya îngilîzî ya grenadî",
"gcn": "gainayî",
"gcr": "kreyoliya guwiyanîsî",
"gct": "germaniya colonia tovar",
"gd": "gaelîka skotî",
"gdb": "ollariyî",
"gdc": "gugu badhunî",
"gdd": "gêdagêdî",
"gde": "gudeyî",
"gdf": "guduf-gavayî",
"gdg": "ga'dangî",
"gdh": "gadjerawangî",
"gdi": "gundiyî",
"gdj": "kurtjarî",
"gdk": "gadangî",
"gdl": "diraşayî",
"gdm": "laalî",
"gdn": "umanakainayî",
"gdo": "godoberî",
"gdq": "mehriyî",
"gdr": "wîpiyî",
"gds": "zimanê destan ê ghandrukî",
"gdt": "kungardutyiyî",
"gdu": "guduyî",
"gdx": "godwariyî",
"gea": "gerumayî",
"geb": "kireyî",
"gec": "gboloo greboyî",
"ged": "gadeyî",
"geg": "gengleyî",
"geh": "hutterisçî",
"gei": "gebeyî",
"gej": "genî",
"gek": "gerkayî",
"gel": "fakkanciyî",
"gem-bur": "burgundî",
"gem-pro": "proto-cermenî",
"geq": "gemeyî",
"ges": "geser-goromî",
"gev": "viyayî",
"gew": "gerayî",
"gex": "garreyî",
"gey": "enyayî",
"gez": "etiyopiya klasîk",
"gfk": "patpatarî",
"gft": "gafatî",
"gga": "gaoyî",
"ggb": "gbiiyî",
"ggd": "gugadjî",
"gge": "guragoneyî",
"ggg": "gurgulayî",
"ggk": "kungarakanyî",
"ggl": "ganglauyî",
"ggn": "gurungiya rojhilatî",
"ggt": "gituayî",
"ggu": "gbanî",
"ggw": "gogodalayî",
"gha": "ghadamî",
"ghe": "ghaleyiya başûrî",
"ghh": "ghaleyî bakurî",
"ghk": "geko karenî",
"ghl": "ghulfanî",
"ghn": "ghanonggayî",
"gho": "ghomarayî",
"ghr": "gherayî",
"ghs": "guhu-samaneyî",
"ght": "kutang ghaleyî",
"gia": "kitjayî",
"gib": "gibanawayî",
"gid": "gidarî",
"gie": "guebieyî",
"gig": "goariayî",
"gih": "githabulî",
"gil": "kîrîbatî",
"gim": "gimî (Goroka)",
"gin": "hinukhî",
"gio": "gelaoyî",
"gip": "gimî (Awistronezya)",
"giq": "gelaoyiya hêşîn",
"gir": "gelaoyiya sor",
"gis": "gizigayiya bakur",
"git": "gitxsanî",
"giu": "mulaoyî",
"giw": "gelaoyiya spî",
"gix": "gilimayî",
"giy": "giyugî",
"giz": "gizigayiya başûr",
"gji": "gejiyî",
"gjk": "kaçi koliyî",
"gjm": "gunditjmarayî",
"gjn": "gonjayî",
"gju": "gojriyî",
"gka": "guyayî",
"gkd": "magiyî",
"gke": "ndaiyî",
"gkn": "gokanayî",
"gko": "kok-narî",
"gkp": "kpelleyiya gîneyî",
"gl": "galîsî",
"glc": "bon gulayî",
"gld": "nanayî",
"glh": "paşayiya bakur-rojavayî",
"glj": "kulaalî",
"glk": "gîlekî",
"glo": "galambuyî",
"glr": "glaro-twaboyî",
"glu": "gulayî",
"glw": "glavdayî",
"gly": "guleyî",
"gma": "gamberayî",
"gmb": "gula'alaayî",
"gmd": "maghdiyî",
"gme-cgo": "gothîkiya krimî",
"gmg": "magiyiyî",
"gmh": "almaniya bilind a navîn",
"gml": "almaniya jêrîn a navîn",
"gmm": "gbaya-mbodomoyî",
"gmn": "gimnimeyî",
"gmq-bot": "westrobotnî",
"gmq-gut": "gutnişî",
"gmq-jmk": "jamtîşî",
"gmq-mno": "norweciya navîn",
"gmq-oda": "danmarkiya kevn",
"gmq-osw": "swêdiya kevn",
"gmq-pro": "proto-norsî",
"gmq-scy": "skanî",
"gmu": "gumaluyî",
"gmv": "gamoyî",
"gmw-cfr": "frankoniya navendî",
"gmw-ecg": "almaniya navendî ya rojhilat",
"gmw-gts": "gottscheerîşî",
"gmw-jdt": "danmarkiya jersey",
"gmw-pro": "proto-cermeniya rojava",
"gmw-rfr": "frankoniya rhine",
"gmw-stm": "sathmar swabî",
"gmw-tsx": "saksoniya transylvanyayê",
"gmw-vog": "almaniya volga",
"gmw-zps": "almaniya zipser",
"gmx": "magomayî",
"gmy": "yûnaniya mîkenî",
"gmz": "mgboyî",
"gn": "guwaranî",
"gna": "kaansayî",
"gnb": "gangteyî",
"gnc": "guwançî",
"gnd": "zulgo-gemzekî",
"gne": "ganangî",
"gng": "ngangamî",
"gnh": "lereyî",
"gni": "gooniyandiyî",
"gnj": "ngenî",
"gnk": "ǁganayî",
"gnl": "ganguluyî",
"gnm": "ginumanî",
"gnn": "gumatjî",
"gnq": "ganayî",
"gnr": "gureng gurengî",
"gnt": "guntaiyî",
"gnu": "gnauyî",
"gnw": "guaraniyiya bolîvyaya rojavayî",
"gnz": "ganziyî",
"goa": "guroyî",
"gob": "playeroyî",
"goc": "gorakorî",
"god": "godieyî",
"goe": "gongdukî",
"gof": "gofayî",
"gog": "gogoyî",
"goh": "almaniya bilind a kevn",
"goi": "gobasiyî",
"goj": "gowlanî",
"gol": "golayî",
"gon": "gondiyî",
"goo": "gone dauyî",
"gop": "yeretuarî",
"goq": "gorapî",
"gor": "gorontaloyî",
"got": "gotî",
"gou": "gavarî",
"gow": "gorowayî",
"gox": "gobuyî",
"goy": "goundoyî",
"goz": "gozarkhaniyî",
"gpa": "gupa-abawayî",
"gpn": "taiapî",
"gqa": "ga'andayî",
"gqi": "guiqiongî",
"gqn": "kinikinaoyî",
"gqr": "gorî",
"gqu": "qauyî",
"gra": "rajput garasiayî",
"grb": "greboyî",
"grc": "yûnaniya kevn",
"grd": "guruntumî",
"grg": "madiyî",
"grh": "gbiri-niraguyî",
"gri": "garî",
"grj": "greboyiya başûrî",
"grk-cal": "yûnaniya kalabrî",
"grk-ita": "grîkoyî",
"grk-mar": "yûnaniya mariupol",
"grk-pro": "proto-helenî",
"grm": "kota marudu talantangî",
"gro": "gromayî",
"grq": "gorovuyî",
"grr": "taznatitî",
"grs": "gresiyî",
"grt": "garoyî",
"gru": "kistaneyî",
"grv": "greboyiya navendî",
"grw": "gwedayî",
"grx": "guriasoyî",
"gry": "greboyiya barclayville",
"grz": "guramalumî",
"gse": "zimanê destan ê ganayî",
"gsg": "zimanê destan ê almanî",
"gsl": "gusilayî",
"gsm": "zimanê destan ê guatemalayî",
"gsn": "gusanî",
"gso": "gbayayiya başûr-rojava",
"gsp": "wasemboyî",
"gss": "zimanê destan ê yûnanî",
"gsw": "elmanîşî",
"gta": "guatóî",
"gtu": "aghu tharrnggalayî",
"gu": "gujaratî",
"gua": "şikiyî",
"gub": "guajajarayî",
"guc": "wayuuyî",
"gud": "yocoboue didayî",
"gue": "gurindjiyî",
"guf": "gupapuynguyî",
"gug": "guaraniyiya paraguayanî",
"guh": "guahiboyî",
"gui": "guaraniyiya bolivyayî ya rojhilatî",
"guk": "gumuzî",
"gul": "gullahî",
"gum": "guambianoyî",
"gun": "mbya guaraniyî",
"guo": "guayaberoyî",
"gup": "gunwingguyî",
"guq": "açeyî",
"gur": "farefareyî",
"gus": "zimanê destan ê gîneyî",
"gut": "maleku jaikayî",
"guu": "yanomamöî",
"guv": "geyî",
"guw": "gunî",
"gux": "gourmançemayî",
"guz": "gusiiyî",
"gv": "manksî",
"gva": "kaskihayî",
"gvc": "guananoyî",
"gve": "duwetî",
"gvf": "golinî",
"gvj": "guajayî",
"gvl": "gulayî",
"gvm": "gurmanayî",
"gvn": "kuku-yalanjiyî",
"gvo": "gavião do jiparanayî",
"gvp": "para gaviãoyî",
"gvr": "gurungiya rojavayî",
"gvs": "gumawanayî",
"gvy": "guyaniyî",
"gwa": "mbatoyî",
"gwb": "gwayî",
"gwc": "kalamiyî",
"gwd": "gawwadayî",
"gwe": "gwenoyî",
"gwf": "gowroyî",
"gwg": "mooyî",
"gwi": "gwiçinî",
"gwj": "gcwiyî",
"gwm": "awngthimî",
"gwn": "gwandarayî",
"gwr": "gwereyî",
"gwt": "gawar-batiyî",
"gwu": "guwamuyî",
"gww": "kwiniyî",
"gwx": "guayî",
"gxx": "weya başûrî",
"gya": "gbayayiya bakur-rojava",
"gyb": "garusî",
"gyd": "kayardildî",
"gye": "gyemî",
"gyf": "gungabulayî",
"gyg": "gbayiyî",
"gyi": "gyeleyî",
"gyl": "gayilî",
"gym": "ngäbereyî",
"gyn": "kreyoliya îngilîzî ya guyanî",
"gyo": "gyalsumdoyî",
"gyr": "guarayuyî",
"gyy": "gunyayî",
"gza": "ganzayî",
"gzn": "ganeyî",
"ha": "hawsayî",
"haa": "hänî",
"hab": "zimanê destan ê hanoyî",
"hac": "hewramî",
"had": "hatamî",
"haf": "zimanê destan ê haiphong",
"hag": "hangayî",
"hah": "hahonî",
"hai": "haidayî",
"haj": "hajongî",
"hak": "hakkayî",
"hal": "halangî",
"ham": "hewayî",
"hao": "haköyî",
"hap": "huplayî",
"har": "harariyî",
"has": "haislayî",
"hav": "havuyî",
"haw": "hawayî",
"hax": "haidayiya başûrî",
"hay": "hayayî",
"haz": "hazaragiyî",
"hba": "hambayî",
"hbb": "hubayî",
"hbn": "heibanî",
"hbu": "habuyî",
"hca": "kreyoliya hindî ya andamanê",
"hch": "huiçolî",
"hdn": "haidayiya bakurî",
"hds": "zimanê destan ê hondurasê",
"hdy": "hadiyyayî",
"he": "îbranî",
"hea": "qiandong miaoyiya bakurî",
"hed": "herdeyî",
"heg": "helongî",
"heh": "heheyî",
"hei": "heiltsukî",
"hem": "hembayî",
"hgm": "haiǁomî",
"hgw": "haigwaiyî",
"hhi": "hoia hoiayî",
"hhr": "kerakî",
"hhy": "hoyahoyayî",
"hi": "hindî",
"hia": "lamangî",
"hib": "hibitoyî",
"hid": "hidatsayî",
"hif": "fiji hindiyî",
"hig": "kamweyî",
"hih": "pamosuyî",
"hii": "hinduriyî",
"hij": "hijukî",
"hik": "seit-kaitetuyî",
"hil": "hîlîgaynonî",
"hio": "tşwayî",
"hir": "himarimayî",
"hit": "hîtîtî",
"hiw": "hiwî",
"hix": "hixkaryanayî",
"hji": "hajiyî",
"hka": "kaheyî",
"hke": "hundeyî",
"hkk": "hunjara-kaina keyî",
"hkn": "mel-khaonhî",
"hks": "zimanê destan ê hongkongî",
"hla": "haliayî",
"hlb": "halbiyî",
"hld": "halang doanî",
"hle": "hlersuyî",
"hlt": "nga layî",
"hma": "maşan hmongiya başûrî",
"hmb": "humburi senniyî",
"hmc": "huişui hmongiya navendî",
"hmd": "a-hmaoyî",
"hme": "huişui hmongiya rojhilatî",
"hmf": "hmong donî",
"hmg": "guiyang hmongiya başûr-rojavayî",
"hmh": "huişui hmongiya başûr-rojavayî",
"hmi": "huişui hmongiya bakurî",
"hmj": "geyî",
"hmk": "maekî",
"hml": "luopohe hmongî",
"hmm": "maşan hmongiya navendî",
"hmn-pro": "proto-hmongî",
"hmp": "maşan hmongiya bakurî",
"hmq": "qiandong miaoyiya rojhilatî",
"hmr": "hmarî",
"hms": "qiandong miaoyiya başûrî",
"hmt": "hamtaiyî",
"hmu": "hamapî",
"hmv": "hmong dôî",
"hmw": "maşan hmongiya rojavayî",
"hmx-mie-pro": "proto-mienî",
"hmx-pro": "proto-hmong-mîenî",
"hmy": "guiyang hmongiya başûrî",
"hmz": "hmong şuayî",
"hna": "minayî",
"hnd": "hindkoyiya başûrî",
"hne": "çhattisgarhiyî",
"hnh": "ǁaniyî",
"hni": "haniyî",
"hnj": "hmongiya hêşîn",
"hnn": "hanunooyî",
"hno": "hindkoyiya bakurî",
"hns": "hindustaniyiya karibî",
"hnu": "hungî",
"ho": "hirî motuyî",
"hoa": "hoavayî",
"hob": "mariyiya awistronezî",
"hoc": "hoyî",
"hod": "holmayî",
"hoe": "horomî",
"hoh": "hobyótî",
"hoi": "holîkaçukî",
"hoj": "hadothiyî",
"hol": "holuyî",
"hom": "homayî",
"hoo": "holoholoyî",
"hop": "hopîyî",
"hor": "horoyî",
"hos": "zimanê destan ê ho şî minh city",
"hot": "hoteyî",
"hov": "hovonganî",
"how": "honiyî",
"hoy": "holiyayî",
"hoz": "hozoyî",
"hpo": "hponî",
"hps": "zimanê destan ê hawai'i pidgin",
"hra": "hrangkholî",
"hrc": "niwer milî",
"hre": "hreyî",
"hrk": "harukuyî",
"hrm": "horned miaoyî",
"hro": "haroiyî",
"hrp": "nhirrpiyî",
"hrt": "hertevinî",
"hru": "hrusoyî",
"hrw": "warwar feniyî",
"hrx": "hunsrikî",
"hrz": "harzaniyî",
"hsb": "sorbiya jorîn",
"hsh": "zimanê destan ê mecarî",
"hsl": "zimanê destan ê hausayî",
"hsn": "xiangî",
"hss": "harsusiyî",
"ht": "haîtî",
"hti": "hotiyî",
"hto": "minica huitotoyî",
"hts": "hadzayî",
"htu": "hitûyî",
"hu": "mecarî",
"hub": "huambisayî",
"huc": "ǁhoanî",
"hud": "huauluyî",
"huf": "humeneyî",
"hug": "huaçipaeriyî",
"huh": "huilliçeyî",
"hui": "huliyî",
"huj": "guiyang hmongiya bakurî",
"huk": "hulungî",
"hul": "hulayî",
"hum": "hunganayî",
"huo": "huyî",
"hup": "hupayî",
"huq": "tsatî",
"hur": "halkomelemî",
"hus": "wastekî",
"huu": "murui huitotoyî",
"huv": "huaveyî",
"huw": "hukuminayî",
"hux": "nüpode huitotoyî",
"huy": "hulaulayî",
"huz": "hunzibî",
"hvc": "zimanê çanda haîtî ya vodoun",
"hvk": "havekeyî",
"hvn": "sabuyî",
"hwa": "waneyî",
"hwo": "hwanayî",
"hy": "ermenî",
"hya": "hyayî",
"hyx-pro": "proto-ermenî",
"hz": "hereroyî",
"ia": "înterlîngua",
"iai": "îaaiyî",
"ian": "îatmulî",
"iar": "purariyî",
"iba": "îbanî",
"ibb": "îbibioyî",
"ibd": "îwaidjayî",
"ibe": "akpesî",
"ibg": "îbanagî",
"ibh": "bihî",
"ibl": "îbaloiyî",
"ibm": "agoiyî",
"ibn": "îbinoyî",
"ibr": "îbuoroyî",
"ibu": "îbuyî",
"iby": "îbaniyî",
"ica": "ede icayî",
"ich": "etkywanî",
"icl": "zimanê destan ê îzlandê",
"icr": "kreyoliya îngilîzî ya îslanderê",
"id": "endonezyayî",
"ida": "îdakho-isukha",
"idb": "îndo-portegîzî",
"idc": "îdonî",
"idd": "ede idacayî",
"ide": "îdereyî",
"idi": "îdî",
"idr": "îndriyî",
"ids": "îdesayî",
"idt": "îdateyî",
"idu": "îdomayî",
"ie": "înterlîngue",
"ifa": "amganad ifugaoyî",
"ifb": "batad ifugaoyî",
"ife": "îfèî",
"iff": "îfoyî",
"ifk": "tuwali ifugaoyî",
"ifm": "teke-fuumuyî",
"ifu": "mayoyao ifugaoyî",
"ify": "keley-i kallahanî",
"ig": "îgboyî",
"igb": "ebirayî",
"ige": "îgedeyî",
"igg": "îganayî",
"igl": "îgalayî",
"igm": "kanggapeyî",
"ign": "îgnacianoyî",
"igo": "îsebeyî",
"igs": "glosayî",
"igw": "îgweyî",
"ihb": "pidgin ihayî",
"ihi": "îhievbeyî",
"ihp": "îhayî",
"ii": "yiyiya siçuwayî",
"iir-nur-pro": "proto-nuristanî",
"iir-pro": "proto-hindûîranî",
"ijc": "îzonî",
"ije": "biseniyî",
"ijj": "ede ijeyî",
"ijn": "kalabariyî",
"ijo-pro": "proto-ijoidî",
"ijs": "îjoyiya başûr-rojhilat",
"ik": "înupîakî",
"ike": "înuktitutiya kanadayî ya rojhilatî",
"iki": "îkoyî",
"ikk": "îkayî",
"ikl": "îkuluyî",
"iko": "olulumo-ikomî",
"ikp": "îkpeşiyî",
"ikr": "îkaranggalî",
"iks": "zimanê destan ê înuitî",
"ikt": "înuvialuktunî",
"ikv": "îku-gora-ankwayî",
"ikw": "îkwereyî",
"ikx": "îkî",
"ikz": "îkizuyî",
"ila": "île apeyî",
"ilb": "îlayî",
"ilg": "îlgarî",
"ili": "îli turkiyî",
"ilk": "îlongotî",
"ill": "îranunî",
"ilo": "îlokanoyî",
"ils": "zimanê destan ê navneteweyî",
"ilu": "îlîwunî",
"ilv": "îlueyî",
"ima": "mala malasarî",
"imi": "anamgurayî",
"iml": "milukî",
"imn": "îmondayî",
"imo": "îmbonguyî",
"imr": "îmroîngî",
"ims": "marsianî",
"imy": "milyanî",
"inb": "îngayî",
"inc-ash": "prakrîtiya aşokanît",
"inc-cen-pro": "proto-îndo-aryaniya navendî",
"inc-dar-pro": "proto-dardîkî",
"inc-gup": "apabhramsayiya gurjarî",
"inc-kam": "prakrîtiya kamarupî",
"inc-kha": "prakrîtiya xasa",
"inc-kho": "xolosî",
"inc-mas": "asamiya navîn",
"inc-mbn": "bengaliya navîn",
"inc-mgd": "prakrîtiya magadî",
"inc-mgu": "gujaratiya navîn",
"inc-mor": "oriyayiya navîn",
"inc-oas": "asamiya zû",
"inc-obn": "bengaliya kevn",
"inc-ogu": "gujaratiya kevn",
"inc-ohi": "hindiya kevn",
"inc-oor": "oriyayiya kevn",
"inc-ork": "kamtayiya kevn",
"inc-pro": "proto-hindûaryanî",
"inc-psc": "prakrîtiya paysakî",
"inc-sap": "apabhramsayiya sawurasenî",
"inc-tak": "apabhramsayiya takkayî",
"inc-vra": "apabhramsayiya vrakadayî",
"ine-ana-pro": "proto-anadolî",
"ine-bsl-pro": "proto-balto-slavî",
"ine-pae": "paeonî",
"ine-pro": "proto-hindûewropî",
"ine-toc-pro": "proto-toçarî",
"ing": "deg xinagî",
"inh": "îngûşî",
"inj": "jungle ingayî",
"inl": "zimanê destan ê endonezyayî",
"inm": "minaeanî",
"inn": "îsinaiyî",
"ino": "înoke-yateyî",
"inp": "îñapariyî",
"ins": "zimanê destan ê hîndî",
"int": "înthayî",
"inz": "înesenyoyî",
"io": "îdoyî",
"ior": "înorî",
"iou": "tuma-irumuyî",
"iow": "çiwereyî",
"ipi": "îpiliyî",
"ipo": "îpikoyî",
"iqu": "îquitoyî",
"iqw": "îkwoyî",
"ira-kms-pro": "proto-komisenî",
"ira-mny-pro": "proto-munji-yidgha",
"ira-mpr-pro": "proto-medo-partî",
"ira-pat-pro": "proto-pathanî",
"ira-pro": "proto-îranî",
"ira-sgc-pro": "proto-sogdîkî",
"ira-sgi-pro": "proto-sangleçî-îşkaşîmî",
"ira-shr-pro": "proto-şughnî-roşanî",
"ira-shy-pro": "proto-şughnî-yazgulamî",
"ira-sym-pro": "proto-şughnî-yazghulamî-munjî",
"ira-wnj": "vanjî",
"ira-zgr-pro": "proto-zaza-hewramî",
"ire": "îresimî",
"irh": "îrarûtûyî",
"iri": "rigweyî",
"irk": "îraqwî",
"irn": "îrantxeyî",
"iro-ere": "erieyî",
"iro-min": "mingoyî",
"iro-pro": "proto-iroquoyî",
"irr": "îrî",
"iru": "îrulayî",
"irx": "kamberauyî",
"iry": "îrayayî",
"is": "îzlendî",
"isa": "îsabiyî",
"isc": "îsconahuayî",
"isd": "îsnagî",
"ise": "zimanê destan ê îtalî",
"isg": "zimanê destan ê îrlendî",
"ish": "esanî",
"isi": "nkem-nkumî",
"isk": "îşkaşimiyî",
"ism": "masimasiyî",
"isn": "îsanzuyî",
"iso": "îsokoyî",
"isr": "zimanê destan ê îsraêlî",
"ist": "îstriyotî",
"isu": "îsuyî",
"it": "îtalî",
"itb": "binongan itnegî",
"itc-ola": "latîniya kevn",
"itc-pro": "proto-îtalî",
"itd": "başûrî tidongî",
"ite": "îteneyî",
"iti": "înlaod itnegî",
"itk": "îtaliya cihû",
"itl": "îtelmenî",
"itm": "îtu mbon uzoyî",
"ito": "îtonamayî",
"itr": "îteriyî",
"its": "îsekiriyî",
"itt": "maeng itnegî",
"itv": "îtawitî",
"itw": "îtoyî",
"itx": "îtikî",
"ity": "moyadan itnegî",
"itz": "îtzayî",
"iu": "înuîtî",
"ium": "îu mienî",
"ivb": "îbatanî",
"ivv": "îvatanî",
"iwk": "î-wakî",
"iwm": "îwamî",
"iwo": "îwurî",
"iws": "sepik iwamî",
"ixc": "îxcatecî",
"ixl": "îxilî",
"iya": "îyayuyî",
"iyo": "mesakayî",
"iyx": "yaayî",
"izh": "îngriyî",
"izi": "îzi-ezaa-îkwo-mgboyî",
"izr": "îzereyî",
"izz": "îziyî",
"ja": "japonî",
"jaa": "jamamadiyî",
"jab": "hyamî",
"jac": "jakaltekî",
"jad": "jahankayî",
"jae": "jabemî",
"jaf": "jarayî",
"jah": "jah hutî",
"jaj": "zazaoyî",
"jal": "yalahatanî",
"jam": "kreyoliya jameîkî",
"jan": "jandayî",
"jao": "yanyuwayî",
"jaq": "yaqayî",
"jas": "javayiya kaledonî ya nû",
"jat": "jakatiyî",
"jau": "yaurî",
"jax": "jambî malayî",
"jay": "yan-nhanguyî",
"jaz": "jaweyî",
"jbe": "berberiya cihû",
"jbj": "arandaiyî",
"jbk": "barikewayî",
"jbn": "nefusayî",
"jbo": "lojbanî",
"jbr": "jofotek-bromnyayî",
"jbt": "jabutiyî",
"jbu": "jukun takumî",
"jbw": "yawijibayayî",
"jcs": "zimanê destan ê jamaîkî country",
"jct": "krymçakî",
"jda": "jadî",
"jdg": "jadgaliyî",
"jdt": "tatiya cihû",
"jeb": "jeberoyî",
"jee": "jerungî",
"jeg": "jengî",
"jeh": "jehî",
"jei": "yeiyî",
"jek": "jeri kuoyî",
"jel": "yelmekî",
"jen": "dzayî",
"jer": "jereyî",
"jet": "manemî",
"jeu": "jonkor bourmataguilî",
"jgb": "ngbeeyî",
"jgk": "gwakî",
"jgo": "ngombayî",
"jhi": "jehaiyî",
"jhs": "zimanê destan ê jhankotî",
"jia": "jinayî",
"jib": "jibuyî",
"jic": "tolî",
"jid": "buyî",
"jie": "jilbeyî",
"jig": "jinguluyî",
"jih": "şangzhaiyî",
"jii": "jiidduyî",
"jil": "jilimî",
"jim": "jimjimenî",
"jio": "jiamaoyî",
"jiq": "guanyinqiaoyî",
"jit": "jitayî",
"jiu": "youle jinuoyî",
"jiv": "şuarî",
"jiy": "buyuan jinuoyî",
"jje": "jejuyî",
"jjr": "zharî",
"jka": "kaerayî",
"jko": "kuboyî",
"jkr": "koroyî (Hindistan)",
"jku": "labirî",
"jle": "ngileyî",
"jls": "zimanê destan ê jamaîkî",
"jma": "dimayî",
"jmb": "zumbunî",
"jmc": "maçameyî",
"jmd": "yamdenayî",
"jmi": "jimiyî",
"jml": "jumliyî",
"jmn": "makuri nagayî",
"jmr": "kamarayî",
"jmw": "mouwaseyî",
"jmx": "juxtlahuaca mixteciya rojavayî",
"jna": "jangşungî",
"jnd": "jandavrayî",
"jng": "yangmanî",
"jni": "janjiyî",
"jnj": "yemsayî",
"jnl": "rawatî",
"jns": "jaunsariyî",
"job": "jobayî",
"jod": "wojenakayî",
"jor": "jorayî",
"jos": "zimanê destan ê urdunî",
"jow": "jowuluyî",
"jpr": "farsiya cihû",
"jpx-pro": "proto-japonîkî",
"jpx-ryu-pro": "proto-ryukyuanî",
"jqr": "jaqaruyî",
"jra": "jarayî",
"jrb": "cihû-erebî",
"jrr": "jiruyî",
"jru": "japreriayî",
"jsl": "zimanê destan ê japonî",
"jua": "júmayî",
"jub": "wannuyî",
"juc": "jurçenî",
"jud": "worodougouyî",
"juh": "honeyî",
"jui": "ngadcurî",
"juk": "wapanî",
"jul": "jirelî",
"jum": "jumjumî",
"jun": "juangî",
"juo": "jibayî",
"jup": "hupdëî",
"jur": "jurúnayî",
"jus": "zimanê destan ê jumlayî",
"jut": "jutişî",
"juu": "juyî",
"juw": "wãphayî",
"juy": "jurayî",
"jv": "javayî",
"jvd": "javindoyî",
"jvn": "javayiya karîbî",
"jwi": "jwira-pepesayî",
"jye": "cihû-erebiya yemenî",
"jyy": "jayayî",
"ka": "gurcî",
"kaa": "karakalpakî",
"kab": "kabîlî",
"kac": "cingphoyî",
"kad": "kadarayî",
"kae": "ketangalanî",
"kaf": "katsoyî",
"kag": "kajamanî",
"kah": "fer",
"kai": "karekareyî",
"kaj": "jjuyî",
"kak": "kayapa kallahanî",
"kam": "kambayî",
"kao": "kassonkeyî",
"kap": "bezhtayî",
"kaq": "capanahuayî",
"kar-pro": "proto-karenî",
"kaw": "javayiya kevn",
"kax": "kaoyî",
"kay": "kamayurayî",
"kba": "kalarkoyî",
"kbb": "kaxuyanayî",
"kbc": "kadiweuyî",
"kbd": "kabardî",
"kbe": "kanjuyî",
"kbh": "camsayî",
"kbi": "kaptiauyî",
"kbj": "kariyî",
"kbk": "grass koiariyî",
"kbm": "iwalî",
"kbn": "kareyî (Afrîka)",
"kbo": "kelikoyî",
"kbp": "kabiyeyî",
"kbq": "kamanoyî",
"kbr": "kafayî",
"kbs": "kandeyî",
"kbt": "gabadiyî",
"kbu": "kabutrayî",
"kbv": "kamberataroyî",
"kbw": "kaîepî",
"kbx": "ap mayî",
"kbz": "duhwayî",
"kca": "xantî",
"kcb": "kawaçayî",
"kcc": "lubilayî",
"kcd": "ngkâlmpw kanumî",
"kce": "kaiviyî",
"kcf": "ukaanî",
"kcg": "tyapî",
"kch": "vonoyî",
"kci": "kamantanî",
"kcj": "kobianayî",
"kck": "kalangayî",
"kcl": "kalayî",
"kcm": "tar gulayî",
"kcn": "nubiyî",
"kco": "kinalaknayî",
"kcp": "kangayî",
"kcq": "kamoyî",
"kcr": "katlayî",
"kcs": "koenoemî",
"kct": "kaianî",
"kcu": "kikamiyî",
"kcv": "keteyî",
"kcw": "kabwariyî",
"kcx": "kaçama-ganjuleyî",
"kcy": "korandjeyî",
"kcz": "konongoyî",
"kda": "worimiyî",
"kdc": "kutuyî",
"kdd": "yankunytjatjarayî",
"kde": "makondeyî",
"kdf": "mamusiyî",
"kdg": "sebayî",
"kdh": "temî",
"kdi": "kumamî",
"kdj": "karamojongî",
"kdk": "numeeyî",
"kdl": "tsikimbayî",
"kdm": "kagomayî",
"kdn": "kundayî",
"kdp": "kaningdon-nindemî",
"kdq": "koçî",
"kdr": "karaîmî",
"kdt": "kuyî",
"kdu": "kadaruyî",
"kdv": "kadoyî",
"kdw": "konerawî",
"kdx": "kamî",
"kdy": "kederî",
"kdz": "kwajayî",
"kea": "kapverdî",
"keb": "keleyî",
"kec": "keigayî",
"ked": "kereweyî",
"kee": "keresiya rojhilatî",
"kef": "kpessiyî",
"keg": "teseyî",
"keh": "keakî",
"kei": "keyî",
"kej": "kadarî",
"kek": "q'eqçiyî",
"kel": "kela-yelayî",
"kem": "kemakî",
"ken": "kenyangî",
"keo": "kakwayî",
"kep": "kaikadiyî",
"keq": "kamarî",
"ker": "kerayî",
"kes": "kugboyî",
"ket": "ketî",
"keu": "akebuyî",
"kev": "kanikkaranî",
"kew": "kewayî",
"kex": "kuknayî",
"key": "kupiayî",
"kez": "kukeleyî",
"kfa": "kodavayî",
"kfb": "kolamiyî",
"kfc": "konda-dorayî",
"kfd": "korra koragayî",
"kfe": "kotayî (Hindistan)",
"kff": "koyayî",
"kfg": "kudiyayî",
"kfh": "kuriçiyayî",
"kfi": "kannada kurumbayî",
"kfj": "kemiehuayî",
"kfk": "kinnauriyî",
"kfl": "kungî",
"kfn": "kukî",
"kfo": "koroyî (Afrîkaya rojava)",
"kfp": "korwayî",
"kfq": "korkuyî",
"kfr": "kaççiyî",
"kfs": "bilaspuriyî",
"kft": "kanjariyî",
"kfu": "katkariyî",
"kfv": "kurmukarî",
"kfw": "kharam nagayî",
"kfx": "kullu pahariyî",
"kfy": "kumaoniyî",
"kfz": "koromfeyî",
"kg": "kîkongoyî",
"kga": "koyagayî",
"kgb": "kaweyî",
"kgd": "kataangî",
"kge": "komeringî",
"kgf": "kubeyî",
"kgg": "kusundayî",
"kgi": "zimanê destan ê selangorî",
"kgj": "gamale khamî",
"kgk": "kaiwayî",
"kgl": "kunggariyî",
"kgm": "karipúnayî",
"kgn": "karinganiyî",
"kgo": "krongoyî",
"kgp": "kayingangî",
"kgq": "kamoroyî",
"kgr": "abunî",
"kgs": "kumbainggarî",
"kgt": "somyevî",
"kgu": "kobolî",
"kgv": "karasî",
"kgw": "karon doriyî",
"kgx": "kamaruyî",
"kgy": "kyerungî",
"kha": "khasiyî",
"khb": "lueyî",
"khc": "tukang besiya bakur",
"khd": "bädi kanumî",
"khe": "korowaiyî",
"khf": "khuenî",
"khh": "kehuyî",
"khi-kho-pro": "proto-khoeyî",
"khi-kun": "ǃkungî",
"khj": "kuturmiyî",
"khl": "lusiyî",
"khn": "khandeşiyî",
"kho": "xotanî",
"khp": "kapauriyî",
"khq": "koyra çiiniyî",
"khr": "khariayî",
"khs": "kasuayî",
"kht": "khamtiyî",
"khu": "nkhumbiyî",
"khv": "khvarşiyî",
"khw": "khowarî",
"khx": "kanuyî",
"khy": "ekeleyî",
"khz": "keaparayî",
"ki": "kîkûyûyî",
"kia": "kimî",
"kib": "koalibî",
"kic": "kîkapûyî",
"kid": "koşinî",
"kie": "kibetî",
"kif": "parbate khamiya rojhilatî",
"kig": "kimaamayî",
"kih": "kilmeriyî",
"kii": "kitsaiyî",
"kij": "kîlîvîlayî",
"kil": "kariyayî",
"kim": "tofalarî",
"kio": "kiowayî",
"kip": "şeşi khamî",
"kiq": "kosadleyî",
"kis": "kîsî",
"kit": "agobî",
"kiv": "kimbuyî",
"kiw": "kiwaiyiya bakur-rojhilat",
"kix": "khiamniungan nagayî",
"kiy": "kirikiriyî",
"kiz": "kisiyî",
"kj": "kwanyamayî",
"kja": "mlapî",
"kjb": "q'anjob'alî",
"kjc": "konjoyiya beravî",
"kjd": "kiwaiyiya başûrî",
"kje": "kîsarî",
"kjg": "khmuyî",
"kjh": "xakasî",
"kji": "zabanayî",
"kjj": "khinalugî",
"kjk": "highland konjoyî",
"kjl": "khamî",
"kjm": "khangî",
"kjn": "kunjenî",
"kjo": "harijan kinnauriyî",
"kjp": "pwoyiya rojhilatî",
"kjq": "keresiya rojavayî",
"kjr": "kuruduyî",
"kjs": "kewayiya rojhilat",
"kjt": "phrae pwoyî",
"kju": "kaşayayî",
"kjx": "ramopayî",
"kjy": "eraveyî",
"kjz": "bumthangkhayî",
"kk": "qazaxî",
"kka": "kakandayî",
"kkb": "kwerisayî",
"kkc": "odoodeeyî",
"kkd": "kinukuyî",
"kke": "kakabeyî",
"kkf": "kalaktang monpayî",
"kkg": "mabaka valley kalingayî",
"kkh": "khünî",
"kki": "kaguluyî",
"kkj": "kakoyî",
"kkk": "kokotayî",
"kkl": "kosarek yaleyî",
"kkm": "kiongî",
"kkn": "kon keuyî",
"kko": "karkoyî",
"kkp": "koko-berayî",
"kkq": "kaikuyî",
"kkr": "kir-balarî",
"kks": "kirfiyî",
"kkt": "koiyî",
"kku": "tumiyî",
"kkv": "kangeanî",
"kkw": "teke-kukuyayî",
"kkx": "kohinî",
"kky": "guugu yimidhirrî",
"kkz": "kaskayî",
"kl": "kalalîsûtî",
"kla": "klamatî-modokî",
"klb": "kiliwayî",
"klc": "kolbilayî",
"kld": "gamîlaraayî",
"kle": "kulungî",
"klf": "kendejeyî",
"klg": "tagakaulu kalaganî",
"klh": "welikiyî",
"kli": "kalumpangî",
"klj": "khalajî",
"klk": "konoyî (Nîjerya)",
"kll": "kagan kalaganî",
"klm": "kolomî",
"kln": "kalencînî",
"klo": "kapyayî",
"klp": "kamasayî",
"klq": "rumuyî",
"klr": "khalingî",
"kls": "kalaşayî",
"klt": "nuknayî",
"klu": "klaoyî",
"klv": "maskelynesî",
"klw": "linduyî",
"klx": "koluwawayî",
"kly": "kalaoyî",
"klz": "kabolayî",
"km": "ximêrî",
"kma": "konniyî",
"kmb": "kimbunduyî",
"kmc": "kamiya başûrî",
"kmd": "madukayang kalingayî",
"kme": "bakoleyî",
"kmf": "kareyî (Gîneya nû)",
"kmg": "kâteyî",
"kmh": "kalamî",
"kmi": "kamiyî",
"kmj": "kumarbhag pahariayî",
"kmk": "limos kalingayî",
"kml": "tanudan kalingayî",
"kmm": "komî (Hindistan)",
"kmn": "awtuwî",
"kmo": "kwomayî",
"kmp": "gimmeyî",
"kmq": "kwamayî",
"kms": "kamasauyî",
"kmt": "kemtuikî",
"kmu": "kaniteyî",
"kmv": "kreyoliya fransî ya karipúna",
"kmw": "kumuyî",
"kmx": "wabodayî",
"kmy": "komayî",
"kmz": "tirkiya xorasanê",
"kn": "kannadayî",
"kna": "kanakuruyî",
"knb": "lubuagan kalingayî",
"knd": "kondayî",
"kne": "kankanaeyî",
"knf": "mankanyayî",
"kni": "kanufiyî",
"knj": "akatekî",
"knk": "kurankoyî",
"knl": "keninjalî",
"knm": "kanamariyî",
"kno": "konoyî (sierra leone)",
"knp": "kwanjayî",
"knq": "kintaqî",
"knr": "kaningrayî",
"kns": "kensiuyî",
"knt": "katukinayî",
"knu": "konoyî (Gîne)",
"knv": "taboyî",
"knx": "kendayanî",
"kny": "kanyokî",
"knz": "kalamseyî",
"ko": "koreyî",
"koa": "konomalayî",
"koc": "kpatiyî",
"kod": "kodî",
"koe": "kacipo-balesiyî",
"kof": "kubiyî",
"kog": "coguiyî",
"koh": "koyoyî",
"koi": "komî-permyakî",
"kok": "konkanî",
"kol": "kolî (Gîneya nû)",
"koo": "konzoyî",
"kop": "waubeyî",
"koq": "kotayî (Gabon)",
"kos": "kosraeyî",
"kot": "lagwanî",
"kou": "kokeyî",
"kov": "kudu-camoyî",
"kow": "kugamayî",
"koy": "koyukonî",
"koz": "korakî",
"kpa": "kuttoyî",
"kpb": "mullu kurumbayî",
"kpc": "curripacoyî",
"kpd": "kobayî",
"kpe": "kpelleyî",
"kpf": "kombayî",
"kpg": "kapîngamarancîyî",
"kph": "kplangî",
"kpi": "kofeiyî",
"kpj": "karajayî",
"kpk": "kpanî",
"kpl": "kpalayî",
"kpm": "kohoyî",
"kpn": "kepkiriwatî",
"kpo": "ikposoyî",
"kpp": "paku karenî",
"kpq": "korupun-selayî",
"kpr": "korafe-yeghayî",
"kps": "tehitî",
"kpt": "karatayî",
"kpu": "kafoayî",
"kpv": "komî-zîriyî",
"kpw": "kobonî",
"kpx": "koiariyiya çiyayî",
"kpy": "koryakî",
"kpz": "kupsabinyî",
"kqa": "mumî",
"kqb": "kovaiyî",
"kqc": "doromu-kokiyî",
"kqd": "koy sanjaq suratî",
"kqe": "kalaganî",
"kqf": "kakabaiyî",
"kqg": "kheyî",
"kqh": "kisankasayî",
"kqi": "koitabuyî",
"kqj": "koromirayî",
"kqk": "kotafon gbeyî",
"kql": "kyeneleyî",
"kqm": "khisayî",
"kqn": "kaondeyî",
"kqo": "krahniya rojhilatî",
"kqp": "kimreyî",
"kqq": "krenakî",
"kqr": "kîmaragangî",
"kqs": "kissiya bakurî",
"kqt": "kadazaniya çemê kliasê",
"kqu": "seroayî",
"kqv": "okolodî",
"kqw": "kandasî",
"kqx": "mserî",
"kqy": "kooreteyî",
"kqz": "koranayî",
"kr": "kanuriyî",
"kra": "kumhaliyî",
"krb": "karkinî",
"krc": "karaçay-balkarî",
"krd": "kairui-midikiyî",
"kre": "panarayî",
"krf": "koroyî (Vanuatu)",
"krh": "kuramayî",
"kri": "krioyî",
"krj": "kinaray-ayî",
"krk": "kerekî",
"krl": "karelî",
"krm": "krimî",
"krn": "sapoyî",
"kro-pro": "proto-kruyî",
"krp": "koropî",
"krr": "kru'ngî",
"krs": "kreşî",
"kru": "kurukhî",
"krv": "kavetî",
"krw": "krahniya rojavayî",
"krx": "karonî",
"kry": "krytsî",
"krz": "sota kanumî",
"ks": "keşmîrî",
"ksa": "şuwa-zamaniyî",
"ksb": "şambalayî",
"ksc": "kalingayiya başûrî",
"ksd": "tolaiyî",
"kse": "kuniyî",
"ksf": "bafiayî",
"ksg": "kusagheyî",
"ksi": "krisayî",
"ksj": "uareyî",
"ksk": "kansayî",
"ksl": "kumaluyî",
"ksm": "kumbayî",
"ksn": "kasiguraninî",
"kso": "kofayî",
"ksp": "kabayî",
"ksq": "kwaamiyî",
"ksr": "borongî",
"kss": "kissiyiya başûrî",
"kst": "winyeyî",
"ksu": "khamyangî",
"ksv": "kusuyî",
"ksw": "s'gaw karenî",
"ksx": "kêdangî",
"ksy": "kharia tharî",
"ksz": "kodakuyî",
"kta": "katuayî",
"ktb": "kambaatayî",
"ktc": "kholokî",
"ktd": "kokatayî",
"ktf": "kwamiyî",
"ktg": "kalkatunguyî",
"kth": "karangayî",
"kti": "muyuyiya bakur",
"ktj": "plapo krumenî",
"ktk": "kanietî",
"ktl": "koroşiyî",
"ktm": "kurtiyî",
"ktn": "karitiyanayî",
"kto": "kuotî",
"ktp": "kaduoyî",
"ktq": "katabagayî",
"ktr": "kota marudu tinagasî",
"kts": "muyuyiya başûr",
"ktt": "ketumî",
"ktu": "kitubayî",
"ktv": "katuyiya rojhilatî",
"ktw": "katoyî",
"ktx": "kaxarariyî",
"kty": "kangoyî",
"ktz": "juǀ'hoanî",
"ku": "kurmancî",
"ku-pro": "proto-kurdî",
"kub": "kutepî",
"kuc": "kwinsuyî",
"kud": "awhelawayî",
"kue": "kumanî",
"kuf": "katuyiya rojavayî",
"kug": "kupayî",
"kuh": "kuşiyî",
"kui": "kuikúroyî",
"kuj": "kuriayî",
"kuk": "kepo'",
"kul": "kulereyî",
"kum": "kumikî",
"kun": "kunamayî",
"kuo": "kumukioyî",
"kup": "kunimaipayî",
"kuq": "karipunayî",
"kus": "kusaalî",
"kut": "kutenaiyî",
"kuu": "kuskokwîmiya jorîn",
"kuv": "kurî",
"kuw": "kpaguayî",
"kux": "kukatjayî",
"kuy": "kuuku-ya'uyî",
"kuz": "kunzayî",
"kva": "bagvalalî",
"kvb": "kubuyî",
"kvc": "kovêyî",
"kvd": "kuiyî (Endonezya)",
"kve": "kalabakanî",
"kvf": "kabalaiyî",
"kvg": "kuni-boaziyî",
"kvh": "komodoyî",
"kvi": "kwangî",
"kvj": "psikyeyî",
"kvk": "zimanê destan ê koreyî",
"kvl": "brek karenî",
"kvm": "kendemî",
"kvn": "border kunayî",
"kvo": "dobelî",
"kvp": "kompaneyî",
"kvq": "geba karenî",
"kvr": "kerînçî",
"kvt": "lahta karenî",
"kvu": "yinbaw karenî",
"kvv": "kolayî",
"kvw": "wersingî",
"kvx": "parkari koliyî",
"kvy": "yintale karenî",
"kvz": "tsakwamboyî",
"kw": "kornî",
"kwa": "dâwî",
"kwb": "baayî",
"kwc": "likwalayî",
"kwd": "kwaioyî",
"kwe": "kwerbayî",
"kwf": "kwara'aeyî",
"kwg": "sara kaba demeyî",
"kwh": "kowyayî",
"kwi": "awa-cuaiquerî",
"kwj": "kwangayî",
"kwk": "kwak'walayî",
"kwl": "kofyarî",
"kwm": "kwambiyî",
"kwn": "kwangaliyî",
"kwo": "kwomtariyî",
"kwp": "kodiayî",
"kwq": "kwakî",
"kwr": "kwerî",
"kws": "kweseyî",
"kwt": "kwestenî",
"kwu": "kwakumî",
"kwv": "sara kaba naàî",
"kww": "kwintiyî",
"kwx": "khirwarî",
"kwz": "kwadiyî",
"kxa": "kayrîrûyî",
"kxb": "krobuyî",
"kxc": "khonsoyî",
"kxd": "bruneyî",
"kxe": "kakihumî",
"kxf": "manumanaw karenî",
"kxh": "karoyî",
"kxi": "keningau murutî",
"kxj": "kulfayî",
"kxk": "zayein karenî",
"kxl": "nepali kuruxî",
"kxm": "ximeriya bakurî",
"kxn": "kanowitî",
"kxo": "kanoeyî",
"kxp": "wadiyara koliyî",
"kxq": "smärky kanumî",
"kxr": "koroyî (Gîneya nû)",
"kxs": "kangjiayî",
"kxt": "koiwatî",
"kxu": "kuiyî (Hindistan)",
"kxv": "kuviyî",
"kxw": "konaiyî",
"kxx": "likubayî",
"kxy": "kayongî",
"kxz": "kerewoyî",
"ky": "kirgizî",
"kya": "kwayayî",
"kyb": "butbut kalingayî",
"kyc": "kyakayî",
"kyd": "kareyî",
"kye": "kraçeyî",
"kyf": "kouyayî",
"kyg": "keyaganayî",
"kyh": "karokî",
"kyi": "kîputî",
"kyj": "karaoyî",
"kyk": "kamayoyî",
"kyl": "kalapuyayî",
"kym": "kpatiliyî",
"kyn": "karolanosî",
"kyo": "kelonî",
"kyp": "kangî",
"kyq": "kengayî",
"kyr": "kuruayayî",
"kys": "baram kayanî",
"kyt": "kayagarî",
"kyu": "kayahiya rojavayî",
"kyv": "kayortî",
"kyw": "kudmaliyî",
"kyx": "rapoisiyî",
"kyy": "kambairayî",
"kyz": "kayabiyî",
"kza": "karaboroyiya rojavayî",
"kzb": "kaiboboyî",
"kzc": "bondoukou kulangoyî",
"kzd": "kadaiyî",
"kze": "kosenayî",
"kzf": "da'a kailiyî",
"kzg": "kikaiyî",
"kzh": "dongolawiyî",
"kzi": "kelabît bariyoyî",
"kzj": "kadazaniya beravî",
"kzk": "kazukuruyî",
"kzl": "kayeliyî",
"kzm": "kaisî",
"kzn": "kokolayî",
"kzo": "kaningiyî",
"kzp": "kaidipangî",
"kzq": "kaikeyî",
"kzr": "karangî",
"kzs": "sugut dusunî",
"kzt": "tambunan dusunî",
"kzu": "kayupulauyî",
"kzv": "komyandaretî",
"kzw": "kaririyî",
"kzx": "kamarianî",
"kzy": "kango-suayî",
"kzz": "kalabrî",
"la": "latînî",
"laa": "lapuyan subanunî",
"lab": "linear A",
"lac": "lacandonî",
"lad": "ladînoyî",
"lae": "pattaniyî",
"laf": "lafofayî",
"lag": "langiyî",
"lah": "lahndayî",
"lai": "lambyayî",
"laj": "langoyî (Uganda)",
"lak": "lakayî",
"lam": "lambayî",
"lan": "laruyî",
"lap": "kabba-lakayî",
"laq": "qabiaoyî",
"lar": "lartehî",
"las": "gur lamayî",
"lau": "labayî",
"law": "laujeyî",
"lax": "tiwayî",
"lay": "lama baiyî",
"laz": "aribwatsayî",
"lb": "luksembûrgî",
"lbb": "labelî",
"lbc": "lakkiayî",
"lbe": "lakî",
"lbf": "tinaniyî",
"lbg": "laopangî",
"lbi": "la'biyî",
"lbj": "ladakhiyî",
"lbk": "bontociya navendî",
"lbl": "libon bikolî",
"lbm": "lodhiyî",
"lbn": "lametî",
"lbo": "lavenî",
"lbq": "wamparî",
"lbr": "lorungiya bakurî",
"lbs": "zimanê destan ê libyayî",
"lbt": "laçiyî",
"lbu": "labuyî",
"lbv": "lavatbura-lamusongî",
"lbw": "tolakiyî",
"lbx": "lawanganî",
"lby": "lamu-lamuyî",
"lbz": "lardilî",
"lcc": "legenyemî",
"lcd": "lolayî",
"lce": "loncongî",
"lcf": "lubuyî",
"lch": "luçaziyî",
"lcl": "liselayî",
"lcm": "tungagî",
"lcp": "lawayiya rojavayî",
"lcq": "luhuyî",
"lcs": "lisabata-nunialiyî",
"lda": "klayî",
"ldb": "idunî",
"ldd": "lurî (Nîjerya)",
"ldg": "lenyimayî",
"ldh": "lamja-dengsa-tolayî",
"ldj": "lemoroyî",
"ldk": "leelauyî",
"ldl": "kaanî",
"ldm": "landomayî",
"ldn": "laadanî",
"ldo": "looyî",
"ldp": "tsoyî",
"ldq": "lufuyî",
"lea": "lega-şabundayî",
"leb": "lala-bisayî",
"lec": "lecoyî",
"led": "lenduyî",
"lee": "lyeleyî",
"lef": "lelemiyî",
"leh": "lenjeyî",
"lei": "lemioyî",
"lej": "lengolayî",
"lek": "leyponî",
"lel": "leleyî (Kongo)",
"lem": "nomaandeyî",
"len": "lencayiya honduranî",
"leo": "letî (Kamerûn)",
"lep": "lepçayî",
"leq": "lembenayî",
"ler": "lenkauyî",
"les": "leseyî",
"let": "lesing-gelimiyî",
"leu": "karayî (Gîneya nû)",
"lev": "lammayî",
"lew": "ledo kailiyî",
"lex": "luangî",
"ley": "lemolangî",
"lez": "lezgînî",
"lfa": "lefayî",
"lfn": "lingua franca nova",
"lg": "lugandayî",
"lga": "lunggayî",
"lgb": "laghuyî",
"lgg": "lugbarayî",
"lgh": "laghuuyî",
"lgi": "lengiluyî",
"lgk": "neververî",
"lgl": "walayî",
"lgm": "lega-mwengayî",
"lgn": "opuuoyî",
"lgq": "logbayî",
"lgr": "lengoyî",
"lgt": "pahîyî",
"lgu": "longguyî",
"lgz": "ligenzayî",
"lha": "lahayî (Viyetnam)",
"lhh": "lahayî (Endonezya)",
"lhi": "lahu şiyî",
"lhl": "lahul loharî",
"lhn": "lahananî",
"lhp": "lhokpuyî",
"lhs": "mlahsö",
"lht": "lo-togayî",
"lhu": "lahuyî",
"li": "lîmbûrgî",
"lia": "limbayiya navendî-rojava",
"lib": "likumî",
"lic": "hlaiyî",
"lid": "nyindrouyî",
"lie": "likilayî",
"lif": "limbuyî",
"lig": "ligbiyî",
"lih": "lihirî",
"lii": "lingkhimî",
"lij": "lîgûrî",
"lik": "likayî",
"lil": "lillooetî",
"lio": "likiyî",
"lip": "sekpeleyî",
"liq": "libidoyî",
"lir": "îngilîziya lîberî",
"lis": "lisuyî",
"liu": "logorikî",
"liv": "lîvonî",
"liw": "colî",
"lix": "liabukuyî",
"liy": "banda-bambariyî",
"liz": "libinzayî",
"lja": "golpayî",
"lje": "rampiyî",
"lji": "laiyoloyî",
"ljl": "li’oyî",
"ljp": "lampungî",
"ljw": "yirandaliyî",
"ljx": "yuruyî",
"lka": "lakaleiyî",
"lkb": "kabrasî",
"lkc": "kucongî",
"lkd": "lakondê",
"lke": "kenyiyî",
"lkh": "lakhayî",
"lki": "lekî",
"lkj": "remunî",
"lkl": "laeko-libuatî",
"lkm": "kalaamayayî",
"lkn": "lakonî",
"lko": "khayoyî",
"lkr": "päriyî",
"lks": "kisayî",
"lkt": "lakotayî",
"lku": "kungkariyî",
"lky": "lokoyayî",
"lla": "lala-robayî",
"llb": "loloyî",
"llc": "leleyî (Gîne)"
}
}
bym7h9jlrqsx8ixuc7iwjopkkaymfth
6292082
6292076
2026-07-29T20:48:21Z
Wikihez
7344
6292082
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î"
},
"posChoices": {
"navdêr": "Navdêr (îsm)",
"lêker": "Lêker (fiîl)",
"rengdêr": "Rengdêr (sifet)",
"hoker": "Hoker (zerf)",
"serenav": "Serenav (îsmê xisûsî)",
"artîkel": "Artîkel",
"baneşan": "Baneşan (nîda)",
"bazinedaçek": "Bazinedaçek",
"cînav": "Cînav (zemîr)",
"daçek": "Daçek (edat)",
"girêdek": "Girêdek",
"gotineke pêşiyan": "Gotineke pêşiyan",
"hejmar": "Hejmar",
"hevok": "Hevok (cimle)",
"îfade": "Îfade",
"kurtenav": "Kurtenav",
"navgir": "Navgir",
"paşdaçek": "Paşdaçek",
"paşgir": "Paşgir",
"pêşdaçek": "Pêşdaçek",
"pêşgir": "Pêşgir",
"pirtik": "Pirtik",
"reh": "Reh",
"sembol": "Sembol",
"tîp": "Tîp (herf)"
},
"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ê û nêr",
"mnmane": "mê yan nêr li gorî maneyê",
"g": "giştî",
"y": "yekjimar",
"p": "pirjimar"
},
"tplDefs": {
"awayê Jacobsonê": {
"langs": [
"zza"
]
},
"rastnivîs": {
"langs": [
"ku"
],
"noLang": true
},
"ku-Latn": {
"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
},
"awayekî din": {
"langs": null
},
"guharto": {
"langs": null
},
"hevmaneya": {
"langs": null
},
"kevnbûyî": {
"langs": null
},
"kêmpeyda": {
"langs": null
},
"şaşnivîs": {
"langs": null
}
},
"jederDefs": {
"jêder-kitêb": {
"label": "Kitêb",
"fields": {
"nivîskar": "Nivîskar",
"sernav": "Sernav",
"sernavê orjînal": "Sernavê orjînal",
"terciman": "Terciman",
"weşanxane": "Weşanxane",
"cih": "Cih",
"sal": "Sal",
"çap": "Çap",
"rûpel": "Rûpel",
"isbn": "ISBN",
"url": "URL"
}
},
"jêder-kovar": {
"label": "Kovar",
"fields": {
"nivîskar": "Nivîskar",
"nivîskar2": "Nivîskar 2",
"sernav": "Sernav",
"sernavê orjînal": "Sernavê orjînal",
"kovar": "Kovar",
"terciman": "Terciman",
"weşanxane": "Weşanxane",
"cild": "Cild",
"hejmar": "Hejmar",
"sal": "Sal",
"rûpel": "Rûpel",
"url": "URL"
}
},
"jêder-websîte": {
"label": "Websîte",
"fields": {
"nivîskar": "Nivîskar",
"sernav": "Sernav",
"terciman": "Terciman",
"websîte": "Websîte",
"url": "URL",
"arşîv": "Arşîva URLê",
"sal": "Sal",
"tarîx": "Tarîx"
}
}
},
"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|/…/}}"
},
"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": {
"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 bi pêşgir, paşgir û hevedudanî — {{qertaf|kod|pêşgir-|reh}}",
"snippet": "{{qertaf|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}}"
}
},
"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",
"mn",
"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"
}
},
"ziman": {
"ku": "kurmancî",
"en": "îngilîzî",
"tr": "tirkî",
"de": "almanî",
"pl": "polonî",
"ja": "japonî",
"fa": "farisî",
"sh": "sirboxirwatî",
"fr": "fransî",
"ka": "gurcî",
"it": "îtalî",
"fi": "fînî",
"ru": "rusî",
"es": "spanî",
"ar": "erebî",
"nl": "holendî",
"hi": "hindî",
"cs": "çekî",
"cmn": "mandarînî",
"pt": "portugalî",
"uk": "ûkraynî",
"hu": "mecarî",
"ko": "koreyî",
"be": "belarusî",
"la": "latînî",
"ckb": "soranî",
"sv": "swêdî",
"hy": "ermenî",
"bg": "bulgarî",
"ro": "romanyayî",
"da": "danmarkî",
"gl": "galîsî",
"el": "yûnanî",
"eo": "esperantoyî",
"tl": "tagalogî",
"fo": "ferî",
"vi": "viyetnamî",
"ca": "katalanî",
"is": "îzlendî",
"et": "estonî",
"az": "azerî",
"ceb": "sebwanoyî",
"mk": "makedonî",
"he": "îbranî",
"th": "tayî",
"lv": "latviyayî",
"sk": "slovakî",
"ms": "malezî",
"ga": "îrlendî",
"tg": "tacikî",
"grc": "yûnaniya kevn",
"sl": "slovenî",
"kk": "qazaxî",
"mi": "maorî",
"mn": "mongolî",
"sq": "albanî",
"uz": "ozbekî",
"lt": "lîtwanî",
"ur": "urdûyî",
"km": "ximêrî",
"id": "endonezyayî",
"cy": "weylsî",
"lo": "lawsî",
"bn": "bengalî",
"zza": "zazakî",
"ky": "kirgizî",
"yi": "yidîşî",
"gd": "gaelîka skotî",
"my": "burmayî",
"te": "telûgûyî",
"nb": "norweciya bokmålî",
"zh": "çînî",
"ps": "peştûyî",
"eu": "baskî",
"oc": "oksîtanî",
"sw": "swahîlî",
"ast": "astûrî",
"af": "afrîkansî",
"tk": "tirkmenî",
"nn": "norweciya nînorskî",
"yue": "kantonî",
"ug": "oygurî",
"rm": "romancî",
"sc": "sardînî",
"vo": "volapûkî",
"io": "îdoyî",
"ml": "malayalamî",
"mt": "maltayî",
"ba": "başkîrî",
"ta": "tamîlî",
"ang": "îngilîziya kevn",
"sa": "sanskrîtî",
"tt": "teterî",
"rup": "aromanî",
"nrf": "normandî",
"no": "norwecî",
"scn": "sicîlî",
"br": "bretonî",
"as": "asamî",
"bo": "tîbetî",
"nan": "minnanî",
"nv": "navajoyî",
"fy": "frîsî",
"pa": "puncabî",
"vec": "venîsî",
"fur": "friyolî",
"wa": "walonî",
"haw": "hawayî",
"lb": "luksembûrgî",
"am": "amharî",
"arz": "erebiya misrî",
"ia": "înterlîngua",
"kl": "kalalîsûtî",
"mr": "maratî",
"gv": "manksî",
"qu": "keçwayî",
"dsb": "sorbiya jêrîn",
"si": "kîngalî",
"kn": "kannadayî",
"sdh": "kurdiya başûrî",
"ota": "osmanî",
"gu": "gujaratî",
"ce": "çeçenî",
"jv": "javayî",
"pdt": "plodîşî",
"chr": "çerokî",
"nds": "nedersaksî",
"acw": "erebiya hîcazî",
"cu": "slaviya kevn",
"ne": "nepalî",
"kw": "kornî",
"hsb": "sorbiya jorîn",
"za": "zhuangî",
"os": "osetî",
"se": "samiya bakurî",
"dng": "dunganî",
"izh": "îngriyî",
"sco": "skotî",
"got": "gotî",
"or": "oriyayî",
"mnc": "mançûyî",
"crh": "teteriya krîmî",
"ltg": "latgalî",
"sah": "yakutî",
"ht": "haîtî",
"ary": "erebiya fasî",
"ha": "hawsayî",
"zu": "zuluyî",
"cv": "çuvaşî",
"yo": "yorubayî",
"ab": "abxazî",
"so": "somalî",
"frr": "frîsiya bakur",
"lad": "ladînoyî",
"an": "aragonî",
"ti": "tigrînî",
"aii": "aramiya nû ya asûrî",
"hak": "hakkayî",
"enm": "îngilîziya navîn",
"pi": "palî",
"navz": "navzimanî",
"ny": "çîçewayî",
"om": "oromoyî",
"nds-de": "almaniya jêrîn a almanî",
"lmo": "lombardî",
"csb": "kaşûbî",
"alt": "altayiya başûrî",
"arc": "aramî",
"bcl": "bîkoliya naverast",
"co": "korsîkayî",
"oj": "ojibweyî",
"pap": "papyamentoyî",
"rue": "rusînî",
"av": "avarî",
"txb": "toxarî B",
"xal": "kalmîkî",
"cop": "qiptî",
"mg": "malagasî",
"nap": "napolîtanî",
"gsw": "elmanîşî",
"dlm": "dalmatî",
"gn": "guwaranî",
"orv": "slaviya rojavayî ya kevn",
"tyv": "tuvanî",
"dv": "divehî",
"ady": "adîgeyî",
"bua": "buryatî",
"wuu": "wuyî",
"pam": "kapampanganî",
"myv": "erzayî",
"udm": "udmurtî",
"khb": "lueyî",
"rom": "romanî",
"su": "sundanî",
"ilo": "îlokanoyî",
"syc": "siryaniya klasîk",
"zdj": "şîngazîcayî",
"cdo": "min dongî",
"evn": "evenkî",
"kum": "kumikî",
"bal": "belûçî",
"lld": "ladînî",
"inh": "îngûşî",
"sd": "sindhî",
"lez": "lezgînî",
"fro": "fransiya kevn",
"non": "norsiya kevn",
"liv": "lîvonî",
"tet": "tetûmî",
"tpi": "tokpisinî",
"shn": "şanî",
"wo": "wolofî",
"mrw": "maranaoyî",
"gld": "nanayî",
"nah": "nahwatlî",
"ki": "kîkûyûyî",
"st": "sotoyiya başûr",
"mww": "hmongî",
"lij": "lîgûrî",
"rgn": "romagnolî",
"li": "lîmbûrgî",
"sm": "samoayî",
"sga": "îrlendiya kevn",
"ks": "keşmîrî",
"pms": "piedmontîsî",
"ccc": "çamicuroyî",
"hil": "hîlîgaynonî",
"xmf": "megrelî",
"hrx": "hunsrikî",
"rif": "tarifitî",
"krc": "karaçay-balkarî",
"war": "warayî",
"mwl": "mîrandî",
"syl": "sîlhetî",
"ee": "eweyî",
"ln": "lingalayî",
"pdc": "almaniya Pennsylvania",
"goh": "almaniya bilind a kevn",
"tly": "talişî",
"nci": "nahwatliya klasîk",
"ckt": "çukçî",
"ain": "aynuyî",
"uga": "ugarîtî",
"xh": "xosayî",
"sms": "samiya skoltî",
"kea": "kapverdî",
"ajp": "erebiya başûrê şamê",
"kjh": "xakasî",
"iu": "înuîtî",
"dz": "conxayî",
"srn": "sirananî",
"vro": "voroyî",
"mdf": "mokşayî",
"xcl": "ermeniya kevn",
"mhr": "mariya rojhilatî",
"cic": "çîkasawî",
"esu": "yupîkiya navendî",
"cjs": "şorî",
"wym": "wîlamowî",
"apw": "apaçiya rojava",
"mba": "higaononî",
"kaw": "javayiya kevn",
"ovd": "elfdalî",
"to": "tongî",
"ist": "îstriyotî",
"szl": "silesî",
"yua": "mayayiya yukatekî",
"tsg": "tausugî",
"zea": "zêlandî",
"bar": "bayerî",
"luy": "luhyayî",
"mzn": "mazenderanî",
"mhn": "mòçenoyî",
"kxd": "bruneyî",
"lzz": "lazî",
"kbd": "kabardî",
"afb": "erebiya kendavî",
"krl": "karelî",
"eve": "evenî",
"stq": "frîsiya saterlandî",
"ak": "akanî",
"tab": "tabasaranî",
"sat": "santalî",
"fj": "fîjî",
"sva": "svanî",
"egy": "misrî",
"ig": "îgboyî",
"hac": "hewramî",
"ay": "aymarayî",
"gur": "farefareyî",
"rw": "kînyarwandayî",
"twf": "taosî",
"koi": "komî-permyakî",
"lkt": "lakotayî",
"akl": "aklanon",
"yai": "yagnobî",
"ryu": "okînawanî",
"rhg": "rohingyayî",
"vep": "vepsî",
"smn": "samiya înarî",
"egl": "emilî",
"ty": "tahîtî",
"mdh": "maguindanaoyî",
"gag": "gagawzî",
"tzm": "temazîxtiya atlasa navendî",
"sgs": "samogîtî",
"ff": "fulahî",
"lou": "kreyoliya fransî ya Louisiana",
"mel": "melanauyiya navendî",
"niv": "nîvxî",
"aa": "afarî",
"gez": "etiyopiya klasîk",
"ext": "extremaduranî",
"frp": "frankoprovansî",
"kpv": "komî-zîriyî",
"udi": "udî",
"sma": "samiya başûr",
"nog": "nogayî",
"akk": "akadî",
"lbe": "lakî",
"min": "mînangkabawî",
"kg": "kîkongoyî",
"ban": "balînî",
"dlg": "dolganî",
"ace": "açehî",
"pox": "polabî",
"ppl": "pîpîlî",
"mnz": "monî",
"kaa": "karakalpakî",
"kab": "kabîlî",
"vot": "votî",
"luo": "luoyî",
"sn": "şonayî",
"swb": "komorî",
"roa-tar": "tarantinoyî",
"lg": "lugandayî",
"nds-nl": "saksoniya jêrîn ya holendî",
"dtp": "dusuniya navendî",
"shi": "taşelhitî",
"msk": "mansakayî",
"rap": "rapanuyî",
"mer": "meruyî",
"ik": "înupîakî",
"prg": "prusiya kevn",
"chk": "çûkî",
"kam": "kambayî",
"chy": "çeyenî",
"nod": "tayiya bakurî",
"akz": "alabamayî",
"xag": "aghwanî",
"ase": "zimanê destan ê emerîkî",
"nmn": "ǃxóõ",
"gun": "mbya guaraniyî",
"cr": "krî",
"yag": "yamanayî",
"otk": "tirkiya kevn",
"sid": "sidamoyî",
"tum": "tumbukayî",
"pjt": "pîttcantcatcarayî",
"sux": "sûmerî",
"bbl": "batsbî",
"jje": "jejuyî",
"bm": "bambarayî",
"frm": "fransiya navîn",
"tpn": "tupînambayî",
"pal": "farisiya navîn",
"bi": "bîslamayî",
"ksw": "s'gaw karenî",
"ssy": "sahoyî",
"bdr": "bajwayiya kendava rojava",
"sne": "bau bidayuh",
"sjd": "samiya kildînî",
"na": "nawrûyî",
"pag": "pangasînanî",
"abq": "abazayî",
"tn": "tswanayî",
"osx": "saksoniya kevn",
"aqc": "arçî",
"xsr": "şerpayî",
"kok": "konkanî",
"kln": "kalencînî",
"win": "wînnebagoyî",
"dar": "dargwayî",
"mfe": "kreyoliya morîtanî",
"iba": "îbanî",
"ae": "avestayî",
"mos": "moreyî",
"arn": "mapuçî",
"ill": "îranunî",
"mrj": "mariya rojavayî",
"cst": "ohloniya bakur",
"blt": "tay dam",
"apc": "erebiya bakûrê şamê",
"gan": "ganî",
"ii": "yiyiya siçuwayî",
"xto": "toxarî A",
"wmw": "mwanî",
"avd": "elwîrî-wîderî",
"pro": "oksîtaniya kevn",
"pcc": "buyî",
"jra": "jarayî",
"new": "newarî",
"unm": "unamî",
"mic": "mîkmakî",
"cjm": "çamiya rojhilatî",
"sdn": "galûrîsî",
"lus": "mizoyî",
"cjy": "jinî",
"tli": "tlingitî",
"bug": "bugî",
"pcd": "pîkardî",
"hop": "hopîyî",
"ofs": "frîsiya kevn",
"tft": "ternateyî",
"roa-opt": "portugaliya kevn",
"gil": "kîrîbatî",
"kac": "cingphoyî",
"csm": "sierra mîwokiya navendî",
"sdc": "sassarîsî",
"ood": "o'odhamî",
"hsn": "xiangî",
"ruo": "îstro-romanyayî",
"mbb": "bukidnon manoboyiya rojavayî",
"bho": "bojpûrî",
"ani": "andî",
"kgp": "kayingangî",
"ss": "swazî",
"mnp": "min beî",
"aho": "ahomî",
"moe": "montagnaîsî",
"naq": "namayî",
"mvi": "miyakoyî",
"duu": "drungî",
"lut": "luşûtsîdî",
"sce": "dongşîangî",
"bqi": "bextiyarî",
"mrc": "marîkopayî",
"gmh": "almaniya bilind a navîn",
"cim": "cimbrî",
"aer": "arrernteyiya rojavayî",
"agj": "argobbayî",
"ium": "îu mienî",
"tay": "atayalî",
"ale": "alêwîtî",
"str": "saanîçî",
"zku": "kaurnayî",
"pnt": "yûnaniya pontî",
"gmw-cfr": "frankoniya navendî",
"bxd": "pelayî",
"ems": "alutîqî",
"mtq": "muongî",
"hit": "hîtîtî",
"mak": "makasarî",
"bjn": "banjarî",
"nay": "ngarrindjerî",
"dak": "dakotayî",
"yrk": "nenetsiya tundra",
"pac": "pacohî",
"ch": "çamoroyî",
"vls": "flamiya rojava",
"acm": "erebiya iraqî",
"smj": "samiya lule",
"lmy": "lamboyayî",
"jam": "kreyoliya jameîkî",
"yka": "yakanî",
"gmw-ecg": "almaniya navendî ya rojhilat",
"xsv": "sûdovî",
"cdm": "çepangî",
"bdk": "buduxî",
"isd": "îsnagî",
"zgh": "amazîxiya fasî",
"css": "ohloniya başûr",
"kqr": "kîmaragangî",
"glk": "gîlekî",
"aeb": "erebiya tunusî",
"lki": "lekî",
"kdr": "karaîmî",
"kld": "gamîlaraayî",
"tdd": "tayî nüa",
"xqa": "karaxanîdî",
"nso": "sotoyiya bakur",
"crs": "kreyoliya seyşelî",
"mvv": "tagal murutî",
"kim": "tofalarî",
"swg": "swabî",
"pau": "palawî",
"wrh": "wiradhurî",
"cho": "çoktawî",
"tig": "tigreyî",
"ivv": "îvatanî",
"ddg": "fatalukuyî",
"rmf": "romaniya kalo fînî",
"pih": "pîtkarnî-norfolkî",
"phn": "fenîkî",
"ktu": "kitubayî",
"mwr": "marwarî",
"wbp": "warlpirî",
"zun": "zuniyî",
"crk": "kriya bejayî",
"ebk": "bontociya rojhilatî",
"nup": "nupeyî",
"yoi": "yonagunî",
"atj": "atîkamekwî",
"duo": "dupaningan agtayî",
"kca": "xantî",
"dta": "daurî",
"rar": "rarotongî",
"abe": "abenakî",
"aot": "atong (Hindistan)",
"osa": "osageyî",
"ami": "amîs",
"sea": "semaî",
"mh": "marşalî",
"mad": "madurayî",
"sei": "sêriyî",
"moh": "mohawkî",
"meu": "hîrî motuyî",
"pwn": "paîwanî",
"okm": "koreyiya navîn",
"xug": "kunigamî",
"amu": "amuzgoyî",
"ine-pro": "proto-hindûewropî",
"tzo": "tzotzîlî",
"ksc": "kalingayiya başûrî",
"sib": "sebopî",
"uum": "ûrûmî",
"kjj": "khinalugî",
"pis": "pijînî",
"peo": "farisiya kevn",
"sg": "sangoyî",
"tyz": "tàyî",
"kpy": "koryakî",
"ruq": "megleno-romanyayî",
"abs": "ambonezî-malezî",
"mas": "masayî",
"bdq": "bahnarî",
"mkz": "makasaeyî",
"mag": "magahî",
"oaa": "orokî",
"din": "dinkayî",
"zlw-slv": "slovînsî",
"olo": "livvî",
"mai": "maithilî",
"nhn": "nahwatliya navendî",
"nan-tws": "teoçewî",
"wuh": "wutunhuayî",
"tpw": "tûpiya kevn",
"gcf": "kreyoliya antîlleyî",
"knb": "lubuagan kalingayî",
"ket": "ketî",
"pua": "purepeçayî",
"xbr": "kamberayî",
"bor": "bororoyî",
"rmy": "romaniya vlaks",
"tao": "yamî",
"arq": "erebiya cezayirî",
"brh": "brahuiyî",
"chn": "çinook jargonî",
"cbk": "çavacanoyî",
"tvo": "tidoreyî",
"wbk": "waigalî",
"nio": "nganasanî",
"bsh": "kamkata-viriyî",
"roa-gal": "galoyî",
"krj": "kinaray-ayî",
"gmy": "yûnaniya mîkenî",
"ctd": "tedim çinî",
"ude": "udiheyî",
"gmw-rfr": "frankoniya rhine",
"tvl": "tuvalûyî",
"ibg": "îbanagî",
"ask": "aşkunî",
"ccp": "çakmayî",
"ts": "tsongayî",
"sje": "pite samî",
"esh": "iştihardî",
"quc": "k'içe'",
"ho": "hirî motuyî",
"hif": "fiji hindiyî",
"orh": "oroqenî",
"ett": "etrûskî",
"zai": "îsthmus zapotekî",
"bla": "blakfotî",
"zlw-opl": "poloniya kevn",
"ses": "sonxayî",
"lis": "lisuyî",
"kr": "kanuriyî",
"bbc": "bataktobayî",
"umb": "umbunduyî",
"rys": "yaeyamayî",
"arp": "arapaho",
"bol": "boleyî",
"com": "komançî",
"ifk": "tuwali ifugaoyî",
"ve": "vendayî",
"kri": "krioyî",
"aoz": "uab meto",
"yxg": "yagarayî",
"zom": "zouyî",
"ttt": "tatî",
"ams": "amamî-oşîmayiya başûrî",
"tts": "isanî",
"igl": "îgalayî",
"xda": "darkinjungî",
"fkv": "kvenî",
"chg": "çaxatayî",
"xwo": "oyratiya nivîsî",
"cab": "garîfunayî",
"atv": "altayiya bakurî",
"tiw": "tiwî",
"fit": "meänkiyelî",
"mnk": "mandinkayî",
"yox": "yoronî",
"tfn": "dena'inayî",
"hur": "halkomelemî",
"ryn": "amamî-oşimayiya bakurî",
"rop": "kriolî",
"ckv": "kavalanî",
"ulc": "ulçî",
"hts": "hadzayî",
"anq": "jarawa",
"dgr": "dogrîbî",
"myp": "pîrahayî",
"xfa": "faliskanî",
"gin": "hinukhî",
"pqm": "malecite-passamaquoddyî",
"mni": "manipurî",
"txg": "tangutî",
"trv": "tarokoyî",
"kha": "khasiyî",
"odt": "holendiya kevn",
"tby": "tabaruyî",
"drg": "rungusî",
"yur": "yurokî",
"neg": "negidalî",
"mga": "îrlendiya navîn",
"gor": "gorontaloyî",
"tcy": "tuluyî",
"oac": "oroçî",
"nia": "nîasî",
"skb": "saekî",
"bth": "biatah bidayuhî",
"nwy": "nottoway-meherrînî",
"chc": "katawbayî",
"bgc": "haryanvî",
"tih": "timugon murutî",
"itl": "îtelmenî",
"gml": "almaniya jêrîn a navîn",
"apj": "xîkarîyayî",
"yao": "yaoyî",
"okn": "oki-no-erabu",
"juc": "jurçenî",
"bnn": "bununî",
"nmb": "nambasiya mezin",
"cuk": "kunayî",
"uby": "ûbîkî",
"bpy": "manîpûriya bîşnûpriyayî",
"alr": "alutor",
"nys": "nyungayî",
"niq": "nandî",
"nnt": "nanticokeyî",
"shy": "şawî",
"xum": "umbriyî",
"kzg": "kikaiyî",
"blk": "pa'o karen",
"khi-kun": "ǃkungî",
"amw": "neo-aramiya rojavayî",
"kyh": "karokî",
"arw": "arawak",
"rkt": "kamtayî",
"ijc": "îzonî",
"jct": "krymçakî",
"xpq": "mohegan-pequotî",
"lnd": "lundayehî",
"xnb": "kanakanabuyî",
"niu": "nîwî",
"wls": "walîsî",
"axm": "ermeniya navîn",
"kap": "bezhtayî",
"ykg": "yukaghiriya bakurî",
"kky": "guugu yimidhirrî",
"hnj": "hmongiya hêşîn",
"dtr": "lotudî",
"kla": "klamatî-modokî",
"fax": "falayî",
"sjt": "ter samî",
"nxq": "naxî",
"oge": "gurciya kevn",
"apm": "çîrîkawayî",
"tzj": "tzutucîlî",
"tbl": "tbolî",
"inc-oas": "asamiya zû",
"hai": "haidayî",
"sou": "taiya başûrî",
"osc": "oskanî",
"shh": "şoşonî",
"xmz": "morî bawah",
"sju": "ume samî",
"xpr": "partî",
"gaa": "gayî",
"nch": "nahwatliya huastecaya navendî",
"bsk": "buruşaskiyî",
"bzj": "kreyoliya belizeyî",
"nhx": "nahwatliya mekayapan",
"ktb": "kambaatayî",
"xnn": "kankanayiya bakurî",
"pot": "potawatomî",
"agr": "aguarunayî",
"bsb": "bisayayiya bruneyî",
"cja": "çamiya rojavayî",
"nov": "noviyalî",
"kbp": "kabiyeyî",
"tkn": "toku-no-şîmayî",
"lzh": "çîniya klasîk",
"caa": "ç'orti'",
"paw": "pawnî",
"wbl": "waxiyî",
"rut": "rutulî",
"lud": "ludianî",
"gon": "gondiyî",
"lsd": "lîşana denî",
"pyu": "puyumayî",
"bej": "bejayî",
"sxr": "saaroayî",
"bsq": "bassayî",
"cmg": "mongoliya klasîk",
"mus": "krîkî",
"sas": "sasakî",
"mlm": "mulamî",
"aio": "aytonî",
"nuk": "nootkayî",
"aiw": "aarî",
"enq": "engayî",
"chl": "cahuillayî",
"huz": "hunzibî",
"grt": "garoyî",
"lic": "hlaiyî",
"fia": "nobiinî",
"osp": "spaniya kevn",
"amm": "amayî",
"ote": "otomiya mezquital",
"roa-leo": "leonîzî",
"dum": "holendiya navîn",
"awa": "awadhî",
"otw": "ottawayî",
"xbc": "baxterî",
"bem": "bembayî",
"ira-pro": "proto-îranî",
"dbl": "diyirbalî",
"mcm": "kristangî",
"ctu": "çolî",
"grk-mar": "yûnaniya mariupol",
"nst": "tangsayî",
"cak": "kaqçikelî",
"pov": "kreyoliya guinea-bissau",
"mbf": "malayiya baba",
"xsy": "saisiyatî",
"bno": "asî",
"lbj": "ladakhiyî",
"adt": "adnyamatanhayî",
"ttj": "tooroyî",
"apy": "apalayî",
"pim": "powhatanî",
"roa-brg": "bûrgûndî",
"szy": "sakizayayî",
"tkl": "tokelawî",
"wlm": "weylsiya navîn",
"gdo": "godoberî",
"ayn": "erebiya sanaanî",
"ksk": "kansayî",
"aht": "ahtnayî",
"btx": "batakiya karo",
"jdt": "tatiya cihû",
"cni": "aşanînkayî",
"skr": "seraikî",
"iir-pro": "proto-hindûîranî",
"yrl": "nhêngatûyî",
"sip": "sîkkîmî",
"ie": "înterlîngue",
"bin": "edoyî",
"sac": "foksî",
"wni": "komoriya ndzwanî",
"btq": "batekî",
"bkd": "binukid",
"gmq-scy": "skanî",
"rah": "rabhayî",
"ddo": "tsezî",
"tuw-sol": "solonî",
"gni": "gooniyandiyî",
"rmn": "romaniya balkanî",
"roa-poi": "poitevin-saintongeaisî",
"mqm": "marquesana başûr",
"tsu": "tsouyî",
"yol": "yolayî",
"fud": "futunî",
"umu": "munsî",
"wam": "massaçusettî",
"bsy": "sabah bisayayî",
"prn": "prasunî",
"clm": "klallamî",
"ssf": "thaoyî",
"jbo": "lojbanî",
"nus": "nuerî",
"mhx": "lhao voyî",
"hmc": "huişui hmongiya navendî",
"lrc": "luriya bakurî",
"tiy": "tirurayî",
"kkh": "khünî",
"nfr": "nafaanrayî",
"zpq": "zapotekiya zoogoço",
"suk": "sukumayî",
"rml": "romaniya baltîkî",
"ncj": "nahwatliya bakurê puebla",
"nhg": "nahwatliya tetelcingo",
"ars": "erebiya necdî",
"bh": "biharî",
"caq": "car nicobareseyî",
"wlc": "mwalî komorî",
"apd": "erebiya sudanî",
"mop": "mayayiya mopanî",
"yaq": "yaquî",
"pon": "ponpeyî",
"kwk": "kwak'walayî",
"wlo": "wolioyî",
"nnr": "narunggayî",
"agx": "aghulî",
"dty": "doteliyî",
"ybh": "yakkhayî",
"azz": "puebla nahuatliya çiyayî",
"yuy": "yuguriya rojhilat",
"tqw": "tonkawayî",
"hss": "harsusiyî",
"mqu": "mandarî",
"maz": "mazahuayiya navendî",
"ife": "îfèî",
"kmk": "limos kalingayî",
"shs": "şuswapî",
"hid": "hidatsayî",
"brg": "baureyî",
"wrr": "wardamanî",
"kis": "kîsî",
"acy": "erebiya qibrisî",
"tin": "tindî",
"gmq-osw": "swêdiya kevn",
"yuf": "havasupaî-walapaî-yavapaî",
"xdk": "darûkî",
"wau": "waujayî",
"ljp": "lampungî",
"alu": "areareyî",
"ach": "açolî",
"bkm": "komiya kamerûnî",
"ngn": "ngwoyî",
"bsa": "abînomnî",
"der": "deoriyî",
"shp": "şipibo-coniboyî",
"ycl": "lolopoyî",
"qua": "kuapawî",
"gmq-pro": "proto-norsî",
"nnv": "nukunuyî",
"zko": "kottî",
"khv": "khvarşiyî",
"nij": "ngajuyî",
"yog": "yogadî",
"raw": "rawangî",
"mfy": "mayoyî",
"nd": "ndebeliya bakurî",
"oko": "koreyiya kevn",
"fon": "fonî",
"abx": "abaknonî",
"rad": "radeyî",
"klj": "khalajî",
"tru": "turoyo",
"nag": "naga pidginî",
"crl": "kriya rojhilat ya bakurî",
"zlw-ocs": "çekiya kevn",
"aau": "abauyî",
"mrq": "marquesana bakur",
"sia": "samiya akkalayî",
"mjg-mgl": "mongghulî",
"car": "galîbî karîbî",
"roa-tou": "torangî",
"rel": "rendilleyî",
"oma": "omaha-poncayî",
"rmq": "kaloyî",
"rmo": "romaniya sinte",
"lep": "lepçayî",
"guw": "gunî",
"knj": "akatekî",
"slr": "salarî",
"sem-srb": "erebiya başûrî ya kevn",
"pad": "paumarî",
"yap": "yapî",
"xul": "ngunawalî",
"kzj": "kadazaniya beravî",
"fan": "fangî (Bantu)",
"brx": "bodoyî (Hindistan)",
"ane": "xârâcùù",
"cro": "crowî",
"ram": "kanelayî",
"tea": "temiarî",
"cnk": "khumi çinî",
"tkr": "tsakhurî",
"ulk": "meryamî",
"tzh": "tzeltalî",
"avk": "kotavayî",
"mjg-mgr": "mangghuerî",
"xav": "xavanteyî",
"kmv": "kreyoliya fransî ya karipúna",
"aas": "aasayî",
"guz": "gusiiyî",
"erk": "efateyiya başûr",
"ngh": "nlûyî",
"cel-gau": "gaulisî",
"hz": "hereroyî",
"alq": "algonquinî",
"cay": "cayugayî",
"inz": "înesenyoyî",
"sgr": "sangisarî",
"iro-min": "mingoyî",
"dru": "rukaiyî",
"tta": "tuteloyî",
"lui": "luiseñoyî",
"mgm": "mambayî",
"xpm": "pumpokolî",
"kyj": "karaoyî",
"ksd": "tolaiyî",
"pkc": "baekceyî",
"pcm": "pidgîniya nîjeryayî",
"kjg": "khmuyî",
"cow": "cowlitzî",
"cyo": "cuyunonî",
"msn": "vuresî",
"jhi": "jehaiyî",
"map-bms": "banyumasanî",
"fla": "montana salişî",
"skd": "sierra miwokiya başûrî",
"xpu": "punîkî",
"tsd": "tsakonî",
"gue": "gurindjiyî",
"ksi": "krisayî",
"pni": "aohengî",
"par": "panamintî",
"ulb": "ulukwumî",
"miq": "miskitoyî",
"mcb": "maçiguengayî",
"kls": "kalaşayî",
"sdo": "bukar-sadung bidayuhî",
"nr": "ndebeliya başûrî",
"mch": "maquiritarî",
"msb": "masbatenyoyî",
"tsi": "tsimşî",
"gmq-gut": "gutnişî",
"tus": "tuskarorayî",
"lmw": "miwokiya golî",
"srs": "sarceeyî",
"zag": "zaghawayî",
"klb": "kiliwayî",
"kmc": "kamiya başûrî",
"beg": "belaîtî",
"inc-ash": "prakrîtiya aşokanît",
"kj": "kwanyamayî",
"ng": "ndongayî",
"irk": "îraqwî",
"grk-ita": "grîkoyî",
"aaq": "penobskotî",
"kek": "q'eqçiyî",
"ojb": "ojibweyiya bakurî",
"txu": "kayapó",
"one": "oneidayî",
"ktv": "katuyiya rojhilatî",
"nhe": "nahwatliya huastekaya rojhilatî",
"lwl": "lawayiya rojhilatî",
"lua": "luba-kasayî",
"bjb": "barngarla",
"acu": "açuarî",
"cof": "tsafikiyî",
"gwi": "gwiçinî",
"urk": "urak lawoi'",
"tar": "tarahumarayiya navendî",
"kva": "bagvalalî",
"hni": "haniyî",
"sek": "sekanî",
"cpg": "yûnaniya kapadokyayî",
"wmb": "wambayayî",
"xld": "lîdyayî",
"amn": "amanabî",
"haa": "hänî",
"cdy": "çadongî",
"akr": "arakî",
"kju": "kaşayayî",
"ada": "adangmeyî",
"alh": "alawayî",
"gdq": "mehriyî",
"tmo": "temoqî",
"kus": "kusaalî",
"dwu": "dhuwalî",
"pak": "parakanã",
"agg": "angorî",
"wao": "wappoyî",
"aji": "ajië",
"cas": "tsimaneyî",
"byq": "basayî",
"xls": "lusîtanî",
"gcr": "kreyoliya guwiyanîsî",
"apk": "apaçiya deştan",
"kut": "kutenaiyî",
"gmw-jdt": "danmarkiya jersey",
"hus": "wastekî",
"rej": "rejangî",
"dog": "dogonî",
"roa-lor": "lorrainî",
"emb": "embalohî",
"tnq": "taînoyî",
"crj": "kriya rojhilat ya başûrî",
"nuj": "nyolî (Uganda)",
"gmq-oda": "danmarkiya kevn",
"akv": "axvaxî",
"doi": "dogriyî",
"trp": "kokborokî",
"geh": "hutterisçî",
"gul": "gullahî",
"coo": "comoxî",
"ije": "biseniyî",
"itk": "îtaliya cihû",
"rmc": "romaniya karpatyayî",
"gmw-gts": "gottscheerîşî",
"ttg": "tutongî",
"ngu": "nahwatliya guerrero",
"pse": "malayiya navendî",
"onw": "nubiya kevn",
"qui": "kuwileytî",
"giw": "gelaoyiya spî",
"ojw": "ojibweyiya rojavayî",
"gay": "gayoyî",
"rmw": "romaniya welşî",
"nhw": "nahwatliya huastecaya rojavayî",
"xkl": "bakungî",
"loz": "loziyî",
"yij": "yindcîbarndî",
"kry": "krytsî",
"ple": "palueyî",
"tht": "tahltanî",
"mkq": "bay miwokî",
"sks": "maiayî",
"mhe": "besisî",
"mrv": "mangarevanî",
"nrm": "naromî",
"chp": "çîpewî",
"bll": "biloxî",
"knx": "kendayanî",
"khw": "khowarî",
"dua": "diwalayî",
"roa-cha": "şampanyî",
"gug": "guaraniyiya paraguayanî",
"dsn": "dusnerî",
"tmh": "tuaregî",
"pmf": "pamonayî",
"smq": "samoyî",
"tal": "talî",
"yuc": "yuçî",
"mqy": "manggarayî",
"bts": "batakiya simalungun",
"tos": "totonakiya çiyayî",
"oia": "oyratayî",
"blz": "balantak",
"bjz": "baruga",
"kai": "karekareyî",
"zav": "zapotekiya yatzaçî",
"okd": "okodiayî",
"ndd": "nde-nsele-nta",
"omc": "moçikayî",
"bto": "iriga bikolanoyî",
"okr": "kirikeyî",
"top": "totonakiya papantla",
"xer": "xerenteyî",
"xlc": "lîkî",
"mid": "mandaicî",
"suy": "suyayî",
"chz": "ozumacin çinantecî",
"pah": "tenharimî",
"til": "tillamookî",
"afn": "defakayî",
"guc": "wayuuyî",
"ojp": "japoniya kevn",
"lif": "limbuyî",
"efi": "efikî",
"mek": "mêkêoyî",
"ayl": "erebiya lîbyayî",
"bnt-phu": "phuthî",
"kne": "kankanaeyî",
"ktn": "karitiyanayî",
"abl": "abûngî",
"rtm": "rotumanî",
"wyb": "ngiyambaayî",
"crg": "mîçîfî",
"kxu": "kuiyî (Hindistan)",
"cts": "bicolanoyiya northern catanduanes",
"dje": "zarmayî",
"plw": "palawanoyî",
"xlu": "luwiyanî",
"koy": "koyukonî",
"vmw": "makhuwayî",
"vmf": "frankiya rojhilatî",
"bru": "bruyiya rojhilatî",
"kmb": "kimbunduyî",
"xsa": "sabaeanî",
"tbk": "tagbanwayiya kalamî",
"kzt": "tambunan dusunî",
"xng": "mongoliya navîn",
"acn": "açangî",
"bwx": "bu-nao bunuyî",
"cwg": "çewongî",
"vmb": "mbabaramî",
"ijs": "îjoyiya başûr-rojhilat",
"asb": "assînîboyî",
"nzd": "nzadî",
"itv": "îtawitî",
"lvk": "lavukaleveyî",
"bde": "badeyî",
"tbc": "takyayî",
"aby": "aneme wakeyî",
"urb": "urubú-kaaporî",
"coh": "çiçonyi-çidzihana-çikauma",
"dbj": "ida'anî",
"smk": "bolinaoyî",
"lbx": "lawanganî",
"kfr": "kaççiyî",
"hlt": "nga layî",
"agm": "angaatahayî",
"xpg": "firîgî",
"smr": "simeulueyî",
"vma": "martuthunirayî",
"gub": "guajajarayî",
"chf": "tabasco çontalî",
"mqs": "makyaniya rojava",
"iby": "îbaniyî",
"cng": "qiangiya bakurî",
"jac": "jakaltekî",
"trw": "torwalî",
"lti": "lêtîyî",
"scl": "şinayî",
"gwr": "gwereyî",
"dgc": "casiguran dumagat agtayî",
"btm": "batakiya mandaîlîng",
"puj": "punan tubuyî",
"oka": "okanaganî",
"gek": "gerkayî",
"mat": "matlatzincayî",
"kio": "kiowayî",
"cku": "koasatî",
"kms": "kamasauyî",
"xaa": "erebiya endulusî",
"gut": "maleku jaikayî",
"aou": "a'ou",
"elx": "îlamî",
"peh": "bonanî",
"pgl": "îrlendiya prîmîtîv",
"myx": "masabayî",
"spp": "supyireyî",
"xnt": "narragansettî",
"cad": "caddoyî",
"aap": "pará arárayî",
"rme": "angloromanî",
"ura": "urarinayî",
"mpm": "mixteciya yosondúa",
"poe": "popolocayiya san juan atzingo",
"sgd": "surigaononî",
"kvh": "komodoyî",
"xtc": "kaduglî",
"tjg": "tunjungî",
"azg": "san pedro amuzgos amuzgo",
"uun": "pazehî",
"udl": "uldemeyî",
"skp": "sekapanî",
"isi": "nkem-nkumî",
"wrz": "warrayî",
"its": "îsekiriyî",
"tgb": "tobilungî",
"bdy": "bandjalangî",
"ssb": "samayiya başûrî",
"hnn": "hanunooyî",
"enn": "engenniyî",
"srm": "saramakkanî",
"dmr": "damariya rojhilat",
"djo": "jangkangî",
"kij": "kîlîvîlayî",
"rob": "tae'",
"sad": "sandaweyî",
"har": "harariyî",
"hov": "hovonganî",
"pos": "popolucayiya sayula",
"sit-bok": "bokarî",
"kns": "kensiuyî",
"mbd": "dibabawon manoboyî",
"asu": "tocantins asurînî",
"sjw": "şawneeyî",
"btw": "butuanonî",
"jut": "jutişî",
"bgs": "tagabawayî",
"xsb": "sambalî",
"mkf": "miyayî",
"mrn": "çeke holoyî",
"kui": "kuikúroyî",
"hup": "hupayî",
"abm": "abanyomî",
"ukk": "muak sa-aakî",
"lbk": "bontociya navendî",
"dbp": "duwaiyî",
"jup": "hupdëî",
"cce": "çopiyî",
"muy": "muyangî",
"agt": "agtayiya kagayanî ya navendî",
"sxn": "sangirî",
"brc": "kreyoliya holendî ya berbiceyî",
"yux": "yukaghiriya başûrî",
"zpv": "zapotekiya çiçicapan",
"teo": "atesoyî",
"dif": "dieriyî",
"maq": "mazateciya çiquihuitlan",
"sgh": "şughnî",
"gnc": "guwançî",
"ega": "egayî",
"kbh": "camsayî",
"bni": "bangî",
"tdj": "tajioyî",
"ngi": "ngizimî",
"bue": "beothukî",
"pok": "pokangayî",
"myw": "muyuwî",
"bkn": "bukîtan",
"dyu": "dyulayî",
"asn": "xingú asuriní",
"cme": "cermayî",
"tna": "takanayî",
"mia": "miamî",
"epi": "epieyî",
"mcq": "eseyî",
"kyu": "kayahiya rojavayî",
"sai-pyk": "pykobjê",
"zaa": "zapotekiya sierra de juarez",
"dhv": "dehûyî",
"bxk": "bukusuyî",
"nuz": "nahwatliya tlamacazapa",
"trm": "tregamî",
"cps": "capiznonî",
"slm": "pangutaran samayî",
"cia": "cia-ciayî",
"abv": "erebiya bahranî",
"lod": "berawanî",
"mhj": "mogholî",
"mnv": "rennelleseyî",
"gir": "gelaoyiya sor",
"bfq": "badagayî",
"wyi": "woiwurrungî",
"eya": "eyakî",
"awk": "awabakal",
"zoc": "zoqueyiya copainala",
"smw": "sumbawayî",
"ank": "goemayî",
"mbl": "maxakalî",
"tbd": "kakî aeyî",
"nez": "nez perceyî",
"crn": "corayî",
"sai-tap": "tapayunayî",
"see": "senekayî",
"huv": "huaveyî",
"apn": "apinayé",
"mfa": "malayiya pattani",
"crx": "karriyerî",
"mam": "mamî",
"ibl": "îbaloiyî",
"cac": "çujî",
"kdt": "kuyî",
"ocu": "tlahuicayî",
"hvn": "sabuyî",
"cjp": "cabecarî",
"xbi": "kombioyî",
"xra": "krahô",
"blc": "bella koola",
"peq": "pomoyiya başûrî",
"bpz": "bilbayî",
"mzp": "movimayî",
"lhu": "lahuyî",
"kge": "komeringî",
"tue": "tuyukayî",
"taa": "tananaya jêrîn",
"vkp": "kreyoliya portugalî ya korlai",
"cmo": "mnongiya navendî",
"mov": "mojaveyî",
"kkz": "kaskayî",
"zro": "zaparoyî",
"mnb": "munayî",
"mwf": "murînpatayî",
"zkg": "goguryeoyî",
"kiw": "kiwaiyiya bakur-rojhilat",
"ebr": "ebrieyî",
"pmt": "tuamotuanî",
"roa-ang": "angevinî",
"ssg": "seimatî",
"hch": "huiçolî",
"bew": "betawî",
"ycn": "yucunayî",
"mbr": "nukak makuyî",
"apq": "a-pucikwar",
"nym": "nyamwezî",
"tbi": "gaamî",
"obi": "obispeñoyî",
"pri": "paicî",
"lu": "luba-katangayî",
"kcg": "tyapî",
"yui": "yurutî",
"kvm": "kendemî",
"djk": "aukanî",
"rir": "ribunî",
"lrg": "laragiayî",
"wnw": "wintuyî",
"woe": "woleayî",
"ljl": "li’oyî",
"kic": "kîkapûyî",
"ndh": "ndalî",
"hdy": "hadiyyayî",
"cbs": "caşinahuayî",
"kys": "baram kayanî",
"nxg": "ngadhayî",
"hix": "hixkaryanayî",
"mpe": "majangî",
"pwm": "molbogî",
"nyn": "nyankoleyî",
"ilb": "îlayî",
"qya": "qiwenyayî",
"wrk": "garawayî",
"def": "dezfuliyî",
"oym": "wayampî",
"rkb": "rikbaktsayî",
"sai-msk": "masakarayî",
"itz": "îtzayî",
"sgc": "kipsigisî",
"ppi": "paipaî",
"tji": "tujiayiya bakurî",
"yak": "yakîmayî",
"gvp": "para gaviãoyî",
"jmc": "maçameyî",
"bfs": "bayiya başûrî",
"ncb": "nicobariya navendî",
"kvb": "kubuyî",
"veo": "venturenyoyî",
"poi": "popolucayiya highland",
"bny": "bintuluyî",
"bhp": "bîmayî",
"rim": "nyaturuyî",
"sog": "sogdî",
"rth": "ratahanî",
"mse": "museyî",
"ncl": "nahwatliya mîçoakanê",
"acp": "akîpayiya rojhilatî",
"pao": "paiuteyiya bakurî",
"iyx": "yaayî",
"zhx-tai": "taişanîzî",
"coe": "koreguajeyî",
"ser": "serranoyî",
"nko": "nkonyayî",
"mgq": "malilayî",
"ppo": "folopayî",
"alc": "kawésqar",
"abg": "abagayî",
"wro": "wororayî",
"kre": "panarayî",
"tuv": "turkanayî",
"dav": "taitayî",
"ppk": "umayî",
"roa-oca": "katalaniya kevn",
"tso-lya": "çolyanî",
"myu": "mundurukú",
"dcc": "deccaniyî",
"lsi": "laşiyî",
"ugo": "gongî",
"nab": "nambikwarayî",
"lil": "lillooetî",
"gqi": "guiqiongî",
"gah": "alekanoyî",
"ncz": "natçezî",
"xom": "komoyî",
"prk": "paraukî",
"bea": "beaverî",
"sky": "sikayanayî",
"pui": "puinaveyî",
"kgg": "kusundayî",
"lml": "ragayî",
"ore": "orejónî",
"vbb": "babariya başûr-rojhilat",
"mbp": "wiwayî",
"bft": "baltî",
"lgg": "lugbarayî",
"mxd": "modangî",
"mir": "isthmus mixeyî",
"enf": "forest enetsî",
"pkp": "pukapukanî",
"kzi": "kelabît bariyoyî",
"wba": "waraoyî",
"xeg": "ǁxegwî",
"cpa": "palantla çinantecî",
"men": "mendeyî",
"btu": "batuyî",
"psy": "piscatawayî",
"xhu": "hurî",
"for": "foreyî",
"deg": "degemayî",
"sai-oto": "otomacoyî",
"nhv": "nahwatliya temascaltepec",
"gme-cgo": "gothîkiya krimî",
"kyi": "kîputî",
"olt": "lîtwanyayiya kevn",
"alp": "aluneyî",
"nbb": "ndoeyî",
"uvl": "loteyî",
"pab": "parecî",
"nbh": "ngamoyî",
"dra-okn": "kannadayiya kevn",
"aak": "ankaveyî",
"wiv": "vîtûyî",
"kuz": "kunzayî",
"atb": "zaiwa",
"aca": "açaguwayî",
"zmr": "maranungkuyî",
"xke": "kerehoyî",
"isk": "îşkaşimiyî",
"dig": "digoyî",
"agn": "agutaynenî",
"bji": "burjî",
"klw": "linduyî",
"bwi": "baniwayî",
"ygr": "yagariayî",
"mez": "menomineeyî",
"kag": "kajamanî",
"mey": "hassaniyayî",
"umo": "umotinayî",
"yii": "yidinyî",
"twy": "tawoyanî",
"ktw": "katoyî",
"ari": "arîkara",
"ysr": "sirenikî",
"adz": "adzerayî",
"spo": "spokanî",
"cgg": "rukîgayî",
"wuv": "wuvulu-auayî",
"etu": "ejaghamî",
"jmd": "yamdenayî",
"mhy": "ma'anyanî",
"tae": "taryanayî",
"kzr": "karangî",
"zhn": "nong zhuangî",
"ess": "yupikiya sîberyaya navendî",
"teg": "teke-tegeyî",
"cqd": "çuanqiandian cluster miaoyî",
"sri": "sirianoyî",
"dag": "dagbaniyî",
"gae": "warekenayî",
"lre": "laurentî",
"tbt": "kitemboyî",
"pgn": "paelignianî",
"onb": "lingaoyî",
"pth": "pataxó hã-ha",
"vmg": "minigirî",
"yah": "yazghulamî",
"kxn": "kanowitî",
"kde": "makondeyî",
"api": "apiaká",
"och": "çîniya kevn",
"pre": "prînsîpenî",
"mgr": "mambwe-lunguyî",
"stp": "tepehuaniya başûr-rojhilat",
"kak": "kayapa kallahanî",
"myg": "mantayî",
"kee": "keresiya rojhilatî",
"mfh": "matalî",
"bkr": "bakumpaî",
"alw": "alaba",
"pml": "sabirî",
"rag": "logûlî",
"mei": "midobî",
"mjy": "mahicanî",
"blm": "belî",
"nhu": "nooneyî",
"kuf": "katuyiya rojavayî",
"cux": "tepeuxila cuicatecî",
"nyy": "nyakyusayî",
"mtf": "murikî (Gîneya nû)",
"mrt": "margî",
"mpj": "martu wangkayî",
"tlh": "klîngonî",
"enh": "tundra enetsî",
"sai-crd": "coroado purî",
"umi": "ukitî",
"tcb": "tanakrosî",
"kpt": "karatayî",
"xvn": "vandalî",
"xsm": "kasemî",
"ltc": "çîniya navîn",
"yuz": "yuracareyî",
"bhw": "biyakî",
"sqt": "soqotrî",
"dny": "deniyî",
"lcp": "lawayiya rojavayî",
"tpx": "akatepekiya me'phaayî",
"ake": "akawaîo",
"jeb": "jeberoyî",
"gup": "gunwingguyî",
"xeb": "eblaiteyî",
"zkt": "xîtanî",
"lex": "luangî",
"mnq": "minriqî",
"njm": "angamî",
"sge": "segayî",
"hoi": "holîkaçukî",
"tee": "huehuetla tepehuayî",
"bil": "bileyî",
"gej": "genî",
"wim": "wik-mungkanî",
"oyd": "oydayî",
"gvj": "guajayî",
"blw": "balangao",
"lgt": "pahîyî",
"sai-cac": "cacanî",
"xok": "xoklengî",
"knv": "taboyî",
"slc": "salibayî (Kolombiya)",
"noz": "nayî",
"bnq": "bantîkî",
"ykm": "yakamulî",
"dym": "yanda dogonî",
"cri": "sãotomenseyî",
"shu": "erebiya çadî",
"tcs": "creoleyiya torres strait",
"gmw-stm": "sathmar swabî",
"rbl": "miraya bikolî",
"mbn": "macaguanî",
"mgu": "mailuyî",
"pib": "yineyî",
"yku": "kuamasî",
"gva": "kaskihayî",
"sai-yur": "yurumanguî",
"clw": "çulymî",
"bln": "bîkolanoyiya başûr katanduanî",
"mxi": "mozarabîkî",
"sob": "sobeyî",
"agd": "agarabiyî",
"bxe": "ongotayî",
"ito": "îtonamayî",
"mmq": "aisî",
"gnd": "zulgo-gemzekî",
"wig": "wik-ngathanayî",
"dto": "tommo soyî",
"suz": "sunwarî",
"rol": "romblomanonî",
"llu": "lawî",
"jaa": "jamamadiyî",
"bns": "bundelî",
"wal": "wolayttayî",
"oui": "oyguriya kevn",
"bjt": "balanta-ganjayî",
"alk": "alakî",
"nhr": "naroyî",
"gmw-vog": "almaniya volga",
"nsn": "nehanî",
"kqe": "kalaganî",
"end": "endeyî",
"jui": "ngadcurî",
"hay": "hayayî",
"svb": "ulau-suainî",
"saz": "sauraştrayî",
"mep": "miriwungî",
"ert": "eritaiyî",
"yen": "yendangî",
"mxb": "mixteciya tezoatlan",
"pmw": "plains miwokî",
"fak": "fangî (Beboid)",
"sai-bet": "betoî",
"arl": "arabela",
"cks": "tayoyî",
"nrn": "nornî",
"kao": "kassonkeyî",
"blb": "bilua",
"wab": "wabî",
"kwd": "kwaioyî",
"abr": "abronî",
"wbi": "wanjî",
"cso": "soçiapam çinantecî",
"kmo": "kwomayî",
"ddw": "dawera-daweloorî",
"zae": "zapotekiya yareni",
"rac": "rasawayî",
"bra": "brajî",
"naz": "nahwatliya koatepek",
"qwm": "kipçakî",
"ayz": "maybratî",
"amp": "alamblakî",
"sit-liz": "lizuyî",
"jum": "jumjumî",
"tub": "tübatulabalî",
"hih": "pamosuyî",
"kbc": "kadiweuyî",
"tun": "tunikayî",
"cod": "cocamayî",
"abt": "ambulasî",
"ame": "yaneşa'",
"xed": "hdî",
"yrb": "yarebayî",
"mbc": "macuşî",
"sai-mal": "malalî",
"khs": "kasuayî",
"soz": "temî",
"mva": "manamî",
"bcu": "bîlîwayî",
"zpo": "zapotekiya amatlan",
"tfr": "teribeyî",
"xgf": "gabrielino-fernandeñoyî",
"aah": "abu' arapeşî",
"adn": "adangî",
"btn": "ratagnonî",
"gby": "gbariyî",
"sxb": "subayî",
"onn": "onobasuluyî",
"aih": "aî-çamî",
"djm": "jamsayî",
"wun": "bunguyî",
"bhv": "bahauyî",
"ahk": "akha",
"tow": "jemezî",
"duw": "dusun wituyî",
"alj": "alanganî",
"sbk": "safwayî",
"kho": "xotanî",
"ndj": "ndambayî",
"mmh": "mehinakuyî",
"ttw": "long watî",
"sai-cat": "catacaoyî",
"kck": "kalangayî",
"yav": "yangbenî",
"heh": "heheyî",
"szw": "sawayî",
"phk": "phakeyî",
"aoa": "angolar",
"xur": "urartûyî",
"txn": "taranganiya rojava",
"piv": "pilenî",
"xta": "mixtekiya alcozauca",
"ute": "uteyî",
"tad": "tauseyî",
"yug": "yugî",
"zum": "kumzarî",
"nkr": "nukuoroyî",
"xaw": "kawaiisuyî",
"mpa": "mpotoyî",
"zng": "mangî",
"gad": "gaddangî",
"drn": "damariya rojava",
"oca": "ocainayî",
"mcg": "mapoyoyî",
"gbm": "garhwaliyî",
"sbh": "sorî-harenganî",
"kew": "kewayî",
"mki": "dhatkî",
"obt": "bretoniya kevn",
"alo": "larike-wakasihu",
"drl": "baagandjiyî",
"tog": "tongayî (Malawî)",
"tdl": "surî",
"met": "matoyî",
"cle": "lealao çinantecî",
"gmq-jmk": "jamtîşî",
"gvf": "golinî",
"tlc": "totonakiya misantla",
"bfg": "busang kayanî",
"kvc": "kovêyî",
"kay": "kamayurayî",
"hei": "heiltsukî",
"urt": "uratî",
"nll": "nihalî",
"bdp": "bendeyî",
"ybe": "yuguriya rojavayî",
"nbr": "numanayî",
"mht": "mandahuacayî",
"wap": "wapişanayî",
"dzg": "dazagayî",
"wrg": "warunguyî",
"tiv": "tivî",
"tox": "tobî",
"kvo": "dobelî",
"ubl": "buhi'non bikolî",
"aja": "ajayî",
"toi": "tongayî (Zambiya)",
"sus": "susuyî",
"nhm": "nahwatliya morelos",
"mcf": "matsesî",
"lew": "ledo kailiyî",
"ckx": "cakayî",
"bxg": "bangalayî",
"nem": "nemî",
"mgo": "meta'",
"eno": "engganoyî",
"crd": "coeur d'aleneyî",
"bdb": "basapî",
"cui": "cuibayî",
"emx": "erromintxelayî",
"bsw": "baysoyî",
"piw": "pimbweyî",
"nim": "nilambayî",
"mzs": "makanîzî",
"njo": "aoyî",
"duk": "uyajitayayî",
"old": "moçî",
"sam": "aramiya samarî",
"mlq": "malinkî",
"awd-kaw": "kawişanayî",
"mro": "mruyî",
"sjm": "mapunî",
"bot": "bongoyî",
"lay": "lama baiyî",
"aif": "agî",
"bks": "masbate sorsogon",
"ibd": "îwaidjayî",
"dob": "dobûyî",
"noa": "woun meuyî",
"too": "totonakiya xicotepec de juarez",
"duv": "duvleyî",
"bqo": "baloyî",
"mna": "mbulayî",
"pbh": "panareyî",
"cav": "cavineñayî",
"scg": "sanggauyî",
"con": "cofanî",
"ubr": "ubirî",
"ata": "pele-ata",
"ngj": "ngieyî",
"ers": "ersuyî",
"tro": "taraoyî",
"yki": "yokeyî",
"tya": "tauyayî",
"byk": "biaoyî",
"tuq": "tedagayî",
"xrn": "arinî",
"mhq": "mandanî",
"ktx": "kaxarariyî",
"beu": "blagarî",
"mtv": "asaro'oyî",
"zca": "zapotekiya coatecas altas",
"abd": "manîdeyî",
"imn": "îmondayî",
"ofo": "ofoyî",
"avv": "avá-kanoeîro",
"ree": "rejang kayanî",
"klr": "khalingî",
"dby": "dibiyasoyî",
"bzd": "bribriyî",
"iwm": "îwamî",
"bvk": "bukatî",
"mgw": "matumbî",
"aus-wul": "wulguruyî",
"mto": "totontepec mixeyî",
"inc-ogu": "gujaratiya kevn",
"kpm": "kohoyî",
"bgz": "banggaî",
"klg": "tagakaulu kalaganî",
"xab": "sambeyî",
"pnz": "panayî (Afrîkaya navendî)",
"snl": "sangilî",
"aoc": "pemon",
"cul": "culinayî",
"nnq": "ngindoyî",
"cji": "çamalalî",
"urh": "urhoboyî",
"hoc": "hoyî",
"yok-nvy": "yokutiya geliyê bakurî",
"nbp": "nnamî",
"qyp": "kuiripî",
"ski": "sikayî",
"whk": "wahau kenyahî",
"fos": "sirayayî",
"paa-nun": "nungonî",
"mtd": "mualangî",
"mrh": "mara çinî",
"xeu": "keoru-ahiayî",
"ass": "îpulo",
"ing": "deg xinagî",
"ajg": "adjayî",
"kjl": "khamî",
"wed": "wedauyî",
"mxz": "maselayiya navendî",
"miw": "akoyeyî",
"lmc": "limilnganî",
"bag": "tukî",
"bva": "bareinî",
"yal": "yalunkayî",
"asa": "pare",
"sai-col": "colanî",
"kdd": "yankunytjatjarayî",
"pne": "penaniya rojavayî",
"hna": "minayî",
"ayp": "erebiya mezopotamyayî ya bakur",
"can": "çambriyî",
"yey": "yeyî",
"szc": "semaq beriyî",
"byd": "benyadu'",
"yok-svy": "yokutiya geliyê başûrî",
"xet": "setayî",
"aro": "araona",
"ntw": "nottowayî",
"szv": "isubuyî",
"crw": "çrauyî",
"kyz": "kayabiyî",
"asl": "asîluluyî",
"poz-abi": "abay-sembwakî",
"tsx": "mubamî",
"ify": "keley-i kallahanî",
"srv": "waray sorsogonî",
"ong": "oloyî",
"mvm": "muyayî",
"lam": "lambayî",
"icl": "zimanê destan ê îzlandê",
"xww": "wemba-wembayî",
"ixl": "îxilî",
"ape": "bukiyîpî",
"rui": "rufijî",
"mhl": "mauwakeyî",
"lgr": "lengoyî",
"nmy": "namuyî",
"ncn": "naunayî",
"pez": "penaniya rojhilatî",
"mfg": "mixiforeyî",
"bei": "bekatî'",
"ydg": "yidghayî",
"cwd": "kriya woods",
"mmn": "mamanwayî",
"nai-kat": "kathlametî",
"cje": "çruyî",
"ark": "arîkapûyî",
"fut": "futuna-anîwayî",
"wad": "wandamenî",
"tew": "tewayî",
"nyo": "nyoroyî",
"bky": "bokyî",
"tjm": "timucuayî",
"ysg": "sonagayî",
"ogu": "ogbronuagumî",
"mnj": "munjî",
"gwd": "gawwadayî",
"fbl": "west albay bikolî",
"uiv": "îyiveyî",
"bkq": "bakairí",
"ibe": "akpesî",
"maa": "mazateciya san jerónimo tecóatl",
"jig": "jinguluyî",
"tvd": "tsuvadî",
"xod": "kokodayî",
"adw": "amondawayî",
"guu": "yanomamöî",
"srh": "sarikolî",
"nam": "ngan'gityemerrî",
"hto": "minica huitotoyî",
"yby": "yaweyuhayî",
"urz": "uru-eu-wau-wau",
"ewo": "ewondoyî",
"cal": "karolînî",
"arr": "arara-karo",
"yup": "yukpayî",
"iai": "îaaiyî",
"wbh": "wandayî",
"dmw": "mudburrayî",
"xel": "keloyî",
"rma": "ramayî",
"zwa": "zayî",
"emi": "mûssaû-emîrakî",
"lai": "lambyayî",
"dim": "dimeyî",
"agu": "agwakatekî",
"zin": "zinzayî",
"kiv": "kimbuyî",
"dbg": "dogul domî",
"bzg": "babuzayî",
"roa-ole": "leoniya kevn",
"bun": "şerbroyî",
"gnn": "gumatjî",
"mhs": "bûrî",
"pln": "palenqueroyî",
"aus-guw": "guwarî",
"tgt": "tagbanwayiya navendî",
"mwv": "mentawaî",
"kke": "kakabeyî",
"pla": "mianî",
"bpr": "koronadal blaanî",
"oty": "tamîliya kevn",
"ywr": "yawuruyî",
"nai-tap": "tapaçultecî",
"sai-sec": "seçurayî",
"pid": "piaroayî",
"mih": "mixteciya çayuco",
"icr": "kreyoliya îngilîzî ya îslanderê",
"hoh": "hobyótî",
"fab": "annoboneseyî",
"ssm": "semnamî",
"ncg": "nisga'ayî",
"mkg": "makî (Çîn)",
"max": "malayiya moluccana bakur",
"zak": "zanakî",
"kxv": "kuviyî",
"xkn": "kayan river kayanî",
"fuy": "fuyugî",
"zpl": "zapotekiya laçixio",
"kwf": "kwara'aeyî",
"aig": "îngilîziya kreyolî ya antîgua û barbud",
"rai": "ramoaainayî",
"otd": "dohoyî",
"bey": "akuwagelî",
"nwr": "nawaruyî",
"tmq": "tumleoyî",
"tgx": "tagişî",
"pbr": "pangwayî",
"loj": "louyî",
"emp": "emberayiya bakurî",
"nho": "takuuyî",
"bco": "kalulî",
"ifb": "batad ifugaoyî",
"jao": "yanyuwayî",
"inc-ohi": "hindiya kevn",
"cup": "cupeñoyî",
"bci": "bawuleyî",
"ngo": "ngonî",
"nun": "anongî",
"yee": "yimasî",
"kxb": "krobuyî",
"hub": "huambisayî",
"nee": "kumakî",
"bec": "iceve-macî",
"smb": "simbarî",
"kuj": "kuriayî",
"ian": "îatmulî",
"cjv": "çuaveyî",
"zne": "zandeyî",
"ssd": "siroî",
"cbn": "nyah kurî",
"lwg": "wangayî",
"bmr": "muinanî",
"kya": "kwayayî",
"xem": "kembayanî",
"acz": "açeronî",
"pav": "wari'",
"egx-dem": "demotîkî",
"bph": "botlixî",
"lev": "lammayî",
"btp": "budibudî",
"bzq": "bulî",
"tdv": "toroyî",
"klq": "rumuyî",
"ojv": "javayiya ontongê",
"bdi": "burunî",
"wya": "wyandotî",
"pbb": "paezî",
"lfn": "lingua franca nova",
"jit": "jitayî",
"amq": "amahaî",
"tcf": "mepaya malînaltepekî",
"ebu": "embuyî",
"rwm": "ambayî",
"pnh": "penrhynî",
"and": "ansus",
"pej": "pomoyiya bakurî",
"kue": "kumanî",
"fip": "fipayî",
"kcn": "nubiyî",
"lol": "mongoyî",
"bwd": "biwaydokayî",
"aia": "arosî",
"zau": "zangskarî",
"pud": "punan aputî",
"ikz": "îkizuyî",
"bgb": "bobongko",
"thk": "tharakayî",
"ymc": "mujiya başûrî",
"mny": "manyawayî",
"xwa": "kwazayî",
"wrs": "warisî",
"nai-tip": "tipaî",
"teu": "sooyî",
"ked": "kereweyî",
"szp": "suaboyî",
"rgr": "resigaroyî",
"bdm": "budumayî",
"nib": "nakameyî",
"lek": "leyponî",
"guh": "guahiboyî",
"bqr": "burusuyî",
"apl": "lipan",
"bnd": "banda",
"tsj": "tşanglayî",
"xme-old": "mediya kevn",
"ppn": "papapanayî",
"mwp": "kala lagaw yayî",
"bfa": "bariyî",
"plh": "paulohî",
"btd": "batakiya dairî",
"ure": "uruyî",
"sty": "tatariya sîberî",
"buy": "mmaniyî",
"xyy": "yorta yortayî",
"xdy": "malayîk dayakî",
"kmj": "kumarbhag pahariayî",
"vun": "vunjoyî",
"cuh": "çukayî",
"lgl": "walayî",
"pna": "punan bah-biauyî",
"now": "nyamboyî",
"gqa": "ga'andayî",
"thm": "thavungî",
"acr": "açiyî",
"cir": "tiriyî",
"mxr": "murîkî (Malezya)",
"swp": "suauyî",
"zor": "zoqueyiya rayón",
"wic": "wiçitayî",
"suw": "sumbwayî",
"bum": "buluyî (Kamerûn)",
"rnw": "rungwayî",
"nak": "nakanayî",
"trs": "trîkuyiya çicahuaxtla",
"lpo": "lipoyî",
"gwe": "gwenoyî",
"cbd": "carijonayî",
"mot": "barî",
"tlv": "taliabuyî",
"xsu": "sanumayî",
"sjl": "mijî",
"pip": "peroyî",
"acx": "erebiya ummanî",
"ybb": "yembayî",
"uln": "unserdeutsch",
"yil": "yindjilandjî",
"ykn": "kua-nsî",
"apu": "apurinã",
"sso": "sissanoyî",
"puc": "punan merapî",
"mwn": "nyamwangayî",
"bpa": "dakakayî",
"mmd": "maonanî",
"bof": "bolonî",
"ati": "attié",
"wji": "warjî",
"lra": "rara bakati'",
"mlu": "toabaîtayî",
"bdd": "bunamayî",
"bfd": "bafutî",
"keu": "akebuyî",
"wod": "wolanî",
"ksb": "şambalayî",
"mff": "nakî",
"azn": "durango nahuatliya rojavayî ya jêrîn",
"asi": "buruwayî",
"ala": "alago",
"tpy": "trumaî",
"zms": "mbesayî",
"kib": "koalibî",
"jun": "juangî",
"guf": "gupapuynguyî",
"liy": "banda-bambariyî",
"sai-pam": "pamiguayî",
"loa": "lolodayî",
"elm": "elemeyî",
"aad": "amalî",
"lcm": "tungagî",
"twh": "tai dónî",
"ppm": "papumayî",
"xmr": "meroytîkî",
"kno": "konoyî (sierra leone)",
"kzz": "kalabrî",
"emw": "emplawasî",
"pnk": "pawnakayî",
"gym": "ngäbereyî",
"mxj": "mijuyî",
"lun": "lundayî",
"kos": "kosraeyî",
"kzx": "kamarianî",
"aan": "anambeyî",
"ukq": "ukwayî",
"tau": "tananaya jorîn",
"anc": "ngas",
"rcf": "kreyola fransî ya réunion",
"knm": "kanamariyî",
"bvy": "baybayanonî",
"jnj": "yemsayî",
"onu": "unuayî",
"bdh": "tara bakayî",
"pij": "pijaoyî",
"mks": "mixteciya silacayoapan",
"juh": "honeyî",
"etx": "etenî",
"sai-chr": "çarruayî",
"aui": "anukî",
"cuc": "usila çinantecî",
"xme-ott": "tatiya kevn",
"njj": "njenî",
"mng": "mnongiya rojhilatî",
"cih": "çinaliyî",
"ard": "arabana",
"val": "vehesî",
"aos": "taykatî",
"peb": "pomoyiya rojhilatî",
"xcb": "kumbrîkî",
"clk": "iduyî",
"aem": "aremî",
"vut": "vuteyî",
"teq": "temeinî",
"siu": "sinagenî",
"xmm": "manado malayî",
"gdj": "kurtjarî",
"xau": "kauwerayî",
"atz": "arta",
"zsr": "zapoteciya rincona başûrî",
"wmt": "walmajarrî",
"ter": "terenoyî",
"sit-sit": "situyî",
"zns": "mangasî",
"kwz": "kwadiyî",
"iki": "îkoyî",
"prq": "aşeninka pereneyî",
"ztq": "zapotekiya quioquitani-quieri",
"wan": "wanî",
"txh": "thrasî",
"ahg": "qimant",
"boe": "mundablî",
"gww": "kwiniyî",
"ior": "înorî",
"ply": "bolyuyî",
"avt": "au",
"zpu": "zapotekiya yalalagî",
"bgv": "warkay-bîpîmî",
"srb": "sorayî",
"huu": "murui huitotoyî",
"zmm": "marimanindjî",
"xme-ker": "kermanî",
"gbv": "gbanuyî",
"awe": "awetí",
"xzh": "zhang-zhungî",
"wow": "wawonî",
"tqo": "toaripî",
"syb": "subaneniya navendî",
"ril": "riangî",
"nqo": "n'koyî",
"laj": "langoyî (Uganda)",
"bbh": "buganî",
"orr": "orumayî",
"gju": "gojriyî",
"ddd": "dongotonoyî",
"yik": "dongşanba laloyî",
"sai-bag": "baguayî",
"tsr": "akeî",
"txe": "totolî",
"nal": "nalikî",
"bez": "kîbenayî",
"jeh": "jehî",
"sem-saf": "safaitîkî",
"mka": "mbreyî",
"nai-jum": "jumaytepequeyî",
"ebg": "ebughuyî",
"cbv": "cacuayî",
"lnl": "bandayiya navendî ya başûr",
"inc-kho": "xolosî",
"tzx": "tabriakî",
"sln": "salînanî",
"ncr": "ncaneyî",
"kqt": "kadazaniya çemê kliasê",
"cbr": "caşibo-cacataiboyî",
"trt": "tunggareyî",
"tyj": "tai doyî",
"kpr": "korafe-yeghayî",
"hmt": "hamtaiyî",
"csi": "coast miwokî",
"bbi": "barombî",
"tvk": "ambrîmiya başûr-rojhilat",
"ynd": "yandruwandhayî",
"sai-sap": "saparayî",
"mik": "mikasukî",
"kid": "koşinî",
"bya": "batakiya palawan",
"awd-ana": "anauyayî",
"yrw": "yarawatayî",
"tnx": "tanemayî",
"lme": "peveyî",
"nbm": "ngbaka ma'boyî",
"myy": "macunayî",
"cao": "çacoboyî",
"anp": "angîka",
"sim": "seimî",
"nha": "nhandayî",
"kqn": "kaondeyî",
"ecr": "eteocretanî",
"crv": "çaurayî",
"bef": "benabenayî",
"aud": "anuta",
"yiy": "yir-yorontî",
"usp": "uspantekoyî",
"sry": "serayî",
"njy": "njyemî",
"mod": "mobilianî",
"mmt": "malalamaî",
"leu": "karayî (Gîneya nû)",
"mbe": "molaleyî",
"txi": "ikpengî",
"snc": "sinaugoroyî",
"noc": "nukî",
"mle": "manambuyî",
"kyr": "kuruayayî",
"ivb": "îbatanî",
"sai-chu": "çuruyayî",
"lsr": "aruopî",
"zaq": "zapotekiya aloapam",
"tef": "teressayî",
"siy": "sivandî",
"nyb": "nyangboyî",
"mpi": "mpadeyî",
"tcq": "kayî",
"kbt": "gabadiyî",
"dka": "dakpayî",
"bff": "bofî",
"ahs": "aşeyî",
"zar": "zapotekiya rincón",
"xct": "tibetiya klasîk",
"afz": "obokuîtayî",
"mnf": "mundanî",
"mpw": "mapidianî",
"gza": "ganzayî",
"acv": "açumawî",
"zmu": "muruwarî",
"zmt": "maringarrî",
"lbc": "lakkiayî",
"gbg": "gbanziriyî",
"des": "desanoyî",
"kud": "awhelawayî",
"agc": "agatuyî",
"tob": "tobayî",
"suc": "subanoniya rojavayî",
"oni": "onînî",
"mne": "nabayî",
"itm": "îtu mbon uzoyî",
"ges": "geser-goromî",
"aza": "azhayî",
"nfl": "aiwooyî",
"tqp": "tomoipî",
"rof": "romboyî",
"ury": "oryayî",
"axg": "mato grosso arára",
"jax": "jambî malayî",
"gkn": "gokanayî",
"tbq-gkh": "gokhyî",
"bkz": "bungku",
"aik": "akeyî",
"tku": "totonaciya nekaksaya jorîn",
"sho": "şangayî",
"crp-rsn": "russenorskî",
"nss": "nalî",
"guo": "guayaberoyî",
"dun": "dusun deyahî",
"bsm": "busamiyî",
"ble": "balanta-kentohe",
"axx": "xaragure",
"sxg": "şixingî",
"apz": "safeyoka",
"awd-pai": "paikonekayî",
"muc": "mbu'",
"kgu": "kobolî",
"dbf": "edopiyî",
"bbp": "bandayiya rojavayî ya navendî",
"loe": "saluanî",
"nux": "mehekî",
"elk": "elkeiyî",
"yaf": "yakayî",
"tiz": "tai hongjinî",
"stu": "samtaoyî",
"nkg": "nekginî",
"koz": "korakî",
"aus-bra": "barranbinyayî",
"tlr": "talîsî",
"spc": "sapeyî",
"sai-pyg": "payaguayî",
"tbq-mil": "milangî",
"klp": "kamasayî",
"crz": "cruzeñoyî",
"boj": "ancamî",
"tan": "tangaleyî",
"svs": "savosavoyî",
"ppq": "peyî",
"ngg": "ngbaka manzayî",
"mpx": "misima-paneatî",
"kcp": "kangayî",
"cbi": "çaçiyî",
"bfc": "bayiya bakurî",
"yec": "yeniçeyî",
"sai-trr": "tarairiú",
"plg": "pilagayî",
"hoe": "horomî",
"yun": "benayî",
"any": "anyî",
"yis": "yisî",
"ush": "uşojoyî",
"tav": "tatuyoyî",
"sve": "serilî",
"gob": "playeroyî",
"nkz": "nkarî",
"moc": "mocovî",
"jko": "kuboyî",
"reg": "karayî (Tanzanya)",
"hul": "hulayî",
"chh": "çinookî",
"yub": "yugambalî",
"tbg": "tayrorayiya bakur",
"mdc": "maleyî",
"kuo": "kumukioyî",
"mvy": "indus kohistanî",
"foi": "foiyî",
"coz": "çoçotecî",
"bim": "bimobayî",
"agf": "argunî",
"kmx": "wabodayî",
"mtl": "montolî",
"kjr": "kuruduyî",
"kcb": "kawaçayî",
"ibn": "îbinoyî",
"scb": "çutî",
"atx": "arutanî",
"mvt": "mpotovoroyî",
"kxa": "kayrîrûyî",
"boq": "bogayayî",
"zpx": "zapotekiya san baltazar loxiça",
"wnc": "wantoatî",
"itd": "tidongiya başûrî",
"xog": "sogayî",
"ann": "obolo",
"unr": "mundarî",
"bzh": "mapos buangî",
"tye": "kyengayî",
"kyq": "kengayî",
"kwa": "dâwî",
"bou": "bondeyî",
"aul": "aulua",
"zty": "zapotekiya yatee",
"wrp": "waropenî",
"mmi": "musarî",
"buq": "bremî",
"auj": "awjîla",
"gtu": "aghu tharrnggalayî",
"zil": "zialoyî",
"tlb": "tobeloyî",
"mty": "nabî",
"lbz": "lardilî",
"gdd": "gêdagêdî",
"mdx": "dizinî",
"bgt": "bugotûyî",
"tpc": "azoyú me'phaayî",
"jmb": "zumbunî",
"tdn": "tondanoyî",
"rng": "rongayî",
"mtm": "matorî",
"djd": "jaminjungî",
"gol": "golayî",
"doz": "dorzeyî",
"nmk": "namakurayî",
"mnt": "maykulanî",
"lbl": "libon bikolî",
"gde": "gudeyî",
"bxs": "busamî",
"xmd": "mbudumî",
"kdq": "koçî",
"cah": "cahuaranoyî",
"bza": "bandiyî",
"aes": "alseayî",
"dsq": "tadaksahakî",
"tmj": "samarokenayî",
"att": "pamplona atta",
"xhd": "hadramî",
"brp": "barapasiyî",
"omw": "tairorayiya başûr",
"nif": "nekî",
"iyo": "mesakayî",
"luq": "lucumiyî",
"kqz": "koranayî",
"coc": "cocopayî",
"amj": "amdang",
"tlk": "talokî",
"spi": "saponî",
"nnf": "ngaingî",
"mlj": "miltuyî",
"luz": "luriya başûrî",
"xas": "kamassî",
"cua": "cuayî",
"afd": "andaî",
"yxl": "yarlî",
"sit-tgm": "tangamî",
"nga": "ngbakayî",
"mrg": "misingî",
"igm": "kanggapeyî",
"gop": "yeretuarî",
"myh": "makahî",
"kpg": "kapîngamarancîyî",
"ero": "horpayî",
"eto": "etonî (Kamerûn)",
"bcq": "bençî",
"srr": "sererî",
"mqz": "malasangayî",
"hui": "huliyî",
"cap": "çipayayî",
"uar": "tayrumayî",
"mox": "molimayî",
"nai-ipa": "ipaî",
"arh": "arhuako",
"wdj": "wadjiginyî",
"tem": "temneyî",
"snn": "sionayî",
"mxk": "monumboyî",
"kru": "kurukhî",
"inc-mas": "asamiya navîn",
"zoo": "zapotekiya asunción mixtepec",
"wme": "wambuleyî",
"pru": "puragî",
"qwt": "kwalhioqua-tlatskanaî",
"gbb": "kaytetyeyî",
"bux": "boghomî",
"atm": "ata",
"abn": "abuayî",
"zab": "zapotekiya san juan guelavia",
"wny": "wanyî",
"sai-qtm": "quitemoyî",
"mmf": "mundatî",
"gdm": "laalî",
"kxi": "keningau murutî",
"dwr": "dawroyî",
"bfw": "bondoyî",
"aux": "aurá",
"ttv": "titanî",
"nrz": "lalayî (Gîneya nû)",
"gbp": "gbaya-bossangoayî",
"awn": "awngî",
"zia": "ziayî",
"way": "wayanayî",
"sut": "subtiabayî",
"rog": "roglayiya bakurî",
"ono": "onondagayî",
"mbj": "nadëbî",
"mls": "masalitî",
"bbj": "ghomalayî'",
"dyi": "djiminiyî",
"bgg": "bugunî",
"ail": "aîmeleyî",
"wir": "wirafedî",
"cla": "ronî",
"ost": "osatuyî",
"kkr": "kir-balarî",
"dgb": "bunogeyî",
"yha": "bahayî",
"mcd": "şaranahuayî",
"rwk": "rwayî",
"ifu": "mayoyao ifugaoyî",
"lig": "ligbiyî",
"jek": "jeri kuoyî",
"ghs": "guhu-samaneyî",
"bdn": "baldemuyî",
"xkf": "xengxayî",
"tsb": "tsamaî",
"sle": "şolagayî",
"nai-spt": "sahaptinî",
"nas": "nasioyî",
"mhd": "mbuguyî",
"kfa": "kodavayî",
"jur": "jurúnayî",
"goa": "guroyî",
"efa": "efaiyî",
"aqn": "altaya bakurî",
"tjs": "tujyayiya başûrî",
"tdy": "tadyawanî",
"los": "loniuyî",
"jka": "kaerayî",
"afo": "eloyî",
"cba-cat": "catio çibçayî",
"bsn": "barasanayî",
"ama": "amanayé",
"sai-san": "sanavironî",
"prc": "paraçî",
"nej": "nekoyî",
"cms": "messapicî",
"kyl": "kalapuyayî",
"coj": "coçimiyî",
"byr": "baruyayî",
"aey": "ameleyî",
"aus-ynk": "yangkaalî",
"yta": "taluyî",
"pay": "peç",
"lse": "lusengoyî",
"cub": "cubeoyî",
"gac": "andamaniya mezin a têkel",
"yry": "yarluyandî",
"tgp": "tangoayî",
"mjt": "sawriya pahariayî",
"phl": "phalurayî",
"ngt": "ngeqî",
"xnr": "kangrî",
"ciy": "çaimayî",
"bca": "bayiya navendî",
"aog": "angoram",
"yrn": "yerongî",
"skz": "sekarî",
"pia": "pima bajoyî",
"mjb": "makaleroyî",
"hot": "hoteyî",
"cbt": "çayahuitayî",
"aor": "aore",
"uve": "uveyiya rojava",
"pbv": "pnarî",
"mkr": "malasî",
"qvy": "kueyuyî",
"nai-chi": "çiquimulillayî",
"bhi": "bhilalî",
"erg": "sieyî",
"plo": "popolucayiya oluta",
"aun": "molmo one",
"kun": "kunamayî",
"laz": "aribwatsayî",
"waj": "waffayî",
"xsi": "sioyî",
"ibr": "îbuoroyî",
"zaf": "zapotekiya ayoquesco",
"lbq": "wamparî",
"keg": "teseyî",
"nyt": "nyawaygî",
"akc": "mpur",
"mnx": "manikionî",
"kmq": "kwamayî",
"khz": "keaparayî",
"ilk": "îlongotî",
"gaj": "gadsupî",
"aqp": "atakapa",
"kgr": "abunî",
"zpf": "zapotekiya san pedro quiatoni",
"sok": "sokoroyî",
"odu": "odualî",
"muh": "mündü",
"lbb": "labelî",
"knl": "keninjalî",
"bna": "boneratî",
"auy": "auyana",
"ade": "adeleyî",
"zpw": "zapotekiya zaniza",
"opm": "oksapminî",
"mug": "musguyî",
"hob": "mariyiya awistronezî",
"ywl": "laluyiya rojavayî",
"ksx": "kêdangî",
"gbq": "gbaya-bozoumî",
"xbm": "bretoniya navîn",
"kmn": "awtuwî",
"ziw": "zigulayî",
"wbm": "wayî",
"tgo": "sudestî",
"opo": "opaoyî",
"lan": "laruyî",
"xuu": "khweyî",
"gid": "gidarî",
"bvj": "baanî",
"zzj": "zuojiang zhuangî",
"wpc": "wirö",
"rnn": "roonî",
"don": "dourayî",
"bhj": "bahingî",
"lib": "likumî",
"akj": "jeru",
"awd-gnu": "guinauyî",
"dux": "duunî",
"bqp": "busayî",
"nsk": "naskapî",
"mqb": "mbukoyî",
"kwl": "kofyarî",
"nai-jtp": "jutiapayî",
"grd": "guruntumî",
"llp": "efateyiya bakur",
"agy": "altaya başûrî",
"yar": "yabaranayî",
"khc": "tukang besiya bakur",
"sbl": "sambaliya botolan",
"crc": "lonwolwolî",
"xkg": "kagoroyî",
"hdn": "haidayiya bakurî",
"sai-ctq": "catuquinaruyî",
"bbb": "barayî",
"amr": "amarakaerî",
"yky": "yakomayî",
"bsx": "yangkamî",
"tmz": "tamanakuyî",
"zsa": "sarasirayî",
"nig": "ngalakanî",
"khl": "lusiyî",
"xow": "kowakî",
"hem": "hembayî",
"pga": "erebiya jubayê",
"bhm": "batharî",
"bzb": "andioyî",
"yko": "yasayî",
"sax": "sayî",
"ypg": "pholayî",
"nnh": "ngiemboonî",
"mpd": "maçinereyî",
"vic": "kreyoliya giravên virginê",
"kdp": "kaningdon-nindemî",
"sit-cha": "çairelî",
"yes": "yeskwayî",
"uur": "urayî (Vanuatu)",
"mhu": "taraonî",
"slu": "selaruyî",
"xtd": "mixtekiya diuxi-tilantongo",
"utr": "etuloyî",
"bnv": "benerafî",
"ydk": "yoidikî",
"trr": "tauşîroyî",
"srk": "serudung murutî",
"xpo": "poçutekî",
"nkx": "nkorooyî",
"kes": "kugboyî",
"kgm": "karipúnayî",
"cax": "çiquitanoyî",
"big": "biangaî",
"vil": "vilelayî",
"dtu": "tebul ure dogonî",
"tty": "sikaritaî",
"rmg": "norweciya traveller",
"mlw": "molokoyî",
"biq": "bipî",
"ylu": "aribwaungî",
"wga": "wagayayî",
"tnz": "ten'ednî",
"qum": "sipakapenseyî",
"pue": "puelçeyî",
"nop": "numanggangî",
"mzq": "mori atasî",
"awd-kus": "kustenauyî",
"idi": "îdî",
"kzf": "da'a kailiyî",
"bib": "bîssayî",
"zad": "zapotekiya cajonos",
"waz": "wampurî",
"tll": "tetelayî",
"pur": "puruborayî",
"nih": "nyihayî",
"tnk": "kwamerayî",
"ilv": "îlueyî",
"dmn-dam": "damayî (Sierra leone)",
"cba-ata": "atanquesî",
"abu": "abureyî",
"zpt": "zapotekiya san vicente coatlan",
"aaw": "solongyî",
"opy": "ofayeyî",
"dtb": "labuk-kinabatangan kadazanî",
"ikt": "înuvialuktunî",
"auu": "auye",
"adi": "adî",
"wsk": "waskiayî",
"tix": "tiwayiya başûrî",
"atu": "reel",
"mui": "musî",
"iso": "îsokoyî",
"gya": "gbayayiya bakur-rojava",
"auw": "awyî",
"zik": "zimakanî",
"sai-way": "wayumarayî",
"sue": "suenayî",
"sai-opo": "opónî",
"srf": "nafî",
"qxs": "kiangiya başûrî",
"ggt": "gituayî",
"bcd": "babariya bakur",
"xam": "ǀxamî",
"wiu": "wiruyî",
"rro": "roroyî",
"osi": "osingî",
"mvb": "mattolî",
"mjk": "matukarî",
"lln": "leleyî (Çad)",
"kiy": "kirikiriyî",
"sit-jap": "japhugî",
"tds": "doutaî",
"blf": "buol",
"akt": "akolet",
"apb": "sa'a",
"awd-mpr": "maypureyî",
"jee": "jerungî",
"saj": "sahuyî",
"pkn": "pakanhayî",
"kkx": "kohinî",
"nai-cal": "calusayî",
"bgf": "banganduyî",
"ybm": "yabenî",
"bhq": "tukang besî başûr",
"mxe": "mele-filayî",
"lom": "loomayî",
"hka": "kaheyî",
"emn": "emanî",
"boi": "barbarenyoyî",
"aie": "amarayî",
"anh": "nendî",
"mej": "meyahî",
"kcl": "kalayî",
"hro": "haroiyî",
"enc": "enî",
"amy": "amî",
"yde": "yangum deyî",
"taj": "tamangiya rojhilatî",
"sar": "saravekayî",
"szb": "ngalumî",
"inm": "minaeanî",
"kwh": "kowyayî",
"hed": "herdeyî",
"cuy": "cuitlatecî",
"yvt": "yaviteroyî",
"sgw": "sebat bet gurageyî",
"nph": "phomî",
"mjs": "mişipî",
"mda": "madayî (Nîjerya)",
"wat": "kaninuwayî",
"blo": "anîî",
"yss": "yessan-mayoyî",
"ona": "selk'namî",
"pny": "pinyinî",
"noe": "nimadî",
"crm": "kriya mûsî",
"hhy": "hoyahoyayî",
"bzz": "evantî",
"inc-apa": "apabhramsayî",
"uuu": "uyî",
"seu": "serui-lautî",
"pbi": "podokoyî",
"mhc": "moçoyî",
"kzw": "kaririyî",
"faa": "fasuyî",
"sai-chi": "çirinoyî",
"yab": "yuhupî",
"vit": "vitî",
"myl": "momayî",
"crb": "island caribî",
"frq": "forakî",
"cog": "çongî",
"brk": "birgidî",
"waq": "wagemanî",
"nuy": "nunggubuyuyî",
"mdb": "morigî",
"idu": "îdomayî",
"fun": "fulniôî",
"dao": "daai çinî",
"wnb": "wanambreyî",
"skv": "skouyî",
"sai-pur": "purukotó",
"nyi": "nyimangî",
"kwn": "kwangaliyî",
"kec": "keigayî",
"gbu": "gagaduyî",
"dnj": "danî",
"bus": "bokobaruyî",
"ado": "abuyî",
"zpn": "zapotekiya santa ines yatzeçi",
"aml": "war-jaîntî",
"mij": "mungbamî",
"lbu": "labuyî",
"ken": "kenyangî",
"ipo": "îpikoyî",
"zam": "zapotekoyiya mahuatlana navendî",
"wac": "wasko-wişramî",
"sww": "sowayî",
"msu": "musomî",
"rkm": "markayî",
"slp": "lamaholotî",
"gso": "gbayayiya başûr-rojava",
"ahb": "axamb",
"kit": "agobî",
"bfi": "zimanê destan ê brîtanî",
"taz": "toçoyî",
"swi": "suî",
"prm": "kibirî",
"gis": "gizigayiya bakur",
"doe": "doeyî",
"abj": "aka-beayî",
"hnh": "ǁaniyî",
"roo": "rotokasî",
"nlv": "nahwatliya orizaba",
"npl": "nahwatliya pueblaya başûr-rojhilatî",
"llc": "leleyî (Gîne)",
"fkk": "kirya-konzelî",
"mde": "bura mabangî",
"bdl": "bajwayiya endonezyayî",
"bss": "akooseyî",
"scw": "şayî",
"lsm": "saamiayî",
"pqa": "pa'ayî",
"nmq": "nambyayî",
"mbq": "maysînî",
"jib": "jibuyî",
"bhs": "buwalî",
"sjo": "xibeyî",
"abw": "pal",
"nxa": "naueteyî",
"mck": "mbundayî",
"jmx": "juxtlahuaca mixteciya rojavayî",
"clu": "caluyanunî",
"ybo": "yabongî",
"tuo": "tukanoyî",
"nml": "ndemlî",
"mfx": "meloyî",
"lop": "lopayî",
"kzv": "komyandaretî",
"kct": "kaianî",
"has": "haislayî",
"mmw": "emayî",
"cyb": "cayubabayî",
"bcj": "bardî",
"awd-ama": "amarizanayî",
"ylr": "yalarnngayî",
"ago": "taînaeyî",
"prw": "parawenî",
"enw": "enwangî",
"kog": "coguiyî",
"bst": "basketoyî",
"ymo": "yangum monî",
"uda": "udayî",
"tma": "tamayî (Çad)",
"sre": "sarayî",
"nbv": "ngamamboyî",
"mcv": "minanibaî",
"koh": "koyoyî",
"zbt": "batuî",
"anb": "andoa",
"yaw": "yawalapitî",
"tnc": "tanimuca-retuarã",
"sbx": "seberuangî",
"yhl": "hlepho phowayî",
"bzv": "bebeyî",
"anf": "anîmere",
"yet": "yetfayî",
"pir": "piratapuyoyî",
"nmw": "nimoayî",
"nhb": "bengî",
"tbo": "tawalayî",
"szd": "seruyî",
"poy": "pogoloyî",
"bve": "malayiya berau",
"ctm": "çitimaçayî",
"aaf": "aranadanî",
"mkh-mvi": "viyetnamiya navîn",
"mnd": "mondeyî",
"mup": "malvî",
"kse": "kuniyî",
"btf": "birgîtî",
"aac": "ariyî",
"tex": "tennetî",
"kbb": "kaxuyanayî",
"ula": "fungwayî",
"dsh": "daasanaçî",
"zps": "zapotekiya coatlan",
"wnp": "wanapî",
"scs": "slaveyiya bakur",
"lid": "nyindrouyî",
"kvi": "kwangî",
"idb": "îndo-portegîzî",
"bdt": "bokotoyî",
"ate": "atemble",
"zpi": "zapotekiya santa maria quiegolani",
"tvy": "timor pidginî",
"sol": "solosî",
"rjs": "rajbanşî",
"ogc": "ogbahî",
"mth": "mungguî",
"dmc": "gavakî",
"zaj": "zaramoyî",
"sss": "soyî",
"nai-okw": "okwanuçuyî",
"hia": "lamangî",
"gyg": "gbayiyî",
"duy": "dicamay agtayî",
"sgt": "brokpakeyî",
"yix": "axi yî",
"tcx": "todayî",
"sui": "sukî",
"phi-nag": "nagtipunan agtayî",
"ixc": "îxcatecî",
"giz": "gizigayiya başûr",
"baa": "babatanayî",
"akm": "aka-bo",
"wiy": "wiyotî",
"tnt": "tontemboanî",
"uta": "otankî",
"nhc": "nahwatliya tabasco",
"mph": "maungî",
"led": "lenduyî",
"kiz": "kisiyî",
"dva": "duauyî",
"bvr": "burarrayî",
"yig": "wusa nasuyî",
"neb": "tourayî",
"shv": "şehrî",
"nnm": "namiayî",
"nai-wji": "jicaqueyiya rojavayî",
"gve": "duwetî",
"yln": "buyangiya langnî",
"blq": "baluan-pam",
"jiv": "şuarî",
"quv": "sakapultekoyî",
"ynk": "naukanskî",
"mgy": "mbungayî",
"kpx": "koiariyiya çiyayî",
"ktz": "juǀ'hoanî",
"ofu": "efutopî",
"wes": "cameroon pidginî",
"dba": "bangi meyî",
"aab": "alumu-tesuyî",
"bkj": "pande",
"ndg": "ndengerekoyî",
"bbo": "konabereyî",
"zka": "kaimbulawayî",
"hgm": "haiǁomî",
"alv-ama": "amasî",
"ttm": "tutçoneyiya bakurî",
"nen": "nengoneyî",
"zmf": "mfinuyî",
"ruf": "luguruyî",
"kfq": "korkuyî",
"tmd": "haruaî",
"eot": "eotileyî",
"sem-amm": "ammoniteyî",
"tdk": "tambasî",
"sba": "ngambayî",
"lue": "luvaleyî",
"khq": "koyra çiiniyî",
"doc": "kamiya bakurî",
"sai-cul": "cullî",
"ano": "andoque",
"yww": "yawarawargayî",
"uji": "tanjijilî",
"ypz": "phuzayî",
"nsq": "miwokiya sierraya bakurî",
"sgb": "mag-ançî aytayî",
"ish": "esanî",
"aoi": "anîndîlyakwa",
"uri": "urimî",
"yer": "tarokî",
"shb": "ninamî",
"kpj": "karajayî",
"hoz": "hozoyî",
"twm": "tawang monpayî",
"mqo": "modoleyî",
"meo": "malayiya kedah",
"bbv": "karnaî",
"agl": "fembeyî",
"ctg": "çittagonianî",
"tkq": "teeyî",
"wmd": "mamaindeyî",
"kjn": "kunjenî",
"kmg": "kâteyî",
"bqq": "biritaiyî",
"aai": "arîfama-mînîafîayî",
"swj": "sirayî",
"puw": "puluwatî",
"rin": "nunguyî",
"bdo": "moromî",
"khj": "kuturmiyî",
"fvr": "furî",
"dbq": "dabayî",
"blr": "blang",
"mfi": "wandalayî",
"xsl": "slaveyiya başûr",
"pww": "pwoyiya bakurî",
"knp": "kwanjayî",
"gbi": "galelayî",
"bqc": "bokoyî",
"zpr": "zapotekiya santiago xanica",
"sai-tim": "timoteyî",
"rki": "rakhineyî",
"ogb": "ogbiayî",
"mpv": "mungkipî",
"ker": "kerayî",
"iqu": "îquitoyî",
"gou": "gavarî",
"bvf": "boorî",
"tmb": "avavayî",
"was": "waşoyî",
"tkp": "tîkopyayî",
"reb": "rembongî",
"ogo": "khanayî",
"diu": "gcirikuyî",
"orw": "oro wînî",
"nlx": "nahalî",
"vme": "maselayiya rojhilat",
"ltn": "latundê",
"bvx": "baboleyî",
"aci": "aka-karî",
"rug": "rovyanayî",
"kqs": "kissiya bakurî",
"dmu": "dubuyî",
"bwr": "burayî",
"bkc": "baka",
"akf": "akpayî",
"wut": "wutungî",
"she": "şekoyî",
"pma": "paamayî",
"mgi": "jilî",
"gvl": "gulayî",
"dyy": "dyaabugayî",
"aiy": "aliyî",
"xin": "xincayî",
"skf": "sakirabiayî",
"zmp": "mbuunî",
"bex": "jûr modoyî",
"mea": "menkayî",
"kfc": "konda-dorayî",
"kbw": "kaîepî",
"cto": "embera-catioyî",
"cam": "cemuhî",
"bae": "baré",
"tce": "tutçoneyiya başûrî",
"nfu": "mfumteyî",
"lcq": "luhuyî",
"oco": "korniya kevn",
"ktg": "kalkatunguyî",
"sja": "epenayî",
"col": "columbia-wenatçiyî",
"alx": "amol",
"wca": "yanomamî",
"xxt": "tamborayî",
"auk": "heyo",
"cuo": "cumanagotoyî",
"sai-and": "andoqueroyî",
"yva": "yawayî",
"due": "umiray dumaget agtayî",
"kml": "tanudan kalingayî",
"ptr": "piamatsinayî",
"blx": "mag-îndî ayta",
"gcl": "kreyoliya îngilîzî ya grenadî",
"ese": "ese ejjayî",
"uvh": "urî",
"nsm": "semayî",
"nin": "ninzoyî",
"hra": "hrangkholî",
"nai-taw": "tawasayî",
"sbi": "setî",
"mvq": "moereyî",
"mqg": "malayiya kota bangun kutai",
"uwa": "kuku-uwanhî",
"iow": "çiwereyî",
"bid": "bidiyoyî",
"yuk": "yukî",
"teh": "tehuelçeyî",
"mkc": "siliputî",
"zle-ono": "novgorodiya kevn",
"wmh": "waima'ayî",
"tio": "teopî",
"yae": "pumeyî",
"mqn": "moroneneyî",
"zma": "mandayî (Awistralya)",
"kdc": "kutuyî",
"kyt": "kayagarî",
"mps": "dadibî",
"byn": "blinî",
"cns": "asmatiya navendî",
"utp": "abayî",
"zpc": "zapotekiya çoapan",
"den": "slaveyî",
"pwo": "pwoyiya rojavayî",
"mub": "mubî",
"mev": "manoyî",
"bij": "kwankayî",
"kyo": "kelonî",
"inb": "îngayî",
"aph": "athpare",
"zas": "zapotekiya santo domingo albarradas",
"ral": "ralteyî",
"irn": "îrantxeyî",
"dge": "degenanî",
"boa": "borayî",
"adj": "adyukruyî",
"zal": "zauzouyî",
"wax": "watamî",
"tca": "tîkunayî",
"agv": "remontado agta",
"omg": "omaguayî",
"xru": "marriammuyî",
"khn": "khandeşiyî",
"gji": "gejiyî",
"ayd": "ayabadhu",
"zmb": "zimbayî",
"toj": "tojolabalî",
"syk": "sukurî",
"bnf": "masiwang",
"glw": "glavdayî",
"bav": "babungoyî",
"akx": "aka-kede",
"ots": "otomiya estado de meksîka",
"mjj": "mawakî",
"leh": "lenjeyî",
"kss": "kissiyiya başûrî",
"kbz": "duhwayî",
"sth": "şeltayî",
"myf": "bambassî",
"ald": "alladînî",
"ego": "eggonî",
"cbu": "candoşi-şaprayî",
"tmc": "tumakî",
"pgs": "pangsengî",
"ndz": "ndogoyî",
"knd": "kondayî",
"haj": "hajongî",
"cmi": "embera-çamiyî",
"mlp": "bargamî",
"yat": "yambetayî",
"bsg": "başkardiyî",
"pek": "pençalî",
"lwo": "luwoyî",
"kpk": "kpanî",
"kdx": "kamî",
"cug": "cungî",
"anx": "andra-hus",
"sey": "secoyayî",
"pio": "piapocoyî",
"jgo": "ngombayî",
"miy": "mixteciya ayutla",
"gyn": "kreyoliya îngilîzî ya guyanî",
"hoa": "hoavayî",
"amx": "anmatyerre",
"tdm": "tarumayî",
"sza": "semelayî",
"pit": "pitta-pittayî",
"nsz": "nisenanî",
"mis-mmd": "mîmiya decorseyî",
"mky": "makianiya rojhilat",
"kdj": "karamojongî",
"hre": "hreyî",
"bie": "bepourî",
"ena": "apaliyî",
"vgr": "vaghrî",
"sze": "sezeyî",
"not": "nomatsiguengayî",
"mif": "mofu-gudurî",
"mfp": "malayiya makassar",
"kul": "kulereyî",
"huo": "huyî",
"biu": "biete",
"twe": "teiwayî",
"stv": "silt'eyî",
"mqj": "mamasayî",
"kug": "kupayî",
"chw": "çuaboyî",
"zkr": "zakhringî",
"waw": "waiwaî",
"ntp": "tepehuaniya bakurî",
"pmi": "pumiya bakurî",
"hux": "nüpode huitotoyî",
"mor": "moroyî",
"mha": "mandayî (Hindistan)",
"thd": "kuuk thaayorreyî",
"dgz": "dagayî",
"mae": "bo-rukulî",
"sjg": "assangorî",
"zpg": "zapotekiya guevea de humboldt",
"tcz": "thado çinî",
"nyv": "nyulnyulî",
"aso": "dano",
"bld": "bolango",
"snk": "soninkeyî",
"sai-mar": "maratinoyî",
"laf": "lafofayî",
"krk": "kerekî",
"gyl": "gayilî",
"ksr": "borongî",
"avi": "avîkam",
"wah": "watubelayî",
"tpl": "tlacoapa me'phaayî",
"mfr": "marrithiyelî",
"khr": "khariayî",
"giq": "gelaoyiya hêşîn",
"aye": "ayere",
"owl": "weylsiya kevn",
"zsu": "sukurumî",
"nhk": "nahwatliya cosoleacaque",
"law": "laujeyî",
"izr": "îzereyî",
"goi": "gobasiyî",
"wog": "wogamusinî",
"ttu": "torauyî",
"dts": "toro so dogonî",
"mcw": "mawayî",
"azc-ktn": "kitanemukî",
"ddj": "jaruyî",
"dma": "dumayî",
"bkh": "bakoko",
"aqz": "akuntsu",
"pdo": "padoeyî",
"nnb": "nandeyî",
"dzl": "dzalayî",
"bax": "bamumî",
"xiy": "xipayayî",
"tct": "t'enî",
"lht": "lo-togayî",
"kkk": "kokotayî",
"lot": "lotukoyî",
"tdc": "embera-tadó",
"bjc": "barijî",
"aew": "ambakîç",
"tkm": "takelmayî",
"sbp": "sanguyî (Tanzanya)",
"sai-ptg": "patagónî",
"lgk": "neververî",
"ybj": "haşayî",
"amg": "amurdag",
"yns": "yansî",
"udu": "udukî",
"mwm": "sarî",
"ums": "pendauyî",
"wii": "minidienî",
"pbn": "kpasamî",
"cuq": "cunî",
"bbd": "bauyî",
"aty": "aneityum",
"ngc": "ngombeyî (Kongo)",
"kxo": "kanoeyî",
"ags": "esîmbî",
"bxb": "belanda borî",
"urn": "uruangnirinî",
"mis-mmn": "mîmiya naçtigalî",
"hru": "hrusoyî",
"apt": "apatanî",
"yon": "yongkomî",
"vag": "vaglayî",
"vkl": "kulisusuyî",
"kxh": "karoyî",
"jab": "hyamî",
"smg": "simbalî",
"asj": "nsarî",
"knk": "kurankoyî",
"kaf": "katsoyî",
"yml": "îamaleleyî",
"brt": "bitareyî",
"bao": "waîmaha",
"tla": "tepehuaniya başûr-rojavayî",
"pmj": "pumiya başûrî",
"nuf": "nusuyî",
"mrl": "mortlockeseyî",
"man": "mandingoyî",
"ign": "îgnacianoyî",
"bzn": "boanoyî (Maluku)",
"xss": "assanî",
"wne": "wanecî",
"thf": "thangmî",
"kjb": "q'anjob'alî",
"sai-muc": "mucuçî",
"msw": "mansoankayî",
"kem": "kemakî",
"bnp": "bolayî",
"aqm": "atohwaim",
"zat": "zapotekiya tabaa",
"sov": "sonsorolî",
"lhn": "lahananî",
"kjq": "keresiya rojavayî",
"dei": "demisayî",
"kwi": "awa-cuaiquerî",
"aez": "aekayî",
"zay": "zayse-zergullayî",
"una": "watutiya bakur",
"ctl": "tlacoatzintepec çinantecî",
"squ": "squamîşî",
"omb": "ombayî",
"sur": "mwaghavulî",
"umc": "marrusînî",
"lbn": "lametî",
"phi-din": "dinapigue agtayî",
"buw": "bubiyî",
"ahn": "ahàn",
"zrn": "zirenkelî",
"srg": "sulodî",
"ora": "orohayî",
"mtn": "matagalpayî",
"kco": "kinalaknayî",
"hmd": "a-hmaoyî",
"woc": "wogeoyî",
"tqr": "toronayî",
"rbb": "rumaî palaungî",
"ott": "otomiya temoaya",
"nhi": "nahwatliya zacatlan-ahuacatlan-tepetzintla",
"mgk": "mawesî",
"dus": "dumiyî",
"bzu": "burmesoyî",
"bbu": "bakulungî",
"trn": "trinitarioyî",
"sdp": "şerdukpenî",
"sbv": "sabineyî",
"sai-jrj": "jirajirayî",
"gvs": "gumawanayî",
"dnn": "dzuunî",
"tte": "bwanabwanayî",
"bcf": "bamuyî",
"xir": "xiriânayî",
"two": "tswapongî",
"sai-tab": "tabancaleyî",
"lgq": "logbayî",
"klm": "kolomî",
"ngs": "gvokoyî",
"eka": "ekajukî",
"dbw": "bankan tey dogonî",
"aly": "alyawarr",
"yad": "yaguayî",
"ndp": "ndoyî",
"mcr": "menyayî",
"xon": "konkombayî",
"kka": "kakandayî",
"hao": "haköyî",
"ckl": "cibakî",
"jbk": "barikewayî",
"abc": "ambala ayta",
"yaa": "yaminahuayî",
"sny": "saniyo-hiyeweyî",
"mmc": "miçoacan mazahuayî",
"xkq": "koronî",
"had": "hatamî",
"sai-cop": "copallenî",
"swy": "saruayî",
"nid": "ngandî",
"mhi": "ma'dî",
"cpo": "kpeeyî",
"anz": "anem",
"unz": "unde kailî",
"sai-tpr": "taparitayî",
"sed": "sedangî",
"fpe": "piçinglisî",
"mxy": "mixteciya noçixtlana başûr-rojhilatî",
"bfz": "mahasu paharî",
"sai-esm": "esmeraldayî",
"urv": "uruavayî",
"seh": "senayî",
"spx": "pîkeneyiya başûr",
"cag": "nivacleyî",
"zkk": "karankawayî",
"bkl": "berik",
"yut": "yopnoyî",
"vai": "vaî",
"slw": "sialumî",
"noj": "nonuyayî",
"caf": "karrieriya başûrî",
"fag": "finonganî",
"ibh": "bihî",
"awt": "araweté",
"tyx": "teke-tyeeyî",
"mog": "mongondowî",
"knt": "katukinayî",
"bwm": "biwatî",
"apr": "arop-lokep",
"atr": "waîmîrî-atroarî",
"mtt": "motayî",
"pym": "fyamî",
"dlk": "dahalikî",
"bzl": "boanoyî (sulawesî)",
"abp": "abenlen ayta",
"zaw": "zapotekiya mitla",
"svm": "slavomolisanoyî",
"zpz": "zapotekiya texmelucan",
"tit": "tiniguayî",
"rax": "rangî",
"asx": "muratayak",
"mvr": "marauyî",
"lha": "lahayî (Viyetnam)",
"irh": "îrarûtûyî",
"sai-gay": "gayónî",
"awi": "aekyom",
"mcy": "watutiya başûr",
"tpt": "tlaçiçilco tepehuayî",
"sto": "stoneyî",
"rea": "rerauyî",
"aom": "ömie",
"tlx": "khehekî",
"mrx": "dineorî",
"oro": "orokoloyî",
"acl": "akar-baleyî",
"wbw": "woî",
"otn": "otomiya tenango",
"gia": "kitjayî",
"ats": "gros ventre",
"tri": "trió",
"zmz": "mbandjayî",
"yzg": "e'ma buyangî",
"bwa": "bwatûyî",
"bcw": "banayî",
"ywt": "xişanba laloyî",
"tsc": "tswayî",
"gmw-tsx": "saksoniya transylvanyayê",
"fap": "palorî",
"nwa": "nawathinehenayî",
"mue": "media lenguayî",
"kcx": "kaçama-ganjuleyî",
"dah": "gwahatikeyî",
"ekg": "ekariyî",
"cbc": "carapanayî",
"bxw": "bankayî",
"ygw": "yagwoiayî",
"tbr": "tumtumî",
"tgw": "tagwana senoufoyî",
"pnr": "panimî",
"njt": "ndyuka-trio pidginî",
"vnk": "lovonoyî",
"kma": "konniyî",
"hal": "halangî",
"awc": "cicipu",
"bch": "bariyayî",
"gfk": "patpatarî",
"ule": "luleyî",
"vkm": "kamakanî",
"xht": "hattîkî",
"btz": "batakiya alas-kluet",
"dti": "ana tinga dogonî",
"yre": "yaoureyî",
"udj": "ujirî",
"tpu": "tampuanî",
"ung": "ngarinyinî",
"xjb": "minjungbalî",
"slz": "ma'yayî",
"kpe": "kpelleyî",
"xla": "kamulayî",
"kpc": "curripacoyî",
"bvz": "bawziyî",
"ets": "yekheeyî",
"bbn": "uneapayî",
"tvw": "sedoayî",
"crp-spp": "pidginiya samoan plantation",
"ngq": "ngoremeyî",
"mil": "mixteciya peñoles",
"sai-chn": "çanayî",
"kvu": "yinbaw karenî",
"txx": "tatanayî",
"lva": "maku'ayî",
"gel": "fakkanciyî",
"bom": "beromî",
"cvn": "valle nacional çinantecî",
"sya": "siangî",
"bql": "bilakurayî",
"arv": "arbore",
"sai-yup": "yupuayî",
"vnp": "vunapuyî",
"sbb": "simboyî",
"gmw-pro": "proto-cermeniya rojava",
"nbn": "kurî",
"wbv": "wajarrî",
"mwh": "moûk-arîakî",
"bwp": "mandobo bawahî",
"fie": "fyerî",
"dal": "dahaloyî",
"aba": "abeyî",
"zpm": "zapotekiya mixtepec",
"wky": "wangkayutyuruyî",
"laq": "qabiaoyî",
"nja": "nzanyî",
"dmo": "kemezungî",
"dro": "daro-matu melanauyî",
"ato": "atong (Kamerun)",
"yif": "açeyî",
"zts": "zapotekiya tilquiapan",
"lah": "lahndayî",
"iry": "îrayayî",
"roa-bbn": "bourbonnais-berriçonî",
"aal": "afadeyî",
"czn": "zenzontepekiya çatîno",
"mpl": "watutiya navîn",
"lmg": "lamogayî",
"nlg": "gelayî",
"ayo": "ayoreoyî",
"zoh": "zoqueyiya çimalapa",
"mtp": "wiçi lhamtes noctenî",
"suv": "sulungî",
"xmt": "matbatî",
"zga": "kingayî",
"jbt": "jabutiyî",
"gof": "gofayî",
"rmt": "domarî",
"bwu": "bulî (Gana)",
"jod": "wojenakayî",
"yyu": "torricelli yauyî",
"sbf": "şaboyî",
"yan": "mayangnayî",
"kii": "kitsaiyî",
"trc": "trîkuyiya copala",
"shx": "şeyî",
"pgu": "paguyî",
"gwa": "mbatoyî",
"dyo": "jola-fonyiyî",
"yas": "gunuyî",
"igb": "ebirayî",
"plz": "paluanî",
"alv-gwa": "gwarayî",
"eke": "ekitî",
"cfd": "carayî",
"abb": "bankonî",
"amc": "amahuaca",
"rhp": "yahangî",
"lmb": "mereiyî",
"koa": "konomalayî",
"hlb": "halbiyî",
"eme": "emerillonî",
"nai-cig": "ciguayoyî",
"ael": "ambeleyî",
"jay": "yan-nhanguyî",
"tak": "talayî",
"mmy": "migaamayî",
"lmd": "lumunî",
"kfp": "korwayî",
"woi": "kamangî",
"akg": "anakalunguyî",
"nai-per": "pericú",
"nrl": "ngarlumayî",
"mew": "maakayî",
"hig": "kamweyî",
"hnd": "hindkoyiya başûrî",
"cuv": "cuvokî",
"ylg": "yeloguyî",
"une": "unemeyî",
"tpj": "tapieteyî",
"sos": "seenkuyî",
"nsh": "ngoşieyî",
"mit": "mixteciya pueblaya başûr",
"mxx": "mahouyî",
"bzk": "kreyoliya nîkaraguayî",
"esq": "esselenî",
"nbc": "çangî",
"anu": "anuak",
"snu": "senggî",
"mpu": "makurapî",
"hbb": "hubayî",
"cbg": "çimilayî",
"wti": "bertayî",
"app": "apma",
"spg": "sianî",
"snf": "noonî",
"mkp": "moikodî",
"viv": "idunayî",
"gem-pro": "proto-cermenî",
"omx": "moniya kevn",
"maw": "mamprulî",
"are": "arrernteya rojavayî",
"zah": "zangwalî",
"ssl": "sisaalayiya rojavayî",
"mpc": "mangarayî",
"qun": "kuynaultî",
"gyd": "kayardildî",
"ikx": "îkî",
"dij": "daiyî",
"bwq": "boboyiya başûrî",
"aum": "asu",
"axb": "abipon",
"zac": "zapotekiya ocotlan",
"xwk": "wangkumarayî",
"nzi": "nzimayî",
"mzv": "manzayî",
"kwe": "kwerbayî",
"sjk": "kemi samî",
"gmv": "gamoyî",
"bkt": "bolokî",
"atw": "atsugewî",
"zpk": "zapotekiya tlacolulita",
"wbe": "waritaî",
"ray": "rapayî",
"ojs": "ojibweyiya severnê",
"zmd": "maridanî",
"kxz": "kerewoyî",
"irr": "îrî",
"gbr": "gbagyiyî",
"bzx": "bozoyiya hainyaxo",
"aya": "awar",
"res": "reşeyî",
"oin": "oneyiya inebu",
"mwe": "mwerayî",
"ite": "îteneyî",
"gaf": "gendeyî",
"gdl": "diraşayî",
"nfd": "ahwayî",
"tlm": "tolomakoyî",
"mgv": "matengoyî",
"gqn": "kinikinaoyî",
"jah": "jah hutî",
"gog": "gogoyî",
"doy": "dompoyî",
"bfj": "bafanjî",
"xwc": "wokkonî",
"tei": "torricellî",
"sha": "şall-zwallî",
"stn": "owayî",
"emy": "mayaniya epigrafîk",
"azd": "durango nahuatliya rojavayî",
"bls": "balaesang",
"dul": "alabat island agtayî",
"xan": "xamtangayî",
"plk": "şinayiya kohistanî",
"sai-sac": "sacatayî",
"apf": "pahanan agta",
"npa": "nar phuyî",
"mfn": "mbembeyiya çema crossê",
"czk": "knaanicî",
"jow": "jowuluyî",
"cbb": "cabiyariyî",
"bpq": "banda malayî",
"sit-tsh": "tşobdunî",
"sbe": "salibayî (Gîneya nû)",
"mfj": "mefeleyî",
"lok": "lokoyî",
"kdu": "kadaruyî",
"ekp": "ekpeyeyî",
"bap": "bantawa",
"ali": "amaimonî",
"ynu": "yahunayî",
"tuf": "tuneboyiya navendî",
"ppu": "paporayî",
"dcr": "negerhollandsî",
"meq": "mereyî",
"nai-knm": "konomihuyî",
"ijn": "kalabariyî",
"hla": "haliayî",
"alm": "amblongî",
"ynn": "yanayî",
"ntj": "ngaanyatjarrayî",
"kbq": "kamanoyî",
"anm": "analî",
"ukg": "ukurigumayî",
"mav": "satere-maweyî",
"mfz": "mabaanî",
"kqq": "krenakî",
"hns": "hindustaniyiya karibî",
"taf": "tapirapeyî",
"mig": "mixteciya san miguel el grande",
"kni": "kanufiyî",
"sai-chp": "çapacurayî",
"cko": "anufoyî",
"wnu": "usanî",
"spe": "sepayî (Gîneya nû)",
"xrw": "karawayî",
"bnt-cmw": "çimwiinî",
"vam": "vanimoyî",
"sjr": "siar-lakî",
"poo": "pomoyiya navendî",
"mlz": "malaynonî",
"xks": "kumbewahayî",
"ldb": "idunî",
"tqb": "tembeyî",
"nai-sin": "sinacantanî",
"nur": "nuguriayî",
"mqx": "mamujuyî",
"unn": "kurnayî",
"bcn": "bîbaalî",
"ttr": "terayî",
"wkd": "moyî",
"kzl": "kayeliyî",
"ntk": "îkomayî",
"gdg": "ga'dangî",
"gbj": "bodo gadabayî",
"abi": "abîdjî",
"zao": "zapotekiya ozolotepec",
"sai-wnm": "wanhamî",
"thp": "thompsonî",
"cwe": "kwereyî",
"xbn": "kenaboî",
"gnq": "ganayî",
"tcc": "datoogayî",
"ztg": "zapotekiya xanaguia",
"zmj": "maridjabinî",
"lak": "lakayî",
"kvr": "kerînçî",
"ggu": "gbanî",
"anv": "denya",
"aof": "bragat",
"awr": "awera",
"zhb": "zhabayî",
"www": "wawayî",
"stb": "subaneniya bakurî",
"ret": "rettayî",
"oon": "öngeyî",
"mlv": "mwotlapî",
"mzr": "marúboyî",
"lag": "langiyî",
"kxc": "khonsoyî",
"itx": "îtikî",
"bja": "budza",
"ayu": "ayuyî",
"tba": "aikanayî",
"txm": "tominî",
"orx": "oroyî",
"nhq": "nahwatliya huaxcaleca",
"mpq": "matisî",
"kfk": "kinnauriyî",
"kzh": "dongolawiyî",
"bck": "bunabayî",
"ksf": "bafiayî"
}
}
2h5djo1kpy7rbxkjiki61bpk6bx91bu
Modul:hac-tewîn-lk
828
1357764
6292054
6241903
2026-07-29T19:20:13Z
Ghybu
1393
kod
6292054
Scribunto
text/plain
-- Module:hac-tewîn
-- Generates a Present / Imperative / Imperfect conjugation table for Hawrami,
-- from a present stem, for {{hac-tewîn-lk}}. Self-contained.
local p = {}
local u = mw.ustring
--------------------------------------------------------------------------
-- 1. DATA
--------------------------------------------------------------------------
local VOWELS = {
["a"] = true, ["e"] = true, ["é"] = true, ["ê"] = true, ["i"] = true,
["î"] = true, ["o"] = true, ["u"] = true, ["û"] = true, ["ü"] = true,
}
local IU_VOWELS = { ["î"] = true, ["û"] = true }
local PERSONS = { "1sg", "2sg", "3sg", "1pl", "2pl", "3pl" }
local PRESENT_ENDINGS = {
["1sg"] = { "û", "w" },
["2sg"] = { "î", "y" },
["3sg"] = { "o", "o" },
["1pl"] = { "mê", "ymê" },
["2pl"] = { "dê", "ydê" },
["3pl"] = { "a", "a" },
}
-- Only 2sg / 2pl exist; 2pl confirmed to reuse the present 2pl shape.
local IMPERATIVE_ENDINGS = {
["2sg"] = { "e", "" },
["2pl"] = { "dê", "ydê" },
}
local IMPERFECT_ENDINGS = {
["1sg"] = "ênê", ["2sg"] = "ênî", ["3sg"] = "ê",
["1pl"] = "ênmê", ["2pl"] = "êndê", ["3pl"] = "ênê",
}
-- add near the other constants
local function prependWord(form, word)
if word and word ~= "" then
return word .. " " .. form
end
return form
end
-- updated PRONOUNS with abbr + visible hover styling
local TOOLTIP_STYLE = 'style="cursor:help; border-bottom:1px dotted #555555;"'
local PRONOUNS = {
["1sg"] = "êmin",
["2sg"] = "to",
["3sg"] = '<abbr ' .. TOOLTIP_STYLE .. ' title="dûr">êḏ</abbr>/<abbr ' .. TOOLTIP_STYLE .. ' title="nêzik">aḏ</abbr> <small>(n.)</small><br/>'
.. '<abbr ' .. TOOLTIP_STYLE .. ' title="dûr">êḏe</abbr>/<abbr ' .. TOOLTIP_STYLE .. ' title="nêzik">aḏe</abbr> <small>(m.)</small>',
["1pl"] = "êma",
["2pl"] = "şime",
["3pl"] = '<abbr ' .. TOOLTIP_STYLE .. ' title="dûr">êḏê</abbr>/<abbr ' .. TOOLTIP_STYLE .. ' title="nêzik">aḏê</abbr>',
}
local GROUP_LABEL = { ["1sg"] = "Yekjimar", ["1pl"] = "Pirrjimar" }
local GROUP_ROWSPAN = 3
--------------------------------------------------------------------------
-- 2. HELPERS
--------------------------------------------------------------------------
local function lastChar(s) return u.sub(s, -1) end
local function firstChar(s) return u.sub(s, 1, 1) end
local function isVowel(ch) return VOWELS[ch] == true end
local function attachEnding(stem, endingPair)
local vowelFinal = isVowel(lastChar(stem))
local ending = vowelFinal and endingPair[2] or endingPair[1]
return stem .. ending
end
-- Present-tense modal prefix m(i)-.
-- consonant-initial -> mi-
-- vowel-initial (not e) -> m-
-- e-initial -> mi- REPLACES the e entirely
local function applyModalPresent(form)
local fc = firstChar(form)
if fc == "e" then
return "mi" .. u.sub(form, 2)
elseif isVowel(fc) then
return "m" .. form
else
return "mi" .. form
end
end
-- Imperative modal prefix b(i)-. No e-drop exception.
local function applyModalImperative(form)
local fc = firstChar(form)
if isVowel(fc) then
return "b" .. form
else
return "bi" .. form
end
end
-- Attaches a preverb (pre) to a finite form, with optional full-replacement
-- form (pre_p) used when the form is consonant-final or ends in î/û.
-- Otherwise: postvocalic -> drop pre's initial "e"; postconsonantal -> keep it.
local function attachPreverb(form, pre, prePart)
if not pre or pre == "" then
return form
end
local lc = lastChar(form)
local consonantFinal = not isVowel(lc)
local iuFinal = IU_VOWELS[lc] == true
if prePart and prePart ~= "" and (consonantFinal or iuFinal) then
return form .. prePart
end
if isVowel(lc) and firstChar(pre) == "e" then
return form .. u.sub(pre, 2)
else
return form .. pre
end
end
--------------------------------------------------------------------------
-- 3. BUILDERS
--------------------------------------------------------------------------
local function getOverride(overrides, key)
local v = overrides[key]
if v and v ~= "" then return v end
return nil
end
-- updated builders: added `word` parameter, applied via prependWord
local function buildPresent(stem, pre, prePart, useModal, word, overrides)
local out = {}
for _, person in ipairs(PERSONS) do
local ov = getOverride(overrides, "prs_" .. person)
if ov then
out[person] = ov
else
local base = attachEnding(stem, PRESENT_ENDINGS[person])
local plain = prependWord(attachPreverb(base, pre, prePart), word)
if useModal then
local modal = prependWord(attachPreverb(applyModalPresent(base), pre, prePart), word)
out[person] = plain .. " / " .. modal
else
out[person] = plain
end
end
end
return out
end
local function buildImperative(stem, pre, prePart, useModal, word, overrides)
local out = {}
for _, person in ipairs(PERSONS) do
if person == "2sg" or person == "2pl" then
local ov = getOverride(overrides, "imv_" .. person)
if ov then
out[person] = ov
else
local base = attachEnding(stem, IMPERATIVE_ENDINGS[person])
local plain = prependWord(attachPreverb(base, pre, prePart), word)
if useModal then
local modal = prependWord(attachPreverb(applyModalImperative(base), pre, prePart), word)
out[person] = plain .. " / " .. modal
else
out[person] = plain
end
end
else
out[person] = "–"
end
end
return out
end
local function buildImperfect(stem, pre, prePart, word, overrides)
local out = {}
for _, person in ipairs(PERSONS) do
local ov = getOverride(overrides, "ipf_" .. person)
if ov then
out[person] = ov
else
local base = stem .. IMPERFECT_ENDINGS[person]
out[person] = prependWord(attachPreverb(base, pre, prePart), word)
end
end
return out
end
--------------------------------------------------------------------------
-- 4. OUTPUT — tenses horizontal, persons vertical
--------------------------------------------------------------------------
local function renderTable(infinitive, stem, present, imperative, imperfect)
local rows = {}
local tableHeader = mw.getCurrentFrame():expandTemplate{
title = 'tabloya-tewandinê-ser',
args = {
title = 'Tewandina <i>'.. infinitive,
palette = 'orange',
tall = 'yes',
}
}
local tableFooter = mw.getCurrentFrame():expandTemplate{ title = 'tabloya-tewandinê-bin' }
table.insert(rows, tableHeader)
table.insert(rows, '! colspan="5" class="outer" | Rehê dema niha: -' .. stem .. '-')
table.insert(rows, '|-')
table.insert(rows, '! colspan="2" | ')
table.insert(rows, '! Dema niha')
table.insert(rows, '! Fermanî')
table.insert(rows, '! Dema netemamî')
for _, person in ipairs(PERSONS) do
table.insert(rows, '|-')
if GROUP_LABEL[person] then
table.insert(rows, '! rowspan="' .. GROUP_ROWSPAN .. '" | ' .. GROUP_LABEL[person])
end
table.insert(rows, '! ' .. PRONOUNS[person])
table.insert(rows, '| ' .. present[person])
table.insert(rows, '| ' .. imperative[person])
table.insert(rows, '| ' .. imperfect[person])
end
table.insert(rows, tableFooter)
return table.concat(rows, "\n")
end
--------------------------------------------------------------------------
-- 5. ENTRY POINT
--------------------------------------------------------------------------
local function getArgs(frame)
local args = {}
local parent = frame.getParent and frame:getParent()
if parent then
for k, v in pairs(parent.args) do args[k] = mw.text.trim(v) end
end
for k, v in pairs(frame.args) do args[k] = mw.text.trim(v) end
return args
end
-- updated p.show
function p.show(frame)
local args = getArgs(frame)
local infinitive = args[1] or ""
local stem = args.reh
if not stem or stem == "" then
return '<strong class="error">hac-tewîn-lk: parametreya "reh" (rehê dema niha) kêm e.</strong>'
end
local pre = args.pre or ""
local prePart = args.pre_p or ""
local word = args["pêş"] or ""
local useModal = not (args.modal == "no" or args.modal == "off" or args.modal == "0")
local present = buildPresent(stem, pre, prePart, useModal, word, args)
local imperative = buildImperative(stem, pre, prePart, useModal, word, args)
local imperfect = buildImperfect(stem, pre, prePart, word, args)
return renderTable(infinitive, stem, present, imperative, imperfect)
end
return p
053t9zmomuljzxsiza0etp46komphrp
Şablon:hac-tewîn-lk
10
1357765
6292055
6241874
2026-07-29T19:21:16Z
Ghybu
1393
6292055
wikitext
text/x-wiki
<includeonly>{{#invoke:hac-tewîn-lk|show|{{{1|{{PAGENAME}}}}}|reh={{{reh|}}}|pre={{{pre|}}}|pre_p={{{pre_p|}}}|modal={{{modal|}}}|pêş={{{pêş|}}}
|prs_1sg={{{prs_1sg|}}}|prs_2sg={{{prs_2sg|}}}|prs_3sg={{{prs_3sg|}}}|prs_1pl={{{prs_1pl|}}}|prs_2pl={{{prs_2pl|}}}|prs_3pl={{{prs_3pl|}}}
|imv_2sg={{{imv_2sg|}}}|imv_2pl={{{imv_2pl|}}}
|ipf_1sg={{{ipf_1sg|}}}|ipf_2sg={{{ipf_2sg|}}}|ipf_3sg={{{ipf_3sg|}}}|ipf_1pl={{{ipf_1pl|}}}|ipf_2pl={{{ipf_2pl|}}}|ipf_3pl={{{ipf_3pl|}}}}}</includeonly><noinclude>{{belgekirin}} {{hac-tewîn-lk|ewekerdene|reh=d}}</noinclude>
9pzrgka29tev9cvrmmb8k7xm9pvo5pk
6292058
6292055
2026-07-29T19:39:25Z
Ghybu
1393
6292058
wikitext
text/x-wiki
<includeonly>{{#invoke:hac-tewîn-lk|show|{{{1|{{PAGENAME}}}}}|reh={{{reh|}}}|pre={{{pre|}}}|pre_p={{{pre_p|}}}|modal={{{modal|}}}|pêş={{{pêş|}}}
|prs_1sg={{{prs_1sg|}}}|prs_2sg={{{prs_2sg|}}}|prs_3sg={{{prs_3sg|}}}|prs_1pl={{{prs_1pl|}}}|prs_2pl={{{prs_2pl|}}}|prs_3pl={{{prs_3pl|}}}
|imv_2sg={{{imv_2sg|}}}|imv_2pl={{{imv_2pl|}}}
|ipf_1sg={{{ipf_1sg|}}}|ipf_2sg={{{ipf_2sg|}}}|ipf_3sg={{{ipf_3sg|}}}|ipf_1pl={{{ipf_1pl|}}}|ipf_2pl={{{ipf_2pl|}}}|ipf_3pl={{{ipf_3pl|}}}}}</includeonly><noinclude>{{belgekirin}}</noinclude>
hcvy93ydx6k9snup9nqo9e9fe29qkf4
Şablon:hac-tewîn-lk/belge
10
1357767
6292059
6241920
2026-07-29T19:41:00Z
Ghybu
1393
/* Nimûne */
6292059
wikitext
text/x-wiki
{{belgekirin/binrûpel}}
Şablonek e ji bo tewandina lêkeran di zaravayê '''hewramî''' de: dema niha, fermanî û dema borî ya nediyar.
== Bikaranîn ==
<pre>
{{hac-tewîn-lk|LÊKER|reh=REH}}
</pre>
=== Nimûne ===
<syntaxhighlight lang="wikitext">
{{hac-tewîn-lk|ewekerdey|reh=ker|pre=ewe|pre_p=ó}}
{{hac-tewîn-lk|zewq kerdey|reh=ker|pêş=zewq}}
</syntaxhighlight>
<syntaxhighlight lang="wikitext">
{{hac-tewîn-lk|ewekerdene|reh=d}}
</syntaxhighlight>
{{hac-tewîn-lk|ewekerdene|reh=d}}
=== Parametre ===
{| class="wikitable"
! Parametre !! Waneya wê !! Nimûne
|-
| <code>1</code> (yekem) || Şêweya nivîsandinê ya mesderê (ne mecbûrî; ji bo sernavê tabloyê tenê) || <code>ewekerdey</code>
|-
| <code>reh</code> || '''Mecbûrî.''' Rehê dema niha || <code>reh=ker</code>
|-
| <code>pre</code> || Pêşdengê/paşgira lêkerê ya kome (ene / ere / ewe). Bi dû hemû kesan ve tê xistin, ne li pêşiya mesderê || <code>pre=ewe</code>
|-
| <code>pre_p</code> || Şêweya kin a <code>pre</code>yê, dema forma tewandî bi konsonantekê an jî bi -î/-û biqede || <code>pre_p=ó</code>
|-
| <code>pêş</code> || Peyva/naveroka pêşîn a lêkerên hevedudanî (navdêr, rengdêr, hoker) || <code>pêş=zewq</code>
|-
| <code>modal</code> || <code>no</code>/<code>off</code>/<code>0</code> pêşgira dubareyî (m(i)-/b(i)-) radike; wekî din her du şêwe (bêpêşgir / bipêşgir) bi <code>/</code> tên nîşandan || <code>modal=no</code>
|}
=== Guhertina destan a kesan (lêkerên nerêzik) ===
Her yek ji van dikare bi destan were dagirtin; dema tijî be, ew form tê bikaranîn û ne ya hesabkirî:
{| class="wikitable"
! Dem !! Parametre
|-
| Dema niha || <code>prs_1sg</code>, <code>prs_2sg</code>, <code>prs_3sg</code>, <code>prs_1pl</code>, <code>prs_2pl</code>, <code>prs_3pl</code>
|-
| Fermanî (tenê kesê 2yem) || <code>imv_2sg</code>, <code>imv_2pl</code>
|-
| Dema borî ya nediyar || <code>ipf_1sg</code>, <code>ipf_2sg</code>, <code>ipf_3sg</code>, <code>ipf_1pl</code>, <code>ipf_2pl</code>, <code>ipf_3pl</code>
|}
<pre>
{{hac-tewîn-lk|çûyene|reh=ç|prs_3sg=şo|ipf_3sg=çoşê}}
</pre>
=== Qeyd ===
* Cînavkên kesê sêyem (êḏ/aḏ, êḏe/aḏe, êḏê/aḏê) hovertext (dûr/nêzik) li ser xwe hene.
* Formên tewandî ti car cînsê (nêr/mê) nîşan nadin.
=== Çavkanî ===
* D. N. MacKenzie (1966), "The Dialect of Awroman", §26, hem jî binêre §33.
<includeonly>
[[Kategorî:Şablon]]
</includeonly>
rq9zf0m8oc2ic48zgdpgviblofgf2cp
6292060
6292059
2026-07-29T19:41:26Z
Ghybu
1393
/* Bikaranîn */
6292060
wikitext
text/x-wiki
{{belgekirin/binrûpel}}
Şablonek e ji bo tewandina lêkeran di zaravayê '''hewramî''' de: dema niha, fermanî û dema borî ya nediyar.
== Bikaranîn ==
<syntaxhighlight lang="wikitext">
{{hac-tewîn-lk|LÊKER|reh=REH}}
</syntaxhighlight>
=== Nimûne ===
<syntaxhighlight lang="wikitext">
{{hac-tewîn-lk|ewekerdey|reh=ker|pre=ewe|pre_p=ó}}
{{hac-tewîn-lk|zewq kerdey|reh=ker|pêş=zewq}}
</syntaxhighlight>
<syntaxhighlight lang="wikitext">
{{hac-tewîn-lk|ewekerdene|reh=d}}
</syntaxhighlight>
{{hac-tewîn-lk|ewekerdene|reh=d}}
=== Parametre ===
{| class="wikitable"
! Parametre !! Waneya wê !! Nimûne
|-
| <code>1</code> (yekem) || Şêweya nivîsandinê ya mesderê (ne mecbûrî; ji bo sernavê tabloyê tenê) || <code>ewekerdey</code>
|-
| <code>reh</code> || '''Mecbûrî.''' Rehê dema niha || <code>reh=ker</code>
|-
| <code>pre</code> || Pêşdengê/paşgira lêkerê ya kome (ene / ere / ewe). Bi dû hemû kesan ve tê xistin, ne li pêşiya mesderê || <code>pre=ewe</code>
|-
| <code>pre_p</code> || Şêweya kin a <code>pre</code>yê, dema forma tewandî bi konsonantekê an jî bi -î/-û biqede || <code>pre_p=ó</code>
|-
| <code>pêş</code> || Peyva/naveroka pêşîn a lêkerên hevedudanî (navdêr, rengdêr, hoker) || <code>pêş=zewq</code>
|-
| <code>modal</code> || <code>no</code>/<code>off</code>/<code>0</code> pêşgira dubareyî (m(i)-/b(i)-) radike; wekî din her du şêwe (bêpêşgir / bipêşgir) bi <code>/</code> tên nîşandan || <code>modal=no</code>
|}
=== Guhertina destan a kesan (lêkerên nerêzik) ===
Her yek ji van dikare bi destan were dagirtin; dema tijî be, ew form tê bikaranîn û ne ya hesabkirî:
{| class="wikitable"
! Dem !! Parametre
|-
| Dema niha || <code>prs_1sg</code>, <code>prs_2sg</code>, <code>prs_3sg</code>, <code>prs_1pl</code>, <code>prs_2pl</code>, <code>prs_3pl</code>
|-
| Fermanî (tenê kesê 2yem) || <code>imv_2sg</code>, <code>imv_2pl</code>
|-
| Dema borî ya nediyar || <code>ipf_1sg</code>, <code>ipf_2sg</code>, <code>ipf_3sg</code>, <code>ipf_1pl</code>, <code>ipf_2pl</code>, <code>ipf_3pl</code>
|}
<pre>
{{hac-tewîn-lk|çûyene|reh=ç|prs_3sg=şo|ipf_3sg=çoşê}}
</pre>
=== Qeyd ===
* Cînavkên kesê sêyem (êḏ/aḏ, êḏe/aḏe, êḏê/aḏê) hovertext (dûr/nêzik) li ser xwe hene.
* Formên tewandî ti car cînsê (nêr/mê) nîşan nadin.
=== Çavkanî ===
* D. N. MacKenzie (1966), "The Dialect of Awroman", §26, hem jî binêre §33.
<includeonly>
[[Kategorî:Şablon]]
</includeonly>
fqwcufdti6qsfd1wlvc7m7sdu0bvtr1
6292063
6292060
2026-07-29T19:43:31Z
Ghybu
1393
/* Guhertina destan a kesan (lêkerên nerêzik) */
6292063
wikitext
text/x-wiki
{{belgekirin/binrûpel}}
Şablonek e ji bo tewandina lêkeran di zaravayê '''hewramî''' de: dema niha, fermanî û dema borî ya nediyar.
== Bikaranîn ==
<syntaxhighlight lang="wikitext">
{{hac-tewîn-lk|LÊKER|reh=REH}}
</syntaxhighlight>
=== Nimûne ===
<syntaxhighlight lang="wikitext">
{{hac-tewîn-lk|ewekerdey|reh=ker|pre=ewe|pre_p=ó}}
{{hac-tewîn-lk|zewq kerdey|reh=ker|pêş=zewq}}
</syntaxhighlight>
<syntaxhighlight lang="wikitext">
{{hac-tewîn-lk|ewekerdene|reh=d}}
</syntaxhighlight>
{{hac-tewîn-lk|ewekerdene|reh=d}}
=== Parametre ===
{| class="wikitable"
! Parametre !! Waneya wê !! Nimûne
|-
| <code>1</code> (yekem) || Şêweya nivîsandinê ya mesderê (ne mecbûrî; ji bo sernavê tabloyê tenê) || <code>ewekerdey</code>
|-
| <code>reh</code> || '''Mecbûrî.''' Rehê dema niha || <code>reh=ker</code>
|-
| <code>pre</code> || Pêşdengê/paşgira lêkerê ya kome (ene / ere / ewe). Bi dû hemû kesan ve tê xistin, ne li pêşiya mesderê || <code>pre=ewe</code>
|-
| <code>pre_p</code> || Şêweya kin a <code>pre</code>yê, dema forma tewandî bi konsonantekê an jî bi -î/-û biqede || <code>pre_p=ó</code>
|-
| <code>pêş</code> || Peyva/naveroka pêşîn a lêkerên hevedudanî (navdêr, rengdêr, hoker) || <code>pêş=zewq</code>
|-
| <code>modal</code> || <code>no</code>/<code>off</code>/<code>0</code> pêşgira dubareyî (m(i)-/b(i)-) radike; wekî din her du şêwe (bêpêşgir / bipêşgir) bi <code>/</code> tên nîşandan || <code>modal=no</code>
|}
=== Guhertina destan a kesan (lêkerên nerêzik) ===
Her yek ji van dikare bi destan were dagirtin; dema tijî be, ew form tê bikaranîn û ne ya hesabkirî:
{| class="wikitable"
! Dem !! Parametre
|-
| Dema niha || <code>prs_1sg</code>, <code>prs_2sg</code>, <code>prs_3sg</code>, <code>prs_1pl</code>, <code>prs_2pl</code>, <code>prs_3pl</code>
|-
| Fermanî (tenê kesê 2yem) || <code>imv_2sg</code>, <code>imv_2pl</code>
|-
| Dema borî ya nediyar || <code>ipf_1sg</code>, <code>ipf_2sg</code>, <code>ipf_3sg</code>, <code>ipf_1pl</code>, <code>ipf_2pl</code>, <code>ipf_3pl</code>
|}
<syntaxhighlight lang="wikitext">
{{hac-tewîn-lk|çûyene|reh=ç|prs_3sg=şo|ipf_3sg=çoşê}}
</syntaxhighlight>
=== Qeyd ===
* Cînavkên kesê sêyem (êḏ/aḏ, êḏe/aḏe, êḏê/aḏê) hovertext (dûr/nêzik) li ser xwe hene.
* Formên tewandî ti car cînsê (nêr/mê) nîşan nadin.
=== Çavkanî ===
* D. N. MacKenzie (1966), "The Dialect of Awroman", §26, hem jî binêre §33.
<includeonly>
[[Kategorî:Şablon]]
</includeonly>
hgtu66xrevzr4tjt00jqoa4ejv6w3jc
6292064
6292063
2026-07-29T19:44:20Z
Ghybu
1393
6292064
wikitext
text/x-wiki
{{belgekirin/binrûpel}}
== Bikaranîn ==
Şablonek e ji bo tewandina lêkeran di zaravayê '''hewramî''' de: dema niha, fermanî û dema borî ya nediyar.
<syntaxhighlight lang="wikitext">
{{hac-tewîn-lk|LÊKER|reh=REH}}
</syntaxhighlight>
=== Nimûne ===
<syntaxhighlight lang="wikitext">
{{hac-tewîn-lk|ewekerdey|reh=ker|pre=ewe|pre_p=ó}}
{{hac-tewîn-lk|zewq kerdey|reh=ker|pêş=zewq}}
</syntaxhighlight>
<syntaxhighlight lang="wikitext">
{{hac-tewîn-lk|ewekerdene|reh=d}}
</syntaxhighlight>
{{hac-tewîn-lk|ewekerdene|reh=d}}
=== Parametre ===
{| class="wikitable"
! Parametre !! Waneya wê !! Nimûne
|-
| <code>1</code> (yekem) || Şêweya nivîsandinê ya mesderê (ne mecbûrî; ji bo sernavê tabloyê tenê) || <code>ewekerdey</code>
|-
| <code>reh</code> || '''Mecbûrî.''' Rehê dema niha || <code>reh=ker</code>
|-
| <code>pre</code> || Pêşdengê/paşgira lêkerê ya kome (ene / ere / ewe). Bi dû hemû kesan ve tê xistin, ne li pêşiya mesderê || <code>pre=ewe</code>
|-
| <code>pre_p</code> || Şêweya kin a <code>pre</code>yê, dema forma tewandî bi konsonantekê an jî bi -î/-û biqede || <code>pre_p=ó</code>
|-
| <code>pêş</code> || Peyva/naveroka pêşîn a lêkerên hevedudanî (navdêr, rengdêr, hoker) || <code>pêş=zewq</code>
|-
| <code>modal</code> || <code>no</code>/<code>off</code>/<code>0</code> pêşgira dubareyî (m(i)-/b(i)-) radike; wekî din her du şêwe (bêpêşgir / bipêşgir) bi <code>/</code> tên nîşandan || <code>modal=no</code>
|}
=== Guhertina destan a kesan (lêkerên nerêzik) ===
Her yek ji van dikare bi destan were dagirtin; dema tijî be, ew form tê bikaranîn û ne ya hesabkirî:
{| class="wikitable"
! Dem !! Parametre
|-
| Dema niha || <code>prs_1sg</code>, <code>prs_2sg</code>, <code>prs_3sg</code>, <code>prs_1pl</code>, <code>prs_2pl</code>, <code>prs_3pl</code>
|-
| Fermanî (tenê kesê 2yem) || <code>imv_2sg</code>, <code>imv_2pl</code>
|-
| Dema borî ya nediyar || <code>ipf_1sg</code>, <code>ipf_2sg</code>, <code>ipf_3sg</code>, <code>ipf_1pl</code>, <code>ipf_2pl</code>, <code>ipf_3pl</code>
|}
<syntaxhighlight lang="wikitext">
{{hac-tewîn-lk|çûyene|reh=ç|prs_3sg=şo|ipf_3sg=çoşê}}
</syntaxhighlight>
=== Qeyd ===
* Cînavkên kesê sêyem (êḏ/aḏ, êḏe/aḏe, êḏê/aḏê) hovertext (dûr/nêzik) li ser xwe hene.
* Formên tewandî ti car cînsê (nêr/mê) nîşan nadin.
=== Çavkanî ===
* D. N. MacKenzie (1966), "The Dialect of Awroman", §26, hem jî binêre §33.
<includeonly>
[[Kategorî:Şablon]]
</includeonly>
9yxgvwx1vcqahqtoyte7ngzvuwypdj5
ئامای
0
1357785
6292056
6241910
2026-07-29T19:26:30Z
Ghybu
1393
/* {{ziman|hac}} */ format
6292056
wikitext
text/x-wiki
== {{ziman|hac}} ==
=== Bilêvkirin ===
* {{hac-IPA|amay}}
=== Lêker ===
{{lêker|hac|c=}}
# {{g|ku|hatin}}
==== Jê ====
* {{g|hac|ئەوەئامای}}
==== Tewandin ====
{{hac-tewîn-lk|amay|reh=e
|prs_1sg=mew|prs_2sg=mey|prs_3sg=mê|prs_1pl=meymê|prs_2pl=meydê|prs_3pl=meya
|imv_2sg=bo|imv_2pl=beydê
|ipf_1sg=ênê|ipf_2sg=ênî|ipf_3sg=ê|ipf_1pl=ênmê|ipf_2pl=êndê|ipf_3pl=ênê
}}
==== Etîmolojî ====
Hevreha {{hv|zza|amayene}}, {{hv|ckb|hatin}}, {{hv|ku|hatin}}.
emvu9uv63de67x9e2o40kffsil0sje5
Wîkîferheng:Xebat
4
1357857
6292088
6291975
2026-07-29T21:42:41Z
Wikihez
7344
/* Mediawiki:Gadget-linkify.js */ Bersiv
6292088
wikitext
text/x-wiki
{{/ser}}
= Karên ferhengî =
== Mane ==
* [[:Kategorî:Madeyên bê beşa mane]]
** [[:Kategorî:Madeyên bê beşa mane bi kurmancî]]
Li ser van rûpelan ev made hene ku maneyan wan nehatine nivîsin û divê werin nivîsin. —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:17, 16 tîrmeh 2026 (UTC)
== Etîmolojî ==
*[[:Kategorî:Daxwazên etîmolojiyê]]
**[[:Kategorî:Daxwazên etîmolojiyê bi kurmancî]]
Li ser van rûpelan ev made hene ku etîmolojiya wan hîn nehatine nivîsin. Ji bo alîkariyê binêre [[WF:Etîmolojî]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:17, 16 tîrmeh 2026 (UTC)
== Cureyê rêzimanî ==
* [[:Kategorî:Gotarên bê kategoriya rêzimanî]]
* [[:Kategorî:Gotarên bê kategoriya rêzimanî bi kurmancî]]
Li ser van rûpelan ev made hene ku cureyên wan yên rêzimanî hîn nehatine nivîsin. Ji bo alîkariyê binêre [[Alîkarî:Cureyên peyvan]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:17, 16 tîrmeh 2026 (UTC)
== Kontrol ==
* [[:Kategorî:Kontrol]]
** [[:Kategorî:Kontrola maneyê]]
Ev madde bi botê hatine çêkirin, yek bi yek divê werin kontrolkirin. —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:17, 16 tîrmeh 2026 (UTC)
= Şablon =
== IPA ==
* {{ş|IPA}} divê [[Modul:IPA]] bi kar bîne. —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:17, 16 tîrmeh 2026 (UTC)
== Deng ==
Kurdîkirina belgekirina {{ş|deng}} lazim e.--[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 00:06, 19 tîrmeh 2026 (UTC)
= Modul =
== Modul:form of/templates ==
* [[Modul:form of/templates]]: Divê ev modul were rojanekirin û xeletiyên berê wekî ([[hevalê]]) werin rastkirin. —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:17, 16 tîrmeh 2026 (UTC)
*:Merheba @[[Bikarhêner:Ghybu|Ghybu]] Te gotibû di vê modulê de xeletî hene, jkx tu dikarî li vir binivîsî çi kêmasî hene, daku wextê rojane dikim ez ji bîr nekim? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:16, 21 tîrmeh 2026 (UTC)
*::Silav. Nizanim ji bîra min çûye... Herwiha ji bo çêkirina formên navdêran zanînên cîns û tîpa dawî bes e:
*::* (-ê, mê) => çemandî, bangkirin
*::* (-ê, nêr) => îzafe
*::* (-ê, mê û nêr) => îzafe (nêr), bangkirin (mê), çemandî (mê)
*::* (-a) => îzafe (mê)
*::* (-ekî) => îzafe û çemandî (nêr, nebinavkirî)
*::* (-eke) = > îzafe (mê, nebinavkirî)
*::* ...
*:: <code>if find(mw.title.getCurrentTitle().subpageText, 'ekî$') then ... end</code>
*::<code><nowiki>{{ku-tewîn-navForm|<navdêr>|<zayend>}</nowiki></code>
*::Tablo û nivîs di yekcarî de tên çêkirin...
*::Feqet problem lêzêdekirina mînakan e. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 17:34, 21 tîrmeh 2026 (UTC)
*:::Lêzêdekirina kîjan nimûneyan? Ev koda js ji bo çi ye? Qisûrê nenêre min fêm nekir :/ [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 18:13, 21 tîrmeh 2026 (UTC)
*::::Li vira ([[hevalê#Formeke navdêrê]]) di bin maneyên 1. û 2. mînak nayên tevlî kirin :) [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 18:18, 21 tîrmeh 2026 (UTC)
*:::::Ev tercîh e, ne mecbûrî ye, em dikarin [https://ku.wiktionary.org/w/index.php?title=heval%C3%AA&diff=prev&oldid=6276350 wisa] bikin. Wekî din? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 18:29, 21 tîrmeh 2026 (UTC)
*::::::Min li jor tênê got ku tenê parametreyên "navdêr" û "zayend" hewce nee. Bi '''[//ku.wiktionary.org/w/index.php?title=heval%C3%AA&curid=969734&diff=6276353&oldid=6276350 vî]''' awayî jî tê çêkirin. Parametreyên din ne hewce ne. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 18:38, 21 tîrmeh 2026 (UTC)
*:::::::Ji bo wê şabloneke din lazim e, bila ev şablon wekî îngilîzî bimîne em ji bo kurmancî yekî din çêkin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 18:42, 21 tîrmeh 2026 (UTC)
*::::::::[https://ku.wiktionary.org/w/index.php?title=heval%C3%AA&oldid=6276885 wisa] çawa ye? Bi min nivîsîna nimûneyan zêde ne lazim e ji ber ku ti kes serê xwe pê naêşîne. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:46, 23 tîrmeh 2026 (UTC)
*:::::::::@[[Bikarhêner:Ghybu|Ghybu]] Vê şablonê bi kar bînin an na? Navê şablonê kê çi be? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 19:07, 24 tîrmeh 2026 (UTC)
== Modul:columns ==
* [[Modul:columns]] were rojanekirin û {{ş|kol3}} bila lînka ''nîşan bide'' deyne beriya sernavê, kolê di qutiya rengî de bila nebe. —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:17, 16 tîrmeh 2026 (UTC)
== Modul:etymon ==
* [[Modul:etymon kevn]]: Rojanekirin hewce ye. —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:17, 16 tîrmeh 2026 (UTC)
== [[Modul:ziman/code to canonical name]] ==
Belgekirina skrîptê û js divê were rastkirin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:31, 22 tîrmeh 2026 (UTC)
:* [[MediaWiki:UpdateLanguageNameAndCode.js]]
:[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:50, 22 tîrmeh 2026 (UTC)
::* [[Modul:ziman/print]]
::[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:52, 22 tîrmeh 2026 (UTC)
:::*[[Modul:ziman/şablon]]
:::[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:56, 22 tîrmeh 2026 (UTC)
::::* [[MediaWiki:Gadget-translation editor.js/ziman.json]]
::::[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 11:06, 22 tîrmeh 2026 (UTC)
= Javascript =
== [[Mediawiki:Gadget-citoid-helper.js]] ==
Ji bo bi citoidê kopîkirina malûmatên çavkaniyan amûreke wisa lazim e. Xisûsen ji ber ku bi çend amûrên din dikare were bikaranîn.
Feqat çend problem hene, şablonên me de kêmasiya parametreyan gelek in û xerîteyên citoidê hîn nehatine çêkirin. Wana sererast bikin dûre vê amûrê çêkin, piştre [[MediaWiki:Gadget-start.js|start.js]] û [[MediaWiki:Gadget-wikt.add-examples.js|add examples.js]] were rojanekirin.
- --[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 00:04, 19 tîrmeh 2026 (UTC)
:Merheba @[[Bikarhêner:Bikarhêner|Bikarhêner]], ez dibêjim karê Modul:quote zêde wext bistîne, bila em dest bi bikaranîna van amûran bikin dûre kêmasiyan em ê temam bikin înşela. Dikarî vana li cihên xwe yên rast kopî paste bikî?
# [[Bikarhêner:Wikihez/skrîpt/js/Gadget-citoid-helper.js]] --> [[Mediawiki:Gadget-citoid-helper.js]]
# Ya li jêr kopî bike qismê herî dawî ya AmûrênVeşartî li [[MediaWiki:Gadgets-definition]]:
## <code><nowiki>* citoid-helper[ResourceLoader|hidden|default|dependencies=mediawiki.util]|citoid-helper.js</nowiki></code>
--[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:58, 26 tîrmeh 2026 (UTC)
== [[MediaWiki:Gadget-start.js]] ==
Rojanekirin hewce ye. Min gelek tişt lê zêde kir lê ez niha test dikime. Piştre em bar bikin:
* [[Bikarhêner:Wikihez/Gadget-start.js]] --> [[MediaWiki:Gadget-start.js]]
* [[Bikarhêner:Wikihez/Gadget-start.css]] --> [[MediaWiki:Gadget-start.css]]
--[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:08, 17 tîrmeh 2026 (UTC)
:Min [[MediaWiki:Gadget-start.js/data.json|data.json]] çêkir ji bo ku bi hêsanî malûmatên heyî werin guhartin bêyî guhartina Javascriptê. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 19:49, 18 tîrmeh 2026 (UTC)
:Xeletiyên ku ji bîr nekim rast bikim:
:* Wextê min çavkanî "kitêb" hilbijart û bi destî tije kir xeletiyeke [https://ku.wiktionary.org/w/index.php?title=xezete&diff=prev&oldid=6265392 wisa] derket her kelîme hate lînkkirin.
:* <code>html("⠿")</code> ev ne lazim e.
:* textarea ji bo çavkaniyên jêgirtinan xaseten yên sernav hîn jî ne draggable e.
:* pêşdîtina zindî checkbox wextê tê rakirin, pêşdîtin winda nabe.
:* Butona mobîlê ya vekirina formê di moda tarî de belî nabe, tenê wekî qutiyeke tarî xuya dibe.
:* Metna hişyarkirinê di guhartina rûpelên heyî de lazim e baştir bikim.
:[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:51, 18 tîrmeh 2026 (UTC)
::Ev problem çêbûn, ez ê binêrim ka çi problemên din hene. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 14:15, 19 tîrmeh 2026 (UTC)
:::Çêke: Ji bo qismê çavkaniyê yek dikare API call û Kategorî:Çavkanî bi kar bîne ji bo ku şablon zêde bikî ji yên heyî. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:21, 19 tîrmeh 2026 (UTC)
::::Ev jî çêbû, min beşa çavkanî jî çêkir. Eger xeletî dernekeve û problema valahiya piştî etîketê ji bîr nekim, piştî rojanekirina amûrên linkify, û citoid em dikarin bar bikin. Ez ê ti tiştê nû îlawe nekim, zêde dirêj bû. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:14, 21 tîrmeh 2026 (UTC)
== [[Mediawiki:Gadget-QQ.js]] ==
Ev amûr di şikle Minerva de. Her daîm vê xeletiyê dide:
<syntaxhighlight lang="js">
TypeError: Cannot read properties of null (reading 'addEventListener') at css () at runScript () at Array.<anonymous> () at flushCssBuffer ()
</syntaxhighlight> [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 19:29, 18 tîrmeh 2026 (UTC)
:* [[Bikarhêner:Wikihez/skrîpt/js/Gadget-QQ.js]] --> [[Mediawiki:Gadget-QQ.js]]
:* [[Bikarhêner:Wikihez/Gadget-QQ.css]] --> [[Mediawiki:Gadget-QQ.css]]
:Ez dibêjim çêbû lê ka çend roj biceribînim. Tiştên ku hatin sererastkirin:
:# Google Books API Key dikarî zêde bikî, dixe cookies û di gerokê de dimîne. Berê bê API Key dixebitiya lê êdî mecbûr e ku API Key-a te hebe, bidestxistina wê ne zêde zor e lê dîsa jî tevlihev e.
:# Êdî di mobîlê de dixebite, heta di mobîlê de xweştir xuya dike.
:# Moda tarî
:# OOUI dewsa jquery.ui
:# Li qutiyê çi dixwazî zêde bikî, dikare li gorî îsm, sifet, fiîl bitewîne. Lê ji bo fiîl tenê dikare çend heb inflection bîne.
:# Butona paqij bike lê zêde kir.
:# Çend paqijiyên jêgirtinên Google Kitêbê niha hene.
:[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:38, 18 tîrmeh 2026 (UTC)
::Tewandina fiîlan û xeletiya modulê lazim e were rastkirin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 14:40, 21 tîrmeh 2026 (UTC)
== [[MediaWiki:Gadget-wikt.add-examples.js]] ==
Min ev amûr hinek rojane kir feqat çend problem hene berî ku bar bikin.
Tiştên ku min guhart:
# Êdî li sayfeyên bi {{ş|maneid}} jî dixebite,
# Cihê di wîkîtekstê de yê ku jêgirtin were îlawekirin baştir bû,
# [[Mediawiki:Gadget-citoid-helper.js|citoid helper]] zêde kir ji bo ku bi hêsanî çavkanî bi riya doi, isbn an urlyê werin tijîkirin.
* [[Bikarhêner:Wikihez/Gadget-wikt.add-examples.css]] --> [[MediaWiki:Gadget-wikt.add-examples.css]]
* [[Bikarhêner:Wikihez/Gadget-wikt.add-examples.js]] --> [[MediaWiki:Gadget-wikt.add-examples.js]]
- --[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 00:50, 19 tîrmeh 2026 (UTC)
:Min "wikt." qismên cache kirinê ya wîkiya fransî bi [[MediaWiki:Gadget-StorageUtils.js]] guhartiye. loma ji bîr nekin wê amûrê li [[MediaWiki:Gadgets-definition]] zêde bikin. û navê amûrê jî biguhêrînin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:15, 23 tîrmeh 2026 (UTC)
== Gadget-translation editor ==
* [[MediaWiki:Gadget-translation editor.js]]: divê formata en.wîktê were bikaranîn ji ber ku me gelek tercime ji en.wîktê kopî kir û ev js hîn nikare formata wekî li jêr bi kar bîne.
<syntaxhighlight lang="wikitext">
* {{Z|sh}}:
*: Kirîlî:
*: Latînî
</syntaxhighlight>
—[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:17, 16 tîrmeh 2026 (UTC)
== [[Mediawiki:Gadget-linkify.js]] ==
* ''rûpeleke'' wekî<syntaxhighlight lang="wikitext">[[rûpeleke]]</syntaxhighlight> lînk dike, bi regexê belkî dikare wisa bike <syntaxhighlight lang="wikitext">[[rûpel]]eke</syntaxhighlight>
—[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:17, 16 tîrmeh 2026 (UTC)
* Amûreke din wekî [[User:Wikihez/Gadget-linkify.js|linkify]] lazim e ku herfên mezin biçûk bike ji bo kurmancî.—[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:17, 16 tîrmeh 2026 (UTC)
:{{r|Bikarhêner}} Merheba bira, dikarî viya jî bar bikî?:
* [[User:Wikihez/Gadget-linkify.js|linkify]] --> [[Mediawiki:Gadget-linkify.js]]
Spas--[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 11:42, 29 tîrmeh 2026 (UTC)
:Dûre [https://ku.wiktionary.org/wiki/MediaWiki:Gadget-start.js#L-283 li vir] wiktviLinkify bike kuLinkify xêra xwe [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 11:51, 29 tîrmeh 2026 (UTC)
::Min ji bîr kir lê zêde bikim niha nikare "Dİ" bike "di", xeletiyeke berbelav a di nivîsên kurdî de, herfên din ên wekî ll yan rr jî hewce ne werin zêdekirin. Dûre em zêde bikin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:42, 29 tîrmeh 2026 (UTC)
== Amûra manayê ==
Amûreke din ji bo nivîsina maneyê wekî Nimûne zêde bike lazim e [https://ku.wiktionary.org/w/index.php?title=Bikarh%C3%AAner:Wikihez/test.js&oldid=6276876 js] [https://ku.wiktionary.org/w/index.php?title=%C5%9Eablon:ceribandin2&oldid=6265629 şablon] [https://ku.wiktionary.org/w/index.php?title=Bikarh%C3%AAner:Wikihez/common.css&oldid=6265642 css] --[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:12, 23 tîrmeh 2026 (UTC)
== [[MediaWiki:Gadget-jeder.js]] ==
@[[Bikarhêner:Ghybu|Ghybu]] Çavkaniyên jêderê di moda pêşdîtinê de jêderê vedişêre, ew jî min gelek eciz dike wextê çavkanî zêde dikim. Min ji Claude pirsî û kodan nîşanî wê da, wisa cewab da:
Yes — and this file actually explains the whole thing precisely, better than my earlier guess about extract-stripping.
What's happening: the CSS rule
<syntaxhighlight lang="css">
.jeder{
display:none;
}
</syntaxhighlight>
hides every citation by default, *unconditionally*. The only thing that ever makes it visible again is the gadget's JS: it finds each `.jeder`, builds the short "`— (year, author, +)`" summary from the `.j-pewist` fields, and either reveals the short version or — for citations with no `.j-pewist` fields — explicitly sets `display:inline` on the original.
So visibility of citations depends entirely on this JS running. In the normal article view (Image 1) it runs, so you see the collapsed "`(1918, E. Rehmî Ji Mala Hekariyan, Amadekar: M. E. Bozarslan, +)`" form. In whatever generated Image 2 — a hover-preview/extract/API render — gadget JS doesn't execute, so nothing ever removes the `display:none`, and the citation vanishes completely rather than degrading to "still visible, just not collapsed."
<b>The fix:</b> flip the default so the *un-collapsed* state is the safe fallback, and let JS do the hiding only after it successfully builds the short version. That way, any context without JS shows the full citation instead of nothing.
CSS — remove the blanket hide:
<syntaxhighlight lang="css">
.jeder {
/* intentionally no display:none here — see Gadget-... .js */
}
</syntaxhighlight>
JS — do the hiding from script, after the short form exists:
{{veşêre-ser}}
<syntaxhighlight lang="js">
// Ji bo şablonên [[Şablon:jêder]] hatiye nivîsandin.
// Parametreyên ku di navbera "<span class="j-pewist">...</span>" an "{{j-pêwîst|...}}" de ne venaşêre.
$(function() {
function nivisaKurtTevliBike(sund, nivisKurt) {
var zede = $('<a>+</a>')
.addClass('click')
.attr('href', '#')
.attr('title', 'zêdetir')
.css('font-weight', 'bold');
var kurt = $(' <a>↩</a>')
.addClass('click-kurt')
.attr('href', '#')
.attr('title', 'veşêre')
.css('font-weight', 'bold');
$('<span>' + nivisKurt + '</span>')
.append(zede).append(')')
.addClass('jeder-kurt')
.css('font-size', '0.85em')
.insertAfter(sund);
sund.append(' ').append(kurt);
// Only hide the full citation once the short summary actually exists.
// If this script never runs (no-JS clients, hover-preview extracts,
// action=render, etc.), the full citation stays visible instead of
// silently disappearing.
sund.css('display', 'none');
}
function vesere() {
$('.jeder').each(function() {
var elmTab = $(this).find('.j-pewist').clone();
if (elmTab.length) {
var elm = '';
for (var i = elmTab.length - 1; i >= 0; i--) {
elm = elmTab.eq(i).html() + ', ' + elm;
}
var nivisKurt = ' — (' + elm;
nivisaKurtTevliBike($(this), nivisKurt);
}
// else: no j-pewist fields to shorten — leave the full citation
// as it already renders (visible), nothing to do.
});
}
vesere();
$(".click").click(function(e) {
e.preventDefault();
$(this).parent('.jeder-kurt').css('display', 'none');
$(this).parent('.jeder-kurt').prev().css('display', 'inline');
});
$(".click-kurt").click(function(e) {
e.preventDefault();
$(this).parent('.jeder').css('display', 'none');
$(this).parent('.jeder').next().css('display', 'inline');
});
});
</syntaxhighlight>
Net effect:
- JS-enabled readers (normal article view): identical experience to today — collapsed short form with `+`/`↩` toggle.
- No-JS contexts (previews, extracts, screen readers before JS loads, print, etc.): full citation is shown instead of nothing — a real regression fix rather than a cosmetic one.
One caveat worth being upfront about: this fixes it *if* the preview context renders the gadget's HTML/CSS but doesn't execute gadget JS (which is the far more common case, and what this code strongly suggests is happening). If Image 2 instead comes from a pipeline that strips the `.jeder`/`.jegirtin-text` elements out of the HTML entirely before this CSS/JS even gets a chance to apply, no on-wiki CSS/JS change can help — that'd need the extract-generation config changed instead. Given what this gadget file shows, though, I'd bet on the CSS-hide explanation.
{{veşêre-bin}}
Em dûre biceribînin eger xeletî tinebe, vî tiştî jî rast bikin. --[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:00, 23 tîrmeh 2026 (UTC)
:Ez APIya MediaWiki rind nizanim belkî Claude dizane:) Em nikarin bibêjin dema ku moda "''action=edit''" e fonksiyona <code>function vesere()</code> bi kar meyîne. [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 15:57, 24 tîrmeh 2026 (UTC)
::Na, di moda "edît"-ê de <code>var elmTab = null</code>... [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 16:13, 24 tîrmeh 2026 (UTC)
?:
<syntaxhighlight lang="js">
if (
mw.config.get('wgAction') === 'edit' ||
mw.config.get('wgAction') === 'submit'
){
var elmTab = [];
} else {
var elmTab = $(this).find('.j-pewist').clone();
}
</syntaxhighlight>
--[[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 16:31, 24 tîrmeh 2026 (UTC)
:Ez jî nizanim Claude çiqas ji mediawiki fêm dike lê heta niha ti tişt nîne ku min jê pirs kir û nikaribû çêke, bila wekî reklam nebe feqat Claude mikemmel e, dibêjim "li vir çima xeletiyeke wisa derdikeve" di dosyeya 2000 rêzî de diçe tiştê xelet tenê rast dike tiştekî din naguherîne. Chatgpt û aistudio qet wisa nakin, eynî dosyeyê deh cara dinivîsin, deh netîceyên cuda derdikevin :D
:Em dikarin vê amûrê wextê edit û submitê neaktîv bikin wekî <syntaxhighlight lang="js">if (!(action === "edit" || action === "submit")) {
:return;</syntaxhighlight> lê wê demê display:none wê çibe nizanim. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 18:23, 24 tîrmeh 2026 (UTC)
::display:none ne hewce ye ma jixwe di nav kodê [https://ku.wiktionary.org/w/index.php?title=MediaWiki:Gadget-jeder.js&oldid=6069025#L-49 L-49] de inline/none heye? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 18:53, 24 tîrmeh 2026 (UTC)
:Min bi vî şiklî [https://ku.wiktionary.org/w/index.php?title=Bikarh%C3%AAner:Wikihez/vector-2022.js&diff=prev&oldid=6290816#L-28] ceriband feqat nexebitî. "display:none" di pêşdîtinê de dixebite feqat js naşixule. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 14:43, 25 tîrmeh 2026 (UTC)
::Kodên JSê pir hez nakim (pêşta hukurina APIya MWyê hewce bû) dîsa jî ez ê seh bikim :) [[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 16:49, 27 tîrmeh 2026 (UTC)
:::Ez niha bi vî şiklî [https://ku.wiktionary.org/w/index.php?title=Bikarh%C3%AAner:Wikihez/test.js&oldid=6290820] [https://ku.wiktionary.org/w/index.php?title=Bikarh%C3%AAner:Wikihez/common.css&oldid=6290821#L-8] bi kar tînim ti problem nîne. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 17:09, 27 tîrmeh 2026 (UTC)
= Moda tarî =
== mane? ==
* {{ş|mane?}} —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:17, 16 tîrmeh 2026 (UTC)
== bêçavkanî ==
* {{ş|bêçavkanî}} —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:17, 16 tîrmeh 2026 (UTC)
== de-tew-nerm-ern ==
* {{ş|de-tew-nerm-ern}} —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:17, 16 tîrmeh 2026 (UTC)
= Bot =
Karên ku bi botê werin çêkirin ji kerema xwe li vir binivîsin.
== Kategorî:Biwêj ==
[[:Kategorî:Biwêj]] divê were paqijkirin, lîsteya madeyên {{ş|biwêj}} çêke, yên ku tê de bûn, kirin, man hene filtre bike yên din bi destî tê çêkirin.—[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:17, 16 tîrmeh 2026 (UTC)
== Jêgirtin ==
Xistina jêgirtinên beşa [https://ku.wiktionary.org/w/index.php?search=insource%3A%2F%3D+*Ji+%5BWw%5D%C3%AAjey%C3%AA+*%3D%2F&title=Taybet%3AL%C3%AAger%C3%AEn&profile=advanced&fulltext=1&ns0=1&searchToken=8rh0bmw8dccsi7aynl6zli8uf ji wêjeyê] li beşa maneyê. —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:17, 16 tîrmeh 2026 (UTC)
== Bota Toolforgeê ==
Botekî Toolforgeê lazim e ji bo ku xeletiyên biçûk wekî şablonên bi navên îngilîzî werin kurdîkirin yan jî valahiya beşan rast bike û hwd.—[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:17, 16 tîrmeh 2026 (UTC)
== Updatew ==
Bota [[Bikarhêner:Wikihez/skrîpt/py/updateW.py|updateW]] divê were rojanekirin. Yan jî yekî nû were çêkirin. Şablonên {{ş|W}} di beşa tercimeyan de sererast dike û zimanan rêz dike. Ya niha xeletiya navê zimanî dide.—[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:17, 16 tîrmeh 2026 (UTC)
== sihir --> sêhr ==
Tercimeyên ''[[sêhr]]'' hemû dibêje ''sihir'' loma bi botê lazim e kirin ''sêhr''. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 17:43, 18 tîrmeh 2026 (UTC)
:Sihirbaz --> sêhrbaz [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 18:07, 18 tîrmeh 2026 (UTC)
== Tercimeyên dîroknas ==
Li tercimeyên [[dîroknas]], hevmaneyên wê hewce ye were îlawekirin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 18:44, 18 tîrmeh 2026 (UTC)
== Mewlûd ==
Sererastkirina jêgirtinên mewlûdê [https://ku.wiktionary.org/w/index.php?search=insource%3A%2Fw%5C%3AMela+His%C3%AAn%C3%AA+Batey%C3%AE%2F&title=Taybet%3AL%C3%AAger%C3%AEn&ns0=1&searchToken=8m0tguy3sqt7edr4sg0u8hedo] wekî [https://ku.wiktionary.org/w/index.php?title=dax%C3%AEdar&curid=284303&diff=6265851&oldid=6142285] [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:43, 20 tîrmeh 2026 (UTC)
bwqw5f67izmuqcdfg7ts03fewivrkam
Bikarhêner:Wikihez/ceribandin
2
1357863
6292078
6277004
2026-07-29T20:34:22Z
Wikihez
7344
6292078
wikitext
text/x-wiki
== lmea ==
{| class="wikitable"
!subcategory!!item_count!!subcategory_count
|-
|Lema_bi_kurmancî||160941||27
|-
|Lema_bi_îngilîzî||64960||24
|-
|Lema_bi_tirkî||63177||21
|-
|Lema_bi_almanî||25958||22
|-
|Lema_bi_polonî||15447||14
|-
|Lema_bi_japonî||13399||14
|-
|Lema_bi_farisî||10285||19
|-
|Lema_bi_sirboxirwatî||6644||13
|-
|Lema_bi_fransî||6377||16
|-
|Lema_bi_gurcî||5826||13
|-
|Lema_bi_îtalî||5318||14
|-
|Lema_bi_fînî||5187||15
|-
|Lema_bi_rusî||5045||15
|-
|Lema_bi_spanî||4713||14
|-
|Lema_bi_erebî||4566||18
|-
|Lema_bi_holendî||4165||14
|-
|Lema_bi_hindî||4102||13
|-
|Lema_bi_çekî||3880||13
|-
|Lema_bi_mandarînî||3842||13
|-
|Lema_bi_portugalî||3645||14
|-
|Lema_bi_ûkraynî||3594||13
|-
|Lema_bi_mecarî||3558||13
|-
|Lema_bi_koreyî||3517||15
|-
|Lema_bi_belarusî||3508||13
|-
|Lema_bi_latînî||3464||14
|-
|Lema_bi_soranî||3449||20
|-
|Lema_bi_swêdî||3311||14
|-
|Lema_bi_ermenî||3268||14
|-
|Lema_bi_bulgarî||3219||13
|-
|Lema_bi_romanyayî||3199||12
|-
|Lema_bi_danmarkî||3130||13
|-
|Lema_bi_galîsî||3130||13
|-
|Lema_bi_yûnanî||3113||14
|-
|Lema_bi_esperantoyî||3086||16
|-
|Lema_bi_tagalogî||3018||14
|-
|Lema_bi_ferî||2967||13
|-
|Lema_bi_viyetnamî||2936||12
|-
|Lema_bi_katalanî||2933||13
|-
|Lema_bi_îzlendî||2892||13
|-
|Lema_bi_estonî||2827||13
|-
|Lema_bi_azerî||2822||14
|-
|Lema_bi_sebwanoyî||2681||13
|-
|Lema_bi_makedonî||2665||13
|-
|Lema_bi_îbranî||2642||14
|-
|Lema_bi_tayî||2608||13
|-
|Lema_bi_latviyayî||2606||13
|-
|Lema_bi_slovakî||2552||13
|-
|Lema_bi_malezî||2540||13
|-
|Lema_bi_îrlendî||2505||13
|-
|Lema_bi_tacikî||2491||12
|-
|Lema_bi_yûnaniya_kevn||2418||12
|-
|Lema_bi_slovenî||2406||12
|-
|Lema_bi_qazaxî||2358||13
|-
|Lema_bi_maorî||2335||13
|-
|Lema_bi_mongolî||2281||12
|-
|Lema_bi_albanî||2280||13
|-
|Lema_bi_ozbekî||2240||13
|-
|Lema_bi_lîtwanî||2221||13
|-
|Lema_bi_urdûyî||2190||14
|-
|Lema_bi_ximêrî||2190||13
|-
|Lema_bi_endonezyayî||2059||14
|-
|Lema_bi_weylsî||2037||12
|-
|Lema_bi_lawsî||2029||13
|-
|Lema_bi_bengalî||2016||12
|-
|Lema_bi_zazakî||1992||15
|-
|Lema_bi_kirgizî||1971||12
|-
|Lema_bi_yidîşî||1917||13
|-
|Lema_bi_gaelîka_skotî||1903||11
|-
|Lema_bi_burmayî||1860||13
|-
|Lema_bi_telûgûyî||1802||11
|-
|Lema_bi_norweciya_bokmålî||1790||11
|-
|Lema_bi_çînî||1670||6
|-
|Lema_bi_peştûyî||1600||12
|-
|Lema_bi_baskî||1588||13
|-
|Lema_bi_oksîtanî||1577||12
|-
|Lema_bi_swahîlî||1547||14
|-
|Lema_bi_astûrî||1536||13
|-
|Lema_bi_afrîkansî||1535||13
|-
|Lema_bi_tirkmenî||1521||11
|-
|Lema_bi_norweciya_nînorskî||1508||12
|-
|Lema_bi_kantonî||1502||12
|-
|Lema_bi_oygurî||1483||12
|-
|Lema_bi_romancî||1455||10
|-
|Lema_bi_sardînî||1447||12
|-
|Lema_bi_volapûkî||1379||10
|-
|Lema_bi_îdoyî||1377||14
|-
|Lema_bi_malayalamî||1370||11
|-
|Lema_bi_maltayî||1348||13
|-
|Lema_bi_başkîrî||1339||12
|-
|Lema_bi_tamîlî||1327||13
|-
|Lema_bi_îngilîziya_kevn||1243||12
|-
|Lema_bi_sanskrîtî||1228||12
|-
|Lema_bi_teterî||1220||10
|-
|Lema_bi_aromanî||1217||12
|-
|Lema_bi_normandî||1180||11
|-
|Lema_bi_norwecî||1154||14
|-
|Lema_bi_sicîlî||1143||10
|-
|Lema_bi_bretonî||1137||13
|-
|Lema_bi_asamî||1132||11
|-
|Lema_bi_tîbetî||1109||10
|-
|Lema_bi_minnanî||1105||10
|-
|Lema_bi_navajoyî||1077||13
|-
|Lema_bi_frîsî||1063||13
|-
|Lema_bi_puncabî||1057||11
|-
|Lema_bi_venîsî||1055||10
|-
|Lema_bi_friyolî||1019||11
|-
|Lema_bi_walonî||992||12
|-
|Lema_bi_hawayî||964||12
|-
|Lema_bi_luksembûrgî||961||13
|-
|Lema_bi_amharî||949||11
|-
|Lema_bi_erebiya_misrî||938||11
|-
|Lema_bi_înterlîngua||921||11
|-
|Lema_bi_kalalîsûtî||916||10
|-
|Lema_bi_maratî||914||11
|-
|Lema_bi_manksî||911||10
|-
|Lema_bi_keçwayî||898||11
|-
|Lema_bi_sorbiya_jêrîn||876||12
|-
|Lema_bi_kîngalî||867||11
|-
|Lema_bi_kannadayî||834||10
|-
|Lema_bi_kurdiya_başûrî||830||12
|-
|Lema_bi_osmanî||774||10
|-
|Lema_bi_gujaratî||771||11
|-
|Lema_bi_çeçenî||766||11
|-
|Lema_bi_javayî||751||11
|-
|Lema_bi_plodîşî||750||8
|-
|Lema_bi_çerokî||745||11
|-
|Lema_bi_nedersaksî||739||11
|-
|Lema_bi_erebiya_hîcazî||718||11
|-
|Lema_bi_slaviya_kevn||713||11
|-
|Lema_bi_nepalî||696||11
|-
|Lema_bi_kornî||696||10
|-
|Lema_bi_sorbiya_jorîn||661||10
|-
|Lema_bi_zhuangî||660||10
|-
|Lema_bi_osetî||655||13
|-
|Lema_bi_samiya_bakurî||654||13
|-
|Lema_bi_dunganî||648||10
|-
|Lema_bi_îngriyî||633||9
|-
|Lema_bi_skotî||626||12
|-
|Lema_bi_gotî||626||11
|-
|Lema_bi_oriyayî||624||9
|-
|Lema_bi_mançûyî||614||10
|-
|Lema_bi_teteriya_krîmî||610||10
|-
|Lema_bi_latgalî||610||10
|-
|Lema_bi_yakutî||592||11
|-
|Lema_bi_haîtî||590||10
|-
|Lema_bi_erebiya_fasî||580||11
|-
|Lema_bi_hawsayî||544||9
|-
|Lema_bi_zuluyî||539||10
|-
|Lema_bi_çuvaşî||524||10
|-
|Lema_bi_yorubayî||517||10
|-
|Lema_bi_abxazî||511||10
|-
|Lema_bi_somalî||510||10
|-
|Lema_bi_frîsiya_bakur||507||9
|-
|Lema_bi_ladînoyî||505||10
|-
|Lema_bi_aragonî||502||10
|-
|Lema_bi_tigrînî||494||11
|-
|Lema_bi_aramiya_nû_ya_asûrî||487||9
|-
|Lema_bi_hakkayî||481||9
|-
|Lema_bi_îngilîziya_navîn||480||10
|-
|Lema_bi_palî||474||6
|-
|Lema_bi_navzimanî||472||7
|-
|Lema_bi_çîçewayî||456||10
|-
|Lema_bi_oromoyî||453||8
|-
|Lema_bi_almaniya_jêrîn_a_almanî||450||9
|-
|Lema_bi_lombardî||449||9
|-
|Lema_bi_kaşûbî||445||8
|-
|Lema_bi_altayiya_başûrî||436||10
|-
|Lema_bi_aramî||432||11
|-
|Lema_bi_bîkoliya_naverast||426||11
|-
|Lema_bi_korsîkayî||423||10
|-
|Lema_bi_ojibweyî||422||11
|-
|Lema_bi_papyamentoyî||421||10
|-
|Lema_bi_rusînî||420||11
|-
|Lema_bi_avarî||412||9
|-
|Lema_bi_toxarî_B||410||8
|-
|Lema_bi_kalmîkî||410||9
|-
|Lema_bi_qiptî||402||9
|-
|Lema_bi_malagasî||401||10
|-
|Lema_bi_napolîtanî||400||11
|-
|Lema_bi_elmanîşî||395||11
|-
|Lema_bi_dalmatî||393||8
|-
|Lema_bi_guwaranî||393||11
|-
|Lema_bi_slaviya_rojavayî_ya_kevn||393||9
|-
|Lema_bi_tuvanî||392||11
|-
|Lema_bi_divehî||391||10
|-
|Lema_bi_adîgeyî||389||9
|-
|Lema_bi_buryatî||387||8
|-
|Lema_bi_wuyî||384||9
|-
|Lema_bi_kapampanganî||376||11
|-
|Lema_bi_erzayî||357||9
|-
|Lema_bi_udmurtî||347||9
|-
|Lema_bi_lueyî||346||8
|-
|Lema_bi_romanî||346||11
|-
|Lema_bi_sundanî||339||11
|-
|Lema_bi_îlokanoyî||336||10
|-
|Lema_bi_siryaniya_klasîk||334||9
|-
|Lema_bi_şîngazîcayî||330||10
|-
|Lema_bi_min_dongî||330||9
|-
|Lema_bi_evenkî||328||6
|-
|Lema_bi_kumikî||327||8
|-
|Lema_bi_belûçî||327||9
|-
|Lema_bi_ladînî||319||10
|-
|Lema_bi_îngûşî||316||8
|-
|Lema_bi_sindhî||315||9
|-
|Lema_bi_lezgînî||314||6
|-
|Lema_bi_fransiya_kevn||311||11
|-
|Lema_bi_norsiya_kevn||308||10
|-
|Lema_bi_lîvonî||308||10
|-
|Lema_bi_tetûmî||306||7
|-
|Lema_bi_tokpisinî||293||11
|-
|Lema_bi_şanî||290||9
|-
|Lema_bi_wolofî||287||10
|-
|Lema_bi_maranaoyî||286||9
|-
|Lema_bi_nanayî||278||6
|-
|Lema_bi_nahwatlî||278||8
|-
|Lema_bi_kîkûyûyî||277||9
|-
|Lema_bi_sotoyiya_başûr||277||9
|-
|Lema_bi_hmongî||277||9
|-
|Lema_bi_lîgûrî||275||10
|-
|Lema_bi_romagnolî||273||8
|-
|Lema_bi_lîmbûrgî||267||9
|-
|Lema_bi_samoayî||265||10
|-
|Lema_bi_îrlendiya_kevn||265||10
|-
|Lema_bi_keşmîrî||261||7
|-
|Lema_bi_piedmontîsî||258||7
|-
|Lema_bi_çamicuroyî||256||8
|-
|Lema_bi_hîlîgaynonî||253||11
|-
|Lema_bi_megrelî||251||9
|-
|Lema_bi_hunsrikî||249||7
|-
|Lema_bi_tarifitî||248||5
|-
|Lema_bi_karaçay-balkarî||247||7
|-
|Lema_bi_warayî||247||9
|-
|Lema_bi_mîrandî||246||8
|-
|Lema_bi_sîlhetî||245||10
|-
|Lema_bi_eweyî||245||9
|-
|Lema_bi_lingalayî||242||9
|-
|Lema_bi_almaniya_Pennsylvania||239||9
|-
|Lema_bi_almaniya_bilind_a_kevn||236||9
|-
|Lema_bi_talişî||235||7
|-
|Lema_bi_nahwatliya_klasîk||234||10
|-
|Lema_bi_çukçî||234||8
|-
|Lema_bi_aynuyî||232||9
|-
|Lema_bi_ugarîtî||231||7
|-
|Lema_bi_xosayî||225||8
|-
|Lema_bi_samiya_skoltî||223||8
|-
|Lema_bi_kapverdî||221||6
|-
|Lema_bi_erebiya_başûrê_şamê||221||9
|-
|Lema_bi_xakasî||218||7
|-
|Lema_bi_înuîtî||217||10
|-
|Lema_bi_conxayî||215||9
|-
|Lema_bi_sirananî||212||8
|-
|Lema_bi_voroyî||210||8
|-
|Lema_bi_mokşayî||209||8
|-
|Lema_bi_ermeniya_kevn||209||8
|-
|Lema_bi_mariya_rojhilatî||209||6
|-
|Lema_bi_çîkasawî||208||8
|-
|Lema_bi_yupîkiya_navendî||207||8
|-
|Lema_bi_şorî||206||7
|-
|Lema_bi_wîlamowî||206||8
|-
|Lema_bi_apaçiya_rojava||205||9
|-
|Lema_bi_higaononî||203||6
|-
|Lema_bi_javayiya_kevn||201||6
|-
|Lema_bi_elfdalî||200||8
|-
|Lema_bi_tongî||200||9
|-
|Lema_bi_îstriyotî||200||8
|-
|Lema_bi_silesî||200||8
|-
|Lema_bi_mayayiya_yukatekî||198||8
|-
|Lema_bi_tausugî||198||7
|-
|Lema_bi_zêlandî||198||9
|-
|Lema_bi_bayerî||197||9
|-
|Lema_bi_luhyayî||196||6
|-
|Lema_bi_mazenderanî||195||8
|-
|Lema_bi_mòçenoyî||191||10
|-
|Lema_bi_bruneyî||191||4
|-
|Lema_bi_lazî||190||9
|-
|Lema_bi_kabardî||189||8
|-
|Lema_bi_erebiya_kendavî||186||9
|-
|Lema_bi_karelî||185||10
|-
|Lema_bi_evenî||185||6
|-
|Lema_bi_frîsiya_saterlandî||181||9
|-
|Lema_bi_akanî||180||7
|-
|Lema_bi_tabasaranî||179||7
|-
|Lema_bi_santalî||179||8
|-
|Lema_bi_fîjî||179||9
|-
|Lema_bi_svanî||178||5
|-
|Lema_bi_misrî||176||4
|-
|Lema_bi_îgboyî||174||9
|-
|Lema_bi_hewramî||173||9
|-
|Lema_bi_aymarayî||173||7
|-
|Lema_bi_farefareyî||172||6
|-
|Lema_bi_kînyarwandayî||172||7
|-
|Lema_bi_taosî||172||4
|-
|Lema_bi_komî-permyakî||168||6
|-
|Lema_bi_lakotayî||167||9
|-
|Lema_bi_aklanon||165||6
|-
|Lema_bi_yagnobî||164||8
|-
|Lema_bi_okînawanî||162||8
|-
|Lema_bi_rohingyayî||159||7
|-
|Lema_bi_vepsî||158||8
|-
|Lema_bi_samiya_înarî||158||9
|-
|Lema_bi_emilî||156||7
|-
|Lema_bi_tahîtî||154||9
|-
|Lema_bi_maguindanaoyî||152||5
|-
|Lema_bi_gagawzî||151||5
|-
|Lema_bi_temazîxtiya_atlasa_navendî||151||8
|-
|Lema_bi_samogîtî||150||6
|-
|Lema_bi_fulahî||149||6
|-
|Lema_bi_kreyoliya_fransî_ya_Louisiana||145||7
|-
|Lema_bi_melanauyiya_navendî||144||2
|-
|Lema_bi_nîvxî||141||5
|-
|Lema_bi_afarî||141||7
|-
|Lema_bi_etiyopiya_klasîk||137||8
|-
|Lema_bi_extremaduranî||136||8
|-
|Lema_bi_frankoprovansî||136||7
|-
|Lema_bi_komî-zîriyî||135||9
|-
|Lema_bi_udî||135||5
|-
|Lema_bi_samiya_başûr||134||9
|-
|Lema_bi_nogayî||133||9
|-
|Lema_bi_akadî||129||5
|-
|Lema_bi_lakî||128||6
|-
|Lema_bi_mînangkabawî||128||7
|-
|Lema_bi_kîkongoyî||127||9
|-
|Lema_bi_balînî||126||7
|-
|Lema_bi_dolganî||126||7
|-
|Lema_bi_açehî||123||7
|-
|Lema_bi_polabî||122||8
|-
|Lema_bi_pîpîlî||122||8
|-
|Lema_bi_monî||121||7
|-
|Lema_bi_karakalpakî||121||6
|-
|Lema_bi_kabîlî||120||8
|-
|Lema_bi_votî||120||6
|-
|Lema_bi_luoyî||118||5
|-
|Lema_bi_şonayî||116||6
|-
|Lema_bi_komorî||116||8
|-
|Lema_bi_tarantinoyî||115||7
|-
|Lema_bi_lugandayî||115||8
|-
|Lema_bi_saksoniya_jêrîn_ya_holendî||115||7
|-
|Lema_bi_dusuniya_navendî||114||7
|-
|Lema_bi_taşelhitî||113||8
|-
|Lema_bi_mansakayî||112||6
|-
|Lema_bi_rapanuyî||112||9
|-
|Lema_bi_meruyî||111||4
|-
|Lema_bi_înupîakî||108||6
|-
|Lema_bi_prusiya_kevn||107||7
|-
|Lema_bi_çûkî||107||8
|-
|Lema_bi_kambayî||107||2
|-
|Lema_bi_çeyenî||107||6
|-
|Lema_bi_tayiya_bakurî||107||7
|-
|Lema_bi_alabamayî||107||5
|-
|Lema_bi_aghwanî||106||7
|-
|Lema_bi_zimanê_destan_ê_emerîkî||104||11
|-
|Lema_bi_ǃxóõ||104||7
|-
|Lema_bi_mbya_guaraniyî||104||8
|-
|Lema_bi_krî||103||6
|-
|Lema_bi_yamanayî||102||5
|-
|Lema_bi_tirkiya_kevn||100||7
|-
|Lema_bi_sidamoyî||97||6
|-
|Lema_bi_tumbukayî||97||7
|-
|Lema_bi_pîttcantcatcarayî||96||7
|-
|Lema_bi_sûmerî||95||6
|-
|Lema_bi_batsbî||94||3
|-
|Lema_bi_jejuyî||93||8
|-
|Lema_bi_bambarayî||93||5
|-
|Lema_bi_fransiya_navîn||92||8
|-
|Lema_bi_tupînambayî||91||7
|-
|Lema_bi_farisiya_navîn||91||6
|-
|Lema_bi_bîslamayî||91||8
|-
|Lema_bi_s'gaw_karenî||91||5
|-
|Lema_bi_sahoyî||90||5
|-
|Lema_bi_bajwayiya_kendava_rojava||90||4
|-
|Lema_bi_bau_bidayuh||90||4
|-
|Lema_bi_samiya_kildînî||90||5
|-
|Lema_bi_nawrûyî||90||5
|-
|Lema_bi_pangasînanî||89||8
|-
|Lema_bi_abazayî||89||4
|-
|Lema_bi_tswanayî||89||7
|-
|Lema_bi_saksoniya_kevn||88||8
|-
|Lema_bi_arçî||88||6
|-
|Lema_bi_şerpayî||87||7
|-
|Lema_bi_konkanî||86||6
|-
|Lema_bi_kalencînî||84||3
|-
|Lema_bi_wînnebagoyî||84||6
|-
|Lema_bi_dargwayî||84||5
|-
|Lema_bi_kreyoliya_morîtanî||83||6
|-
|Lema_bi_îbanî||82||5
|-
|Lema_bi_avestayî||82||5
|-
|Lema_bi_moreyî||81||3
|-
|Lema_bi_mapuçî||81||6
|-
|Lema_bi_îranunî||81||3
|-
|Lema_bi_mariya_rojavayî||80||4
|-
|Lema_bi_ohloniya_bakur||80||8
|-
|Lema_bi_tay_dam||80||6
|-
|Lema_bi_erebiya_bakûrê_şamê||80||8
|-
|Lema_bi_ganî||79||5
|-
|Lema_bi_yiyiya_siçuwayî||79||8
|-
|Lema_bi_toxarî_A||79||6
|-
|Lema_bi_mwanî||79||4
|-
|Lema_bi_elwîrî-wîderî||78||6
|-
|Lema_bi_oksîtaniya_kevn||78||6
|-
|Lema_bi_buyî||78||5
|-
|Lema_bi_jarayî||78||6
|-
|Lema_bi_newarî||78||4
|-
|Lema_bi_unamî||77||5
|-
|Lema_bi_mîkmakî||76||5
|-
|Lema_bi_çamiya_rojhilatî||76||4
|-
|Lema_bi_galûrîsî||76||5
|-
|Lema_bi_mizoyî||75||5
|-
|Lema_bi_jinî||75||5
|-
|Lema_bi_tlingitî||75||5
|-
|Lema_bi_bugî||74||5
|-
|Lema_bi_pîkardî||74||9
|-
|Lema_bi_hopîyî||73||6
|-
|Lema_bi_frîsiya_kevn||73||7
|-
|Lema_bi_ternateyî||73||5
|-
|Lema_bi_portugaliya_kevn||72||6
|-
|Lema_bi_kîrîbatî||72||5
|-
|Lema_bi_cingphoyî||71||8
|-
|Lema_bi_sierra_mîwokiya_navendî||71||7
|-
|Lema_bi_sassarîsî||71||5
|-
|Lema_bi_o'odhamî||70||4
|-
|Lema_bi_xiangî||69||4
|-
|Lema_bi_îstro-romanyayî||69||7
|-
|Lema_bi_bukidnon_manoboyiya_rojavayî||68||5
|-
|Lema_bi_bojpûrî||67||8
|-
|Lema_bi_andî||66||5
|-
|Lema_bi_kayingangî||65||8
|-
|Lema_bi_swazî||65||5
|-
|Lema_bi_min_beî||64||4
|-
|Lema_bi_ahomî||64||5
|-
|Lema_bi_montagnaîsî||64||3
|-
|Lema_bi_namayî||62||5
|-
|Lema_bi_miyakoyî||62||7
|-
|Lema_bi_drungî||62||5
|-
|Lema_bi_luşûtsîdî||62||4
|-
|Lema_bi_dongşîangî||61||3
|-
|Lema_bi_bextiyarî||61||7
|-
|Lema_bi_marîkopayî||61||4
|-
|Lema_bi_almaniya_bilind_a_navîn||61||7
|-
|Lema_bi_cimbrî||61||5
|-
|Lema_bi_arrernteyiya_rojavayî||61||5
|-
|Lema_bi_argobbayî||60||6
|-
|Lema_bi_îu_mienî||60||5
|-
|Lema_bi_atayalî||60||4
|-
|Lema_bi_alêwîtî||60||6
|-
|Lema_bi_saanîçî||60||6
|-
|Lema_bi_kaurnayî||60||4
|-
|Lema_bi_yûnaniya_pontî||59||4
|-
|Lema_bi_frankoniya_navendî||59||3
|-
|Lema_bi_pelayî||58||6
|-
|Lema_bi_alutîqî||58||5
|-
|Lema_bi_muongî||58||5
|-
|Lema_bi_hîtîtî||57||6
|-
|Lema_bi_makasarî||57||4
|-
|Lema_bi_banjarî||57||4
|-
|Lema_bi_ngarrindjerî||57||6
|-
|Lema_bi_dakotayî||56||5
|-
|Lema_bi_nenetsiya_tundra||56||4
|-
|Lema_bi_pacohî||56||5
|-
|Lema_bi_çamoroyî||56||5
|-
|Lema_bi_flamiya_rojava||55||4
|-
|Lema_bi_erebiya_iraqî||55||6
|-
|Lema_bi_samiya_lule||55||7
|-
|Lema_bi_lamboyayî||54||7
|-
|Lema_bi_kreyoliya_jameîkî||54||6
|-
|Lema_bi_yakanî||53||4
|-
|Lema_bi_almaniya_navendî_ya_rojhilat||53||8
|-
|Lema_bi_sûdovî||52||4
|-
|Lema_bi_çepangî||52||4
|-
|Lema_bi_buduxî||52||3
|-
|Lema_bi_îsnagî||51||5
|-
|Lema_bi_amazîxiya_fasî||51||6
|-
|Lema_bi_ohloniya_başûr||51||7
|-
|Lema_bi_kîmaragangî||50||1
|-
|Lema_bi_gîlekî||50||7
|-
|Lema_bi_erebiya_tunusî||50||7
|-
|Lema_bi_lekî||49||6
|-
|Lema_bi_karaîmî||49||5
|-
|Lema_bi_gamîlaraayî||49||5
|-
|Lema_bi_tayî_nüa||49||5
|-
|Lema_bi_karaxanîdî||48||6
|-
|Lema_bi_sotoyiya_bakur||48||3
|-
|Lema_bi_kreyoliya_seyşelî||47||3
|-
|Lema_bi_tagal_murutî||47||1
|-
|Lema_bi_tofalarî||47||6
|-
|Lema_bi_swabî||47||5
|-
|Lema_bi_palawî||47||7
|-
|Lema_bi_wiradhurî||46||6
|-
|Lema_bi_çoktawî||46||7
|-
|Lema_bi_tigreyî||46||3
|-
|Lema_bi_îvatanî||46||4
|-
|Lema_bi_fatalukuyî||46||3
|-
|Lema_bi_romaniya_kalo_fînî||46||5
|-
|Lema_bi_pîtkarnî-norfolkî||46||6
|-
|Lema_bi_fenîkî||45||3
|-
|Lema_bi_kitubayî||45||4
|-
|Lema_bi_marwarî||44||2
|-
|Lema_bi_warlpirî||44||4
|-
|Lema_bi_zuniyî||44||4
|-
|Lema_bi_kriya_bejayî||44||5
|-
|Lema_bi_bontociya_rojhilatî||44||3
|-
|Lema_bi_nupeyî||44||4
|-
|Lema_bi_yonagunî||44||5
|-
|Lema_bi_atîkamekwî||44||3
|-
|Lema_bi_dupaningan_agtayî||44||5
|-
|Lema_bi_xantî||43||3
|-
|Lema_bi_daurî||43||3
|-
|Lema_bi_rarotongî||43||3
|-
|Lema_bi_abenakî||43||4
|-
|Lema_bi_atong_(Hindistan)||43||5
|-
|Lema_bi_osageyî||42||5
|-
|Lema_bi_amîs||42||5
|-
|Lema_bi_semaî||42||3
|-
|Lema_bi_marşalî||42||5
|-
|Lema_bi_madurayî||41||4
|-
|Lema_bi_sêriyî||41||3
|-
|Lema_bi_mohawkî||41||5
|-
|Lema_bi_hîrî_motuyî||40||5
|-
|Lema_bi_paîwanî||40||5
|-
|Lema_bi_koreyiya_navîn||40||6
|-
|Lema_bi_kunigamî||40||7
|-
|Lema_bi_amuzgoyî||40||5
|-
|Lema_bi_proto-hindûewropî||40||6
|-
|Lema_bi_tzotzîlî||39||3
|-
|Lema_bi_kalingayiya_başûrî||39||3
|-
|Lema_bi_sebopî||39||1
|-
|Lema_bi_ûrûmî||39||5
|-
|Lema_bi_khinalugî||39||4
|-
|Lema_bi_pijînî||38||5
|-
|Lema_bi_farisiya_kevn||38||5
|-
|Lema_bi_sangoyî||38||4
|-
|Lema_bi_tàyî||38||4
|-
|Lema_bi_koryakî||38||3
|-
|Lema_bi_megleno-romanyayî||37||4
|-
|Lema_bi_ambonezî-malezî||37||6
|-
|Lema_bi_masayî||37||1
|-
|Lema_bi_bahnarî||37||4
|-
|Lema_bi_makasaeyî||37||3
|-
|Lema_bi_magahî||37||3
|-
|Lema_bi_orokî||37||3
|-
|Lema_bi_dinkayî||37||3
|-
|Lema_bi_slovînsî||37||4
|-
|Lema_bi_livvî||36||4
|-
|Lema_bi_maithilî||36||3
|-
|Lema_bi_nahwatliya_navendî||36||3
|-
|Lema_bi_teoçewî||36||5
|-
|Lema_bi_wutunhuayî||36||5
|-
|Lema_bi_tûpiya_kevn||35||4
|-
|Lema_bi_kreyoliya_antîlleyî||35||3
|-
|Lema_bi_lubuagan_kalingayî||35||2
|-
|Lema_bi_ketî||35||2
|-
|Lema_bi_purepeçayî||35||3
|-
|Lema_bi_kamberayî||35||3
|-
|Lema_bi_bororoyî||35||2
|-
|Lema_bi_romaniya_vlaks||35||4
|-
|Lema_bi_yamî||35||1
|-
|Lema_bi_erebiya_cezayirî||35||5
|-
|Lema_bi_brahuiyî||34||6
|-
|Lema_bi_çinook_jargonî||34||4
|-
|Lema_bi_çavacanoyî||34||4
|-
|Lema_bi_tidoreyî||34||5
|-
|Lema_bi_waigalî||34||9
|-
|Lema_bi_nganasanî||34||1
|-
|Lema_bi_kamkata-viriyî||34||9
|-
|Lema_bi_galoyî||34||4
|-
|Lema_bi_kinaray-ayî||34||6
|-
|Lema_bi_yûnaniya_mîkenî||33||6
|-
|Lema_bi_tedim_çinî||33||5
|-
|Lema_bi_udiheyî||33||4
|-
|Lema_bi_frankoniya_rhine||33||3
|-
|Lema_bi_tuvalûyî||33||4
|-
|Lema_bi_îbanagî||33||7
|-
|Lema_bi_aşkunî||32||7
|-
|Lema_bi_çakmayî||32||2
|-
|Lema_bi_tsongayî||32||2
|-
|Lema_bi_pite_samî||32||5
|-
|Lema_bi_iştihardî||32||4
|-
|Lema_bi_k'içe'||32||4
|-
|Lema_bi_hirî_motuyî||31||4
|-
|Lema_bi_fiji_hindiyî||31||4
|-
|Lema_bi_oroqenî||31||4
|-
|Lema_bi_etrûskî||30||4
|-
|Lema_bi_îsthmus_zapotekî||30||2
|-
|Lema_bi_blakfotî||30||3
|-
|Lema_bi_poloniya_kevn||30||4
|-
|Lema_bi_sonxayî||30||1
|-
|Lema_bi_lisuyî||29||2
|-
|Lema_bi_kanuriyî||29||2
|-
|Lema_bi_bataktobayî||29||4
|-
|Lema_bi_umbunduyî||29||5
|-
|Lema_bi_yaeyamayî||29||6
|-
|Lema_bi_arapaho||29||4
|-
|Lema_bi_boleyî||29||1
|-
|Lema_bi_komançî||29||3
|-
|Lema_bi_tuwali_ifugaoyî||29||3
|-
|Lema_bi_vendayî||28||4
|-
|Lema_bi_krioyî||28||6
|-
|Lema_bi_uab_meto||28||3
|-
|Lema_bi_yagarayî||28||4
|-
|Lema_bi_zouyî||28||5
|-
|Lema_bi_tatî||27||1
|-
|Lema_bi_amamî-oşîmayiya_başûrî||27||5
|-
|Lema_bi_isanî||27||6
|-
|Lema_bi_îgalayî||27||3
|-
|Lema_bi_darkinjungî||27||1
|-
|Lema_bi_kvenî||27||4
|-
|Lema_bi_çaxatayî||26||4
|-
|Lema_bi_oyratiya_nivîsî||26||6
|-
|Lema_bi_garîfunayî||26||3
|-
|Lema_bi_altayiya_bakurî||26||4
|-
|Lema_bi_tiwî||26||1
|-
|Lema_bi_meänkiyelî||26||5
|-
|Lema_bi_mandinkayî||26||3
|-
|Lema_bi_yoronî||26||4
|-
|Lema_bi_dena'inayî||26||2
|-
|Lema_bi_halkomelemî||25||3
|-
|Lema_bi_amamî-oşimayiya_bakurî||25||6
|-
|Lema_bi_kriolî||25||3
|-
|Lema_bi_kavalanî||25||2
|-
|Lema_bi_ulçî||25||2
|-
|Lema_bi_hadzayî||25||5
|-
|Lema_bi_jarawa||25||2
|-
|Lema_bi_dogrîbî||25||2
|-
|Lema_bi_pîrahayî||25||3
|-
|Lema_bi_faliskanî||25||7
|-
|Lema_bi_hinukhî||24||3
|-
|Lema_bi_malecite-passamaquoddyî||24||1
|-
|Lema_bi_manipurî||24||3
|-
|Lema_bi_tangutî||24||3
|-
|Lema_bi_tarokoyî||24||1
|-
|Lema_bi_khasiyî||24||3
|-
|Lema_bi_holendiya_kevn||24||5
|-
|Lema_bi_tabaruyî||24||4
|-
|Lema_bi_rungusî||24||1
|-
|Lema_bi_yurokî||24||1
|-
|Lema_bi_negidalî||23||3
|-
|Lema_bi_îrlendiya_navîn||23||3
|-
|Lema_bi_gorontaloyî||23||4
|-
|Lema_bi_tuluyî||23||2
|-
|Lema_bi_oroçî||23||3
|-
|Lema_bi_nîasî||23||5
|-
|Lema_bi_saekî||22||3
|-
|Lema_bi_biatah_bidayuhî||22||4
|-
|Lema_bi_nottoway-meherrînî||22||3
|-
|Lema_bi_katawbayî||22||2
|-
|Lema_bi_haryanvî||22||2
|-
|Lema_bi_timugon_murutî||22||1
|-
|Lema_bi_îtelmenî||22||2
|-
|Lema_bi_almaniya_jêrîn_a_navîn||22||4
|-
|Lema_bi_xîkarîyayî||22||3
|-
|Lema_bi_yaoyî||22||3
|-
|Lema_bi_oki-no-erabu||21||4
|-
|Lema_bi_jurçenî||21||3
|-
|Lema_bi_bununî||21||3
|-
|Lema_bi_nambasiya_mezin||21||4
|-
|Lema_bi_kunayî||21||3
|-
|Lema_bi_ûbîkî||21||4
|-
|Lema_bi_manîpûriya_bîşnûpriyayî||21||2
|-
|Lema_bi_alutor||21||2
|-
|Lema_bi_nyungayî||21||1
|-
|Lema_bi_nandî||21||1
|-
|Lema_bi_nanticokeyî||21||1
|-
|Lema_bi_şawî||20||3
|-
|Lema_bi_umbriyî||20||4
|-
|Lema_bi_kikaiyî||20||4
|-
|Lema_bi_pa'o_karen||20||3
|-
|Lema_bi_ǃkungî||20||3
|-
|Lema_bi_neo-aramiya_rojavayî||20||2
|-
|Lema_bi_karokî||20||1
|-
|Lema_bi_arawak||20||1
|-
|Lema_bi_kamtayî||20||5
|-
|Lema_bi_îzonî||20||3
|-
|Lema_bi_krymçakî||20||3
|-
|Lema_bi_mohegan-pequotî||20||1
|-
|Lema_bi_lundayehî||20||3
|-
|Lema_bi_kanakanabuyî||20||2
|-
|Lema_bi_nîwî||20||3
|-
|Lema_bi_walîsî||20||2
|-
|Lema_bi_ermeniya_navîn||19||2
|-
|Lema_bi_bezhtayî||19||2
|-
|Lema_bi_yukaghiriya_bakurî||19||2
|-
|Lema_bi_guugu_yimidhirrî||19||1
|-
|Lema_bi_hmongiya_hêşîn||19||2
|-
|Lema_bi_lotudî||19||1
|-
|Lema_bi_klamatî-modokî||19||3
|-
|Lema_bi_falayî||19||3
|-
|Lema_bi_ter_samî||19||2
|-
|Lema_bi_naxî||19||2
|-
|Lema_bi_gurciya_kevn||18||3
|-
|Lema_bi_çîrîkawayî||18||2
|-
|Lema_bi_tzutucîlî||18||3
|-
|Lema_bi_tbolî||18||3
|-
|Lema_bi_asamiya_zû||18||4
|-
|Lema_bi_haidayî||18||3
|-
|Lema_bi_taiya_başûrî||18||5
|-
|Lema_bi_oskanî||18||4
|-
|Lema_bi_şoşonî||18||3
|-
|Lema_bi_morî_bawah||18||3
|-
|Lema_bi_ume_samî||18||5
|-
|Lema_bi_partî||18||4
|-
|Lema_bi_gayî||18||5
|-
|Lema_bi_nahwatliya_huastecaya_navendî||18||2
|-
|Lema_bi_buruşaskiyî||18||3
|-
|Lema_bi_kreyoliya_belizeyî||17||5
|-
|Lema_bi_nahwatliya_mekayapan||17||2
|-
|Lema_bi_kambaatayî||17||2
|-
|Lema_bi_kankanayiya_bakurî||17||4
|-
|Lema_bi_potawatomî||17||1
|-
|Lema_bi_aguarunayî||17||1
|-
|Lema_bi_bisayayiya_bruneyî||17||3
|-
|Lema_bi_çamiya_rojavayî||17||4
|-
|Lema_bi_noviyalî||17||4
|-
|Lema_bi_kabiyeyî||17||2
|-
|Lema_bi_toku-no-şîmayî||17||4
|-
|Lema_bi_çîniya_klasîk||17||2
|-
|Lema_bi_ç'orti'||16||3
|-
|Lema_bi_pawnî||16||2
|-
|Lema_bi_waxiyî||16||4
|-
|Lema_bi_rutulî||16||3
|-
|Lema_bi_ludianî||16||2
|-
|Lema_bi_gondiyî||16||2
|-
|Lema_bi_lîşana_denî||16||2
|-
|Lema_bi_puyumayî||16||1
|-
|Lema_bi_bejayî||16||4
|-
|Lema_bi_saaroayî||16||1
|-
|Lema_bi_bassayî||16||2
|-
|Lema_bi_mongoliya_klasîk||16||3
|-
|Lema_bi_krîkî||16||3
|-
|Lema_bi_sasakî||16||2
|-
|Lema_bi_mulamî||16||3
|-
|Lema_bi_aytonî||16||3
|-
|Lema_bi_nootkayî||16||5
|-
|Lema_bi_aarî||15||2
|-
|Lema_bi_engayî||15||3
|-
|Lema_bi_cahuillayî||15||1
|-
|Lema_bi_hunzibî||15||2
|-
|Lema_bi_garoyî||15||3
|-
|Lema_bi_hlaiyî||15||3
|-
|Lema_bi_nobiinî||15||2
|-
|Lema_bi_spaniya_kevn||15||3
|-
|Lema_bi_amayî||15||1
|-
|Lema_bi_otomiya_mezquital||15||1
|-
|Lema_bi_leonîzî||15||1
|-
|Lema_bi_holendiya_navîn||15||2
|-
|Lema_bi_awadhî||15||3
|-
|Lema_bi_ottawayî||15||2
|-
|Lema_bi_baxterî||15||3
|-
|Lema_bi_bembayî||14||2
|-
|Lema_bi_proto-îranî||14||1
|-
|Lema_bi_diyirbalî||14||3
|-
|Lema_bi_kristangî||14||3
|-
|Lema_bi_çolî||14||2
|-
|Lema_bi_yûnaniya_mariupol||14||2
|-
|Lema_bi_tangsayî||14||4
|-
|Lema_bi_kaqçikelî||14||2
|-
|Lema_bi_kreyoliya_guinea-bissau||14||2
|-
|Lema_bi_malayiya_baba||14||2
|-
|Lema_bi_saisiyatî||14||1
|-
|Lema_bi_asî||14||1
|-
|Lema_bi_ladakhiyî||14||1
|-
|Lema_bi_adnyamatanhayî||14||2
|-
|Lema_bi_tooroyî||14||2
|-
|Lema_bi_apalayî||14||1
|-
|Lema_bi_powhatanî||14||1
|-
|Lema_bi_bûrgûndî||14||2
|-
|Lema_bi_sakizayayî||14||1
|-
|Lema_bi_tokelawî||14||3
|-
|Lema_bi_weylsiya_navîn||14||3
|-
|Lema_bi_godoberî||14||1
|-
|Lema_bi_erebiya_sanaanî||14||4
|-
|Lema_bi_kansayî||14||2
|-
|Lema_bi_ahtnayî||14||1
|-
|Lema_bi_batakiya_karo||14||2
|-
|Lema_bi_tatiya_cihû||14||2
|-
|Lema_bi_aşanînkayî||14||2
|-
|Lema_bi_seraikî||13||5
|-
|Lema_bi_proto-hindûîranî||13||1
|-
|Lema_bi_nhêngatûyî||13||4
|-
|Lema_bi_sîkkîmî||13||2
|-
|Lema_bi_înterlîngue||13||3
|-
|Lema_bi_edoyî||13||3
|-
|Lema_bi_foksî||13||2
|-
|Lema_bi_komoriya_ndzwanî||13||5
|-
|Lema_bi_batekî||13||1
|-
|Lema_bi_binukid||13||2
|-
|Lema_bi_skanî||13||2
|-
|Lema_bi_rabhayî||13||2
|-
|Lema_bi_tsezî||13||2
|-
|Lema_bi_solonî||13||2
|-
|Lema_bi_gooniyandiyî||13||1
|-
|Lema_bi_romaniya_balkanî||13||2
|-
|Lema_bi_poitevin-saintongeaisî||13||2
|-
|Lema_bi_marquesana_başûr||13||2
|-
|Lema_bi_tsouyî||13||1
|-
|Lema_bi_yolayî||13||2
|-
|Lema_bi_futunî||13||2
|-
|Lema_bi_munsî||13||2
|-
|Lema_bi_massaçusettî||13||1
|-
|Lema_bi_sabah_bisayayî||13||1
|-
|Lema_bi_prasunî||13||3
|-
|Lema_bi_klallamî||13||3
|-
|Lema_bi_thaoyî||13||1
|-
|Lema_bi_lojbanî||13||4
|-
|Lema_bi_nuerî||13||1
|-
|Lema_bi_lhao_voyî||12||3
|-
|Lema_bi_huişui_hmongiya_navendî||12||3
|-
|Lema_bi_luriya_bakurî||12||3
|-
|Lema_bi_tirurayî||12||2
|-
|Lema_bi_khünî||12||4
|-
|Lema_bi_nafaanrayî||12||3
|-
|Lema_bi_zapotekiya_zoogoço||12||1
|-
|Lema_bi_sukumayî||12||3
|-
|Lema_bi_romaniya_baltîkî||12||1
|-
|Lema_bi_nahwatliya_bakurê_puebla||12||2
|-
|Lema_bi_nahwatliya_tetelcingo||12||2
|-
|Lema_bi_erebiya_necdî||12||4
|-
|Lema_bi_biharî||12||2
|-
|Lema_bi_car_nicobareseyî||12||3
|-
|Lema_bi_mwalî_komorî||12||4
|-
|Lema_bi_erebiya_sudanî||12||2
|-
|Lema_bi_mayayiya_mopanî||11||2
|-
|Lema_bi_yaquî||11||2
|-
|Lema_bi_ponpeyî||11||2
|-
|Lema_bi_kwak'walayî||11||3
|-
|Lema_bi_wolioyî||11||3
|-
|Lema_bi_narunggayî||11||1
|-
|Lema_bi_aghulî||11||2
|-
|Lema_bi_doteliyî||11||2
|-
|Lema_bi_yakkhayî||11||3
|-
|Lema_bi_puebla_nahuatliya_çiyayî||11||2
|-
|Lema_bi_yuguriya_rojhilat||11||1
|-
|Lema_bi_tonkawayî||11||2
|-
|Lema_bi_harsusiyî||11||1
|-
|Lema_bi_mandarî||11||2
|-
|Lema_bi_mazahuayiya_navendî||11||1
|-
|Lema_bi_îfèî||11||2
|-
|Lema_bi_limos_kalingayî||11||1
|-
|Lema_bi_şuswapî||11||2
|-
|Lema_bi_hidatsayî||11||2
|-
|Lema_bi_baureyî||11||2
|-
|Lema_bi_wardamanî||11||1
|-
|Lema_bi_kîsî||11||2
|-
|Lema_bi_erebiya_qibrisî||11||4
|-
|Lema_bi_tindî||11||1
|-
|Lema_bi_swêdiya_kevn||11||4
|-
|Lema_bi_havasupaî-walapaî-yavapaî||11||2
|-
|Lema_bi_darûkî||11||1
|-
|Lema_bi_waujayî||11||2
|-
|Lema_bi_lampungî||11||2
|-
|Lema_bi_areareyî||11||3
|-
|Lema_bi_açolî||11||1
|-
|Lema_bi_komiya_kamerûnî||10||2
|-
|Lema_bi_ngwoyî||10||1
|-
|Lema_bi_abînomnî||10||2
|-
|Lema_bi_deoriyî||10||2
|-
|Lema_bi_şipibo-coniboyî||10||2
|-
|Lema_bi_lolopoyî||10||2
|-
|Lema_bi_kuapawî||10||1
|-
|Lema_bi_proto-norsî||10||4
|-
|Lema_bi_nukunuyî||10||2
|-
|Lema_bi_kottî||10||2
|-
|Lema_bi_khvarşiyî||10||1
|-
|Lema_bi_ngajuyî||10||2
|-
|Lema_bi_yogadî||10||2
|-
|Lema_bi_rawangî||10||3
|-
|Lema_bi_mayoyî||10||3
|-
|Lema_bi_ndebeliya_bakurî||10||2
|-
|Lema_bi_koreyiya_kevn||10||3
|-
|Lema_bi_fonî||10||1
|-
|Lema_bi_abaknonî||10||1
|-
|Lema_bi_radeyî||10||2
|-
|Lema_bi_khalajî||10||3
|-
|Lema_bi_turoyo||10||1
|-
|Lema_bi_naga_pidginî||10||2
|-
|Lema_bi_kriya_rojhilat_ya_bakurî||10||1
|-
|Lema_bi_çekiya_kevn||10||3
|-
|Lema_bi_abauyî||10||1
|-
|Lema_bi_marquesana_bakur||10||1
|-
|Lema_bi_samiya_akkalayî||10||2
|-
|Lema_bi_mongghulî||10||1
|-
|Lema_bi_galîbî_karîbî||10||2
|-
|Lema_bi_torangî||10||1
|-
|Lema_bi_rendilleyî||10||1
|-
|Lema_bi_omaha-poncayî||10||2
|-
|Lema_bi_kaloyî||10||2
|-
|Lema_bi_romaniya_sinte||10||2
|-
|Lema_bi_lepçayî||10||1
|-
|Lema_bi_gunî||10||3
|-
|Lema_bi_akatekî||10||2
|-
|Lema_bi_salarî||10||1
|-
|Lema_bi_erebiya_başûrî_ya_kevn||10||1
|-
|Lema_bi_paumarî||10||1
|-
|Lema_bi_yapî||10||1
|-
|Lema_bi_ngunawalî||10||3
|-
|Lema_bi_kadazaniya_beravî||9||2
|-
|Lema_bi_fangî_(Bantu)||9||3
|-
|Lema_bi_bodoyî_(Hindistan)||9||2
|-
|Lema_bi_xârâcùù||9||1
|-
|Lema_bi_crowî||9||3
|-
|Lema_bi_kanelayî||9||1
|-
|Lema_bi_temiarî||9||1
|-
|Lema_bi_khumi_çinî||9||1
|-
|Lema_bi_tsakhurî||9||2
|-
|Lema_bi_meryamî||9||1
|-
|Lema_bi_tzeltalî||9||1
|-
|Lema_bi_kotavayî||9||2
|-
|Lema_bi_mangghuerî||9||1
|-
|Lema_bi_xavanteyî||9||2
|-
|Lema_bi_kreyoliya_fransî_ya_karipúna||9||1
|-
|Lema_bi_aasayî||9||2
|-
|Lema_bi_gusiiyî||9||2
|-
|Lema_bi_efateyiya_başûr||9||3
|-
|Lema_bi_nlûyî||9||1
|-
|Lema_bi_gaulisî||9||2
|-
|Lema_bi_hereroyî||9||1
|-
|Lema_bi_algonquinî||9||1
|-
|Lema_bi_cayugayî||9||2
|-
|Lema_bi_înesenyoyî||9||1
|-
|Lema_bi_sangisarî||9||1
|-
|Lema_bi_mingoyî||9||1
|-
|Lema_bi_rukaiyî||9||1
|-
|Lema_bi_tuteloyî||9||2
|-
|Lema_bi_luiseñoyî||9||2
|-
|Lema_bi_mambayî||9||2
|-
|Lema_bi_pumpokolî||9||2
|-
|Lema_bi_karaoyî||9||1
|-
|Lema_bi_tolaiyî||9||2
|-
|Lema_bi_baekceyî||9||1
|-
|Lema_bi_pidgîniya_nîjeryayî||9||3
|-
|Lema_bi_khmuyî||9||2
|-
|Lema_bi_cowlitzî||9||2
|-
|Lema_bi_cuyunonî||9||2
|-
|Lema_bi_vuresî||9||1
|-
|Lema_bi_jehaiyî||8||1
|-
|Lema_bi_banyumasanî||8||2
|-
|Lema_bi_montana_salişî||8||1
|-
|Lema_bi_sierra_miwokiya_başûrî||8||1
|-
|Lema_bi_punîkî||8||3
|-
|Lema_bi_tsakonî||8||1
|-
|Lema_bi_gurindjiyî||8||1
|-
|Lema_bi_krisayî||8||1
|-
|Lema_bi_aohengî||8||1
|-
|Lema_bi_panamintî||8||2
|-
|Lema_bi_ulukwumî||8||2
|-
|Lema_bi_miskitoyî||8||3
|-
|Lema_bi_maçiguengayî||8||1
|-
|Lema_bi_kalaşayî||8||1
|-
|Lema_bi_bukar-sadung_bidayuhî||8||2
|-
|Lema_bi_ndebeliya_başûrî||8||1
|-
|Lema_bi_maquiritarî||8||1
|-
|Lema_bi_masbatenyoyî||8||1
|-
|Lema_bi_tsimşî||8||2
|-
|Lema_bi_gutnişî||8||2
|-
|Lema_bi_tuskarorayî||8||1
|-
|Lema_bi_miwokiya_golî||8||2
|-
|Lema_bi_sarceeyî||8||2
|-
|Lema_bi_zaghawayî||8||2
|-
|Lema_bi_kiliwayî||8||2
|-
|Lema_bi_kamiya_başûrî||8||1
|-
|Lema_bi_belaîtî||8||3
|-
|Lema_bi_prakrîtiya_aşokanît||8||4
|-
|Lema_bi_kwanyamayî||8||1
|-
|Lema_bi_ndongayî||8||1
|-
|Lema_bi_îraqwî||8||1
|-
|Lema_bi_grîkoyî||8||1
|-
|Lema_bi_penobskotî||8||1
|-
|Lema_bi_q'eqçiyî||8||2
|-
|Lema_bi_ojibweyiya_bakurî||8||1
|-
|Lema_bi_kayapó||8||1
|-
|Lema_bi_oneidayî||8||1
|-
|Lema_bi_katuyiya_rojhilatî||8||2
|-
|Lema_bi_nahwatliya_huastekaya_rojhilatî||8||1
|-
|Lema_bi_lawayiya_rojhilatî||8||1
|-
|Lema_bi_luba-kasayî||7||1
|-
|Lema_bi_barngarla||7||1
|-
|Lema_bi_açuarî||7||1
|-
|Lema_bi_tsafikiyî||7||2
|-
|Lema_bi_gwiçinî||7||1
|-
|Lema_bi_urak_lawoi'||7||2
|-
|Lema_bi_tarahumarayiya_navendî||7||2
|-
|Lema_bi_bagvalalî||7||1
|-
|Lema_bi_haniyî||7||2
|-
|Lema_bi_sekanî||7||1
|-
|Lema_bi_yûnaniya_kapadokyayî||7||1
|-
|Lema_bi_wambayayî||7||1
|-
|Lema_bi_lîdyayî||7||2
|-
|Lema_bi_amanabî||7||2
|-
|Lema_bi_hänî||7||1
|-
|Lema_bi_çadongî||7||2
|-
|Lema_bi_arakî||7||1
|-
|Lema_bi_kaşayayî||7||1
|-
|Lema_bi_adangmeyî||7||3
|-
|Lema_bi_alawayî||7||1
|-
|Lema_bi_mehriyî||7||1
|-
|Lema_bi_temoqî||7||1
|-
|Lema_bi_kusaalî||7||1
|-
|Lema_bi_dhuwalî||7||2
|-
|Lema_bi_parakanã||7||1
|-
|Lema_bi_angorî||7||1
|-
|Lema_bi_wappoyî||7||2
|-
|Lema_bi_ajië||7||1
|-
|Lema_bi_tsimaneyî||7||1
|-
|Lema_bi_basayî||7||2
|-
|Lema_bi_lusîtanî||7||2
|-
|Lema_bi_kreyoliya_guwiyanîsî||7||2
|-
|Lema_bi_apaçiya_deştan||7||1
|-
|Lema_bi_kutenaiyî||7||1
|-
|Lema_bi_danmarkiya_jersey||7||1
|-
|Lema_bi_wastekî||7||1
|-
|Lema_bi_rejangî||7||1
|-
|Lema_bi_dogonî||7||2
|-
|Lema_bi_lorrainî||7||2
|-
|Lema_bi_embalohî||7||1
|-
|Lema_bi_taînoyî||7||3
|-
|Lema_bi_kriya_rojhilat_ya_başûrî||7||1
|-
|Lema_bi_nyolî_(Uganda)||7||1
|-
|Lema_bi_danmarkiya_kevn||7||2
|-
|Lema_bi_axvaxî||7||1
|-
|Lema_bi_dogriyî||7||2
|-
|Lema_bi_kokborokî||7||2
|-
|Lema_bi_hutterisçî||7||2
|-
|Lema_bi_gullahî||7||2
|-
|Lema_bi_comoxî||7||1
|-
|Lema_bi_biseniyî||7||2
|-
|Lema_bi_îtaliya_cihû||7||2
|-
|Lema_bi_romaniya_karpatyayî||7||1
|-
|Lema_bi_gottscheerîşî||7||2
|-
|Lema_bi_tutongî||7||3
|-
|Lema_bi_nahwatliya_guerrero||7||1
|-
|Lema_bi_malayiya_navendî||7||2
|-
|Lema_bi_nubiya_kevn||7||2
|-
|Lema_bi_kuwileytî||7||2
|-
|Lema_bi_gelaoyiya_spî||7||1
|-
|Lema_bi_ojibweyiya_rojavayî||7||1
|-
|Lema_bi_gayoyî||7||2
|-
|Lema_bi_romaniya_welşî||7||2
|-
|Lema_bi_nahwatliya_huastecaya_rojavayî||7||1
|-
|Lema_bi_bakungî||7||1
|-
|Lema_bi_loziyî||7||1
|-
|Lema_bi_yindcîbarndî||7||1
|-
|Lema_bi_krytsî||7||3
|-
|Lema_bi_palueyî||7||1
|-
|Lema_bi_tahltanî||7||2
|-
|Lema_bi_bay_miwokî||7||2
|-
|Lema_bi_maiayî||7||1
|-
|Lema_bi_besisî||7||2
|-
|Lema_bi_mangarevanî||7||2
|-
|Lema_bi_naromî||6||2
|-
|Lema_bi_çîpewî||6||1
|-
|Lema_bi_biloxî||6||1
|-
|Lema_bi_kendayanî||6||1
|-
|Lema_bi_khowarî||6||1
|-
|Lema_bi_diwalayî||6||1
|-
|Lema_bi_şampanyî||6||2
|-
|Lema_bi_guaraniyiya_paraguayanî||6||3
|-
|Lema_bi_dusnerî||6||1
|-
|Lema_bi_tuaregî||6||1
|-
|Lema_bi_pamonayî||6||2
|-
|Lema_bi_samoyî||6||1
|-
|Lema_bi_talî||6||2
|-
|Lema_bi_yuçî||6||2
|-
|Lema_bi_manggarayî||6||2
|-
|Lema_bi_batakiya_simalungun||6||2
|-
|Lema_bi_totonakiya_çiyayî||6||1
|-
|Lema_bi_oyratayî||6||1
|-
|Lema_bi_balantak||6||2
|-
|Lema_bi_baruga||6||1
|-
|Lema_bi_karekareyî||6||2
|-
|Lema_bi_zapotekiya_yatzaçî||6||1
|-
|Lema_bi_okodiayî||6||2
|-
|Lema_bi_nde-nsele-nta||6||1
|-
|Lema_bi_moçikayî||6||2
|-
|Lema_bi_iriga_bikolanoyî||6||2
|-
|Lema_bi_kirikeyî||6||2
|-
|Lema_bi_totonakiya_papantla||6||1
|-
|Lema_bi_xerenteyî||6||1
|-
|Lema_bi_lîkî||6||3
|-
|Lema_bi_mandaicî||6||1
|-
|Lema_bi_suyayî||6||1
|-
|Lema_bi_ozumacin_çinantecî||6||1
|-
|Lema_bi_tenharimî||6||1
|-
|Lema_bi_tillamookî||6||2
|-
|Lema_bi_defakayî||6||2
|-
|Lema_bi_wayuuyî||6||1
|-
|Lema_bi_japoniya_kevn||6||1
|-
|Lema_bi_limbuyî||6||1
|-
|Lema_bi_efikî||6||2
|-
|Lema_bi_mêkêoyî||6||1
|-
|Lema_bi_erebiya_lîbyayî||6||1
|-
|Lema_bi_phuthî||6||2
|-
|Lema_bi_kankanaeyî||6||1
|-
|Lema_bi_karitiyanayî||6||1
|-
|Lema_bi_abûngî||6||2
|-
|Lema_bi_rotumanî||6||2
|-
|Lema_bi_ngiyambaayî||6||1
|-
|Lema_bi_mîçîfî||6||1
|-
|Lema_bi_kuiyî_(Hindistan)||6||1
|-
|Lema_bi_bicolanoyiya_northern_catanduanes||6||1
|-
|Lema_bi_zarmayî||6||2
|-
|Lema_bi_palawanoyî||6||1
|-
|Lema_bi_luwiyanî||6||2
|-
|Lema_bi_koyukonî||6||1
|-
|Lema_bi_makhuwayî||6||1
|-
|Lema_bi_frankiya_rojhilatî||6||1
|-
|Lema_bi_bruyiya_rojhilatî||6||1
|-
|Lema_bi_kimbunduyî||6||2
|-
|Lema_bi_sabaeanî||6||2
|-
|Lema_bi_tagbanwayiya_kalamî||6||2
|-
|Lema_bi_tambunan_dusunî||6||1
|-
|Lema_bi_mongoliya_navîn||6||2
|-
|Lema_bi_açangî||6||2
|-
|Lema_bi_bu-nao_bunuyî||6||1
|-
|Lema_bi_çewongî||6||1
|-
|Lema_bi_mbabaramî||6||1
|-
|Lema_bi_îjoyiya_başûr-rojhilat||6||2
|-
|Lema_bi_assînîboyî||6||1
|-
|Lema_bi_nzadî||6||1
|-
|Lema_bi_îtawitî||6||1
|-
|Lema_bi_lavukaleveyî||6||2
|-
|Lema_bi_badeyî||6||1
|-
|Lema_bi_takyayî||6||1
|-
|Lema_bi_aneme_wakeyî||6||1
|-
|Lema_bi_urubú-kaaporî||6||1
|-
|Lema_bi_çiçonyi-çidzihana-çikauma||6||2
|-
|Lema_bi_ida'anî||6||1
|-
|Lema_bi_bolinaoyî||6||1
|-
|Lema_bi_lawanganî||6||1
|-
|Lema_bi_kaççiyî||6||1
|-
|Lema_bi_nga_layî||6||2
|-
|Lema_bi_angaatahayî||6||1
|-
|Lema_bi_firîgî||6||1
|-
|Lema_bi_simeulueyî||6||1
|-
|Lema_bi_martuthunirayî||6||1
|-
|Lema_bi_guajajarayî||6||1
|-
|Lema_bi_tabasco_çontalî||6||1
|-
|Lema_bi_makyaniya_rojava||6||2
|-
|Lema_bi_îbaniyî||6||2
|-
|Lema_bi_qiangiya_bakurî||6||1
|-
|Lema_bi_jakaltekî||6||2
|-
|Lema_bi_torwalî||5||1
|-
|Lema_bi_lêtîyî||5||1
|-
|Lema_bi_şinayî||5||1
|-
|Lema_bi_gwereyî||5||1
|-
|Lema_bi_casiguran_dumagat_agtayî||5||1
|-
|Lema_bi_batakiya_mandaîlîng||5||2
|-
|Lema_bi_punan_tubuyî||5||1
|-
|Lema_bi_okanaganî||5||1
|-
|Lema_bi_gerkayî||5||2
|-
|Lema_bi_matlatzincayî||5||2
|-
|Lema_bi_kiowayî||5||2
|-
|Lema_bi_koasatî||5||1
|-
|Lema_bi_kamasauyî||5||1
|-
|Lema_bi_erebiya_endulusî||5||1
|-
|Lema_bi_maleku_jaikayî||5||1
|-
|Lema_bi_a'ou||5||1
|-
|Lema_bi_îlamî||5||2
|-
|Lema_bi_bonanî||5||1
|-
|Lema_bi_îrlendiya_prîmîtîv||5||1
|-
|Lema_bi_masabayî||5||1
|-
|Lema_bi_supyireyî||5||1
|-
|Lema_bi_narragansettî||5||1
|-
|Lema_bi_caddoyî||5||1
|-
|Lema_bi_pará_arárayî||5||1
|-
|Lema_bi_angloromanî||5||1
|-
|Lema_bi_urarinayî||5||2
|-
|Lema_bi_mixteciya_yosondúa||5||1
|-
|Lema_bi_popolocayiya_san_juan_atzingo||5||1
|-
|Lema_bi_surigaononî||5||1
|-
|Lema_bi_komodoyî||5||1
|-
|Lema_bi_kaduglî||5||1
|-
|Lema_bi_tunjungî||5||1
|-
|Lema_bi_san_pedro_amuzgos_amuzgo||5||1
|-
|Lema_bi_pazehî||5||1
|-
|Lema_bi_uldemeyî||5||2
|-
|Lema_bi_sekapanî||5||1
|-
|Lema_bi_nkem-nkumî||5||1
|-
|Lema_bi_warrayî||5||1
|-
|Lema_bi_îsekiriyî||5||2
|-
|Lema_bi_tobilungî||5||1
|-
|Lema_bi_bandjalangî||5||1
|-
|Lema_bi_samayiya_başûrî||5||2
|-
|Lema_bi_hanunooyî||5||2
|-
|Lema_bi_engenniyî||5||1
|-
|Lema_bi_saramakkanî||5||1
|-
|Lema_bi_damariya_rojhilat||5||1
|-
|Lema_bi_jangkangî||5||1
|-
|Lema_bi_kîlîvîlayî||5||1
|-
|Lema_bi_tae'||5||1
|-
|Lema_bi_sandaweyî||5||1
|-
|Lema_bi_harariyî||5||1
|-
|Lema_bi_hovonganî||5||1
|-
|Lema_bi_popolucayiya_sayula||5||1
|-
|Lema_bi_bokarî||5||1
|-
|Lema_bi_kensiuyî||5||1
|-
|Lema_bi_dibabawon_manoboyî||5||1
|-
|Lema_bi_tocantins_asurînî||5||1
|-
|Lema_bi_şawneeyî||5||1
|-
|Lema_bi_butuanonî||5||2
|-
|Lema_bi_jutişî||5||2
|-
|Lema_bi_tagabawayî||5||1
|-
|Lema_bi_sambalî||5||1
|-
|Lema_bi_miyayî||5||1
|-
|Lema_bi_çeke_holoyî||5||1
|-
|Lema_bi_kuikúroyî||5||1
|-
|Lema_bi_hupayî||5||2
|-
|Lema_bi_abanyomî||5||2
|-
|Lema_bi_muak_sa-aakî||5||1
|-
|Lema_bi_bontociya_navendî||5||1
|-
|Lema_bi_duwaiyî||5||1
|-
|Lema_bi_hupdëî||5||1
|-
|Lema_bi_çopiyî||5||1
|-
|Lema_bi_muyangî||5||2
|-
|Lema_bi_agtayiya_kagayanî_ya_navendî||5||1
|-
|Lema_bi_sangirî||5||2
|-
|Lema_bi_kreyoliya_holendî_ya_berbiceyî||5||2
|-
|Lema_bi_yukaghiriya_başûrî||5||1
|-
|Lema_bi_zapotekiya_çiçicapan||5||1
|-
|Lema_bi_atesoyî||5||1
|-
|Lema_bi_dieriyî||5||1
|-
|Lema_bi_mazateciya_çiquihuitlan||5||1
|-
|Lema_bi_şughnî||5||2
|-
|Lema_bi_guwançî||5||1
|-
|Lema_bi_egayî||5||1
|-
|Lema_bi_camsayî||5||2
|-
|Lema_bi_bangî||5||1
|-
|Lema_bi_tajioyî||5||1
|-
|Lema_bi_ngizimî||5||1
|-
|Lema_bi_beothukî||5||2
|-
|Lema_bi_pokangayî||5||1
|-
|Lema_bi_muyuwî||5||1
|-
|Lema_bi_bukîtan||5||2
|-
|Lema_bi_dyulayî||5||1
|-
|Lema_bi_xingú_asuriní||5||1
|-
|Lema_bi_cermayî||5||1
|-
|Lema_bi_takanayî||5||1
|-
|Lema_bi_miamî||5||1
|-
|Lema_bi_epieyî||5||1
|-
|Lema_bi_eseyî||5||1
|-
|Lema_bi_kayahiya_rojavayî||5||2
|-
|Lema_bi_pykobjê||5||1
|-
|Lema_bi_zapotekiya_sierra_de_juarez||5||1
|-
|Lema_bi_dehûyî||5||2
|-
|Lema_bi_bukusuyî||5||1
|-
|Lema_bi_nahwatliya_tlamacazapa||5||1
|-
|Lema_bi_tregamî||5||2
|-
|Lema_bi_capiznonî||5||1
|-
|Lema_bi_pangutaran_samayî||5||1
|-
|Lema_bi_cia-ciayî||5||1
|-
|Lema_bi_erebiya_bahranî||5||1
|-
|Lema_bi_berawanî||5||1
|-
|Lema_bi_mogholî||5||1
|-
|Lema_bi_rennelleseyî||5||1
|-
|Lema_bi_gelaoyiya_sor||5||1
|-
|Lema_bi_badagayî||5||1
|-
|Lema_bi_woiwurrungî||5||1
|-
|Lema_bi_eyakî||5||2
|-
|Lema_bi_awabakal||5||1
|-
|Lema_bi_zoqueyiya_copainala||5||1
|-
|Lema_bi_sumbawayî||5||1
|-
|Lema_bi_goemayî||5||1
|-
|Lema_bi_maxakalî||5||1
|-
|Lema_bi_kakî_aeyî||5||1
|-
|Lema_bi_nez_perceyî||5||2
|-
|Lema_bi_corayî||5||1
|-
|Lema_bi_tapayunayî||5||1
|-
|Lema_bi_senekayî||5||1
|-
|Lema_bi_huaveyî||5||1
|-
|Lema_bi_apinayé||5||1
|-
|Lema_bi_malayiya_pattani||5||2
|-
|Lema_bi_karriyerî||5||1
|-
|Lema_bi_mamî||5||1
|-
|Lema_bi_îbaloiyî||5||1
|-
|Lema_bi_çujî||5||1
|-
|Lema_bi_kuyî||5||2
|-
|Lema_bi_tlahuicayî||5||2
|-
|Lema_bi_sabuyî||5||1
|-
|Lema_bi_cabecarî||5||2
|-
|Lema_bi_kombioyî||5||1
|-
|Lema_bi_krahô||5||1
|-
|Lema_bi_bella_koola||5||1
|-
|Lema_bi_pomoyiya_başûrî||5||1
|-
|Lema_bi_bilbayî||5||1
|-
|Lema_bi_movimayî||5||1
|-
|Lema_bi_lahuyî||5||2
|-
|Lema_bi_komeringî||5||1
|-
|Lema_bi_tuyukayî||5||1
|-
|Lema_bi_tananaya_jêrîn||5||1
|-
|Lema_bi_kreyoliya_portugalî_ya_korlai||5||1
|-
|Lema_bi_mnongiya_navendî||5||1
|-
|Lema_bi_mojaveyî||5||2
|-
|Lema_bi_kaskayî||5||1
|-
|Lema_bi_zaparoyî||5||1
|-
|Lema_bi_munayî||5||2
|-
|Lema_bi_murînpatayî||5||1
|-
|Lema_bi_goguryeoyî||5||1
|-
|Lema_bi_kiwaiyiya_bakur-rojhilat||4||1
|-
|Lema_bi_ebrieyî||4||1
|-
|Lema_bi_tuamotuanî||4||1
|-
|Lema_bi_angevinî||4||1
|-
|Lema_bi_seimatî||4||1
|-
|Lema_bi_huiçolî||4||1
|-
|Lema_bi_betawî||4||1
|-
|Lema_bi_yucunayî||4||1
|-
|Lema_bi_nukak_makuyî||4||1
|-
|Lema_bi_a-pucikwar||4||1
|-
|Lema_bi_nyamwezî||4||1
|-
|Lema_bi_gaamî||4||1
|-
|Lema_bi_obispeñoyî||4||1
|-
|Lema_bi_paicî||4||1
|-
|Lema_bi_luba-katangayî||4||2
|-
|Lema_bi_tyapî||4||2
|-
|Lema_bi_yurutî||4||1
|-
|Lema_bi_kendemî||4||1
|-
|Lema_bi_aukanî||4||1
|-
|Lema_bi_ribunî||4||1
|-
|Lema_bi_laragiayî||4||1
|-
|Lema_bi_wintuyî||4||1
|-
|Lema_bi_woleayî||4||1
|-
|Lema_bi_li’oyî||4||1
|-
|Lema_bi_kîkapûyî||4||1
|-
|Lema_bi_ndalî||4||1
|-
|Lema_bi_hadiyyayî||4||1
|-
|Lema_bi_caşinahuayî||4||1
|-
|Lema_bi_baram_kayanî||4||1
|-
|Lema_bi_ngadhayî||4||1
|-
|Lema_bi_hixkaryanayî||4||1
|-
|Lema_bi_majangî||4||1
|-
|Lema_bi_molbogî||4||2
|-
|Lema_bi_nyankoleyî||4||1
|-
|Lema_bi_îlayî||4||1
|-
|Lema_bi_qiwenyayî||4||1
|-
|Lema_bi_garawayî||4||1
|-
|Lema_bi_dezfuliyî||4||2
|-
|Lema_bi_wayampî||4||1
|-
|Lema_bi_rikbaktsayî||4||1
|-
|Lema_bi_masakarayî||4||1
|-
|Lema_bi_îtzayî||4||1
|-
|Lema_bi_kipsigisî||4||1
|-
|Lema_bi_paipaî||4||2
|-
|Lema_bi_tujiayiya_bakurî||4||2
|-
|Lema_bi_yakîmayî||4||1
|-
|Lema_bi_para_gaviãoyî||4||1
|-
|Lema_bi_maçameyî||4||1
|-
|Lema_bi_bayiya_başûrî||4||1
|-
|Lema_bi_nicobariya_navendî||4||1
|-
|Lema_bi_kubuyî||4||1
|-
|Lema_bi_venturenyoyî||4||2
|-
|Lema_bi_popolucayiya_highland||4||1
|-
|Lema_bi_bintuluyî||4||1
|-
|Lema_bi_bîmayî||4||1
|-
|Lema_bi_nyaturuyî||4||1
|-
|Lema_bi_sogdî||4||1
|-
|Lema_bi_ratahanî||4||2
|-
|Lema_bi_museyî||4||1
|-
|Lema_bi_nahwatliya_mîçoakanê||4||1
|-
|Lema_bi_akîpayiya_rojhilatî||4||1
|-
|Lema_bi_paiuteyiya_bakurî||4||1
|-
|Lema_bi_yaayî||4||1
|-
|Lema_bi_taişanîzî||4||2
|-
|Lema_bi_koreguajeyî||4||1
|-
|Lema_bi_serranoyî||4||2
|-
|Lema_bi_nkonyayî||4||1
|-
|Lema_bi_malilayî||4||1
|-
|Lema_bi_folopayî||4||1
|-
|Lema_bi_kawésqar||4||1
|-
|Lema_bi_abagayî||4||1
|-
|Lema_bi_wororayî||4||1
|-
|Lema_bi_panarayî||4||1
|-
|Lema_bi_turkanayî||4||1
|-
|Lema_bi_taitayî||4||1
|-
|Lema_bi_umayî||4||2
|-
|Lema_bi_katalaniya_kevn||4||1
|-
|Lema_bi_çolyanî||4||1
|-
|Lema_bi_mundurukú||4||2
|-
|Lema_bi_deccaniyî||4||2
|-
|Lema_bi_laşiyî||4||2
|-
|Lema_bi_gongî||4||1
|-
|Lema_bi_nambikwarayî||4||1
|-
|Lema_bi_lillooetî||4||1
|-
|Lema_bi_guiqiongî||4||1
|-
|Lema_bi_alekanoyî||4||2
|-
|Lema_bi_natçezî||4||1
|-
|Lema_bi_komoyî||4||1
|-
|Lema_bi_paraukî||4||2
|-
|Lema_bi_beaverî||4||1
|-
|Lema_bi_sikayanayî||4||1
|-
|Lema_bi_puinaveyî||4||1
|-
|Lema_bi_kusundayî||4||1
|-
|Lema_bi_ragayî||4||1
|-
|Lema_bi_orejónî||4||1
|-
|Lema_bi_babariya_başûr-rojhilat||4||1
|-
|Lema_bi_wiwayî||4||1
|-
|Lema_bi_baltî||4||1
|-
|Lema_bi_lugbarayî||4||1
|-
|Lema_bi_modangî||4||1
|-
|Lema_bi_isthmus_mixeyî||4||1
|-
|Lema_bi_forest_enetsî||4||1
|-
|Lema_bi_pukapukanî||4||1
|-
|Lema_bi_kelabît_bariyoyî||4||1
|-
|Lema_bi_waraoyî||4||1
|-
|Lema_bi_ǁxegwî||4||1
|-
|Lema_bi_palantla_çinantecî||4||1
|-
|Lema_bi_mendeyî||4||1
|-
|Lema_bi_batuyî||4||1
|-
|Lema_bi_piscatawayî||4||1
|-
|Lema_bi_hurî||4||1
|-
|Lema_bi_foreyî||4||2
|-
|Lema_bi_degemayî||4||1
|-
|Lema_bi_otomacoyî||4||1
|-
|Lema_bi_nahwatliya_temascaltepec||4||1
|-
|Lema_bi_gothîkiya_krimî||4||1
|-
|Lema_bi_kîputî||4||1
|-
|Lema_bi_lîtwanyayiya_kevn||4||1
|-
|Lema_bi_aluneyî||4||1
|-
|Lema_bi_ndoeyî||4||1
|-
|Lema_bi_loteyî||4||1
|-
|Lema_bi_parecî||4||1
|-
|Lema_bi_ngamoyî||4||1
|-
|Lema_bi_kannadayiya_kevn||4||1
|-
|Lema_bi_ankaveyî||4||1
|-
|Lema_bi_vîtûyî||4||1
|-
|Lema_bi_kunzayî||4||1
|-
|Lema_bi_zaiwa||4||2
|-
|Lema_bi_açaguwayî||4||1
|-
|Lema_bi_maranungkuyî||4||1
|-
|Lema_bi_kerehoyî||4||1
|-
|Lema_bi_îşkaşimiyî||4||1
|-
|Lema_bi_digoyî||4||1
|-
|Lema_bi_agutaynenî||4||1
|-
|Lema_bi_burjî||4||1
|-
|Lema_bi_linduyî||4||1
|-
|Lema_bi_baniwayî||4||1
|-
|Lema_bi_yagariayî||4||1
|-
|Lema_bi_menomineeyî||4||1
|-
|Lema_bi_kajamanî||4||1
|-
|Lema_bi_hassaniyayî||4||1
|-
|Lema_bi_umotinayî||4||1
|-
|Lema_bi_yidinyî||4||1
|-
|Lema_bi_tawoyanî||4||1
|-
|Lema_bi_katoyî||4||1
|-
|Lema_bi_arîkara||4||1
|-
|Lema_bi_sirenikî||4||1
|-
|Lema_bi_adzerayî||4||1
|-
|Lema_bi_spokanî||4||1
|-
|Lema_bi_rukîgayî||4||1
|-
|Lema_bi_wuvulu-auayî||4||1
|-
|Lema_bi_ejaghamî||4||1
|-
|Lema_bi_yamdenayî||4||1
|-
|Lema_bi_ma'anyanî||4||1
|-
|Lema_bi_taryanayî||4||1
|-
|Lema_bi_karangî||4||1
|-
|Lema_bi_nong_zhuangî||4||1
|-
|Lema_bi_yupikiya_sîberyaya_navendî||4||1
|-
|Lema_bi_teke-tegeyî||4||1
|-
|Lema_bi_çuanqiandian_cluster_miaoyî||4||2
|-
|Lema_bi_sirianoyî||4||1
|-
|Lema_bi_dagbaniyî||4||1
|-
|Lema_bi_warekenayî||4||1
|-
|Lema_bi_laurentî||4||2
|-
|Lema_bi_kitemboyî||4||1
|-
|Lema_bi_paelignianî||4||1
|-
|Lema_bi_lingaoyî||4||1
|-
|Lema_bi_pataxó_hã-ha||4||1
|-
|Lema_bi_minigirî||4||2
|-
|Lema_bi_yazghulamî||4||1
|-
|Lema_bi_kanowitî||4||1
|-
|Lema_bi_makondeyî||4||1
|-
|Lema_bi_apiaká||4||1
|-
|Lema_bi_çîniya_kevn||4||2
|-
|Lema_bi_prînsîpenî||4||1
|-
|Lema_bi_mambwe-lunguyî||4||1
|-
|Lema_bi_tepehuaniya_başûr-rojhilat||4||1
|-
|Lema_bi_kayapa_kallahanî||4||1
|-
|Lema_bi_mantayî||4||1
|-
|Lema_bi_keresiya_rojhilatî||4||2
|-
|Lema_bi_matalî||4||1
|-
|Lema_bi_bakumpaî||4||1
|-
|Lema_bi_alaba||4||1
|-
|Lema_bi_sabirî||4||1
|-
|Lema_bi_logûlî||4||1
|-
|Lema_bi_midobî||4||1
|-
|Lema_bi_mahicanî||4||1
|-
|Lema_bi_belî||4||1
|-
|Lema_bi_nooneyî||4||1
|-
|Lema_bi_katuyiya_rojavayî||4||2
|-
|Lema_bi_tepeuxila_cuicatecî||4||1
|-
|Lema_bi_nyakyusayî||4||1
|-
|Lema_bi_murikî_(Gîneya_nû)||4||1
|-
|Lema_bi_margî||4||1
|-
|Lema_bi_martu_wangkayî||4||1
|-
|Lema_bi_klîngonî||4||1
|-
|Lema_bi_tundra_enetsî||4||1
|-
|Lema_bi_coroado_purî||4||1
|-
|Lema_bi_ukitî||4||1
|-
|Lema_bi_tanakrosî||4||1
|-
|Lema_bi_karatayî||4||1
|-
|Lema_bi_vandalî||4||2
|-
|Lema_bi_kasemî||4||1
|-
|Lema_bi_çîniya_navîn||4||2
|-
|Lema_bi_yuracareyî||4||1
|-
|Lema_bi_biyakî||4||1
|-
|Lema_bi_soqotrî||4||1
|-
|Lema_bi_deniyî||4||1
|-
|Lema_bi_lawayiya_rojavayî||4||1
|-
|Lema_bi_akatepekiya_me'phaayî||4||1
|-
|Lema_bi_akawaîo||4||1
|-
|Lema_bi_jeberoyî||4||1
|-
|Lema_bi_gunwingguyî||4||1
|-
|Lema_bi_eblaiteyî||4||1
|-
|Lema_bi_xîtanî||4||1
|-
|Lema_bi_luangî||4||1
|-
|Lema_bi_minriqî||4||1
|-
|Lema_bi_angamî||4||1
|-
|Lema_bi_segayî||4||1
|-
|Lema_bi_holîkaçukî||4||1
|-
|Lema_bi_huehuetla_tepehuayî||4||1
|-
|Lema_bi_bileyî||4||1
|-
|Lema_bi_genî||4||1
|-
|Lema_bi_wik-mungkanî||4||1
|-
|Lema_bi_oydayî||3||1
|-
|Lema_bi_guajayî||3||1
|-
|Lema_bi_balangao||3||1
|-
|Lema_bi_pahîyî||3||1
|-
|Lema_bi_cacanî||3||1
|-
|Lema_bi_xoklengî||3||1
|-
|Lema_bi_taboyî||3||1
|-
|Lema_bi_salibayî_(Kolombiya)||3||1
|-
|Lema_bi_nayî||3||1
|-
|Lema_bi_bantîkî||3||1
|-
|Lema_bi_yakamulî||3||1
|-
|Lema_bi_yanda_dogonî||3||1
|-
|Lema_bi_sãotomenseyî||3||1
|-
|Lema_bi_erebiya_çadî||3||1
|-
|Lema_bi_creoleyiya_torres_strait||3||1
|-
|Lema_bi_sathmar_swabî||3||1
|-
|Lema_bi_miraya_bikolî||3||1
|-
|Lema_bi_macaguanî||3||1
|-
|Lema_bi_mailuyî||3||1
|-
|Lema_bi_yineyî||3||1
|-
|Lema_bi_kuamasî||3||1
|-
|Lema_bi_kaskihayî||3||1
|-
|Lema_bi_yurumanguî||3||1
|-
|Lema_bi_çulymî||3||1
|-
|Lema_bi_bîkolanoyiya_başûr_katanduanî||3||1
|-
|Lema_bi_mozarabîkî||3||1
|-
|Lema_bi_sobeyî||3||1
|-
|Lema_bi_agarabiyî||3||1
|-
|Lema_bi_ongotayî||3||1
|-
|Lema_bi_îtonamayî||3||1
|-
|Lema_bi_aisî||3||1
|-
|Lema_bi_zulgo-gemzekî||3||1
|-
|Lema_bi_wik-ngathanayî||3||1
|-
|Lema_bi_tommo_soyî||3||1
|-
|Lema_bi_sunwarî||3||1
|-
|Lema_bi_romblomanonî||3||1
|-
|Lema_bi_lawî||3||1
|-
|Lema_bi_jamamadiyî||3||1
|-
|Lema_bi_bundelî||3||1
|-
|Lema_bi_wolayttayî||3||1
|-
|Lema_bi_oyguriya_kevn||3||1
|-
|Lema_bi_balanta-ganjayî||3||1
|-
|Lema_bi_alakî||3||1
|-
|Lema_bi_naroyî||3||1
|-
|Lema_bi_almaniya_volga||3||1
|-
|Lema_bi_nehanî||3||1
|-
|Lema_bi_kalaganî||3||1
|-
|Lema_bi_endeyî||3||1
|-
|Lema_bi_ngadcurî||3||1
|-
|Lema_bi_hayayî||3||1
|-
|Lema_bi_ulau-suainî||3||1
|-
|Lema_bi_sauraştrayî||3||1
|-
|Lema_bi_miriwungî||3||1
|-
|Lema_bi_eritaiyî||3||1
|-
|Lema_bi_yendangî||3||1
|-
|Lema_bi_mixteciya_tezoatlan||3||1
|-
|Lema_bi_plains_miwokî||3||1
|-
|Lema_bi_fangî_(Beboid)||3||1
|-
|Lema_bi_betoî||3||1
|-
|Lema_bi_arabela||3||1
|-
|Lema_bi_tayoyî||3||1
|-
|Lema_bi_nornî||3||1
|-
|Lema_bi_kassonkeyî||3||1
|-
|Lema_bi_bilua||3||1
|-
|Lema_bi_wabî||3||1
|-
|Lema_bi_kwaioyî||3||1
|-
|Lema_bi_abronî||3||1
|-
|Lema_bi_wanjî||3||1
|-
|Lema_bi_soçiapam_çinantecî||3||1
|-
|Lema_bi_kwomayî||3||1
|-
|Lema_bi_dawera-daweloorî||3||1
|-
|Lema_bi_zapotekiya_yareni||3||1
|-
|Lema_bi_rasawayî||3||1
|-
|Lema_bi_brajî||3||1
|-
|Lema_bi_nahwatliya_koatepek||3||1
|-
|Lema_bi_kipçakî||3||1
|-
|Lema_bi_maybratî||3||1
|-
|Lema_bi_alamblakî||3||1
|-
|Lema_bi_lizuyî||3||1
|-
|Lema_bi_jumjumî||3||1
|-
|Lema_bi_tübatulabalî||3||1
|-
|Lema_bi_pamosuyî||3||1
|-
|Lema_bi_kadiweuyî||3||1
|-
|Lema_bi_tunikayî||3||1
|-
|Lema_bi_cocamayî||3||1
|-
|Lema_bi_ambulasî||3||1
|-
|Lema_bi_yaneşa'||3||1
|-
|Lema_bi_hdî||3||1
|-
|Lema_bi_yarebayî||3||1
|-
|Lema_bi_macuşî||3||1
|-
|Lema_bi_malalî||3||1
|-
|Lema_bi_kasuayî||3||1
|-
|Lema_bi_temî||3||1
|-
|Lema_bi_manamî||3||1
|-
|Lema_bi_bîlîwayî||3||1
|-
|Lema_bi_zapotekiya_amatlan||3||1
|-
|Lema_bi_teribeyî||3||1
|-
|Lema_bi_gabrielino-fernandeñoyî||3||1
|-
|Lema_bi_abu'_arapeşî||3||1
|-
|Lema_bi_adangî||3||1
|-
|Lema_bi_ratagnonî||3||1
|-
|Lema_bi_gbariyî||3||1
|-
|Lema_bi_subayî||3||1
|-
|Lema_bi_onobasuluyî||3||1
|-
|Lema_bi_aî-çamî||3||1
|-
|Lema_bi_jamsayî||3||1
|-
|Lema_bi_bunguyî||3||1
|-
|Lema_bi_bahauyî||3||1
|-
|Lema_bi_akha||3||1
|-
|Lema_bi_jemezî||3||1
|-
|Lema_bi_dusun_wituyî||3||1
|-
|Lema_bi_alanganî||3||1
|-
|Lema_bi_safwayî||3||1
|-
|Lema_bi_xotanî||3||1
|-
|Lema_bi_ndambayî||3||1
|-
|Lema_bi_mehinakuyî||3||1
|-
|Lema_bi_long_watî||3||1
|-
|Lema_bi_catacaoyî||3||1
|-
|Lema_bi_kalangayî||3||1
|-
|Lema_bi_yangbenî||3||1
|-
|Lema_bi_heheyî||3||1
|-
|Lema_bi_sawayî||3||1
|-
|Lema_bi_phakeyî||3||1
|-
|Lema_bi_angolar||3||1
|-
|Lema_bi_urartûyî||3||1
|-
|Lema_bi_taranganiya_rojava||3||1
|-
|Lema_bi_pilenî||3||1
|-
|Lema_bi_mixtekiya_alcozauca||3||1
|-
|Lema_bi_uteyî||3||1
|-
|Lema_bi_tauseyî||3||1
|-
|Lema_bi_yugî||3||1
|-
|Lema_bi_kumzarî||3||1
|-
|Lema_bi_nukuoroyî||3||1
|-
|Lema_bi_kawaiisuyî||3||1
|-
|Lema_bi_mpotoyî||3||1
|-
|Lema_bi_mangî||3||1
|-
|Lema_bi_gaddangî||3||1
|-
|Lema_bi_damariya_rojava||3||1
|-
|Lema_bi_ocainayî||3||1
|-
|Lema_bi_mapoyoyî||3||1
|-
|Lema_bi_garhwaliyî||3||1
|-
|Lema_bi_sorî-harenganî||3||1
|-
|Lema_bi_kewayî||3||1
|-
|Lema_bi_dhatkî||3||1
|-
|Lema_bi_bretoniya_kevn||3||1
|-
|Lema_bi_larike-wakasihu||3||1
|-
|Lema_bi_baagandjiyî||3||1
|-
|Lema_bi_tongayî_(Malawî)||3||1
|-
|Lema_bi_surî||3||1
|-
|Lema_bi_matoyî||3||1
|-
|Lema_bi_lealao_çinantecî||3||1
|-
|Lema_bi_jamtîşî||3||1
|-
|Lema_bi_golinî||3||1
|-
|Lema_bi_totonakiya_misantla||3||1
|-
|Lema_bi_busang_kayanî||3||1
|-
|Lema_bi_kovêyî||3||1
|-
|Lema_bi_kamayurayî||3||1
|-
|Lema_bi_heiltsukî||3||1
|-
|Lema_bi_uratî||3||1
|-
|Lema_bi_nihalî||3||1
|-
|Lema_bi_bendeyî||3||1
|-
|Lema_bi_yuguriya_rojavayî||3||1
|-
|Lema_bi_numanayî||3||1
|-
|Lema_bi_mandahuacayî||3||1
|-
|Lema_bi_wapişanayî||3||1
|-
|Lema_bi_dazagayî||3||1
|-
|Lema_bi_warunguyî||3||1
|-
|Lema_bi_tivî||3||1
|-
|Lema_bi_tobî||3||1
|-
|Lema_bi_dobelî||3||1
|-
|Lema_bi_buhi'non_bikolî||3||1
|-
|Lema_bi_ajayî||3||1
|-
|Lema_bi_tongayî_(Zambiya)||3||1
|-
|Lema_bi_susuyî||3||1
|-
|Lema_bi_nahwatliya_morelos||3||1
|-
|Lema_bi_matsesî||3||1
|-
|Lema_bi_ledo_kailiyî||3||1
|-
|Lema_bi_cakayî||3||1
|-
|Lema_bi_bangalayî||3||1
|-
|Lema_bi_nemî||3||1
|-
|Lema_bi_meta'||3||1
|-
|Lema_bi_engganoyî||3||1
|-
|Lema_bi_coeur_d'aleneyî||3||1
|-
|Lema_bi_basapî||3||1
|-
|Lema_bi_cuibayî||3||1
|-
|Lema_bi_erromintxelayî||3||1
|-
|Lema_bi_baysoyî||3||1
|-
|Lema_bi_pimbweyî||3||1
|-
|Lema_bi_nilambayî||3||1
|-
|Lema_bi_makanîzî||3||1
|-
|Lema_bi_aoyî||3||1
|-
|Lema_bi_uyajitayayî||3||1
|-
|Lema_bi_moçî||3||1
|-
|Lema_bi_aramiya_samarî||3||1
|-
|Lema_bi_malinkî||3||1
|-
|Lema_bi_kawişanayî||3||1
|-
|Lema_bi_mruyî||3||1
|-
|Lema_bi_mapunî||3||1
|-
|Lema_bi_bongoyî||3||1
|-
|Lema_bi_lama_baiyî||3||1
|-
|Lema_bi_agî||3||1
|-
|Lema_bi_masbate_sorsogon||3||1
|-
|Lema_bi_îwaidjayî||3||1
|-
|Lema_bi_dobûyî||3||1
|-
|Lema_bi_woun_meuyî||3||1
|-
|Lema_bi_totonakiya_xicotepec_de_juarez||3||1
|-
|Lema_bi_duvleyî||3||1
|-
|Lema_bi_baloyî||3||1
|-
|Lema_bi_mbulayî||3||1
|-
|Lema_bi_panareyî||3||1
|-
|Lema_bi_cavineñayî||3||1
|-
|Lema_bi_sanggauyî||3||1
|-
|Lema_bi_cofanî||3||1
|-
|Lema_bi_ubirî||3||1
|-
|Lema_bi_pele-ata||3||1
|-
|Lema_bi_ngieyî||3||1
|-
|Lema_bi_ersuyî||3||1
|-
|Lema_bi_taraoyî||3||1
|-
|Lema_bi_yokeyî||3||1
|-
|Lema_bi_tauyayî||3||1
|-
|Lema_bi_biaoyî||3||1
|-
|Lema_bi_tedagayî||3||1
|-
|Lema_bi_arinî||3||1
|-
|Lema_bi_mandanî||3||1
|-
|Lema_bi_kaxarariyî||3||1
|-
|Lema_bi_blagarî||3||1
|-
|Lema_bi_asaro'oyî||3||1
|-
|Lema_bi_zapotekiya_coatecas_altas||3||1
|-
|Lema_bi_manîdeyî||3||1
|-
|Lema_bi_îmondayî||3||1
|-
|Lema_bi_ofoyî||3||1
|-
|Lema_bi_avá-kanoeîro||3||1
|-
|Lema_bi_rejang_kayanî||3||1
|-
|Lema_bi_khalingî||3||1
|-
|Lema_bi_dibiyasoyî||3||1
|-
|Lema_bi_bribriyî||3||1
|-
|Lema_bi_îwamî||3||1
|-
|Lema_bi_bukatî||3||1
|-
|Lema_bi_matumbî||3||1
|-
|Lema_bi_wulguruyî||3||1
|-
|Lema_bi_totontepec_mixeyî||3||1
|-
|Lema_bi_gujaratiya_kevn||3||1
|-
|Lema_bi_kohoyî||3||1
|-
|Lema_bi_banggaî||3||1
|-
|Lema_bi_tagakaulu_kalaganî||3||1
|-
|Lema_bi_sambeyî||3||1
|-
|Lema_bi_panayî_(Afrîkaya_navendî)||3||1
|-
|Lema_bi_sangilî||3||1
|-
|Lema_bi_pemon||3||1
|-
|Lema_bi_culinayî||3||1
|-
|Lema_bi_ngindoyî||3||1
|-
|Lema_bi_çamalalî||3||1
|-
|Lema_bi_urhoboyî||3||1
|-
|Lema_bi_hoyî||3||1
|-
|Lema_bi_yokutiya_geliyê_bakurî||3||1
|-
|Lema_bi_nnamî||3||1
|-
|Lema_bi_kuiripî||3||1
|-
|Lema_bi_sikayî||3||1
|-
|Lema_bi_wahau_kenyahî||3||1
|-
|Lema_bi_sirayayî||3||1
|-
|Lema_bi_nungonî||3||1
|-
|Lema_bi_mualangî||3||1
|-
|Lema_bi_mara_çinî||3||1
|-
|Lema_bi_keoru-ahiayî||3||1
|-
|Lema_bi_îpulo||3||1
|-
|Lema_bi_deg_xinagî||3||1
|-
|Lema_bi_adjayî||3||1
|-
|Lema_bi_khamî||3||1
|-
|Lema_bi_wedauyî||3||1
|-
|Lema_bi_maselayiya_navendî||3||1
|-
|Lema_bi_akoyeyî||3||1
|-
|Lema_bi_limilnganî||3||1
|-
|Lema_bi_tukî||3||1
|-
|Lema_bi_bareinî||3||1
|-
|Lema_bi_yalunkayî||3||1
|-
|Lema_bi_pare||3||1
|-
|Lema_bi_colanî||3||1
|-
|Lema_bi_yankunytjatjarayî||3||1
|-
|Lema_bi_penaniya_rojavayî||3||1
|-
|Lema_bi_minayî||3||1
|-
|Lema_bi_erebiya_mezopotamyayî_ya_bakur||3||1
|-
|Lema_bi_çambriyî||3||1
|-
|Lema_bi_yeyî||3||1
|-
|Lema_bi_semaq_beriyî||3||1
|-
|Lema_bi_benyadu'||3||1
|-
|Lema_bi_yokutiya_geliyê_başûrî||3||1
|-
|Lema_bi_setayî||3||1
|-
|Lema_bi_araona||3||1
|-
|Lema_bi_nottowayî||3||1
|-
|Lema_bi_isubuyî||3||1
|-
|Lema_bi_çrauyî||3||1
|-
|Lema_bi_kayabiyî||3||1
|-
|Lema_bi_asîluluyî||3||1
|-
|Lema_bi_abay-sembwakî||3||1
|-
|Lema_bi_mubamî||3||1
|-
|Lema_bi_keley-i_kallahanî||3||1
|-
|Lema_bi_waray_sorsogonî||3||1
|-
|Lema_bi_oloyî||3||1
|-
|Lema_bi_muyayî||3||1
|-
|Lema_bi_lambayî||3||1
|-
|Lema_bi_zimanê_destan_ê_îzlandê||3||1
|-
|Lema_bi_wemba-wembayî||3||1
|-
|Lema_bi_îxilî||3||1
|-
|Lema_bi_bukiyîpî||3||1
|-
|Lema_bi_rufijî||3||1
|-
|Lema_bi_mauwakeyî||3||1
|-
|Lema_bi_lengoyî||3||1
|-
|Lema_bi_namuyî||3||1
|-
|Lema_bi_naunayî||3||1
|-
|Lema_bi_penaniya_rojhilatî||3||1
|-
|Lema_bi_mixiforeyî||3||1
|-
|Lema_bi_bekatî'||3||1
|-
|Lema_bi_yidghayî||3||1
|-
|Lema_bi_kriya_woods||3||1
|-
|Lema_bi_mamanwayî||3||1
|-
|Lema_bi_kathlametî||3||1
|-
|Lema_bi_çruyî||3||1
|-
|Lema_bi_arîkapûyî||3||1
|-
|Lema_bi_futuna-anîwayî||3||1
|-
|Lema_bi_wandamenî||3||1
|-
|Lema_bi_tewayî||3||1
|-
|Lema_bi_nyoroyî||3||1
|-
|Lema_bi_bokyî||3||1
|-
|Lema_bi_timucuayî||3||1
|-
|Lema_bi_sonagayî||3||1
|-
|Lema_bi_ogbronuagumî||3||1
|-
|Lema_bi_munjî||3||1
|-
|Lema_bi_gawwadayî||3||1
|-
|Lema_bi_west_albay_bikolî||3||1
|-
|Lema_bi_îyiveyî||3||1
|-
|Lema_bi_bakairí||3||1
|-
|Lema_bi_akpesî||3||1
|-
|Lema_bi_mazateciya_san_jerónimo_tecóatl||3||1
|-
|Lema_bi_jinguluyî||3||1
|-
|Lema_bi_tsuvadî||3||1
|-
|Lema_bi_kokodayî||3||1
|-
|Lema_bi_amondawayî||3||1
|-
|Lema_bi_yanomamöî||3||1
|-
|Lema_bi_sarikolî||3||1
|-
|Lema_bi_ngan'gityemerrî||3||1
|-
|Lema_bi_minica_huitotoyî||3||1
|-
|Lema_bi_yaweyuhayî||3||1
|-
|Lema_bi_uru-eu-wau-wau||3||1
|-
|Lema_bi_ewondoyî||3||1
|-
|Lema_bi_karolînî||3||1
|-
|Lema_bi_arara-karo||3||1
|-
|Lema_bi_yukpayî||3||1
|-
|Lema_bi_îaaiyî||3||1
|-
|Lema_bi_wandayî||3||1
|-
|Lema_bi_mudburrayî||3||1
|-
|Lema_bi_keloyî||3||1
|-
|Lema_bi_ramayî||3||1
|-
|Lema_bi_zayî||3||1
|-
|Lema_bi_mûssaû-emîrakî||3||1
|-
|Lema_bi_lambyayî||3||1
|-
|Lema_bi_dimeyî||3||1
|-
|Lema_bi_agwakatekî||3||1
|-
|Lema_bi_zinzayî||3||1
|-
|Lema_bi_kimbuyî||3||1
|-
|Lema_bi_dogul_domî||3||1
|-
|Lema_bi_babuzayî||3||1
|-
|Lema_bi_leoniya_kevn||3||1
|-
|Lema_bi_şerbroyî||3||1
|-
|Lema_bi_gumatjî||3||1
|-
|Lema_bi_bûrî||3||1
|-
|Lema_bi_palenqueroyî||3||1
|-
|Lema_bi_guwarî||3||1
|-
|Lema_bi_tagbanwayiya_navendî||3||1
|-
|Lema_bi_mentawaî||3||1
|-
|Lema_bi_kakabeyî||3||1
|-
|Lema_bi_mianî||3||1
|-
|Lema_bi_koronadal_blaanî||3||1
|-
|Lema_bi_tamîliya_kevn||3||1
|-
|Lema_bi_yawuruyî||3||1
|-
|Lema_bi_tapaçultecî||3||1
|-
|Lema_bi_seçurayî||3||1
|-
|Lema_bi_piaroayî||3||1
|-
|Lema_bi_mixteciya_çayuco||3||1
|-
|Lema_bi_kreyoliya_îngilîzî_ya_îslanderê||3||1
|-
|Lema_bi_hobyótî||3||1
|-
|Lema_bi_annoboneseyî||3||1
|-
|Lema_bi_semnamî||3||1
|-
|Lema_bi_nisga'ayî||3||1
|-
|Lema_bi_makî_(Çîn)||3||1
|-
|Lema_bi_malayiya_moluccana_bakur||3||1
|-
|Lema_bi_zanakî||3||1
|-
|Lema_bi_kuviyî||3||1
|-
|Lema_bi_kayan_river_kayanî||3||1
|-
|Lema_bi_fuyugî||3||1
|-
|Lema_bi_zapotekiya_laçixio||3||1
|-
|Lema_bi_kwara'aeyî||3||1
|-
|Lema_bi_îngilîziya_kreyolî_ya_antîgua_û_barbud||3||1
|-
|Lema_bi_ramoaainayî||3||1
|-
|Lema_bi_dohoyî||3||1
|-
|Lema_bi_akuwagelî||3||1
|-
|Lema_bi_nawaruyî||3||1
|-
|Lema_bi_tumleoyî||3||1
|-
|Lema_bi_tagişî||3||1
|-
|Lema_bi_pangwayî||3||1
|-
|Lema_bi_louyî||3||1
|-
|Lema_bi_emberayiya_bakurî||3||1
|-
|Lema_bi_takuuyî||3||1
|-
|Lema_bi_kalulî||3||1
|-
|Lema_bi_batad_ifugaoyî||3||1
|-
|Lema_bi_yanyuwayî||3||1
|-
|Lema_bi_hindiya_kevn||3||2
|-
|Lema_bi_cupeñoyî||3||1
|-
|Lema_bi_bawuleyî||3||1
|-
|Lema_bi_ngonî||3||1
|-
|Lema_bi_anongî||3||1
|-
|Lema_bi_yimasî||3||1
|-
|Lema_bi_krobuyî||3||1
|-
|Lema_bi_huambisayî||3||1
|-
|Lema_bi_kumakî||3||1
|-
|Lema_bi_iceve-macî||3||1
|-
|Lema_bi_simbarî||3||1
|-
|Lema_bi_kuriayî||3||1
|-
|Lema_bi_îatmulî||3||1
|-
|Lema_bi_çuaveyî||3||1
|-
|Lema_bi_zandeyî||3||1
|-
|Lema_bi_siroî||3||1
|-
|Lema_bi_nyah_kurî||3||1
|-
|Lema_bi_wangayî||3||1
|-
|Lema_bi_muinanî||3||1
|-
|Lema_bi_kwayayî||3||1
|-
|Lema_bi_kembayanî||3||1
|-
|Lema_bi_açeronî||3||1
|-
|Lema_bi_wari'||3||1
|-
|Lema_bi_demotîkî||3||1
|-
|Lema_bi_botlixî||3||1
|-
|Lema_bi_lammayî||3||1
|-
|Lema_bi_budibudî||3||1
|-
|Lema_bi_bulî||3||1
|-
|Lema_bi_toroyî||3||1
|-
|Lema_bi_rumuyî||3||1
|-
|Lema_bi_javayiya_ontongê||3||1
|-
|Lema_bi_burunî||3||1
|-
|Lema_bi_wyandotî||3||1
|-
|Lema_bi_paezî||3||1
|-
|Lema_bi_lingua_franca_nova||3||2
|-
|Lema_bi_jitayî||3||1
|-
|Lema_bi_amahaî||3||1
|-
|Lema_bi_mepaya_malînaltepekî||3||1
|-
|Lema_bi_embuyî||3||1
|-
|Lema_bi_ambayî||3||1
|-
|Lema_bi_penrhynî||3||1
|-
|Lema_bi_ansus||3||1
|-
|Lema_bi_pomoyiya_bakurî||3||1
|-
|Lema_bi_kumanî||3||1
|-
|Lema_bi_fipayî||3||1
|-
|Lema_bi_nubiyî||3||1
|-
|Lema_bi_mongoyî||3||1
|-
|Lema_bi_biwaydokayî||3||1
|-
|Lema_bi_arosî||3||1
|-
|Lema_bi_zangskarî||3||1
|-
|Lema_bi_punan_aputî||3||1
|-
|Lema_bi_îkizuyî||3||1
|-
|Lema_bi_bobongko||3||1
|-
|Lema_bi_tharakayî||3||1
|-
|Lema_bi_mujiya_başûrî||3||1
|-
|Lema_bi_manyawayî||3||1
|-
|Lema_bi_kwazayî||3||1
|-
|Lema_bi_warisî||3||1
|-
|Lema_bi_tipaî||3||1
|-
|Lema_bi_sooyî||3||1
|-
|Lema_bi_kereweyî||3||1
|-
|Lema_bi_suaboyî||3||1
|-
|Lema_bi_resigaroyî||3||1
|-
|Lema_bi_budumayî||3||1
|-
|Lema_bi_nakameyî||3||1
|-
|Lema_bi_leyponî||3||1
|-
|Lema_bi_guahiboyî||3||1
|-
|Lema_bi_burusuyî||3||1
|-
|Lema_bi_lipan||3||1
|-
|Lema_bi_banda||3||1
|-
|Lema_bi_tşanglayî||3||1
|-
|Lema_bi_mediya_kevn||3||1
|-
|Lema_bi_papapanayî||3||1
|-
|Lema_bi_kala_lagaw_yayî||3||1
|-
|Lema_bi_bariyî||3||1
|-
|Lema_bi_paulohî||3||1
|-
|Lema_bi_batakiya_dairî||3||1
|-
|Lema_bi_uruyî||3||1
|-
|Lema_bi_tatariya_sîberî||3||1
|-
|Lema_bi_mmaniyî||3||1
|-
|Lema_bi_yorta_yortayî||3||1
|-
|Lema_bi_malayîk_dayakî||3||1
|-
|Lema_bi_kumarbhag_pahariayî||3||1
|-
|Lema_bi_vunjoyî||3||1
|-
|Lema_bi_çukayî||3||1
|-
|Lema_bi_walayî||3||1
|-
|Lema_bi_punan_bah-biauyî||3||1
|-
|Lema_bi_nyamboyî||3||1
|-
|Lema_bi_ga'andayî||3||1
|-
|Lema_bi_thavungî||3||1
|-
|Lema_bi_açiyî||3||1
|-
|Lema_bi_tiriyî||3||1
|-
|Lema_bi_murîkî_(Malezya)||3||1
|-
|Lema_bi_suauyî||3||1
|-
|Lema_bi_zoqueyiya_rayón||3||1
|-
|Lema_bi_wiçitayî||3||1
|-
|Lema_bi_sumbwayî||3||1
|-
|Lema_bi_buluyî_(Kamerûn)||3||1
|-
|Lema_bi_rungwayî||3||1
|-
|Lema_bi_nakanayî||3||1
|-
|Lema_bi_trîkuyiya_çicahuaxtla||3||1
|-
|Lema_bi_lipoyî||3||1
|-
|Lema_bi_gwenoyî||3||1
|-
|Lema_bi_carijonayî||3||1
|-
|Lema_bi_barî||3||1
|-
|Lema_bi_taliabuyî||3||1
|-
|Lema_bi_sanumayî||3||1
|-
|Lema_bi_mijî||3||1
|-
|Lema_bi_peroyî||3||1
|-
|Lema_bi_erebiya_ummanî||3||1
|-
|Lema_bi_yembayî||3||1
|-
|Lema_bi_unserdeutsch||3||1
|-
|Lema_bi_yindjilandjî||3||1
|-
|Lema_bi_kua-nsî||3||1
|-
|Lema_bi_apurinã||3||1
|-
|Lema_bi_sissanoyî||3||1
|-
|Lema_bi_punan_merapî||3||1
|-
|Lema_bi_nyamwangayî||3||1
|-
|Lema_bi_dakakayî||3||1
|-
|Lema_bi_maonanî||3||1
|-
|Lema_bi_bolonî||3||1
|-
|Lema_bi_attié||3||1
|-
|Lema_bi_warjî||3||1
|-
|Lema_bi_rara_bakati'||3||1
|-
|Lema_bi_toabaîtayî||3||1
|-
|Lema_bi_bunamayî||2||1
|-
|Lema_bi_bafutî||2||1
|-
|Lema_bi_akebuyî||2||1
|-
|Lema_bi_wolanî||2||1
|-
|Lema_bi_şambalayî||2||1
|-
|Lema_bi_nakî||2||1
|-
|Lema_bi_durango_nahuatliya_rojavayî_ya_jêrîn||2||1
|-
|Lema_bi_buruwayî||2||1
|-
|Lema_bi_alago||2||1
|-
|Lema_bi_trumaî||2||1
|-
|Lema_bi_mbesayî||2||1
|-
|Lema_bi_koalibî||2||1
|-
|Lema_bi_juangî||2||1
|-
|Lema_bi_gupapuynguyî||2||1
|-
|Lema_bi_banda-bambariyî||2||1
|-
|Lema_bi_pamiguayî||2||1
|-
|Lema_bi_lolodayî||2||1
|-
|Lema_bi_elemeyî||2||1
|-
|Lema_bi_amalî||2||1
|-
|Lema_bi_tungagî||2||1
|-
|Lema_bi_tai_dónî||2||1
|-
|Lema_bi_papumayî||2||1
|-
|Lema_bi_meroytîkî||2||1
|-
|Lema_bi_konoyî_(sierra_leone)||2||1
|-
|Lema_bi_kalabrî||2||1
|-
|Lema_bi_emplawasî||2||1
|-
|Lema_bi_pawnakayî||2||1
|-
|Lema_bi_ngäbereyî||2||1
|-
|Lema_bi_mijuyî||2||1
|-
|Lema_bi_lundayî||2||1
|-
|Lema_bi_kosraeyî||2||1
|-
|Lema_bi_kamarianî||2||1
|-
|Lema_bi_anambeyî||2||1
|-
|Lema_bi_ukwayî||2||1
|-
|Lema_bi_tananaya_jorîn||2||1
|-
|Lema_bi_ngas||2||1
|-
|Lema_bi_kreyola_fransî_ya_réunion||2||1
|-
|Lema_bi_kanamariyî||2||1
|-
|Lema_bi_baybayanonî||2||1
|-
|Lema_bi_yemsayî||2||1
|-
|Lema_bi_unuayî||2||1
|-
|Lema_bi_tara_bakayî||2||1
|-
|Lema_bi_pijaoyî||2||1
|-
|Lema_bi_mixteciya_silacayoapan||2||1
|-
|Lema_bi_honeyî||2||1
|-
|Lema_bi_etenî||2||1
|-
|Lema_bi_çarruayî||2||1
|-
|Lema_bi_anukî||2||1
|-
|Lema_bi_usila_çinantecî||2||1
|-
|Lema_bi_tatiya_kevn||2||1
|-
|Lema_bi_njenî||2||1
|-
|Lema_bi_mnongiya_rojhilatî||2||1
|-
|Lema_bi_çinaliyî||2||1
|-
|Lema_bi_arabana||2||1
|-
|Lema_bi_vehesî||2||1
|-
|Lema_bi_taykatî||2||1
|-
|Lema_bi_pomoyiya_rojhilatî||2||1
|-
|Lema_bi_kumbrîkî||2||1
|-
|Lema_bi_iduyî||2||1
|-
|Lema_bi_aremî||2||1
|-
|Lema_bi_vuteyî||2||1
|-
|Lema_bi_temeinî||2||1
|-
|Lema_bi_sinagenî||2||1
|-
|Lema_bi_manado_malayî||2||1
|-
|Lema_bi_kurtjarî||2||1
|-
|Lema_bi_kauwerayî||2||1
|-
|Lema_bi_arta||2||1
|-
|Lema_bi_zapoteciya_rincona_başûrî||2||1
|-
|Lema_bi_walmajarrî||2||1
|-
|Lema_bi_terenoyî||2||1
|-
|Lema_bi_situyî||2||1
|-
|Lema_bi_mangasî||2||1
|-
|Lema_bi_kwadiyî||2||1
|-
|Lema_bi_îkoyî||2||1
|-
|Lema_bi_aşeninka_pereneyî||2||1
|-
|Lema_bi_zapotekiya_quioquitani-quieri||2||1
|-
|Lema_bi_wanî||2||1
|-
|Lema_bi_thrasî||2||1
|-
|Lema_bi_qimant||2||1
|-
|Lema_bi_mundablî||2||1
|-
|Lema_bi_kwiniyî||2||1
|-
|Lema_bi_înorî||2||1
|-
|Lema_bi_bolyuyî||2||1
|-
|Lema_bi_au||2||1
|-
|Lema_bi_zapotekiya_yalalagî||2||1
|-
|Lema_bi_warkay-bîpîmî||2||1
|-
|Lema_bi_sorayî||2||1
|-
|Lema_bi_murui_huitotoyî||2||1
|-
|Lema_bi_marimanindjî||2||1
|-
|Lema_bi_kermanî||2||1
|-
|Lema_bi_gbanuyî||2||1
|-
|Lema_bi_awetí||2||1
|-
|Lema_bi_zhang-zhungî||2||1
|-
|Lema_bi_wawonî||2||1
|-
|Lema_bi_toaripî||2||1
|-
|Lema_bi_subaneniya_navendî||2||1
|-
|Lema_bi_riangî||2||1
|-
|Lema_bi_n'koyî||2||1
|-
|Lema_bi_langoyî_(Uganda)||2||1
|-
|Lema_bi_buganî||2||1
|-
|Lema_bi_orumayî||2||1
|-
|Lema_bi_gojriyî||2||1
|-
|Lema_bi_dongotonoyî||2||1
|-
|Lema_bi_dongşanba_laloyî||2||1
|-
|Lema_bi_baguayî||2||1
|-
|Lema_bi_akeî||2||1
|-
|Lema_bi_totolî||2||1
|-
|Lema_bi_nalikî||2||1
|-
|Lema_bi_kîbenayî||2||1
|-
|Lema_bi_jehî||2||1
|-
|Lema_bi_safaitîkî||2||1
|-
|Lema_bi_mbreyî||2||1
|-
|Lema_bi_jumaytepequeyî||2||1
|-
|Lema_bi_ebughuyî||2||1
|-
|Lema_bi_cacuayî||2||1
|-
|Lema_bi_bandayiya_navendî_ya_başûr||2||1
|-
|Lema_bi_xolosî||2||1
|-
|Lema_bi_tabriakî||2||1
|-
|Lema_bi_salînanî||2||1
|-
|Lema_bi_ncaneyî||2||1
|-
|Lema_bi_kadazaniya_çemê_kliasê||2||1
|-
|Lema_bi_caşibo-cacataiboyî||2||1
|-
|Lema_bi_tunggareyî||2||1
|-
|Lema_bi_tai_doyî||2||1
|-
|Lema_bi_korafe-yeghayî||2||1
|-
|Lema_bi_hamtaiyî||2||1
|-
|Lema_bi_coast_miwokî||2||1
|-
|Lema_bi_barombî||2||1
|-
|Lema_bi_ambrîmiya_başûr-rojhilat||2||1
|-
|Lema_bi_yandruwandhayî||2||1
|-
|Lema_bi_saparayî||2||1
|-
|Lema_bi_mikasukî||2||1
|-
|Lema_bi_koşinî||2||1
|-
|Lema_bi_batakiya_palawan||2||1
|-
|Lema_bi_anauyayî||2||1
|-
|Lema_bi_yarawatayî||2||1
|-
|Lema_bi_tanemayî||2||1
|-
|Lema_bi_peveyî||2||1
|-
|Lema_bi_ngbaka_ma'boyî||2||1
|-
|Lema_bi_macunayî||2||1
|-
|Lema_bi_çacoboyî||2||1
|-
|Lema_bi_angîka||2||1
|-
|Lema_bi_seimî||2||1
|-
|Lema_bi_nhandayî||2||1
|-
|Lema_bi_kaondeyî||2||1
|-
|Lema_bi_eteocretanî||2||1
|-
|Lema_bi_çaurayî||2||1
|-
|Lema_bi_benabenayî||2||1
|-
|Lema_bi_anuta||2||1
|-
|Lema_bi_yir-yorontî||2||1
|-
|Lema_bi_uspantekoyî||2||1
|-
|Lema_bi_serayî||2||1
|-
|Lema_bi_njyemî||2||1
|-
|Lema_bi_mobilianî||2||1
|-
|Lema_bi_malalamaî||2||1
|-
|Lema_bi_karayî_(Gîneya_nû)||2||1
|-
|Lema_bi_molaleyî||2||1
|-
|Lema_bi_ikpengî||2||1
|-
|Lema_bi_sinaugoroyî||2||1
|-
|Lema_bi_nukî||2||1
|-
|Lema_bi_manambuyî||2||1
|-
|Lema_bi_kuruayayî||2||1
|-
|Lema_bi_îbatanî||2||1
|-
|Lema_bi_çuruyayî||2||1
|-
|Lema_bi_aruopî||2||1
|-
|Lema_bi_zapotekiya_aloapam||2||1
|-
|Lema_bi_teressayî||2||1
|-
|Lema_bi_sivandî||2||1
|-
|Lema_bi_nyangboyî||2||1
|-
|Lema_bi_mpadeyî||2||1
|-
|Lema_bi_kayî||2||1
|-
|Lema_bi_gabadiyî||2||1
|-
|Lema_bi_dakpayî||2||1
|-
|Lema_bi_bofî||2||1
|-
|Lema_bi_aşeyî||2||1
|-
|Lema_bi_zapotekiya_rincón||2||1
|-
|Lema_bi_tibetiya_klasîk||2||1
|-
|Lema_bi_obokuîtayî||2||1
|-
|Lema_bi_mundanî||2||1
|-
|Lema_bi_mapidianî||2||1
|-
|Lema_bi_ganzayî||2||1
|-
|Lema_bi_açumawî||2||1
|-
|Lema_bi_muruwarî||2||1
|-
|Lema_bi_maringarrî||2||1
|-
|Lema_bi_lakkiayî||2||1
|-
|Lema_bi_gbanziriyî||2||1
|-
|Lema_bi_desanoyî||2||1
|-
|Lema_bi_awhelawayî||2||1
|-
|Lema_bi_agatuyî||2||1
|-
|Lema_bi_tobayî||2||1
|-
|Lema_bi_subanoniya_rojavayî||2||1
|-
|Lema_bi_onînî||2||1
|-
|Lema_bi_nabayî||2||1
|-
|Lema_bi_îtu_mbon_uzoyî||2||1
|-
|Lema_bi_geser-goromî||2||1
|-
|Lema_bi_azhayî||2||1
|-
|Lema_bi_aiwooyî||2||1
|-
|Lema_bi_tomoipî||2||1
|-
|Lema_bi_romboyî||2||1
|-
|Lema_bi_oryayî||2||1
|-
|Lema_bi_mato_grosso_arára||2||1
|-
|Lema_bi_jambî_malayî||2||1
|-
|Lema_bi_gokanayî||2||1
|-
|Lema_bi_gokhyî||2||1
|-
|Lema_bi_bungku||2||1
|-
|Lema_bi_akeyî||2||1
|-
|Lema_bi_totonaciya_nekaksaya_jorîn||2||1
|-
|Lema_bi_şangayî||2||1
|-
|Lema_bi_russenorskî||2||1
|-
|Lema_bi_nalî||2||1
|-
|Lema_bi_guayaberoyî||2||1
|-
|Lema_bi_dusun_deyahî||2||1
|-
|Lema_bi_busamiyî||2||1
|-
|Lema_bi_balanta-kentohe||2||1
|-
|Lema_bi_xaragure||2||1
|-
|Lema_bi_şixingî||2||1
|-
|Lema_bi_safeyoka||2||1
|-
|Lema_bi_paikonekayî||2||1
|-
|Lema_bi_mbu'||2||1
|-
|Lema_bi_kobolî||2||1
|-
|Lema_bi_edopiyî||2||1
|-
|Lema_bi_bandayiya_rojavayî_ya_navendî||2||1
|-
|Lema_bi_saluanî||2||1
|-
|Lema_bi_mehekî||2||1
|-
|Lema_bi_elkeiyî||2||1
|-
|Lema_bi_yakayî||2||1
|-
|Lema_bi_tai_hongjinî||2||1
|-
|Lema_bi_samtaoyî||2||1
|-
|Lema_bi_nekginî||2||1
|-
|Lema_bi_korakî||2||1
|-
|Lema_bi_barranbinyayî||2||1
|-
|Lema_bi_talîsî||2||1
|-
|Lema_bi_sapeyî||2||1
|-
|Lema_bi_payaguayî||2||1
|-
|Lema_bi_milangî||2||1
|-
|Lema_bi_kamasayî||2||1
|-
|Lema_bi_cruzeñoyî||2||1
|-
|Lema_bi_ancamî||2||1
|-
|Lema_bi_tangaleyî||2||1
|-
|Lema_bi_savosavoyî||2||1
|-
|Lema_bi_peyî||2||1
|-
|Lema_bi_ngbaka_manzayî||2||1
|-
|Lema_bi_misima-paneatî||2||1
|-
|Lema_bi_kangayî||2||1
|-
|Lema_bi_çaçiyî||2||1
|-
|Lema_bi_bayiya_bakurî||2||1
|-
|Lema_bi_yeniçeyî||2||1
|-
|Lema_bi_tarairiú||2||1
|-
|Lema_bi_pilagayî||2||1
|-
|Lema_bi_horomî||2||1
|-
|Lema_bi_benayî||2||1
|-
|Lema_bi_anyî||2||1
|-
|Lema_bi_yisî||2||1
|-
|Lema_bi_uşojoyî||2||1
|-
|Lema_bi_tatuyoyî||2||1
|-
|Lema_bi_serilî||2||1
|-
|Lema_bi_playeroyî||2||1
|-
|Lema_bi_nkarî||2||1
|-
|Lema_bi_mocovî||2||1
|-
|Lema_bi_kuboyî||2||1
|-
|Lema_bi_karayî_(Tanzanya)||2||1
|-
|Lema_bi_hulayî||2||1
|-
|Lema_bi_çinookî||2||1
|-
|Lema_bi_yugambalî||2||1
|-
|Lema_bi_tayrorayiya_bakur||2||1
|-
|Lema_bi_maleyî||2||1
|-
|Lema_bi_kumukioyî||2||1
|-
|Lema_bi_indus_kohistanî||2||1
|-
|Lema_bi_foiyî||2||1
|-
|Lema_bi_çoçotecî||2||1
|-
|Lema_bi_bimobayî||2||1
|-
|Lema_bi_argunî||2||1
|-
|Lema_bi_wabodayî||2||1
|-
|Lema_bi_montolî||2||1
|-
|Lema_bi_kuruduyî||2||1
|-
|Lema_bi_kawaçayî||2||1
|-
|Lema_bi_îbinoyî||2||1
|-
|Lema_bi_çutî||2||1
|-
|Lema_bi_arutanî||2||1
|-
|Lema_bi_mpotovoroyî||2||1
|-
|Lema_bi_kayrîrûyî||2||1
|-
|Lema_bi_bogayayî||2||1
|-
|Lema_bi_zapotekiya_san_baltazar_loxiça||2||1
|-
|Lema_bi_wantoatî||2||1
|-
|Lema_bi_tidongiya_başûrî||2||1
|-
|Lema_bi_sogayî||2||1
|-
|Lema_bi_obolo||2||1
|-
|Lema_bi_mundarî||2||1
|-
|Lema_bi_mapos_buangî||2||1
|-
|Lema_bi_kyengayî||2||1
|-
|Lema_bi_kengayî||2||1
|-
|Lema_bi_dâwî||2||1
|-
|Lema_bi_bondeyî||2||1
|-
|Lema_bi_aulua||2||1
|-
|Lema_bi_zapotekiya_yatee||2||1
|-
|Lema_bi_waropenî||2||1
|-
|Lema_bi_musarî||2||1
|-
|Lema_bi_bremî||2||1
|-
|Lema_bi_awjîla||2||1
|-
|Lema_bi_aghu_tharrnggalayî||2||1
|-
|Lema_bi_zialoyî||2||1
|-
|Lema_bi_tobeloyî||2||1
|-
|Lema_bi_nabî||2||1
|-
|Lema_bi_lardilî||2||1
|-
|Lema_bi_gêdagêdî||2||1
|-
|Lema_bi_dizinî||2||1
|-
|Lema_bi_bugotûyî||2||1
|-
|Lema_bi_azoyú_me'phaayî||2||1
|-
|Lema_bi_zumbunî||2||1
|-
|Lema_bi_tondanoyî||2||1
|-
|Lema_bi_rongayî||2||1
|-
|Lema_bi_matorî||2||1
|-
|Lema_bi_jaminjungî||2||1
|-
|Lema_bi_golayî||2||1
|-
|Lema_bi_dorzeyî||2||1
|-
|Lema_bi_namakurayî||2||1
|-
|Lema_bi_maykulanî||2||1
|-
|Lema_bi_libon_bikolî||2||1
|-
|Lema_bi_gudeyî||2||1
|-
|Lema_bi_busamî||2||1
|-
|Lema_bi_mbudumî||2||1
|-
|Lema_bi_koçî||2||1
|-
|Lema_bi_cahuaranoyî||2||1
|-
|Lema_bi_bandiyî||2||1
|-
|Lema_bi_alseayî||2||1
|-
|Lema_bi_tadaksahakî||2||1
|-
|Lema_bi_samarokenayî||2||1
|-
|Lema_bi_pamplona_atta||2||1
|-
|Lema_bi_hadramî||2||1
|-
|Lema_bi_barapasiyî||2||1
|-
|Lema_bi_tairorayiya_başûr||2||1
|-
|Lema_bi_nekî||2||1
|-
|Lema_bi_mesakayî||2||1
|-
|Lema_bi_lucumiyî||2||1
|-
|Lema_bi_koranayî||2||1
|-
|Lema_bi_cocopayî||2||1
|-
|Lema_bi_amdang||2||1
|-
|Lema_bi_talokî||2||1
|-
|Lema_bi_saponî||2||1
|-
|Lema_bi_ngaingî||2||1
|-
|Lema_bi_miltuyî||2||1
|-
|Lema_bi_luriya_başûrî||2||1
|-
|Lema_bi_kamassî||2||1
|-
|Lema_bi_cuayî||2||1
|-
|Lema_bi_andaî||2||1
|-
|Lema_bi_yarlî||2||1
|-
|Lema_bi_tangamî||2||1
|-
|Lema_bi_ngbakayî||2||1
|-
|Lema_bi_misingî||2||1
|-
|Lema_bi_kanggapeyî||2||1
|-
|Lema_bi_yeretuarî||2||1
|-
|Lema_bi_makahî||2||1
|-
|Lema_bi_kapîngamarancîyî||2||1
|-
|Lema_bi_horpayî||2||1
|-
|Lema_bi_etonî_(Kamerûn)||2||1
|-
|Lema_bi_bençî||2||1
|-
|Lema_bi_sererî||2||1
|-
|Lema_bi_malasangayî||2||1
|-
|Lema_bi_huliyî||2||1
|-
|Lema_bi_çipayayî||2||1
|-
|Lema_bi_tayrumayî||2||1
|-
|Lema_bi_molimayî||2||1
|-
|Lema_bi_ipaî||2||1
|-
|Lema_bi_arhuako||2||1
|-
|Lema_bi_wadjiginyî||2||1
|-
|Lema_bi_temneyî||2||1
|-
|Lema_bi_sionayî||2||1
|-
|Lema_bi_monumboyî||2||1
|-
|Lema_bi_kurukhî||2||1
|-
|Lema_bi_asamiya_navîn||2||1
|-
|Lema_bi_zapotekiya_asunción_mixtepec||2||1
|-
|Lema_bi_wambuleyî||2||1
|-
|Lema_bi_puragî||2||1
|-
|Lema_bi_kwalhioqua-tlatskanaî||2||1
|-
|Lema_bi_kaytetyeyî||2||1
|-
|Lema_bi_boghomî||2||1
|-
|Lema_bi_ata||2||1
|-
|Lema_bi_abuayî||2||1
|-
|Lema_bi_zapotekiya_san_juan_guelavia||2||1
|-
|Lema_bi_wanyî||2||1
|-
|Lema_bi_quitemoyî||2||1
|-
|Lema_bi_mundatî||2||1
|-
|Lema_bi_laalî||2||1
|-
|Lema_bi_keningau_murutî||2||1
|-
|Lema_bi_dawroyî||2||1
|-
|Lema_bi_bondoyî||2||1
|-
|Lema_bi_aurá||2||1
|-
|Lema_bi_titanî||2||1
|-
|Lema_bi_lalayî_(Gîneya_nû)||2||1
|-
|Lema_bi_gbaya-bossangoayî||2||1
|-
|Lema_bi_awngî||2||1
|-
|Lema_bi_ziayî||2||1
|-
|Lema_bi_wayanayî||2||1
|-
|Lema_bi_subtiabayî||2||1
|-
|Lema_bi_roglayiya_bakurî||2||1
|-
|Lema_bi_onondagayî||2||1
|-
|Lema_bi_nadëbî||2||1
|-
|Lema_bi_masalitî||2||1
|-
|Lema_bi_ghomalayî'||2||1
|-
|Lema_bi_djiminiyî||2||1
|-
|Lema_bi_bugunî||2||1
|-
|Lema_bi_aîmeleyî||2||1
|-
|Lema_bi_wirafedî||2||1
|-
|Lema_bi_ronî||2||1
|-
|Lema_bi_osatuyî||2||1
|-
|Lema_bi_kir-balarî||2||1
|-
|Lema_bi_bunogeyî||2||1
|-
|Lema_bi_bahayî||2||1
|-
|Lema_bi_şaranahuayî||2||1
|-
|Lema_bi_rwayî||2||1
|-
|Lema_bi_mayoyao_ifugaoyî||2||1
|-
|Lema_bi_ligbiyî||2||1
|-
|Lema_bi_jeri_kuoyî||2||1
|-
|Lema_bi_guhu-samaneyî||2||1
|-
|Lema_bi_baldemuyî||2||1
|-
|Lema_bi_xengxayî||2||1
|-
|Lema_bi_tsamaî||2||1
|-
|Lema_bi_şolagayî||2||1
|-
|Lema_bi_sahaptinî||2||1
|-
|Lema_bi_nasioyî||2||1
|-
|Lema_bi_mbuguyî||2||1
|-
|Lema_bi_kodavayî||2||1
|-
|Lema_bi_jurúnayî||2||1
|-
|Lema_bi_guroyî||2||1
|-
|Lema_bi_efaiyî||2||1
|-
|Lema_bi_altaya_bakurî||2||1
|-
|Lema_bi_tujyayiya_başûrî||2||1
|-
|Lema_bi_tadyawanî||2||1
|-
|Lema_bi_loniuyî||2||1
|-
|Lema_bi_kaerayî||2||1
|-
|Lema_bi_eloyî||2||1
|-
|Lema_bi_catio_çibçayî||2||1
|-
|Lema_bi_barasanayî||2||1
|-
|Lema_bi_amanayé||2||1
|-
|Lema_bi_sanavironî||2||1
|-
|Lema_bi_paraçî||2||1
|-
|Lema_bi_nekoyî||2||1
|-
|Lema_bi_messapicî||2||1
|-
|Lema_bi_kalapuyayî||2||1
|-
|Lema_bi_coçimiyî||2||1
|-
|Lema_bi_baruyayî||2||1
|-
|Lema_bi_ameleyî||2||1
|-
|Lema_bi_yangkaalî||2||1
|-
|Lema_bi_taluyî||2||1
|-
|Lema_bi_peç||2||1
|-
|Lema_bi_lusengoyî||2||1
|-
|Lema_bi_cubeoyî||2||1
|-
|Lema_bi_andamaniya_mezin_a_têkel||2||1
|-
|Lema_bi_yarluyandî||2||1
|-
|Lema_bi_tangoayî||2||1
|-
|Lema_bi_sawriya_pahariayî||2||1
|-
|Lema_bi_phalurayî||2||1
|-
|Lema_bi_ngeqî||2||1
|-
|Lema_bi_kangrî||2||1
|-
|Lema_bi_çaimayî||2||1
|-
|Lema_bi_bayiya_navendî||2||1
|-
|Lema_bi_angoram||2||1
|-
|Lema_bi_yerongî||2||1
|-
|Lema_bi_sekarî||2||1
|-
|Lema_bi_pima_bajoyî||2||1
|-
|Lema_bi_makaleroyî||2||1
|-
|Lema_bi_hoteyî||2||1
|-
|Lema_bi_çayahuitayî||2||1
|-
|Lema_bi_aore||2||1
|-
|Lema_bi_uveyiya_rojava||2||1
|-
|Lema_bi_pnarî||2||1
|-
|Lema_bi_malasî||2||1
|-
|Lema_bi_kueyuyî||2||1
|-
|Lema_bi_çiquimulillayî||2||1
|-
|Lema_bi_bhilalî||2||1
|-
|Lema_bi_sieyî||2||1
|-
|Lema_bi_popolucayiya_oluta||2||1
|-
|Lema_bi_molmo_one||2||1
|-
|Lema_bi_kunamayî||2||1
|-
|Lema_bi_aribwatsayî||2||1
|-
|Lema_bi_waffayî||2||1
|-
|Lema_bi_sioyî||2||1
|-
|Lema_bi_îbuoroyî||2||1
|-
|Lema_bi_zapotekiya_ayoquesco||2||1
|-
|Lema_bi_wamparî||2||1
|-
|Lema_bi_teseyî||2||1
|-
|Lema_bi_nyawaygî||2||1
|-
|Lema_bi_mpur||2||1
|-
|Lema_bi_manikionî||2||1
|-
|Lema_bi_kwamayî||2||1
|-
|Lema_bi_keaparayî||2||1
|-
|Lema_bi_îlongotî||2||1
|-
|Lema_bi_gadsupî||2||1
|-
|Lema_bi_atakapa||2||1
|-
|Lema_bi_abunî||2||1
|-
|Lema_bi_zapotekiya_san_pedro_quiatoni||2||1
|-
|Lema_bi_sokoroyî||2||1
|-
|Lema_bi_odualî||2||1
|-
|Lema_bi_mündü||2||1
|-
|Lema_bi_labelî||2||1
|-
|Lema_bi_keninjalî||2||1
|-
|Lema_bi_boneratî||2||1
|-
|Lema_bi_auyana||2||1
|-
|Lema_bi_adeleyî||2||1
|-
|Lema_bi_zapotekiya_zaniza||2||1
|-
|Lema_bi_oksapminî||2||1
|-
|Lema_bi_musguyî||2||1
|-
|Lema_bi_mariyiya_awistronezî||2||1
|-
|Lema_bi_laluyiya_rojavayî||2||1
|-
|Lema_bi_kêdangî||2||1
|-
|Lema_bi_gbaya-bozoumî||2||1
|-
|Lema_bi_bretoniya_navîn||2||1
|-
|Lema_bi_awtuwî||2||1
|-
|Lema_bi_zigulayî||2||1
|-
|Lema_bi_wayî||2||1
|-
|Lema_bi_sudestî||2||1
|-
|Lema_bi_opaoyî||2||1
|-
|Lema_bi_laruyî||2||1
|-
|Lema_bi_khweyî||2||1
|-
|Lema_bi_gidarî||2||1
|-
|Lema_bi_baanî||2||1
|-
|Lema_bi_zuojiang_zhuangî||2||1
|-
|Lema_bi_wirö||2||1
|-
|Lema_bi_roonî||2||1
|-
|Lema_bi_dourayî||2||1
|-
|Lema_bi_bahingî||2||1
|-
|Lema_bi_likumî||2||1
|-
|Lema_bi_jeru||2||1
|-
|Lema_bi_guinauyî||2||1
|-
|Lema_bi_duunî||2||1
|-
|Lema_bi_busayî||2||1
|-
|Lema_bi_naskapî||2||1
|-
|Lema_bi_mbukoyî||2||1
|-
|Lema_bi_kofyarî||2||1
|-
|Lema_bi_jutiapayî||2||1
|-
|Lema_bi_guruntumî||2||1
|-
|Lema_bi_efateyiya_bakur||2||1
|-
|Lema_bi_altaya_başûrî||2||1
|-
|Lema_bi_yabaranayî||2||1
|-
|Lema_bi_tukang_besiya_bakur||2||1
|-
|Lema_bi_sambaliya_botolan||2||1
|-
|Lema_bi_lonwolwolî||2||1
|-
|Lema_bi_kagoroyî||2||1
|-
|Lema_bi_haidayiya_bakurî||2||1
|-
|Lema_bi_catuquinaruyî||2||1
|-
|Lema_bi_barayî||2||1
|-
|Lema_bi_amarakaerî||2||1
|-
|Lema_bi_yakomayî||2||1
|-
|Lema_bi_yangkamî||2||1
|-
|Lema_bi_tamanakuyî||2||1
|-
|Lema_bi_sarasirayî||2||1
|-
|Lema_bi_ngalakanî||2||1
|-
|Lema_bi_lusiyî||2||1
|-
|Lema_bi_kowakî||2||1
|-
|Lema_bi_hembayî||2||1
|-
|Lema_bi_erebiya_jubayê||2||1
|-
|Lema_bi_batharî||2||1
|-
|Lema_bi_andioyî||2||1
|-
|Lema_bi_yasayî||2||1
|-
|Lema_bi_sayî||2||1
|-
|Lema_bi_pholayî||2||1
|-
|Lema_bi_ngiemboonî||2||1
|-
|Lema_bi_maçinereyî||2||1
|-
|Lema_bi_kreyoliya_giravên_virginê||2||1
|-
|Lema_bi_kaningdon-nindemî||2||1
|-
|Lema_bi_çairelî||2||1
|-
|Lema_bi_yeskwayî||2||1
|-
|Lema_bi_urayî_(Vanuatu)||2||1
|-
|Lema_bi_taraonî||2||1
|-
|Lema_bi_selaruyî||2||1
|-
|Lema_bi_mixtekiya_diuxi-tilantongo||2||1
|-
|Lema_bi_etuloyî||2||1
|-
|Lema_bi_benerafî||2||1
|-
|Lema_bi_yoidikî||2||1
|-
|Lema_bi_tauşîroyî||2||1
|-
|Lema_bi_serudung_murutî||2||1
|-
|Lema_bi_poçutekî||2||1
|-
|Lema_bi_nkorooyî||2||1
|-
|Lema_bi_kugboyî||2||1
|-
|Lema_bi_karipúnayî||2||1
|-
|Lema_bi_çiquitanoyî||2||1
|-
|Lema_bi_biangaî||2||1
|-
|Lema_bi_vilelayî||2||1
|-
|Lema_bi_tebul_ure_dogonî||2||1
|-
|Lema_bi_sikaritaî||2||1
|-
|Lema_bi_norweciya_traveller||2||1
|-
|Lema_bi_molokoyî||2||1
|-
|Lema_bi_bipî||2||1
|-
|Lema_bi_aribwaungî||2||1
|-
|Lema_bi_wagayayî||2||1
|-
|Lema_bi_ten'ednî||2||1
|-
|Lema_bi_sipakapenseyî||2||1
|-
|Lema_bi_puelçeyî||2||1
|-
|Lema_bi_numanggangî||2||1
|-
|Lema_bi_mori_atasî||2||1
|-
|Lema_bi_kustenauyî||2||1
|-
|Lema_bi_îdî||2||1
|-
|Lema_bi_da'a_kailiyî||2||1
|-
|Lema_bi_bîssayî||2||1
|-
|Lema_bi_zapotekiya_cajonos||2||1
|-
|Lema_bi_wampurî||2||1
|-
|Lema_bi_tetelayî||2||1
|-
|Lema_bi_puruborayî||2||1
|-
|Lema_bi_nyihayî||2||1
|-
|Lema_bi_kwamerayî||2||1
|-
|Lema_bi_îlueyî||2||1
|-
|Lema_bi_damayî_(Sierra_leone)||2||1
|-
|Lema_bi_atanquesî||2||1
|-
|Lema_bi_abureyî||2||1
|-
|Lema_bi_zapotekiya_san_vicente_coatlan||2||1
|-
|Lema_bi_solongyî||2||1
|-
|Lema_bi_ofayeyî||2||1
|-
|Lema_bi_labuk-kinabatangan_kadazanî||2||1
|-
|Lema_bi_înuvialuktunî||2||1
|-
|Lema_bi_auye||2||1
|-
|Lema_bi_adî||2||1
|-
|Lema_bi_waskiayî||2||1
|-
|Lema_bi_tiwayiya_başûrî||2||1
|-
|Lema_bi_reel||2||1
|-
|Lema_bi_musî||2||1
|-
|Lema_bi_îsokoyî||2||1
|-
|Lema_bi_gbayayiya_bakur-rojava||2||1
|-
|Lema_bi_awyî||2||1
|-
|Lema_bi_zimakanî||2||1
|-
|Lema_bi_wayumarayî||2||1
|-
|Lema_bi_suenayî||2||1
|-
|Lema_bi_opónî||2||1
|-
|Lema_bi_nafî||2||1
|-
|Lema_bi_kiangiya_başûrî||2||1
|-
|Lema_bi_gituayî||2||1
|-
|Lema_bi_babariya_bakur||2||1
|-
|Lema_bi_ǀxamî||2||1
|-
|Lema_bi_wiruyî||2||1
|-
|Lema_bi_roroyî||2||1
|-
|Lema_bi_osingî||2||1
|-
|Lema_bi_mattolî||2||1
|-
|Lema_bi_matukarî||2||1
|-
|Lema_bi_leleyî_(Çad)||2||1
|-
|Lema_bi_kirikiriyî||2||1
|-
|Lema_bi_japhugî||2||1
|-
|Lema_bi_doutaî||2||1
|-
|Lema_bi_buol||2||1
|-
|Lema_bi_akolet||2||1
|-
|Lema_bi_sa'a||2||1
|-
|Lema_bi_maypureyî||2||1
|-
|Lema_bi_jerungî||2||1
|-
|Lema_bi_sahuyî||2||1
|-
|Lema_bi_pakanhayî||2||1
|-
|Lema_bi_kohinî||2||1
|-
|Lema_bi_calusayî||2||1
|-
|Lema_bi_banganduyî||2||1
|-
|Lema_bi_yabenî||2||1
|-
|Lema_bi_tukang_besî_başûr||2||1
|-
|Lema_bi_mele-filayî||2||1
|-
|Lema_bi_loomayî||2||1
|-
|Lema_bi_kaheyî||2||1
|-
|Lema_bi_emanî||2||1
|-
|Lema_bi_barbarenyoyî||2||1
|-
|Lema_bi_amarayî||2||1
|-
|Lema_bi_nendî||2||1
|-
|Lema_bi_meyahî||2||1
|-
|Lema_bi_kalayî||2||1
|-
|Lema_bi_haroiyî||2||1
|-
|Lema_bi_enî||2||1
|-
|Lema_bi_amî||2||1
|-
|Lema_bi_yangum_deyî||2||1
|-
|Lema_bi_tamangiya_rojhilatî||2||1
|-
|Lema_bi_saravekayî||2||1
|-
|Lema_bi_ngalumî||2||1
|-
|Lema_bi_minaeanî||2||1
|-
|Lema_bi_kowyayî||2||1
|-
|Lema_bi_herdeyî||2||1
|-
|Lema_bi_cuitlatecî||2||1
|-
|Lema_bi_yaviteroyî||2||1
|-
|Lema_bi_sebat_bet_gurageyî||2||1
|-
|Lema_bi_phomî||2||1
|-
|Lema_bi_mişipî||2||1
|-
|Lema_bi_madayî_(Nîjerya)||2||1
|-
|Lema_bi_kaninuwayî||2||1
|-
|Lema_bi_anîî||2||1
|-
|Lema_bi_yessan-mayoyî||2||1
|-
|Lema_bi_selk'namî||2||1
|-
|Lema_bi_pinyinî||2||1
|-
|Lema_bi_nimadî||2||1
|-
|Lema_bi_kriya_mûsî||2||1
|-
|Lema_bi_hoyahoyayî||2||1
|-
|Lema_bi_evantî||2||1
|-
|Lema_bi_apabhramsayî||2||1
|-
|Lema_bi_uyî||2||1
|-
|Lema_bi_serui-lautî||2||1
|-
|Lema_bi_podokoyî||2||1
|-
|Lema_bi_moçoyî||2||1
|-
|Lema_bi_kaririyî||2||1
|-
|Lema_bi_fasuyî||2||1
|-
|Lema_bi_çirinoyî||2||1
|-
|Lema_bi_yuhupî||2||1
|-
|Lema_bi_vitî||2||1
|-
|Lema_bi_momayî||2||1
|-
|Lema_bi_island_caribî||2||1
|-
|Lema_bi_forakî||2||1
|-
|Lema_bi_çongî||2||1
|-
|Lema_bi_birgidî||2||1
|-
|Lema_bi_wagemanî||2||1
|-
|Lema_bi_nunggubuyuyî||2||1
|-
|Lema_bi_morigî||2||1
|-
|Lema_bi_îdomayî||2||1
|-
|Lema_bi_fulniôî||2||1
|-
|Lema_bi_daai_çinî||2||1
|-
|Lema_bi_wanambreyî||2||1
|-
|Lema_bi_skouyî||2||1
|-
|Lema_bi_purukotó||2||1
|-
|Lema_bi_nyimangî||2||1
|-
|Lema_bi_kwangaliyî||2||1
|-
|Lema_bi_keigayî||2||1
|-
|Lema_bi_gagaduyî||2||1
|-
|Lema_bi_danî||2||1
|-
|Lema_bi_bokobaruyî||2||1
|-
|Lema_bi_abuyî||2||1
|-
|Lema_bi_zapotekiya_santa_ines_yatzeçi||2||1
|-
|Lema_bi_war-jaîntî||2||1
|-
|Lema_bi_mungbamî||2||1
|-
|Lema_bi_labuyî||2||1
|-
|Lema_bi_kenyangî||2||1
|-
|Lema_bi_îpikoyî||2||1
|-
|Lema_bi_zapotekoyiya_mahuatlana_navendî||2||1
|-
|Lema_bi_wasko-wişramî||2||1
|-
|Lema_bi_sowayî||2||1
|-
|Lema_bi_musomî||2||1
|-
|Lema_bi_markayî||2||1
|-
|Lema_bi_lamaholotî||2||1
|-
|Lema_bi_gbayayiya_başûr-rojava||2||1
|-
|Lema_bi_axamb||2||1
|-
|Lema_bi_agobî||2||1
|-
|Lema_bi_zimanê_destan_ê_brîtanî||2||1
|-
|Lema_bi_toçoyî||2||1
|-
|Lema_bi_suî||2||1
|-
|Lema_bi_kibirî||2||1
|-
|Lema_bi_gizigayiya_bakur||2||1
|-
|Lema_bi_doeyî||2||1
|-
|Lema_bi_aka-beayî||2||1
|-
|Lema_bi_ǁaniyî||2||1
|-
|Lema_bi_rotokasî||2||1
|-
|Lema_bi_nahwatliya_orizaba||2||1
|-
|Lema_bi_nahwatliya_pueblaya_başûr-rojhilatî||2||1
|-
|Lema_bi_leleyî_(Gîne)||2||1
|-
|Lema_bi_kirya-konzelî||2||1
|-
|Lema_bi_bura_mabangî||2||1
|-
|Lema_bi_bajwayiya_endonezyayî||2||1
|-
|Lema_bi_akooseyî||2||1
|-
|Lema_bi_şayî||2||1
|-
|Lema_bi_saamiayî||2||1
|-
|Lema_bi_pa'ayî||2||1
|-
|Lema_bi_nambyayî||2||1
|-
|Lema_bi_maysînî||2||1
|-
|Lema_bi_jibuyî||2||1
|-
|Lema_bi_buwalî||2||1
|-
|Lema_bi_xibeyî||2||1
|-
|Lema_bi_pal||2||1
|-
|Lema_bi_naueteyî||2||1
|-
|Lema_bi_mbundayî||2||1
|-
|Lema_bi_juxtlahuaca_mixteciya_rojavayî||2||1
|-
|Lema_bi_caluyanunî||2||1
|-
|Lema_bi_yabongî||2||1
|-
|Lema_bi_tukanoyî||2||1
|-
|Lema_bi_ndemlî||2||1
|-
|Lema_bi_meloyî||2||1
|-
|Lema_bi_lopayî||2||1
|-
|Lema_bi_komyandaretî||2||1
|-
|Lema_bi_kaianî||2||1
|-
|Lema_bi_haislayî||2||1
|-
|Lema_bi_emayî||2||1
|-
|Lema_bi_cayubabayî||2||1
|-
|Lema_bi_bardî||2||1
|-
|Lema_bi_amarizanayî||2||1
|-
|Lema_bi_yalarnngayî||2||1
|-
|Lema_bi_taînaeyî||2||1
|-
|Lema_bi_parawenî||2||1
|-
|Lema_bi_enwangî||2||1
|-
|Lema_bi_coguiyî||2||1
|-
|Lema_bi_basketoyî||2||1
|-
|Lema_bi_yangum_monî||2||1
|-
|Lema_bi_udayî||2||1
|-
|Lema_bi_tamayî_(Çad)||2||1
|-
|Lema_bi_sarayî||2||1
|-
|Lema_bi_ngamamboyî||2||1
|-
|Lema_bi_minanibaî||2||1
|-
|Lema_bi_koyoyî||2||1
|-
|Lema_bi_batuî||2||1
|-
|Lema_bi_andoa||2||1
|-
|Lema_bi_yawalapitî||2||1
|-
|Lema_bi_tanimuca-retuarã||2||1
|-
|Lema_bi_seberuangî||2||1
|-
|Lema_bi_hlepho_phowayî||2||1
|-
|Lema_bi_bebeyî||2||1
|-
|Lema_bi_anîmere||2||1
|-
|Lema_bi_yetfayî||2||1
|-
|Lema_bi_piratapuyoyî||2||1
|-
|Lema_bi_nimoayî||2||1
|-
|Lema_bi_bengî||2||1
|-
|Lema_bi_tawalayî||2||1
|-
|Lema_bi_seruyî||2||1
|-
|Lema_bi_pogoloyî||2||1
|-
|Lema_bi_malayiya_berau||2||1
|-
|Lema_bi_çitimaçayî||2||1
|-
|Lema_bi_aranadanî||2||1
|-
|Lema_bi_viyetnamiya_navîn||2||1
|-
|Lema_bi_mondeyî||2||1
|-
|Lema_bi_malvî||2||1
|-
|Lema_bi_kuniyî||2||1
|-
|Lema_bi_birgîtî||2||1
|-
|Lema_bi_ariyî||2||1
|-
|Lema_bi_tennetî||2||1
|-
|Lema_bi_kaxuyanayî||2||1
|-
|Lema_bi_fungwayî||2||1
|-
|Lema_bi_daasanaçî||2||1
|-
|Lema_bi_zapotekiya_coatlan||2||1
|-
|Lema_bi_wanapî||2||1
|-
|Lema_bi_slaveyiya_bakur||2||1
|-
|Lema_bi_nyindrouyî||2||1
|-
|Lema_bi_kwangî||2||1
|-
|Lema_bi_îndo-portegîzî||2||1
|-
|Lema_bi_bokotoyî||2||1
|-
|Lema_bi_atemble||2||1
|-
|Lema_bi_zapotekiya_santa_maria_quiegolani||2||1
|-
|Lema_bi_timor_pidginî||2||1
|-
|Lema_bi_solosî||2||1
|-
|Lema_bi_rajbanşî||2||1
|-
|Lema_bi_ogbahî||2||1
|-
|Lema_bi_mungguî||2||1
|-
|Lema_bi_gavakî||2||1
|-
|Lema_bi_zaramoyî||2||1
|-
|Lema_bi_soyî||2||1
|-
|Lema_bi_okwanuçuyî||2||1
|-
|Lema_bi_lamangî||2||1
|-
|Lema_bi_gbayiyî||2||1
|-
|Lema_bi_dicamay_agtayî||2||1
|-
|Lema_bi_brokpakeyî||2||1
|-
|Lema_bi_axi_yî||2||1
|-
|Lema_bi_todayî||2||1
|-
|Lema_bi_sukî||2||1
|-
|Lema_bi_nagtipunan_agtayî||2||1
|-
|Lema_bi_îxcatecî||2||1
|-
|Lema_bi_gizigayiya_başûr||2||1
|-
|Lema_bi_babatanayî||2||1
|-
|Lema_bi_aka-bo||2||1
|-
|Lema_bi_wiyotî||2||1
|-
|Lema_bi_tontemboanî||2||1
|-
|Lema_bi_otankî||2||1
|-
|Lema_bi_nahwatliya_tabasco||2||1
|-
|Lema_bi_maungî||2||1
|-
|Lema_bi_lenduyî||2||1
|-
|Lema_bi_kisiyî||2||1
|-
|Lema_bi_duauyî||2||1
|-
|Lema_bi_burarrayî||2||1
|-
|Lema_bi_wusa_nasuyî||2||1
|-
|Lema_bi_tourayî||2||1
|-
|Lema_bi_şehrî||2||1
|-
|Lema_bi_namiayî||2||1
|-
|Lema_bi_jicaqueyiya_rojavayî||2||1
|-
|Lema_bi_duwetî||2||1
|-
|Lema_bi_buyangiya_langnî||2||1
|-
|Lema_bi_baluan-pam||2||1
|-
|Lema_bi_şuarî||2||1
|-
|Lema_bi_sakapultekoyî||2||1
|-
|Lema_bi_naukanskî||2||1
|-
|Lema_bi_mbungayî||2||1
|-
|Lema_bi_koiariyiya_çiyayî||2||1
|-
|Lema_bi_juǀ'hoanî||2||1
|-
|Lema_bi_efutopî||2||1
|-
|Lema_bi_cameroon_pidginî||2||1
|-
|Lema_bi_bangi_meyî||2||1
|-
|Lema_bi_alumu-tesuyî||2||1
|-
|Lema_bi_pande||2||1
|-
|Lema_bi_ndengerekoyî||2||1
|-
|Lema_bi_konabereyî||2||1
|-
|Lema_bi_kaimbulawayî||2||1
|-
|Lema_bi_haiǁomî||2||1
|-
|Lema_bi_amasî||2||1
|-
|Lema_bi_tutçoneyiya_bakurî||2||1
|-
|Lema_bi_nengoneyî||2||1
|-
|Lema_bi_mfinuyî||2||1
|-
|Lema_bi_luguruyî||2||1
|-
|Lema_bi_korkuyî||2||1
|-
|Lema_bi_haruaî||2||1
|-
|Lema_bi_eotileyî||2||1
|-
|Lema_bi_ammoniteyî||2||1
|-
|Lema_bi_tambasî||2||1
|-
|Lema_bi_ngambayî||2||1
|-
|Lema_bi_luvaleyî||2||1
|-
|Lema_bi_koyra_çiiniyî||2||1
|-
|Lema_bi_kamiya_bakurî||2||1
|-
|Lema_bi_cullî||2||1
|-
|Lema_bi_andoque||2||1
|-
|Lema_bi_yawarawargayî||2||1
|-
|Lema_bi_tanjijilî||2||1
|-
|Lema_bi_phuzayî||2||1
|-
|Lema_bi_miwokiya_sierraya_bakurî||2||1
|-
|Lema_bi_mag-ançî_aytayî||2||1
|-
|Lema_bi_esanî||2||1
|-
|Lema_bi_anîndîlyakwa||2||1
|-
|Lema_bi_urimî||2||1
|-
|Lema_bi_tarokî||2||1
|-
|Lema_bi_ninamî||2||1
|-
|Lema_bi_karajayî||2||1
|-
|Lema_bi_hozoyî||2||1
|-
|Lema_bi_tawang_monpayî||2||1
|-
|Lema_bi_modoleyî||2||1
|-
|Lema_bi_malayiya_kedah||2||1
|-
|Lema_bi_karnaî||2||1
|-
|Lema_bi_fembeyî||2||1
|-
|Lema_bi_çittagonianî||2||1
|-
|Lema_bi_teeyî||2||1
|-
|Lema_bi_mamaindeyî||2||1
|-
|Lema_bi_kunjenî||2||1
|-
|Lema_bi_kâteyî||2||1
|-
|Lema_bi_biritaiyî||2||1
|-
|Lema_bi_arîfama-mînîafîayî||2||1
|-
|Lema_bi_sirayî||2||1
|-
|Lema_bi_puluwatî||2||1
|-
|Lema_bi_nunguyî||2||1
|-
|Lema_bi_moromî||2||1
|-
|Lema_bi_kuturmiyî||2||1
|-
|Lema_bi_furî||2||1
|-
|Lema_bi_dabayî||2||1
|-
|Lema_bi_blang||2||1
|-
|Lema_bi_wandalayî||2||1
|-
|Lema_bi_slaveyiya_başûr||2||1
|-
|Lema_bi_pwoyiya_bakurî||2||1
|-
|Lema_bi_kwanjayî||2||1
|-
|Lema_bi_galelayî||2||1
|-
|Lema_bi_bokoyî||2||1
|-
|Lema_bi_zapotekiya_santiago_xanica||2||1
|-
|Lema_bi_timoteyî||2||1
|-
|Lema_bi_rakhineyî||2||1
|-
|Lema_bi_ogbiayî||2||1
|-
|Lema_bi_mungkipî||2||1
|-
|Lema_bi_kerayî||2||1
|-
|Lema_bi_îquitoyî||2||1
|-
|Lema_bi_gavarî||2||1
|-
|Lema_bi_boorî||2||1
|-
|Lema_bi_avavayî||2||1
|-
|Lema_bi_waşoyî||2||1
|-
|Lema_bi_tîkopyayî||2||1
|-
|Lema_bi_rembongî||2||1
|-
|Lema_bi_khanayî||2||1
|-
|Lema_bi_gcirikuyî||2||1
|-
|Lema_bi_oro_wînî||2||1
|-
|Lema_bi_nahalî||2||1
|-
|Lema_bi_maselayiya_rojhilat||2||1
|-
|Lema_bi_latundê||2||1
|-
|Lema_bi_baboleyî||2||1
|-
|Lema_bi_aka-karî||2||1
|-
|Lema_bi_rovyanayî||2||1
|-
|Lema_bi_kissiya_bakurî||2||1
|-
|Lema_bi_dubuyî||2||1
|-
|Lema_bi_burayî||2||1
|-
|Lema_bi_baka||2||1
|-
|Lema_bi_akpayî||2||1
|-
|Lema_bi_wutungî||2||1
|-
|Lema_bi_şekoyî||2||1
|-
|Lema_bi_paamayî||2||1
|-
|Lema_bi_jilî||2||1
|-
|Lema_bi_gulayî||2||1
|-
|Lema_bi_dyaabugayî||2||1
|-
|Lema_bi_aliyî||2||1
|-
|Lema_bi_xincayî||2||1
|-
|Lema_bi_sakirabiayî||2||1
|-
|Lema_bi_mbuunî||2||1
|-
|Lema_bi_jûr_modoyî||2||1
|-
|Lema_bi_menkayî||2||1
|-
|Lema_bi_konda-dorayî||2||1
|-
|Lema_bi_kaîepî||2||1
|-
|Lema_bi_embera-catioyî||2||1
|-
|Lema_bi_cemuhî||2||1
|-
|Lema_bi_baré||2||1
|-
|Lema_bi_tutçoneyiya_başûrî||2||1
|-
|Lema_bi_mfumteyî||2||1
|-
|Lema_bi_luhuyî||2||1
|-
|Lema_bi_korniya_kevn||2||1
|-
|Lema_bi_kalkatunguyî||2||1
|-
|Lema_bi_epenayî||2||1
|-
|Lema_bi_columbia-wenatçiyî||2||1
|-
|Lema_bi_amol||2||1
|-
|Lema_bi_yanomamî||2||1
|-
|Lema_bi_tamborayî||2||1
|-
|Lema_bi_heyo||2||1
|-
|Lema_bi_cumanagotoyî||2||1
|-
|Lema_bi_andoqueroyî||2||1
|-
|Lema_bi_yawayî||2||1
|-
|Lema_bi_umiray_dumaget_agtayî||2||1
|-
|Lema_bi_tanudan_kalingayî||2||1
|-
|Lema_bi_piamatsinayî||2||1
|-
|Lema_bi_mag-îndî_ayta||2||1
|-
|Lema_bi_kreyoliya_îngilîzî_ya_grenadî||2||1
|-
|Lema_bi_ese_ejjayî||2||1
|-
|Lema_bi_urî||2||1
|-
|Lema_bi_semayî||2||1
|-
|Lema_bi_ninzoyî||2||1
|-
|Lema_bi_hrangkholî||2||1
|-
|Lema_bi_tawasayî||2||1
|-
|Lema_bi_setî||2||1
|-
|Lema_bi_moereyî||2||1
|-
|Lema_bi_malayiya_kota_bangun_kutai||2||1
|-
|Lema_bi_kuku-uwanhî||2||1
|-
|Lema_bi_çiwereyî||2||1
|-
|Lema_bi_bidiyoyî||2||1
|-
|Lema_bi_yukî||2||1
|-
|Lema_bi_tehuelçeyî||2||1
|-
|Lema_bi_siliputî||2||1
|-
|Lema_bi_novgorodiya_kevn||2||1
|-
|Lema_bi_waima'ayî||2||1
|-
|Lema_bi_teopî||2||1
|-
|Lema_bi_pumeyî||2||1
|-
|Lema_bi_moroneneyî||2||1
|-
|Lema_bi_mandayî_(Awistralya)||2||1
|-
|Lema_bi_kutuyî||2||1
|-
|Lema_bi_kayagarî||2||1
|-
|Lema_bi_dadibî||2||1
|-
|Lema_bi_blinî||2||1
|-
|Lema_bi_asmatiya_navendî||2||1
|-
|Lema_bi_abayî||2||1
|-
|Lema_bi_zapotekiya_çoapan||2||1
|-
|Lema_bi_slaveyî||2||1
|-
|Lema_bi_pwoyiya_rojavayî||2||1
|-
|Lema_bi_mubî||2||1
|-
|Lema_bi_manoyî||2||1
|-
|Lema_bi_kwankayî||2||1
|-
|Lema_bi_kelonî||2||1
|-
|Lema_bi_îngayî||2||1
|-
|Lema_bi_athpare||2||1
|-
|Lema_bi_zapotekiya_santo_domingo_albarradas||2||1
|-
|Lema_bi_ralteyî||2||1
|-
|Lema_bi_îrantxeyî||2||1
|-
|Lema_bi_degenanî||2||1
|-
|Lema_bi_borayî||2||1
|-
|Lema_bi_adyukruyî||2||1
|-
|Lema_bi_zauzouyî||2||1
|-
|Lema_bi_watamî||2||1
|-
|Lema_bi_tîkunayî||2||1
|-
|Lema_bi_remontado_agta||2||1
|-
|Lema_bi_omaguayî||2||1
|-
|Lema_bi_marriammuyî||2||1
|-
|Lema_bi_khandeşiyî||2||1
|-
|Lema_bi_gejiyî||2||1
|-
|Lema_bi_ayabadhu||2||1
|-
|Lema_bi_zimbayî||2||1
|-
|Lema_bi_tojolabalî||2||1
|-
|Lema_bi_sukurî||2||1
|-
|Lema_bi_masiwang||2||1
|-
|Lema_bi_glavdayî||2||1
|-
|Lema_bi_babungoyî||2||1
|-
|Lema_bi_aka-kede||2||1
|-
|Lema_bi_otomiya_estado_de_meksîka||2||1
|-
|Lema_bi_mawakî||2||1
|-
|Lema_bi_lenjeyî||2||1
|-
|Lema_bi_kissiyiya_başûrî||2||1
|-
|Lema_bi_duhwayî||2||1
|-
|Lema_bi_şeltayî||2||1
|-
|Lema_bi_bambassî||2||1
|-
|Lema_bi_alladînî||2||1
|-
|Lema_bi_eggonî||2||1
|-
|Lema_bi_candoşi-şaprayî||2||1
|-
|Lema_bi_tumakî||2||1
|-
|Lema_bi_pangsengî||2||1
|-
|Lema_bi_ndogoyî||2||1
|-
|Lema_bi_kondayî||2||1
|-
|Lema_bi_hajongî||2||1
|-
|Lema_bi_embera-çamiyî||2||1
|-
|Lema_bi_bargamî||2||1
|-
|Lema_bi_yambetayî||2||1
|-
|Lema_bi_başkardiyî||2||1
|-
|Lema_bi_pençalî||2||1
|-
|Lema_bi_luwoyî||2||1
|-
|Lema_bi_kpanî||2||1
|-
|Lema_bi_kamî||2||1
|-
|Lema_bi_cungî||2||1
|-
|Lema_bi_andra-hus||2||1
|-
|Lema_bi_secoyayî||2||1
|-
|Lema_bi_piapocoyî||2||1
|-
|Lema_bi_ngombayî||2||1
|-
|Lema_bi_mixteciya_ayutla||2||1
|-
|Lema_bi_kreyoliya_îngilîzî_ya_guyanî||2||1
|-
|Lema_bi_hoavayî||2||1
|-
|Lema_bi_anmatyerre||2||1
|-
|Lema_bi_tarumayî||2||1
|-
|Lema_bi_semelayî||2||1
|-
|Lema_bi_pitta-pittayî||2||1
|-
|Lema_bi_nisenanî||2||1
|-
|Lema_bi_mîmiya_decorseyî||2||1
|-
|Lema_bi_makianiya_rojhilat||2||1
|-
|Lema_bi_karamojongî||2||1
|-
|Lema_bi_hreyî||2||1
|-
|Lema_bi_bepourî||2||1
|-
|Lema_bi_apaliyî||2||1
|-
|Lema_bi_vaghrî||2||1
|-
|Lema_bi_sezeyî||2||1
|-
|Lema_bi_nomatsiguengayî||2||1
|-
|Lema_bi_mofu-gudurî||2||1
|-
|Lema_bi_malayiya_makassar||2||1
|-
|Lema_bi_kulereyî||2||1
|-
|Lema_bi_huyî||2||1
|-
|Lema_bi_biete||2||1
|-
|Lema_bi_teiwayî||2||1
|-
|Lema_bi_silt'eyî||2||1
|-
|Lema_bi_mamasayî||2||1
|-
|Lema_bi_kupayî||2||1
|-
|Lema_bi_çuaboyî||2||1
|-
|Lema_bi_zakhringî||2||1
|-
|Lema_bi_waiwaî||2||1
|-
|Lema_bi_tepehuaniya_bakurî||2||1
|-
|Lema_bi_pumiya_bakurî||2||1
|-
|Lema_bi_nüpode_huitotoyî||2||1
|-
|Lema_bi_moroyî||2||1
|-
|Lema_bi_mandayî_(Hindistan)||2||1
|-
|Lema_bi_kuuk_thaayorreyî||2||1
|-
|Lema_bi_dagayî||2||1
|-
|Lema_bi_bo-rukulî||2||1
|-
|Lema_bi_assangorî||2||1
|-
|Lema_bi_zapotekiya_guevea_de_humboldt||2||1
|-
|Lema_bi_thado_çinî||2||1
|-
|Lema_bi_nyulnyulî||2||1
|-
|Lema_bi_dano||2||1
|-
|Lema_bi_bolango||2||1
|-
|Lema_bi_soninkeyî||2||1
|-
|Lema_bi_maratinoyî||2||1
|-
|Lema_bi_lafofayî||2||1
|-
|Lema_bi_kerekî||2||1
|-
|Lema_bi_gayilî||2||1
|-
|Lema_bi_borongî||2||1
|-
|Lema_bi_avîkam||2||1
|-
|Lema_bi_watubelayî||2||1
|-
|Lema_bi_tlacoapa_me'phaayî||2||1
|-
|Lema_bi_marrithiyelî||2||1
|-
|Lema_bi_khariayî||2||1
|-
|Lema_bi_gelaoyiya_hêşîn||2||1
|-
|Lema_bi_ayere||2||1
|-
|Lema_bi_weylsiya_kevn||2||1
|-
|Lema_bi_sukurumî||2||1
|-
|Lema_bi_nahwatliya_cosoleacaque||2||1
|-
|Lema_bi_laujeyî||2||1
|-
|Lema_bi_îzereyî||2||1
|-
|Lema_bi_gobasiyî||2||1
|-
|Lema_bi_wogamusinî||2||1
|-
|Lema_bi_torauyî||2||1
|-
|Lema_bi_toro_so_dogonî||2||1
|-
|Lema_bi_mawayî||2||1
|-
|Lema_bi_kitanemukî||2||1
|-
|Lema_bi_jaruyî||2||1
|-
|Lema_bi_dumayî||2||1
|-
|Lema_bi_bakoko||2||1
|-
|Lema_bi_akuntsu||2||1
|-
|Lema_bi_padoeyî||2||1
|-
|Lema_bi_nandeyî||2||1
|-
|Lema_bi_dzalayî||2||1
|-
|Lema_bi_bamumî||2||1
|-
|Lema_bi_xipayayî||2||1
|-
|Lema_bi_t'enî||2||1
|-
|Lema_bi_lo-togayî||2||1
|-
|Lema_bi_kokotayî||2||1
|-
|Lema_bi_lotukoyî||2||1
|-
|Lema_bi_embera-tadó||2||1
|-
|Lema_bi_barijî||2||1
|-
|Lema_bi_ambakîç||2||1
|-
|Lema_bi_takelmayî||2||1
|-
|Lema_bi_sanguyî_(Tanzanya)||2||1
|-
|Lema_bi_patagónî||2||1
|-
|Lema_bi_neververî||2||1
|-
|Lema_bi_haşayî||2||1
|-
|Lema_bi_amurdag||2||1
|-
|Lema_bi_yansî||2||1
|-
|Lema_bi_udukî||2||1
|-
|Lema_bi_sarî||2||1
|-
|Lema_bi_pendauyî||2||1
|-
|Lema_bi_minidienî||2||1
|-
|Lema_bi_kpasamî||2||1
|-
|Lema_bi_cunî||2||1
|-
|Lema_bi_bauyî||2||1
|-
|Lema_bi_aneityum||2||1
|-
|Lema_bi_ngombeyî_(Kongo)||2||1
|-
|Lema_bi_kanoeyî||2||1
|-
|Lema_bi_esîmbî||2||1
|-
|Lema_bi_belanda_borî||2||1
|-
|Lema_bi_uruangnirinî||2||1
|-
|Lema_bi_mîmiya_naçtigalî||2||1
|-
|Lema_bi_hrusoyî||2||1
|-
|Lema_bi_apatanî||2||1
|-
|Lema_bi_yongkomî||2||1
|-
|Lema_bi_vaglayî||2||1
|-
|Lema_bi_kulisusuyî||2||1
|-
|Lema_bi_karoyî||2||1
|-
|Lema_bi_hyamî||2||1
|-
|Lema_bi_simbalî||2||1
|-
|Lema_bi_nsarî||2||1
|-
|Lema_bi_kurankoyî||2||1
|-
|Lema_bi_katsoyî||2||1
|-
|Lema_bi_îamaleleyî||2||1
|-
|Lema_bi_bitareyî||2||1
|-
|Lema_bi_waîmaha||2||1
|-
|Lema_bi_tepehuaniya_başûr-rojavayî||2||1
|-
|Lema_bi_pumiya_başûrî||2||1
|-
|Lema_bi_nusuyî||2||1
|-
|Lema_bi_mortlockeseyî||2||1
|-
|Lema_bi_mandingoyî||2||1
|-
|Lema_bi_îgnacianoyî||2||1
|-
|Lema_bi_boanoyî_(Maluku)||2||1
|-
|Lema_bi_assanî||2||1
|-
|Lema_bi_wanecî||2||1
|-
|Lema_bi_thangmî||2||1
|-
|Lema_bi_q'anjob'alî||2||1
|-
|Lema_bi_mucuçî||2||1
|-
|Lema_bi_mansoankayî||2||1
|-
|Lema_bi_kemakî||2||1
|-
|Lema_bi_bolayî||2||1
|-
|Lema_bi_atohwaim||2||1
|-
|Lema_bi_zapotekiya_tabaa||2||1
|-
|Lema_bi_sonsorolî||2||1
|-
|Lema_bi_lahananî||2||1
|-
|Lema_bi_keresiya_rojavayî||2||1
|-
|Lema_bi_demisayî||2||1
|-
|Lema_bi_awa-cuaiquerî||2||1
|-
|Lema_bi_aekayî||2||1
|-
|Lema_bi_zayse-zergullayî||2||1
|-
|Lema_bi_watutiya_bakur||2||1
|-
|Lema_bi_tlacoatzintepec_çinantecî||2||1
|-
|Lema_bi_squamîşî||2||1
|-
|Lema_bi_ombayî||2||1
|-
|Lema_bi_mwaghavulî||2||1
|-
|Lema_bi_marrusînî||2||1
|-
|Lema_bi_lametî||2||1
|-
|Lema_bi_dinapigue_agtayî||2||1
|-
|Lema_bi_bubiyî||2||1
|-
|Lema_bi_ahàn||2||1
|-
|Lema_bi_zirenkelî||2||1
|-
|Lema_bi_sulodî||2||1
|-
|Lema_bi_orohayî||2||1
|-
|Lema_bi_matagalpayî||2||1
|-
|Lema_bi_kinalaknayî||2||1
|-
|Lema_bi_a-hmaoyî||2||1
|-
|Lema_bi_wogeoyî||2||1
|-
|Lema_bi_toronayî||2||1
|-
|Lema_bi_rumaî_palaungî||2||1
|-
|Lema_bi_otomiya_temoaya||2||1
|-
|Lema_bi_nahwatliya_zacatlan-ahuacatlan-tepetzintla||2||1
|-
|Lema_bi_mawesî||2||1
|-
|Lema_bi_dumiyî||2||1
|-
|Lema_bi_burmesoyî||2||1
|-
|Lema_bi_bakulungî||2||1
|-
|Lema_bi_trinitarioyî||2||1
|-
|Lema_bi_şerdukpenî||2||1
|-
|Lema_bi_sabineyî||2||1
|-
|Lema_bi_jirajirayî||2||1
|-
|Lema_bi_gumawanayî||2||1
|-
|Lema_bi_dzuunî||2||1
|-
|Lema_bi_bwanabwanayî||2||1
|-
|Lema_bi_bamuyî||2||1
|-
|Lema_bi_xiriânayî||2||1
|-
|Lema_bi_tswapongî||2||1
|-
|Lema_bi_tabancaleyî||2||1
|-
|Lema_bi_logbayî||2||1
|-
|Lema_bi_kolomî||2||1
|-
|Lema_bi_gvokoyî||2||1
|-
|Lema_bi_ekajukî||2||1
|-
|Lema_bi_bankan_tey_dogonî||2||1
|-
|Lema_bi_alyawarr||2||1
|-
|Lema_bi_yaguayî||2||1
|-
|Lema_bi_ndoyî||2||1
|-
|Lema_bi_menyayî||2||1
|-
|Lema_bi_konkombayî||2||1
|-
|Lema_bi_kakandayî||2||1
|-
|Lema_bi_haköyî||2||1
|-
|Lema_bi_cibakî||2||1
|-
|Lema_bi_barikewayî||2||1
|-
|Lema_bi_ambala_ayta||2||1
|-
|Lema_bi_yaminahuayî||2||1
|-
|Lema_bi_saniyo-hiyeweyî||2||1
|-
|Lema_bi_miçoacan_mazahuayî||2||1
|-
|Lema_bi_koronî||2||1
|-
|Lema_bi_hatamî||2||1
|-
|Lema_bi_copallenî||2||1
|-
|Lema_bi_saruayî||2||1
|-
|Lema_bi_ngandî||2||1
|-
|Lema_bi_ma'dî||2||1
|-
|Lema_bi_kpeeyî||2||1
|-
|Lema_bi_anem||2||1
|-
|Lema_bi_unde_kailî||2||1
|-
|Lema_bi_taparitayî||2||1
|-
|Lema_bi_sedangî||2||1
|-
|Lema_bi_piçinglisî||2||1
|-
|Lema_bi_mixteciya_noçixtlana_başûr-rojhilatî||2||1
|-
|Lema_bi_mahasu_paharî||2||1
|-
|Lema_bi_esmeraldayî||2||1
|-
|Lema_bi_uruavayî||2||1
|-
|Lema_bi_senayî||2||1
|-
|Lema_bi_pîkeneyiya_başûr||2||1
|-
|Lema_bi_nivacleyî||2||1
|-
|Lema_bi_karankawayî||2||1
|-
|Lema_bi_berik||2||1
|-
|Lema_bi_yopnoyî||2||1
|-
|Lema_bi_vaî||2||1
|-
|Lema_bi_sialumî||2||1
|-
|Lema_bi_nonuyayî||2||1
|-
|Lema_bi_karrieriya_başûrî||2||1
|-
|Lema_bi_finonganî||2||1
|-
|Lema_bi_bihî||2||1
|-
|Lema_bi_araweté||2||1
|-
|Lema_bi_teke-tyeeyî||2||1
|-
|Lema_bi_mongondowî||2||1
|-
|Lema_bi_katukinayî||2||1
|-
|Lema_bi_biwatî||2||1
|-
|Lema_bi_arop-lokep||2||1
|-
|Lema_bi_waîmîrî-atroarî||2||1
|-
|Lema_bi_motayî||2||1
|-
|Lema_bi_fyamî||2||1
|-
|Lema_bi_dahalikî||2||1
|-
|Lema_bi_boanoyî_(sulawesî)||2||1
|-
|Lema_bi_abenlen_ayta||2||1
|-
|Lema_bi_zapotekiya_mitla||2||1
|-
|Lema_bi_slavomolisanoyî||2||1
|-
|Lema_bi_zapotekiya_texmelucan||2||1
|-
|Lema_bi_tiniguayî||2||1
|-
|Lema_bi_rangî||2||1
|-
|Lema_bi_muratayak||2||1
|-
|Lema_bi_marauyî||2||1
|-
|Lema_bi_lahayî_(Viyetnam)||2||1
|-
|Lema_bi_îrarûtûyî||2||1
|-
|Lema_bi_gayónî||2||1
|-
|Lema_bi_aekyom||2||1
|-
|Lema_bi_watutiya_başûr||2||1
|-
|Lema_bi_tlaçiçilco_tepehuayî||2||1
|-
|Lema_bi_stoneyî||2||1
|-
|Lema_bi_rerauyî||2||1
|-
|Lema_bi_ömie||2||1
|-
|Lema_bi_khehekî||2||1
|-
|Lema_bi_dineorî||2||1
|-
|Lema_bi_orokoloyî||2||1
|-
|Lema_bi_akar-baleyî||2||1
|-
|Lema_bi_woî||2||1
|-
|Lema_bi_otomiya_tenango||2||1
|-
|Lema_bi_kitjayî||2||1
|-
|Lema_bi_gros_ventre||2||1
|-
|Lema_bi_trió||2||1
|-
|Lema_bi_mbandjayî||2||1
|-
|Lema_bi_e'ma_buyangî||2||1
|-
|Lema_bi_bwatûyî||2||1
|-
|Lema_bi_banayî||2||1
|-
|Lema_bi_xişanba_laloyî||2||1
|-
|Lema_bi_tswayî||2||1
|-
|Lema_bi_saksoniya_transylvanyayê||2||1
|-
|Lema_bi_palorî||2||1
|-
|Lema_bi_nawathinehenayî||2||1
|-
|Lema_bi_media_lenguayî||2||1
|-
|Lema_bi_kaçama-ganjuleyî||2||1
|-
|Lema_bi_gwahatikeyî||2||1
|-
|Lema_bi_ekariyî||2||1
|-
|Lema_bi_carapanayî||2||1
|-
|Lema_bi_bankayî||2||1
|-
|Lema_bi_yagwoiayî||2||1
|-
|Lema_bi_tumtumî||2||1
|-
|Lema_bi_tagwana_senoufoyî||2||1
|-
|Lema_bi_panimî||2||1
|-
|Lema_bi_ndyuka-trio_pidginî||2||1
|-
|Lema_bi_lovonoyî||2||1
|-
|Lema_bi_konniyî||2||1
|-
|Lema_bi_halangî||2||1
|-
|Lema_bi_cicipu||2||1
|-
|Lema_bi_bariyayî||2||1
|-
|Lema_bi_patpatarî||2||1
|-
|Lema_bi_luleyî||2||1
|-
|Lema_bi_kamakanî||2||1
|-
|Lema_bi_hattîkî||2||1
|-
|Lema_bi_batakiya_alas-kluet||2||1
|-
|Lema_bi_ana_tinga_dogonî||2||1
|-
|Lema_bi_yaoureyî||2||1
|-
|Lema_bi_ujirî||2||1
|-
|Lema_bi_tampuanî||2||1
|-
|Lema_bi_ngarinyinî||2||1
|-
|Lema_bi_minjungbalî||2||1
|-
|Lema_bi_ma'yayî||2||1
|-
|Lema_bi_kpelleyî||2||1
|-
|Lema_bi_kamulayî||2||1
|-
|Lema_bi_curripacoyî||2||1
|-
|Lema_bi_bawziyî||2||1
|-
|Lema_bi_yekheeyî||2||1
|-
|Lema_bi_uneapayî||2||1
|-
|Lema_bi_sedoayî||2||1
|-
|Lema_bi_pidginiya_samoan_plantation||2||1
|-
|Lema_bi_ngoremeyî||2||1
|-
|Lema_bi_mixteciya_peñoles||2||1
|-
|Lema_bi_çanayî||2||1
|-
|Lema_bi_yinbaw_karenî||2||1
|-
|Lema_bi_tatanayî||2||1
|-
|Lema_bi_maku'ayî||2||1
|-
|Lema_bi_fakkanciyî||2||1
|-
|Lema_bi_beromî||2||1
|-
|Lema_bi_valle_nacional_çinantecî||2||1
|-
|Lema_bi_siangî||2||1
|-
|Lema_bi_bilakurayî||2||1
|-
|Lema_bi_arbore||2||1
|-
|Lema_bi_yupuayî||2||1
|-
|Lema_bi_vunapuyî||2||1
|-
|Lema_bi_simboyî||2||1
|-
|Lema_bi_proto-cermeniya_rojava||2||1
|-
|Lema_bi_kurî||2||1
|-
|Lema_bi_wajarrî||2||1
|-
|Lema_bi_moûk-arîakî||2||1
|-
|Lema_bi_mandobo_bawahî||2||1
|-
|Lema_bi_fyerî||2||1
|-
|Lema_bi_dahaloyî||2||1
|-
|Lema_bi_abeyî||2||1
|-
|Lema_bi_zapotekiya_mixtepec||2||1
|-
|Lema_bi_wangkayutyuruyî||2||1
|-
|Lema_bi_qabiaoyî||2||1
|-
|Lema_bi_nzanyî||2||1
|-
|Lema_bi_kemezungî||2||1
|-
|Lema_bi_daro-matu_melanauyî||2||1
|-
|Lema_bi_atong_(Kamerun)||2||1
|-
|Lema_bi_açeyî||2||1
|-
|Lema_bi_zapotekiya_tilquiapan||2||1
|-
|Lema_bi_lahndayî||2||1
|-
|Lema_bi_îrayayî||2||1
|-
|Lema_bi_bourbonnais-berriçonî||2||1
|-
|Lema_bi_afadeyî||2||1
|-
|Lema_bi_zenzontepekiya_çatîno||2||1
|-
|Lema_bi_watutiya_navîn||2||1
|-
|Lema_bi_lamogayî||2||1
|-
|Lema_bi_gelayî||2||1
|-
|Lema_bi_ayoreoyî||2||1
|-
|Lema_bi_zoqueyiya_çimalapa||2||1
|-
|Lema_bi_wiçi_lhamtes_noctenî||2||1
|-
|Lema_bi_sulungî||2||1
|-
|Lema_bi_matbatî||2||1
|-
|Lema_bi_kingayî||2||1
|-
|Lema_bi_jabutiyî||2||1
|-
|Lema_bi_gofayî||2||1
|-
|Lema_bi_domarî||2||1
|-
|Lema_bi_bulî_(Gana)||2||1
|-
|Lema_bi_wojenakayî||2||1
|-
|Lema_bi_torricelli_yauyî||2||1
|-
|Lema_bi_şaboyî||2||1
|-
|Lema_bi_mayangnayî||2||1
|-
|Lema_bi_kitsaiyî||2||1
|-
|Lema_bi_trîkuyiya_copala||2||1
|-
|Lema_bi_şeyî||2||1
|-
|Lema_bi_paguyî||2||1
|-
|Lema_bi_mbatoyî||2||1
|-
|Lema_bi_jola-fonyiyî||2||1
|-
|Lema_bi_gunuyî||2||1
|-
|Lema_bi_ebirayî||2||1
|-
|Lema_bi_paluanî||2||1
|-
|Lema_bi_gwarayî||2||1
|-
|Lema_bi_ekitî||2||1
|-
|Lema_bi_carayî||2||1
|-
|Lema_bi_bankonî||2||1
|-
|Lema_bi_amahuaca||2||1
|-
|Lema_bi_yahangî||2||1
|-
|Lema_bi_mereiyî||2||1
|-
|Lema_bi_konomalayî||2||1
|-
|Lema_bi_halbiyî||2||1
|-
|Lema_bi_emerillonî||2||1
|-
|Lema_bi_ciguayoyî||2||1
|-
|Lema_bi_ambeleyî||2||1
|-
|Lema_bi_yan-nhanguyî||2||1
|-
|Lema_bi_talayî||2||1
|-
|Lema_bi_migaamayî||2||1
|-
|Lema_bi_lumunî||2||1
|-
|Lema_bi_korwayî||2||1
|-
|Lema_bi_kamangî||2||1
|-
|Lema_bi_anakalunguyî||2||1
|-
|Lema_bi_pericú||2||1
|-
|Lema_bi_ngarlumayî||2||1
|-
|Lema_bi_maakayî||2||1
|-
|Lema_bi_kamweyî||2||1
|-
|Lema_bi_hindkoyiya_başûrî||2||1
|-
|Lema_bi_cuvokî||2||1
|-
|Lema_bi_yeloguyî||2||1
|-
|Lema_bi_unemeyî||2||1
|-
|Lema_bi_tapieteyî||2||1
|-
|Lema_bi_seenkuyî||2||1
|-
|Lema_bi_ngoşieyî||2||1
|-
|Lema_bi_mixteciya_pueblaya_başûr||2||1
|-
|Lema_bi_mahouyî||2||1
|-
|Lema_bi_kreyoliya_nîkaraguayî||2||1
|-
|Lema_bi_esselenî||2||1
|-
|Lema_bi_çangî||2||1
|-
|Lema_bi_anuak||2||1
|-
|Lema_bi_senggî||2||1
|-
|Lema_bi_makurapî||2||1
|-
|Lema_bi_hubayî||2||1
|-
|Lema_bi_çimilayî||2||1
|-
|Lema_bi_bertayî||2||1
|-
|Lema_bi_apma||2||1
|-
|Lema_bi_sianî||2||1
|-
|Lema_bi_noonî||2||1
|-
|Lema_bi_moikodî||2||1
|-
|Lema_bi_idunayî||2||1
|-
|Lema_bi_proto-cermenî||2||1
|-
|Lema_bi_moniya_kevn||2||1
|-
|Lema_bi_mamprulî||2||1
|-
|Lema_bi_arrernteya_rojavayî||2||1
|-
|Lema_bi_zangwalî||2||1
|-
|Lema_bi_sisaalayiya_rojavayî||2||1
|-
|Lema_bi_mangarayî||2||1
|-
|Lema_bi_kuynaultî||2||1
|-
|Lema_bi_kayardildî||2||1
|-
|Lema_bi_îkî||2||1
|-
|Lema_bi_daiyî||2||1
|-
|Lema_bi_boboyiya_başûrî||2||1
|-
|Lema_bi_asu||2||1
|-
|Lema_bi_abipon||2||1
|-
|Lema_bi_zapotekiya_ocotlan||2||1
|-
|Lema_bi_wangkumarayî||2||1
|-
|Lema_bi_nzimayî||2||1
|-
|Lema_bi_manzayî||2||1
|-
|Lema_bi_kwerbayî||2||1
|-
|Lema_bi_kemi_samî||2||1
|-
|Lema_bi_gamoyî||2||1
|-
|Lema_bi_bolokî||2||1
|-
|Lema_bi_atsugewî||2||1
|-
|Lema_bi_zapotekiya_tlacolulita||2||1
|-
|Lema_bi_waritaî||2||1
|-
|Lema_bi_rapayî||2||1
|-
|Lema_bi_ojibweyiya_severnê||2||1
|-
|Lema_bi_maridanî||2||1
|-
|Lema_bi_kerewoyî||2||1
|-
|Lema_bi_îrî||2||1
|-
|Lema_bi_gbagyiyî||2||1
|-
|Lema_bi_bozoyiya_hainyaxo||2||1
|-
|Lema_bi_awar||2||1
|-
|Lema_bi_reşeyî||2||1
|-
|Lema_bi_oneyiya_inebu||2||1
|-
|Lema_bi_mwerayî||2||1
|-
|Lema_bi_îteneyî||2||1
|-
|Lema_bi_gendeyî||2||1
|-
|Lema_bi_diraşayî||2||1
|-
|Lema_bi_ahwayî||2||1
|-
|Lema_bi_tolomakoyî||2||1
|-
|Lema_bi_matengoyî||2||1
|-
|Lema_bi_kinikinaoyî||2||1
|-
|Lema_bi_jah_hutî||2||1
|-
|Lema_bi_gogoyî||2||1
|-
|Lema_bi_dompoyî||2||1
|-
|Lema_bi_bafanjî||2||1
|-
|Lema_bi_wokkonî||2||1
|-
|Lema_bi_torricellî||2||1
|-
|Lema_bi_şall-zwallî||2||1
|-
|Lema_bi_owayî||2||1
|-
|Lema_bi_mayaniya_epigrafîk||2||1
|-
|Lema_bi_durango_nahuatliya_rojavayî||2||1
|-
|Lema_bi_balaesang||2||1
|-
|Lema_bi_alabat_island_agtayî||2||1
|-
|Lema_bi_xamtangayî||2||1
|-
|Lema_bi_şinayiya_kohistanî||2||1
|-
|Lema_bi_sacatayî||2||1
|-
|Lema_bi_pahanan_agta||2||1
|-
|Lema_bi_nar_phuyî||2||1
|-
|Lema_bi_mbembeyiya_çema_crossê||2||1
|-
|Lema_bi_knaanicî||2||1
|-
|Lema_bi_jowuluyî||2||1
|-
|Lema_bi_cabiyariyî||2||1
|-
|Lema_bi_banda_malayî||2||1
|-
|Lema_bi_tşobdunî||2||1
|-
|Lema_bi_salibayî_(Gîneya_nû)||2||1
|-
|Lema_bi_mefeleyî||2||1
|-
|Lema_bi_lokoyî||2||1
|-
|Lema_bi_kadaruyî||2||1
|-
|Lema_bi_ekpeyeyî||2||1
|-
|Lema_bi_bantawa||2||1
|-
|Lema_bi_amaimonî||2||1
|-
|Lema_bi_yahunayî||2||1
|-
|Lema_bi_tuneboyiya_navendî||2||1
|-
|Lema_bi_paporayî||2||1
|-
|Lema_bi_negerhollandsî||2||1
|-
|Lema_bi_mereyî||2||1
|-
|Lema_bi_konomihuyî||2||1
|-
|Lema_bi_kalabariyî||2||1
|-
|Lema_bi_haliayî||2||1
|-
|Lema_bi_amblongî||2||1
|-
|Lema_bi_yanayî||2||1
|-
|Lema_bi_ngaanyatjarrayî||2||1
|-
|Lema_bi_kamanoyî||2||1
|-
|Lema_bi_analî||2||1
|-
|Lema_bi_ukurigumayî||2||1
|-
|Lema_bi_satere-maweyî||2||1
|-
|Lema_bi_mabaanî||2||1
|-
|Lema_bi_krenakî||2||1
|-
|Lema_bi_hindustaniyiya_karibî||2||1
|-
|Lema_bi_tapirapeyî||2||1
|-
|Lema_bi_mixteciya_san_miguel_el_grande||2||1
|-
|Lema_bi_kanufiyî||2||1
|-
|Lema_bi_çapacurayî||2||1
|-
|Lema_bi_anufoyî||2||1
|-
|Lema_bi_usanî||2||1
|-
|Lema_bi_sepayî_(Gîneya_nû)||2||1
|-
|Lema_bi_karawayî||2||1
|-
|Lema_bi_çimwiinî||2||1
|-
|Lema_bi_vanimoyî||2||1
|-
|Lema_bi_siar-lakî||2||1
|-
|Lema_bi_pomoyiya_navendî||2||1
|-
|Lema_bi_malaynonî||2||1
|-
|Lema_bi_kumbewahayî||2||1
|-
|Lema_bi_idunî||2||1
|-
|Lema_bi_tembeyî||2||1
|-
|Lema_bi_sinacantanî||2||1
|-
|Lema_bi_nuguriayî||2||1
|-
|Lema_bi_mamujuyî||2||1
|-
|Lema_bi_kurnayî||2||1
|-
|Lema_bi_bîbaalî||2||1
|-
|Lema_bi_terayî||2||1
|-
|Lema_bi_moyî||2||1
|-
|Lema_bi_kayeliyî||2||1
|-
|Lema_bi_îkomayî||2||1
|-
|Lema_bi_ga'dangî||2||1
|-
|Lema_bi_bodo_gadabayî||2||1
|-
|Lema_bi_abîdjî||2||1
|-
|Lema_bi_zapotekiya_ozolotepec||2||1
|-
|Lema_bi_wanhamî||2||1
|-
|Lema_bi_thompsonî||2||1
|-
|Lema_bi_kwereyî||2||1
|-
|Lema_bi_kenaboî||2||1
|-
|Lema_bi_ganayî||2||1
|-
|Lema_bi_datoogayî||2||1
|-
|Lema_bi_zapotekiya_xanaguia||2||1
|-
|Lema_bi_maridjabinî||2||1
|-
|Lema_bi_lakayî||2||1
|-
|Lema_bi_kerînçî||2||1
|-
|Lema_bi_gbanî||2||1
|-
|Lema_bi_denya||2||1
|-
|Lema_bi_bragat||2||1
|-
|Lema_bi_awera||2||1
|-
|Lema_bi_zhabayî||2||1
|-
|Lema_bi_wawayî||2||1
|-
|Lema_bi_subaneniya_bakurî||2||1
|-
|Lema_bi_rettayî||2||1
|-
|Lema_bi_öngeyî||2||1
|-
|Lema_bi_mwotlapî||2||1
|-
|Lema_bi_marúboyî||2||1
|-
|Lema_bi_langiyî||2||1
|-
|Lema_bi_khonsoyî||2||1
|-
|Lema_bi_îtikî||2||1
|-
|Lema_bi_budza||2||1
|-
|Lema_bi_ayuyî||2||1
|-
|Lema_bi_aikanayî||2||1
|-
|Lema_bi_tominî||2||1
|-
|Lema_bi_oroyî||2||1
|-
|Lema_bi_nahwatliya_huaxcaleca||2||1
|-
|Lema_bi_matisî||2||1
|-
|Lema_bi_kinnauriyî||2||1
|-
|Lema_bi_dongolawiyî||2||1
|-
|Lema_bi_bunabayî||2||1
|-
|Lema_bi_bafiayî||2||1
|}
==== Modul:zimanên etîmolojiyê====
{{Special:PrefixIndex/Modul:zimanên etîmolojiyê/|stripprefix=yes}}
==== Modul:etymology languages====
{{Special:PrefixIndex/Modul:etymology languages/|stripprefix=yes}}
==== Binêre herwiha ====
{{veşêre-ser}}
{| class="wikitable"
!wikilink
|-
|[[Pêvek:Bêçavkanî]]
|-
|[[Pêvek:Bêçavkanî/a]]
|-
|[[Pêvek:Bêçavkanî/a/alozbûn wekî wayra]]
|-
|[[Pêvek:Bêçavkanî/aloq]]
|-
|[[Pêvek:Bêçavkanî/alozbûn]]
|-
|[[Pêvek:Bêçavkanî/amerzandin]]
|-
|[[Pêvek:Bêçavkanî/asûm]]
|-
|[[Pêvek:Bêçavkanî/bester]]
|-
|[[Pêvek:Bêçavkanî/cewser]]
|-
|[[Pêvek:Bêçavkanî/derbest]]
|-
|[[Pêvek:Bêçavkanî/dogirme]]
|-
|[[Pêvek:Bêçavkanî/dolivandin]]
|-
|[[Pêvek:Bêçavkanî/dêziman]]
|-
|[[Pêvek:Bêçavkanî/girêmestî]]
|-
|[[Pêvek:Bêçavkanî/hesoskî]]
|-
|[[Pêvek:Bêçavkanî/hilinder]]
|-
|[[Pêvek:Bêçavkanî/ji barê ve]]
|-
|[[Pêvek:Bêçavkanî/kakilîk]]
|-
|[[Pêvek:Bêçavkanî/kedpîr]]
|-
|[[Pêvek:Bêçavkanî/kilûç]]
|-
|[[Pêvek:Bêçavkanî/nêremê]]
|-
|[[Pêvek:Bêçavkanî/nû]]
|-
|[[Pêvek:Bêçavkanî/oc bûn]]
|-
|[[Pêvek:Bêçavkanî/qomik]]
|-
|[[Pêvek:Bêçavkanî/rojol]]
|-
|[[Pêvek:Bêçavkanî/sîniyar]]
|-
|[[Pêvek:Bêçavkanî/tazîger]]
|-
|[[Pêvek:Bêçavkanî/tevilîn]]
|-
|[[Pêvek:Bêçavkanî/torecivîn]]
|-
|[[Pêvek:Bêçavkanî/zelîn]]
|-
|[[Pêvek:Bêçavkanî/şeebî]]
|}
{{veşêre-bin}}
8rjnllexwo74cjvu1y2a4abh9q5k00l
6292079
6292078
2026-07-29T20:34:32Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292079
wikitext
text/x-wiki
== lmea ==
{| class="wikitable sortable"
!subcategory!!item_count!!subcategory_count
|-
|Lema_bi_kurmancî||160941||27
|-
|Lema_bi_îngilîzî||64960||24
|-
|Lema_bi_tirkî||63177||21
|-
|Lema_bi_almanî||25958||22
|-
|Lema_bi_polonî||15447||14
|-
|Lema_bi_japonî||13399||14
|-
|Lema_bi_farisî||10285||19
|-
|Lema_bi_sirboxirwatî||6644||13
|-
|Lema_bi_fransî||6377||16
|-
|Lema_bi_gurcî||5826||13
|-
|Lema_bi_îtalî||5318||14
|-
|Lema_bi_fînî||5187||15
|-
|Lema_bi_rusî||5045||15
|-
|Lema_bi_spanî||4713||14
|-
|Lema_bi_erebî||4566||18
|-
|Lema_bi_holendî||4165||14
|-
|Lema_bi_hindî||4102||13
|-
|Lema_bi_çekî||3880||13
|-
|Lema_bi_mandarînî||3842||13
|-
|Lema_bi_portugalî||3645||14
|-
|Lema_bi_ûkraynî||3594||13
|-
|Lema_bi_mecarî||3558||13
|-
|Lema_bi_koreyî||3517||15
|-
|Lema_bi_belarusî||3508||13
|-
|Lema_bi_latînî||3464||14
|-
|Lema_bi_soranî||3449||20
|-
|Lema_bi_swêdî||3311||14
|-
|Lema_bi_ermenî||3268||14
|-
|Lema_bi_bulgarî||3219||13
|-
|Lema_bi_romanyayî||3199||12
|-
|Lema_bi_danmarkî||3130||13
|-
|Lema_bi_galîsî||3130||13
|-
|Lema_bi_yûnanî||3113||14
|-
|Lema_bi_esperantoyî||3086||16
|-
|Lema_bi_tagalogî||3018||14
|-
|Lema_bi_ferî||2967||13
|-
|Lema_bi_viyetnamî||2936||12
|-
|Lema_bi_katalanî||2933||13
|-
|Lema_bi_îzlendî||2892||13
|-
|Lema_bi_estonî||2827||13
|-
|Lema_bi_azerî||2822||14
|-
|Lema_bi_sebwanoyî||2681||13
|-
|Lema_bi_makedonî||2665||13
|-
|Lema_bi_îbranî||2642||14
|-
|Lema_bi_tayî||2608||13
|-
|Lema_bi_latviyayî||2606||13
|-
|Lema_bi_slovakî||2552||13
|-
|Lema_bi_malezî||2540||13
|-
|Lema_bi_îrlendî||2505||13
|-
|Lema_bi_tacikî||2491||12
|-
|Lema_bi_yûnaniya_kevn||2418||12
|-
|Lema_bi_slovenî||2406||12
|-
|Lema_bi_qazaxî||2358||13
|-
|Lema_bi_maorî||2335||13
|-
|Lema_bi_mongolî||2281||12
|-
|Lema_bi_albanî||2280||13
|-
|Lema_bi_ozbekî||2240||13
|-
|Lema_bi_lîtwanî||2221||13
|-
|Lema_bi_urdûyî||2190||14
|-
|Lema_bi_ximêrî||2190||13
|-
|Lema_bi_endonezyayî||2059||14
|-
|Lema_bi_weylsî||2037||12
|-
|Lema_bi_lawsî||2029||13
|-
|Lema_bi_bengalî||2016||12
|-
|Lema_bi_zazakî||1992||15
|-
|Lema_bi_kirgizî||1971||12
|-
|Lema_bi_yidîşî||1917||13
|-
|Lema_bi_gaelîka_skotî||1903||11
|-
|Lema_bi_burmayî||1860||13
|-
|Lema_bi_telûgûyî||1802||11
|-
|Lema_bi_norweciya_bokmålî||1790||11
|-
|Lema_bi_çînî||1670||6
|-
|Lema_bi_peştûyî||1600||12
|-
|Lema_bi_baskî||1588||13
|-
|Lema_bi_oksîtanî||1577||12
|-
|Lema_bi_swahîlî||1547||14
|-
|Lema_bi_astûrî||1536||13
|-
|Lema_bi_afrîkansî||1535||13
|-
|Lema_bi_tirkmenî||1521||11
|-
|Lema_bi_norweciya_nînorskî||1508||12
|-
|Lema_bi_kantonî||1502||12
|-
|Lema_bi_oygurî||1483||12
|-
|Lema_bi_romancî||1455||10
|-
|Lema_bi_sardînî||1447||12
|-
|Lema_bi_volapûkî||1379||10
|-
|Lema_bi_îdoyî||1377||14
|-
|Lema_bi_malayalamî||1370||11
|-
|Lema_bi_maltayî||1348||13
|-
|Lema_bi_başkîrî||1339||12
|-
|Lema_bi_tamîlî||1327||13
|-
|Lema_bi_îngilîziya_kevn||1243||12
|-
|Lema_bi_sanskrîtî||1228||12
|-
|Lema_bi_teterî||1220||10
|-
|Lema_bi_aromanî||1217||12
|-
|Lema_bi_normandî||1180||11
|-
|Lema_bi_norwecî||1154||14
|-
|Lema_bi_sicîlî||1143||10
|-
|Lema_bi_bretonî||1137||13
|-
|Lema_bi_asamî||1132||11
|-
|Lema_bi_tîbetî||1109||10
|-
|Lema_bi_minnanî||1105||10
|-
|Lema_bi_navajoyî||1077||13
|-
|Lema_bi_frîsî||1063||13
|-
|Lema_bi_puncabî||1057||11
|-
|Lema_bi_venîsî||1055||10
|-
|Lema_bi_friyolî||1019||11
|-
|Lema_bi_walonî||992||12
|-
|Lema_bi_hawayî||964||12
|-
|Lema_bi_luksembûrgî||961||13
|-
|Lema_bi_amharî||949||11
|-
|Lema_bi_erebiya_misrî||938||11
|-
|Lema_bi_înterlîngua||921||11
|-
|Lema_bi_kalalîsûtî||916||10
|-
|Lema_bi_maratî||914||11
|-
|Lema_bi_manksî||911||10
|-
|Lema_bi_keçwayî||898||11
|-
|Lema_bi_sorbiya_jêrîn||876||12
|-
|Lema_bi_kîngalî||867||11
|-
|Lema_bi_kannadayî||834||10
|-
|Lema_bi_kurdiya_başûrî||830||12
|-
|Lema_bi_osmanî||774||10
|-
|Lema_bi_gujaratî||771||11
|-
|Lema_bi_çeçenî||766||11
|-
|Lema_bi_javayî||751||11
|-
|Lema_bi_plodîşî||750||8
|-
|Lema_bi_çerokî||745||11
|-
|Lema_bi_nedersaksî||739||11
|-
|Lema_bi_erebiya_hîcazî||718||11
|-
|Lema_bi_slaviya_kevn||713||11
|-
|Lema_bi_nepalî||696||11
|-
|Lema_bi_kornî||696||10
|-
|Lema_bi_sorbiya_jorîn||661||10
|-
|Lema_bi_zhuangî||660||10
|-
|Lema_bi_osetî||655||13
|-
|Lema_bi_samiya_bakurî||654||13
|-
|Lema_bi_dunganî||648||10
|-
|Lema_bi_îngriyî||633||9
|-
|Lema_bi_skotî||626||12
|-
|Lema_bi_gotî||626||11
|-
|Lema_bi_oriyayî||624||9
|-
|Lema_bi_mançûyî||614||10
|-
|Lema_bi_teteriya_krîmî||610||10
|-
|Lema_bi_latgalî||610||10
|-
|Lema_bi_yakutî||592||11
|-
|Lema_bi_haîtî||590||10
|-
|Lema_bi_erebiya_fasî||580||11
|-
|Lema_bi_hawsayî||544||9
|-
|Lema_bi_zuluyî||539||10
|-
|Lema_bi_çuvaşî||524||10
|-
|Lema_bi_yorubayî||517||10
|-
|Lema_bi_abxazî||511||10
|-
|Lema_bi_somalî||510||10
|-
|Lema_bi_frîsiya_bakur||507||9
|-
|Lema_bi_ladînoyî||505||10
|-
|Lema_bi_aragonî||502||10
|-
|Lema_bi_tigrînî||494||11
|-
|Lema_bi_aramiya_nû_ya_asûrî||487||9
|-
|Lema_bi_hakkayî||481||9
|-
|Lema_bi_îngilîziya_navîn||480||10
|-
|Lema_bi_palî||474||6
|-
|Lema_bi_navzimanî||472||7
|-
|Lema_bi_çîçewayî||456||10
|-
|Lema_bi_oromoyî||453||8
|-
|Lema_bi_almaniya_jêrîn_a_almanî||450||9
|-
|Lema_bi_lombardî||449||9
|-
|Lema_bi_kaşûbî||445||8
|-
|Lema_bi_altayiya_başûrî||436||10
|-
|Lema_bi_aramî||432||11
|-
|Lema_bi_bîkoliya_naverast||426||11
|-
|Lema_bi_korsîkayî||423||10
|-
|Lema_bi_ojibweyî||422||11
|-
|Lema_bi_papyamentoyî||421||10
|-
|Lema_bi_rusînî||420||11
|-
|Lema_bi_avarî||412||9
|-
|Lema_bi_toxarî_B||410||8
|-
|Lema_bi_kalmîkî||410||9
|-
|Lema_bi_qiptî||402||9
|-
|Lema_bi_malagasî||401||10
|-
|Lema_bi_napolîtanî||400||11
|-
|Lema_bi_elmanîşî||395||11
|-
|Lema_bi_dalmatî||393||8
|-
|Lema_bi_guwaranî||393||11
|-
|Lema_bi_slaviya_rojavayî_ya_kevn||393||9
|-
|Lema_bi_tuvanî||392||11
|-
|Lema_bi_divehî||391||10
|-
|Lema_bi_adîgeyî||389||9
|-
|Lema_bi_buryatî||387||8
|-
|Lema_bi_wuyî||384||9
|-
|Lema_bi_kapampanganî||376||11
|-
|Lema_bi_erzayî||357||9
|-
|Lema_bi_udmurtî||347||9
|-
|Lema_bi_lueyî||346||8
|-
|Lema_bi_romanî||346||11
|-
|Lema_bi_sundanî||339||11
|-
|Lema_bi_îlokanoyî||336||10
|-
|Lema_bi_siryaniya_klasîk||334||9
|-
|Lema_bi_şîngazîcayî||330||10
|-
|Lema_bi_min_dongî||330||9
|-
|Lema_bi_evenkî||328||6
|-
|Lema_bi_kumikî||327||8
|-
|Lema_bi_belûçî||327||9
|-
|Lema_bi_ladînî||319||10
|-
|Lema_bi_îngûşî||316||8
|-
|Lema_bi_sindhî||315||9
|-
|Lema_bi_lezgînî||314||6
|-
|Lema_bi_fransiya_kevn||311||11
|-
|Lema_bi_norsiya_kevn||308||10
|-
|Lema_bi_lîvonî||308||10
|-
|Lema_bi_tetûmî||306||7
|-
|Lema_bi_tokpisinî||293||11
|-
|Lema_bi_şanî||290||9
|-
|Lema_bi_wolofî||287||10
|-
|Lema_bi_maranaoyî||286||9
|-
|Lema_bi_nanayî||278||6
|-
|Lema_bi_nahwatlî||278||8
|-
|Lema_bi_kîkûyûyî||277||9
|-
|Lema_bi_sotoyiya_başûr||277||9
|-
|Lema_bi_hmongî||277||9
|-
|Lema_bi_lîgûrî||275||10
|-
|Lema_bi_romagnolî||273||8
|-
|Lema_bi_lîmbûrgî||267||9
|-
|Lema_bi_samoayî||265||10
|-
|Lema_bi_îrlendiya_kevn||265||10
|-
|Lema_bi_keşmîrî||261||7
|-
|Lema_bi_piedmontîsî||258||7
|-
|Lema_bi_çamicuroyî||256||8
|-
|Lema_bi_hîlîgaynonî||253||11
|-
|Lema_bi_megrelî||251||9
|-
|Lema_bi_hunsrikî||249||7
|-
|Lema_bi_tarifitî||248||5
|-
|Lema_bi_karaçay-balkarî||247||7
|-
|Lema_bi_warayî||247||9
|-
|Lema_bi_mîrandî||246||8
|-
|Lema_bi_sîlhetî||245||10
|-
|Lema_bi_eweyî||245||9
|-
|Lema_bi_lingalayî||242||9
|-
|Lema_bi_almaniya_Pennsylvania||239||9
|-
|Lema_bi_almaniya_bilind_a_kevn||236||9
|-
|Lema_bi_talişî||235||7
|-
|Lema_bi_nahwatliya_klasîk||234||10
|-
|Lema_bi_çukçî||234||8
|-
|Lema_bi_aynuyî||232||9
|-
|Lema_bi_ugarîtî||231||7
|-
|Lema_bi_xosayî||225||8
|-
|Lema_bi_samiya_skoltî||223||8
|-
|Lema_bi_kapverdî||221||6
|-
|Lema_bi_erebiya_başûrê_şamê||221||9
|-
|Lema_bi_xakasî||218||7
|-
|Lema_bi_înuîtî||217||10
|-
|Lema_bi_conxayî||215||9
|-
|Lema_bi_sirananî||212||8
|-
|Lema_bi_voroyî||210||8
|-
|Lema_bi_mokşayî||209||8
|-
|Lema_bi_ermeniya_kevn||209||8
|-
|Lema_bi_mariya_rojhilatî||209||6
|-
|Lema_bi_çîkasawî||208||8
|-
|Lema_bi_yupîkiya_navendî||207||8
|-
|Lema_bi_şorî||206||7
|-
|Lema_bi_wîlamowî||206||8
|-
|Lema_bi_apaçiya_rojava||205||9
|-
|Lema_bi_higaononî||203||6
|-
|Lema_bi_javayiya_kevn||201||6
|-
|Lema_bi_elfdalî||200||8
|-
|Lema_bi_tongî||200||9
|-
|Lema_bi_îstriyotî||200||8
|-
|Lema_bi_silesî||200||8
|-
|Lema_bi_mayayiya_yukatekî||198||8
|-
|Lema_bi_tausugî||198||7
|-
|Lema_bi_zêlandî||198||9
|-
|Lema_bi_bayerî||197||9
|-
|Lema_bi_luhyayî||196||6
|-
|Lema_bi_mazenderanî||195||8
|-
|Lema_bi_mòçenoyî||191||10
|-
|Lema_bi_bruneyî||191||4
|-
|Lema_bi_lazî||190||9
|-
|Lema_bi_kabardî||189||8
|-
|Lema_bi_erebiya_kendavî||186||9
|-
|Lema_bi_karelî||185||10
|-
|Lema_bi_evenî||185||6
|-
|Lema_bi_frîsiya_saterlandî||181||9
|-
|Lema_bi_akanî||180||7
|-
|Lema_bi_tabasaranî||179||7
|-
|Lema_bi_santalî||179||8
|-
|Lema_bi_fîjî||179||9
|-
|Lema_bi_svanî||178||5
|-
|Lema_bi_misrî||176||4
|-
|Lema_bi_îgboyî||174||9
|-
|Lema_bi_hewramî||173||9
|-
|Lema_bi_aymarayî||173||7
|-
|Lema_bi_farefareyî||172||6
|-
|Lema_bi_kînyarwandayî||172||7
|-
|Lema_bi_taosî||172||4
|-
|Lema_bi_komî-permyakî||168||6
|-
|Lema_bi_lakotayî||167||9
|-
|Lema_bi_aklanon||165||6
|-
|Lema_bi_yagnobî||164||8
|-
|Lema_bi_okînawanî||162||8
|-
|Lema_bi_rohingyayî||159||7
|-
|Lema_bi_vepsî||158||8
|-
|Lema_bi_samiya_înarî||158||9
|-
|Lema_bi_emilî||156||7
|-
|Lema_bi_tahîtî||154||9
|-
|Lema_bi_maguindanaoyî||152||5
|-
|Lema_bi_gagawzî||151||5
|-
|Lema_bi_temazîxtiya_atlasa_navendî||151||8
|-
|Lema_bi_samogîtî||150||6
|-
|Lema_bi_fulahî||149||6
|-
|Lema_bi_kreyoliya_fransî_ya_Louisiana||145||7
|-
|Lema_bi_melanauyiya_navendî||144||2
|-
|Lema_bi_nîvxî||141||5
|-
|Lema_bi_afarî||141||7
|-
|Lema_bi_etiyopiya_klasîk||137||8
|-
|Lema_bi_extremaduranî||136||8
|-
|Lema_bi_frankoprovansî||136||7
|-
|Lema_bi_komî-zîriyî||135||9
|-
|Lema_bi_udî||135||5
|-
|Lema_bi_samiya_başûr||134||9
|-
|Lema_bi_nogayî||133||9
|-
|Lema_bi_akadî||129||5
|-
|Lema_bi_lakî||128||6
|-
|Lema_bi_mînangkabawî||128||7
|-
|Lema_bi_kîkongoyî||127||9
|-
|Lema_bi_balînî||126||7
|-
|Lema_bi_dolganî||126||7
|-
|Lema_bi_açehî||123||7
|-
|Lema_bi_polabî||122||8
|-
|Lema_bi_pîpîlî||122||8
|-
|Lema_bi_monî||121||7
|-
|Lema_bi_karakalpakî||121||6
|-
|Lema_bi_kabîlî||120||8
|-
|Lema_bi_votî||120||6
|-
|Lema_bi_luoyî||118||5
|-
|Lema_bi_şonayî||116||6
|-
|Lema_bi_komorî||116||8
|-
|Lema_bi_tarantinoyî||115||7
|-
|Lema_bi_lugandayî||115||8
|-
|Lema_bi_saksoniya_jêrîn_ya_holendî||115||7
|-
|Lema_bi_dusuniya_navendî||114||7
|-
|Lema_bi_taşelhitî||113||8
|-
|Lema_bi_mansakayî||112||6
|-
|Lema_bi_rapanuyî||112||9
|-
|Lema_bi_meruyî||111||4
|-
|Lema_bi_înupîakî||108||6
|-
|Lema_bi_prusiya_kevn||107||7
|-
|Lema_bi_çûkî||107||8
|-
|Lema_bi_kambayî||107||2
|-
|Lema_bi_çeyenî||107||6
|-
|Lema_bi_tayiya_bakurî||107||7
|-
|Lema_bi_alabamayî||107||5
|-
|Lema_bi_aghwanî||106||7
|-
|Lema_bi_zimanê_destan_ê_emerîkî||104||11
|-
|Lema_bi_ǃxóõ||104||7
|-
|Lema_bi_mbya_guaraniyî||104||8
|-
|Lema_bi_krî||103||6
|-
|Lema_bi_yamanayî||102||5
|-
|Lema_bi_tirkiya_kevn||100||7
|-
|Lema_bi_sidamoyî||97||6
|-
|Lema_bi_tumbukayî||97||7
|-
|Lema_bi_pîttcantcatcarayî||96||7
|-
|Lema_bi_sûmerî||95||6
|-
|Lema_bi_batsbî||94||3
|-
|Lema_bi_jejuyî||93||8
|-
|Lema_bi_bambarayî||93||5
|-
|Lema_bi_fransiya_navîn||92||8
|-
|Lema_bi_tupînambayî||91||7
|-
|Lema_bi_farisiya_navîn||91||6
|-
|Lema_bi_bîslamayî||91||8
|-
|Lema_bi_s'gaw_karenî||91||5
|-
|Lema_bi_sahoyî||90||5
|-
|Lema_bi_bajwayiya_kendava_rojava||90||4
|-
|Lema_bi_bau_bidayuh||90||4
|-
|Lema_bi_samiya_kildînî||90||5
|-
|Lema_bi_nawrûyî||90||5
|-
|Lema_bi_pangasînanî||89||8
|-
|Lema_bi_abazayî||89||4
|-
|Lema_bi_tswanayî||89||7
|-
|Lema_bi_saksoniya_kevn||88||8
|-
|Lema_bi_arçî||88||6
|-
|Lema_bi_şerpayî||87||7
|-
|Lema_bi_konkanî||86||6
|-
|Lema_bi_kalencînî||84||3
|-
|Lema_bi_wînnebagoyî||84||6
|-
|Lema_bi_dargwayî||84||5
|-
|Lema_bi_kreyoliya_morîtanî||83||6
|-
|Lema_bi_îbanî||82||5
|-
|Lema_bi_avestayî||82||5
|-
|Lema_bi_moreyî||81||3
|-
|Lema_bi_mapuçî||81||6
|-
|Lema_bi_îranunî||81||3
|-
|Lema_bi_mariya_rojavayî||80||4
|-
|Lema_bi_ohloniya_bakur||80||8
|-
|Lema_bi_tay_dam||80||6
|-
|Lema_bi_erebiya_bakûrê_şamê||80||8
|-
|Lema_bi_ganî||79||5
|-
|Lema_bi_yiyiya_siçuwayî||79||8
|-
|Lema_bi_toxarî_A||79||6
|-
|Lema_bi_mwanî||79||4
|-
|Lema_bi_elwîrî-wîderî||78||6
|-
|Lema_bi_oksîtaniya_kevn||78||6
|-
|Lema_bi_buyî||78||5
|-
|Lema_bi_jarayî||78||6
|-
|Lema_bi_newarî||78||4
|-
|Lema_bi_unamî||77||5
|-
|Lema_bi_mîkmakî||76||5
|-
|Lema_bi_çamiya_rojhilatî||76||4
|-
|Lema_bi_galûrîsî||76||5
|-
|Lema_bi_mizoyî||75||5
|-
|Lema_bi_jinî||75||5
|-
|Lema_bi_tlingitî||75||5
|-
|Lema_bi_bugî||74||5
|-
|Lema_bi_pîkardî||74||9
|-
|Lema_bi_hopîyî||73||6
|-
|Lema_bi_frîsiya_kevn||73||7
|-
|Lema_bi_ternateyî||73||5
|-
|Lema_bi_portugaliya_kevn||72||6
|-
|Lema_bi_kîrîbatî||72||5
|-
|Lema_bi_cingphoyî||71||8
|-
|Lema_bi_sierra_mîwokiya_navendî||71||7
|-
|Lema_bi_sassarîsî||71||5
|-
|Lema_bi_o'odhamî||70||4
|-
|Lema_bi_xiangî||69||4
|-
|Lema_bi_îstro-romanyayî||69||7
|-
|Lema_bi_bukidnon_manoboyiya_rojavayî||68||5
|-
|Lema_bi_bojpûrî||67||8
|-
|Lema_bi_andî||66||5
|-
|Lema_bi_kayingangî||65||8
|-
|Lema_bi_swazî||65||5
|-
|Lema_bi_min_beî||64||4
|-
|Lema_bi_ahomî||64||5
|-
|Lema_bi_montagnaîsî||64||3
|-
|Lema_bi_namayî||62||5
|-
|Lema_bi_miyakoyî||62||7
|-
|Lema_bi_drungî||62||5
|-
|Lema_bi_luşûtsîdî||62||4
|-
|Lema_bi_dongşîangî||61||3
|-
|Lema_bi_bextiyarî||61||7
|-
|Lema_bi_marîkopayî||61||4
|-
|Lema_bi_almaniya_bilind_a_navîn||61||7
|-
|Lema_bi_cimbrî||61||5
|-
|Lema_bi_arrernteyiya_rojavayî||61||5
|-
|Lema_bi_argobbayî||60||6
|-
|Lema_bi_îu_mienî||60||5
|-
|Lema_bi_atayalî||60||4
|-
|Lema_bi_alêwîtî||60||6
|-
|Lema_bi_saanîçî||60||6
|-
|Lema_bi_kaurnayî||60||4
|-
|Lema_bi_yûnaniya_pontî||59||4
|-
|Lema_bi_frankoniya_navendî||59||3
|-
|Lema_bi_pelayî||58||6
|-
|Lema_bi_alutîqî||58||5
|-
|Lema_bi_muongî||58||5
|-
|Lema_bi_hîtîtî||57||6
|-
|Lema_bi_makasarî||57||4
|-
|Lema_bi_banjarî||57||4
|-
|Lema_bi_ngarrindjerî||57||6
|-
|Lema_bi_dakotayî||56||5
|-
|Lema_bi_nenetsiya_tundra||56||4
|-
|Lema_bi_pacohî||56||5
|-
|Lema_bi_çamoroyî||56||5
|-
|Lema_bi_flamiya_rojava||55||4
|-
|Lema_bi_erebiya_iraqî||55||6
|-
|Lema_bi_samiya_lule||55||7
|-
|Lema_bi_lamboyayî||54||7
|-
|Lema_bi_kreyoliya_jameîkî||54||6
|-
|Lema_bi_yakanî||53||4
|-
|Lema_bi_almaniya_navendî_ya_rojhilat||53||8
|-
|Lema_bi_sûdovî||52||4
|-
|Lema_bi_çepangî||52||4
|-
|Lema_bi_buduxî||52||3
|-
|Lema_bi_îsnagî||51||5
|-
|Lema_bi_amazîxiya_fasî||51||6
|-
|Lema_bi_ohloniya_başûr||51||7
|-
|Lema_bi_kîmaragangî||50||1
|-
|Lema_bi_gîlekî||50||7
|-
|Lema_bi_erebiya_tunusî||50||7
|-
|Lema_bi_lekî||49||6
|-
|Lema_bi_karaîmî||49||5
|-
|Lema_bi_gamîlaraayî||49||5
|-
|Lema_bi_tayî_nüa||49||5
|-
|Lema_bi_karaxanîdî||48||6
|-
|Lema_bi_sotoyiya_bakur||48||3
|-
|Lema_bi_kreyoliya_seyşelî||47||3
|-
|Lema_bi_tagal_murutî||47||1
|-
|Lema_bi_tofalarî||47||6
|-
|Lema_bi_swabî||47||5
|-
|Lema_bi_palawî||47||7
|-
|Lema_bi_wiradhurî||46||6
|-
|Lema_bi_çoktawî||46||7
|-
|Lema_bi_tigreyî||46||3
|-
|Lema_bi_îvatanî||46||4
|-
|Lema_bi_fatalukuyî||46||3
|-
|Lema_bi_romaniya_kalo_fînî||46||5
|-
|Lema_bi_pîtkarnî-norfolkî||46||6
|-
|Lema_bi_fenîkî||45||3
|-
|Lema_bi_kitubayî||45||4
|-
|Lema_bi_marwarî||44||2
|-
|Lema_bi_warlpirî||44||4
|-
|Lema_bi_zuniyî||44||4
|-
|Lema_bi_kriya_bejayî||44||5
|-
|Lema_bi_bontociya_rojhilatî||44||3
|-
|Lema_bi_nupeyî||44||4
|-
|Lema_bi_yonagunî||44||5
|-
|Lema_bi_atîkamekwî||44||3
|-
|Lema_bi_dupaningan_agtayî||44||5
|-
|Lema_bi_xantî||43||3
|-
|Lema_bi_daurî||43||3
|-
|Lema_bi_rarotongî||43||3
|-
|Lema_bi_abenakî||43||4
|-
|Lema_bi_atong_(Hindistan)||43||5
|-
|Lema_bi_osageyî||42||5
|-
|Lema_bi_amîs||42||5
|-
|Lema_bi_semaî||42||3
|-
|Lema_bi_marşalî||42||5
|-
|Lema_bi_madurayî||41||4
|-
|Lema_bi_sêriyî||41||3
|-
|Lema_bi_mohawkî||41||5
|-
|Lema_bi_hîrî_motuyî||40||5
|-
|Lema_bi_paîwanî||40||5
|-
|Lema_bi_koreyiya_navîn||40||6
|-
|Lema_bi_kunigamî||40||7
|-
|Lema_bi_amuzgoyî||40||5
|-
|Lema_bi_proto-hindûewropî||40||6
|-
|Lema_bi_tzotzîlî||39||3
|-
|Lema_bi_kalingayiya_başûrî||39||3
|-
|Lema_bi_sebopî||39||1
|-
|Lema_bi_ûrûmî||39||5
|-
|Lema_bi_khinalugî||39||4
|-
|Lema_bi_pijînî||38||5
|-
|Lema_bi_farisiya_kevn||38||5
|-
|Lema_bi_sangoyî||38||4
|-
|Lema_bi_tàyî||38||4
|-
|Lema_bi_koryakî||38||3
|-
|Lema_bi_megleno-romanyayî||37||4
|-
|Lema_bi_ambonezî-malezî||37||6
|-
|Lema_bi_masayî||37||1
|-
|Lema_bi_bahnarî||37||4
|-
|Lema_bi_makasaeyî||37||3
|-
|Lema_bi_magahî||37||3
|-
|Lema_bi_orokî||37||3
|-
|Lema_bi_dinkayî||37||3
|-
|Lema_bi_slovînsî||37||4
|-
|Lema_bi_livvî||36||4
|-
|Lema_bi_maithilî||36||3
|-
|Lema_bi_nahwatliya_navendî||36||3
|-
|Lema_bi_teoçewî||36||5
|-
|Lema_bi_wutunhuayî||36||5
|-
|Lema_bi_tûpiya_kevn||35||4
|-
|Lema_bi_kreyoliya_antîlleyî||35||3
|-
|Lema_bi_lubuagan_kalingayî||35||2
|-
|Lema_bi_ketî||35||2
|-
|Lema_bi_purepeçayî||35||3
|-
|Lema_bi_kamberayî||35||3
|-
|Lema_bi_bororoyî||35||2
|-
|Lema_bi_romaniya_vlaks||35||4
|-
|Lema_bi_yamî||35||1
|-
|Lema_bi_erebiya_cezayirî||35||5
|-
|Lema_bi_brahuiyî||34||6
|-
|Lema_bi_çinook_jargonî||34||4
|-
|Lema_bi_çavacanoyî||34||4
|-
|Lema_bi_tidoreyî||34||5
|-
|Lema_bi_waigalî||34||9
|-
|Lema_bi_nganasanî||34||1
|-
|Lema_bi_kamkata-viriyî||34||9
|-
|Lema_bi_galoyî||34||4
|-
|Lema_bi_kinaray-ayî||34||6
|-
|Lema_bi_yûnaniya_mîkenî||33||6
|-
|Lema_bi_tedim_çinî||33||5
|-
|Lema_bi_udiheyî||33||4
|-
|Lema_bi_frankoniya_rhine||33||3
|-
|Lema_bi_tuvalûyî||33||4
|-
|Lema_bi_îbanagî||33||7
|-
|Lema_bi_aşkunî||32||7
|-
|Lema_bi_çakmayî||32||2
|-
|Lema_bi_tsongayî||32||2
|-
|Lema_bi_pite_samî||32||5
|-
|Lema_bi_iştihardî||32||4
|-
|Lema_bi_k'içe'||32||4
|-
|Lema_bi_hirî_motuyî||31||4
|-
|Lema_bi_fiji_hindiyî||31||4
|-
|Lema_bi_oroqenî||31||4
|-
|Lema_bi_etrûskî||30||4
|-
|Lema_bi_îsthmus_zapotekî||30||2
|-
|Lema_bi_blakfotî||30||3
|-
|Lema_bi_poloniya_kevn||30||4
|-
|Lema_bi_sonxayî||30||1
|-
|Lema_bi_lisuyî||29||2
|-
|Lema_bi_kanuriyî||29||2
|-
|Lema_bi_bataktobayî||29||4
|-
|Lema_bi_umbunduyî||29||5
|-
|Lema_bi_yaeyamayî||29||6
|-
|Lema_bi_arapaho||29||4
|-
|Lema_bi_boleyî||29||1
|-
|Lema_bi_komançî||29||3
|-
|Lema_bi_tuwali_ifugaoyî||29||3
|-
|Lema_bi_vendayî||28||4
|-
|Lema_bi_krioyî||28||6
|-
|Lema_bi_uab_meto||28||3
|-
|Lema_bi_yagarayî||28||4
|-
|Lema_bi_zouyî||28||5
|-
|Lema_bi_tatî||27||1
|-
|Lema_bi_amamî-oşîmayiya_başûrî||27||5
|-
|Lema_bi_isanî||27||6
|-
|Lema_bi_îgalayî||27||3
|-
|Lema_bi_darkinjungî||27||1
|-
|Lema_bi_kvenî||27||4
|-
|Lema_bi_çaxatayî||26||4
|-
|Lema_bi_oyratiya_nivîsî||26||6
|-
|Lema_bi_garîfunayî||26||3
|-
|Lema_bi_altayiya_bakurî||26||4
|-
|Lema_bi_tiwî||26||1
|-
|Lema_bi_meänkiyelî||26||5
|-
|Lema_bi_mandinkayî||26||3
|-
|Lema_bi_yoronî||26||4
|-
|Lema_bi_dena'inayî||26||2
|-
|Lema_bi_halkomelemî||25||3
|-
|Lema_bi_amamî-oşimayiya_bakurî||25||6
|-
|Lema_bi_kriolî||25||3
|-
|Lema_bi_kavalanî||25||2
|-
|Lema_bi_ulçî||25||2
|-
|Lema_bi_hadzayî||25||5
|-
|Lema_bi_jarawa||25||2
|-
|Lema_bi_dogrîbî||25||2
|-
|Lema_bi_pîrahayî||25||3
|-
|Lema_bi_faliskanî||25||7
|-
|Lema_bi_hinukhî||24||3
|-
|Lema_bi_malecite-passamaquoddyî||24||1
|-
|Lema_bi_manipurî||24||3
|-
|Lema_bi_tangutî||24||3
|-
|Lema_bi_tarokoyî||24||1
|-
|Lema_bi_khasiyî||24||3
|-
|Lema_bi_holendiya_kevn||24||5
|-
|Lema_bi_tabaruyî||24||4
|-
|Lema_bi_rungusî||24||1
|-
|Lema_bi_yurokî||24||1
|-
|Lema_bi_negidalî||23||3
|-
|Lema_bi_îrlendiya_navîn||23||3
|-
|Lema_bi_gorontaloyî||23||4
|-
|Lema_bi_tuluyî||23||2
|-
|Lema_bi_oroçî||23||3
|-
|Lema_bi_nîasî||23||5
|-
|Lema_bi_saekî||22||3
|-
|Lema_bi_biatah_bidayuhî||22||4
|-
|Lema_bi_nottoway-meherrînî||22||3
|-
|Lema_bi_katawbayî||22||2
|-
|Lema_bi_haryanvî||22||2
|-
|Lema_bi_timugon_murutî||22||1
|-
|Lema_bi_îtelmenî||22||2
|-
|Lema_bi_almaniya_jêrîn_a_navîn||22||4
|-
|Lema_bi_xîkarîyayî||22||3
|-
|Lema_bi_yaoyî||22||3
|-
|Lema_bi_oki-no-erabu||21||4
|-
|Lema_bi_jurçenî||21||3
|-
|Lema_bi_bununî||21||3
|-
|Lema_bi_nambasiya_mezin||21||4
|-
|Lema_bi_kunayî||21||3
|-
|Lema_bi_ûbîkî||21||4
|-
|Lema_bi_manîpûriya_bîşnûpriyayî||21||2
|-
|Lema_bi_alutor||21||2
|-
|Lema_bi_nyungayî||21||1
|-
|Lema_bi_nandî||21||1
|-
|Lema_bi_nanticokeyî||21||1
|-
|Lema_bi_şawî||20||3
|-
|Lema_bi_umbriyî||20||4
|-
|Lema_bi_kikaiyî||20||4
|-
|Lema_bi_pa'o_karen||20||3
|-
|Lema_bi_ǃkungî||20||3
|-
|Lema_bi_neo-aramiya_rojavayî||20||2
|-
|Lema_bi_karokî||20||1
|-
|Lema_bi_arawak||20||1
|-
|Lema_bi_kamtayî||20||5
|-
|Lema_bi_îzonî||20||3
|-
|Lema_bi_krymçakî||20||3
|-
|Lema_bi_mohegan-pequotî||20||1
|-
|Lema_bi_lundayehî||20||3
|-
|Lema_bi_kanakanabuyî||20||2
|-
|Lema_bi_nîwî||20||3
|-
|Lema_bi_walîsî||20||2
|-
|Lema_bi_ermeniya_navîn||19||2
|-
|Lema_bi_bezhtayî||19||2
|-
|Lema_bi_yukaghiriya_bakurî||19||2
|-
|Lema_bi_guugu_yimidhirrî||19||1
|-
|Lema_bi_hmongiya_hêşîn||19||2
|-
|Lema_bi_lotudî||19||1
|-
|Lema_bi_klamatî-modokî||19||3
|-
|Lema_bi_falayî||19||3
|-
|Lema_bi_ter_samî||19||2
|-
|Lema_bi_naxî||19||2
|-
|Lema_bi_gurciya_kevn||18||3
|-
|Lema_bi_çîrîkawayî||18||2
|-
|Lema_bi_tzutucîlî||18||3
|-
|Lema_bi_tbolî||18||3
|-
|Lema_bi_asamiya_zû||18||4
|-
|Lema_bi_haidayî||18||3
|-
|Lema_bi_taiya_başûrî||18||5
|-
|Lema_bi_oskanî||18||4
|-
|Lema_bi_şoşonî||18||3
|-
|Lema_bi_morî_bawah||18||3
|-
|Lema_bi_ume_samî||18||5
|-
|Lema_bi_partî||18||4
|-
|Lema_bi_gayî||18||5
|-
|Lema_bi_nahwatliya_huastecaya_navendî||18||2
|-
|Lema_bi_buruşaskiyî||18||3
|-
|Lema_bi_kreyoliya_belizeyî||17||5
|-
|Lema_bi_nahwatliya_mekayapan||17||2
|-
|Lema_bi_kambaatayî||17||2
|-
|Lema_bi_kankanayiya_bakurî||17||4
|-
|Lema_bi_potawatomî||17||1
|-
|Lema_bi_aguarunayî||17||1
|-
|Lema_bi_bisayayiya_bruneyî||17||3
|-
|Lema_bi_çamiya_rojavayî||17||4
|-
|Lema_bi_noviyalî||17||4
|-
|Lema_bi_kabiyeyî||17||2
|-
|Lema_bi_toku-no-şîmayî||17||4
|-
|Lema_bi_çîniya_klasîk||17||2
|-
|Lema_bi_ç'orti'||16||3
|-
|Lema_bi_pawnî||16||2
|-
|Lema_bi_waxiyî||16||4
|-
|Lema_bi_rutulî||16||3
|-
|Lema_bi_ludianî||16||2
|-
|Lema_bi_gondiyî||16||2
|-
|Lema_bi_lîşana_denî||16||2
|-
|Lema_bi_puyumayî||16||1
|-
|Lema_bi_bejayî||16||4
|-
|Lema_bi_saaroayî||16||1
|-
|Lema_bi_bassayî||16||2
|-
|Lema_bi_mongoliya_klasîk||16||3
|-
|Lema_bi_krîkî||16||3
|-
|Lema_bi_sasakî||16||2
|-
|Lema_bi_mulamî||16||3
|-
|Lema_bi_aytonî||16||3
|-
|Lema_bi_nootkayî||16||5
|-
|Lema_bi_aarî||15||2
|-
|Lema_bi_engayî||15||3
|-
|Lema_bi_cahuillayî||15||1
|-
|Lema_bi_hunzibî||15||2
|-
|Lema_bi_garoyî||15||3
|-
|Lema_bi_hlaiyî||15||3
|-
|Lema_bi_nobiinî||15||2
|-
|Lema_bi_spaniya_kevn||15||3
|-
|Lema_bi_amayî||15||1
|-
|Lema_bi_otomiya_mezquital||15||1
|-
|Lema_bi_leonîzî||15||1
|-
|Lema_bi_holendiya_navîn||15||2
|-
|Lema_bi_awadhî||15||3
|-
|Lema_bi_ottawayî||15||2
|-
|Lema_bi_baxterî||15||3
|-
|Lema_bi_bembayî||14||2
|-
|Lema_bi_proto-îranî||14||1
|-
|Lema_bi_diyirbalî||14||3
|-
|Lema_bi_kristangî||14||3
|-
|Lema_bi_çolî||14||2
|-
|Lema_bi_yûnaniya_mariupol||14||2
|-
|Lema_bi_tangsayî||14||4
|-
|Lema_bi_kaqçikelî||14||2
|-
|Lema_bi_kreyoliya_guinea-bissau||14||2
|-
|Lema_bi_malayiya_baba||14||2
|-
|Lema_bi_saisiyatî||14||1
|-
|Lema_bi_asî||14||1
|-
|Lema_bi_ladakhiyî||14||1
|-
|Lema_bi_adnyamatanhayî||14||2
|-
|Lema_bi_tooroyî||14||2
|-
|Lema_bi_apalayî||14||1
|-
|Lema_bi_powhatanî||14||1
|-
|Lema_bi_bûrgûndî||14||2
|-
|Lema_bi_sakizayayî||14||1
|-
|Lema_bi_tokelawî||14||3
|-
|Lema_bi_weylsiya_navîn||14||3
|-
|Lema_bi_godoberî||14||1
|-
|Lema_bi_erebiya_sanaanî||14||4
|-
|Lema_bi_kansayî||14||2
|-
|Lema_bi_ahtnayî||14||1
|-
|Lema_bi_batakiya_karo||14||2
|-
|Lema_bi_tatiya_cihû||14||2
|-
|Lema_bi_aşanînkayî||14||2
|-
|Lema_bi_seraikî||13||5
|-
|Lema_bi_proto-hindûîranî||13||1
|-
|Lema_bi_nhêngatûyî||13||4
|-
|Lema_bi_sîkkîmî||13||2
|-
|Lema_bi_înterlîngue||13||3
|-
|Lema_bi_edoyî||13||3
|-
|Lema_bi_foksî||13||2
|-
|Lema_bi_komoriya_ndzwanî||13||5
|-
|Lema_bi_batekî||13||1
|-
|Lema_bi_binukid||13||2
|-
|Lema_bi_skanî||13||2
|-
|Lema_bi_rabhayî||13||2
|-
|Lema_bi_tsezî||13||2
|-
|Lema_bi_solonî||13||2
|-
|Lema_bi_gooniyandiyî||13||1
|-
|Lema_bi_romaniya_balkanî||13||2
|-
|Lema_bi_poitevin-saintongeaisî||13||2
|-
|Lema_bi_marquesana_başûr||13||2
|-
|Lema_bi_tsouyî||13||1
|-
|Lema_bi_yolayî||13||2
|-
|Lema_bi_futunî||13||2
|-
|Lema_bi_munsî||13||2
|-
|Lema_bi_massaçusettî||13||1
|-
|Lema_bi_sabah_bisayayî||13||1
|-
|Lema_bi_prasunî||13||3
|-
|Lema_bi_klallamî||13||3
|-
|Lema_bi_thaoyî||13||1
|-
|Lema_bi_lojbanî||13||4
|-
|Lema_bi_nuerî||13||1
|-
|Lema_bi_lhao_voyî||12||3
|-
|Lema_bi_huişui_hmongiya_navendî||12||3
|-
|Lema_bi_luriya_bakurî||12||3
|-
|Lema_bi_tirurayî||12||2
|-
|Lema_bi_khünî||12||4
|-
|Lema_bi_nafaanrayî||12||3
|-
|Lema_bi_zapotekiya_zoogoço||12||1
|-
|Lema_bi_sukumayî||12||3
|-
|Lema_bi_romaniya_baltîkî||12||1
|-
|Lema_bi_nahwatliya_bakurê_puebla||12||2
|-
|Lema_bi_nahwatliya_tetelcingo||12||2
|-
|Lema_bi_erebiya_necdî||12||4
|-
|Lema_bi_biharî||12||2
|-
|Lema_bi_car_nicobareseyî||12||3
|-
|Lema_bi_mwalî_komorî||12||4
|-
|Lema_bi_erebiya_sudanî||12||2
|-
|Lema_bi_mayayiya_mopanî||11||2
|-
|Lema_bi_yaquî||11||2
|-
|Lema_bi_ponpeyî||11||2
|-
|Lema_bi_kwak'walayî||11||3
|-
|Lema_bi_wolioyî||11||3
|-
|Lema_bi_narunggayî||11||1
|-
|Lema_bi_aghulî||11||2
|-
|Lema_bi_doteliyî||11||2
|-
|Lema_bi_yakkhayî||11||3
|-
|Lema_bi_puebla_nahuatliya_çiyayî||11||2
|-
|Lema_bi_yuguriya_rojhilat||11||1
|-
|Lema_bi_tonkawayî||11||2
|-
|Lema_bi_harsusiyî||11||1
|-
|Lema_bi_mandarî||11||2
|-
|Lema_bi_mazahuayiya_navendî||11||1
|-
|Lema_bi_îfèî||11||2
|-
|Lema_bi_limos_kalingayî||11||1
|-
|Lema_bi_şuswapî||11||2
|-
|Lema_bi_hidatsayî||11||2
|-
|Lema_bi_baureyî||11||2
|-
|Lema_bi_wardamanî||11||1
|-
|Lema_bi_kîsî||11||2
|-
|Lema_bi_erebiya_qibrisî||11||4
|-
|Lema_bi_tindî||11||1
|-
|Lema_bi_swêdiya_kevn||11||4
|-
|Lema_bi_havasupaî-walapaî-yavapaî||11||2
|-
|Lema_bi_darûkî||11||1
|-
|Lema_bi_waujayî||11||2
|-
|Lema_bi_lampungî||11||2
|-
|Lema_bi_areareyî||11||3
|-
|Lema_bi_açolî||11||1
|-
|Lema_bi_komiya_kamerûnî||10||2
|-
|Lema_bi_ngwoyî||10||1
|-
|Lema_bi_abînomnî||10||2
|-
|Lema_bi_deoriyî||10||2
|-
|Lema_bi_şipibo-coniboyî||10||2
|-
|Lema_bi_lolopoyî||10||2
|-
|Lema_bi_kuapawî||10||1
|-
|Lema_bi_proto-norsî||10||4
|-
|Lema_bi_nukunuyî||10||2
|-
|Lema_bi_kottî||10||2
|-
|Lema_bi_khvarşiyî||10||1
|-
|Lema_bi_ngajuyî||10||2
|-
|Lema_bi_yogadî||10||2
|-
|Lema_bi_rawangî||10||3
|-
|Lema_bi_mayoyî||10||3
|-
|Lema_bi_ndebeliya_bakurî||10||2
|-
|Lema_bi_koreyiya_kevn||10||3
|-
|Lema_bi_fonî||10||1
|-
|Lema_bi_abaknonî||10||1
|-
|Lema_bi_radeyî||10||2
|-
|Lema_bi_khalajî||10||3
|-
|Lema_bi_turoyo||10||1
|-
|Lema_bi_naga_pidginî||10||2
|-
|Lema_bi_kriya_rojhilat_ya_bakurî||10||1
|-
|Lema_bi_çekiya_kevn||10||3
|-
|Lema_bi_abauyî||10||1
|-
|Lema_bi_marquesana_bakur||10||1
|-
|Lema_bi_samiya_akkalayî||10||2
|-
|Lema_bi_mongghulî||10||1
|-
|Lema_bi_galîbî_karîbî||10||2
|-
|Lema_bi_torangî||10||1
|-
|Lema_bi_rendilleyî||10||1
|-
|Lema_bi_omaha-poncayî||10||2
|-
|Lema_bi_kaloyî||10||2
|-
|Lema_bi_romaniya_sinte||10||2
|-
|Lema_bi_lepçayî||10||1
|-
|Lema_bi_gunî||10||3
|-
|Lema_bi_akatekî||10||2
|-
|Lema_bi_salarî||10||1
|-
|Lema_bi_erebiya_başûrî_ya_kevn||10||1
|-
|Lema_bi_paumarî||10||1
|-
|Lema_bi_yapî||10||1
|-
|Lema_bi_ngunawalî||10||3
|-
|Lema_bi_kadazaniya_beravî||9||2
|-
|Lema_bi_fangî_(Bantu)||9||3
|-
|Lema_bi_bodoyî_(Hindistan)||9||2
|-
|Lema_bi_xârâcùù||9||1
|-
|Lema_bi_crowî||9||3
|-
|Lema_bi_kanelayî||9||1
|-
|Lema_bi_temiarî||9||1
|-
|Lema_bi_khumi_çinî||9||1
|-
|Lema_bi_tsakhurî||9||2
|-
|Lema_bi_meryamî||9||1
|-
|Lema_bi_tzeltalî||9||1
|-
|Lema_bi_kotavayî||9||2
|-
|Lema_bi_mangghuerî||9||1
|-
|Lema_bi_xavanteyî||9||2
|-
|Lema_bi_kreyoliya_fransî_ya_karipúna||9||1
|-
|Lema_bi_aasayî||9||2
|-
|Lema_bi_gusiiyî||9||2
|-
|Lema_bi_efateyiya_başûr||9||3
|-
|Lema_bi_nlûyî||9||1
|-
|Lema_bi_gaulisî||9||2
|-
|Lema_bi_hereroyî||9||1
|-
|Lema_bi_algonquinî||9||1
|-
|Lema_bi_cayugayî||9||2
|-
|Lema_bi_înesenyoyî||9||1
|-
|Lema_bi_sangisarî||9||1
|-
|Lema_bi_mingoyî||9||1
|-
|Lema_bi_rukaiyî||9||1
|-
|Lema_bi_tuteloyî||9||2
|-
|Lema_bi_luiseñoyî||9||2
|-
|Lema_bi_mambayî||9||2
|-
|Lema_bi_pumpokolî||9||2
|-
|Lema_bi_karaoyî||9||1
|-
|Lema_bi_tolaiyî||9||2
|-
|Lema_bi_baekceyî||9||1
|-
|Lema_bi_pidgîniya_nîjeryayî||9||3
|-
|Lema_bi_khmuyî||9||2
|-
|Lema_bi_cowlitzî||9||2
|-
|Lema_bi_cuyunonî||9||2
|-
|Lema_bi_vuresî||9||1
|-
|Lema_bi_jehaiyî||8||1
|-
|Lema_bi_banyumasanî||8||2
|-
|Lema_bi_montana_salişî||8||1
|-
|Lema_bi_sierra_miwokiya_başûrî||8||1
|-
|Lema_bi_punîkî||8||3
|-
|Lema_bi_tsakonî||8||1
|-
|Lema_bi_gurindjiyî||8||1
|-
|Lema_bi_krisayî||8||1
|-
|Lema_bi_aohengî||8||1
|-
|Lema_bi_panamintî||8||2
|-
|Lema_bi_ulukwumî||8||2
|-
|Lema_bi_miskitoyî||8||3
|-
|Lema_bi_maçiguengayî||8||1
|-
|Lema_bi_kalaşayî||8||1
|-
|Lema_bi_bukar-sadung_bidayuhî||8||2
|-
|Lema_bi_ndebeliya_başûrî||8||1
|-
|Lema_bi_maquiritarî||8||1
|-
|Lema_bi_masbatenyoyî||8||1
|-
|Lema_bi_tsimşî||8||2
|-
|Lema_bi_gutnişî||8||2
|-
|Lema_bi_tuskarorayî||8||1
|-
|Lema_bi_miwokiya_golî||8||2
|-
|Lema_bi_sarceeyî||8||2
|-
|Lema_bi_zaghawayî||8||2
|-
|Lema_bi_kiliwayî||8||2
|-
|Lema_bi_kamiya_başûrî||8||1
|-
|Lema_bi_belaîtî||8||3
|-
|Lema_bi_prakrîtiya_aşokanît||8||4
|-
|Lema_bi_kwanyamayî||8||1
|-
|Lema_bi_ndongayî||8||1
|-
|Lema_bi_îraqwî||8||1
|-
|Lema_bi_grîkoyî||8||1
|-
|Lema_bi_penobskotî||8||1
|-
|Lema_bi_q'eqçiyî||8||2
|-
|Lema_bi_ojibweyiya_bakurî||8||1
|-
|Lema_bi_kayapó||8||1
|-
|Lema_bi_oneidayî||8||1
|-
|Lema_bi_katuyiya_rojhilatî||8||2
|-
|Lema_bi_nahwatliya_huastekaya_rojhilatî||8||1
|-
|Lema_bi_lawayiya_rojhilatî||8||1
|-
|Lema_bi_luba-kasayî||7||1
|-
|Lema_bi_barngarla||7||1
|-
|Lema_bi_açuarî||7||1
|-
|Lema_bi_tsafikiyî||7||2
|-
|Lema_bi_gwiçinî||7||1
|-
|Lema_bi_urak_lawoi'||7||2
|-
|Lema_bi_tarahumarayiya_navendî||7||2
|-
|Lema_bi_bagvalalî||7||1
|-
|Lema_bi_haniyî||7||2
|-
|Lema_bi_sekanî||7||1
|-
|Lema_bi_yûnaniya_kapadokyayî||7||1
|-
|Lema_bi_wambayayî||7||1
|-
|Lema_bi_lîdyayî||7||2
|-
|Lema_bi_amanabî||7||2
|-
|Lema_bi_hänî||7||1
|-
|Lema_bi_çadongî||7||2
|-
|Lema_bi_arakî||7||1
|-
|Lema_bi_kaşayayî||7||1
|-
|Lema_bi_adangmeyî||7||3
|-
|Lema_bi_alawayî||7||1
|-
|Lema_bi_mehriyî||7||1
|-
|Lema_bi_temoqî||7||1
|-
|Lema_bi_kusaalî||7||1
|-
|Lema_bi_dhuwalî||7||2
|-
|Lema_bi_parakanã||7||1
|-
|Lema_bi_angorî||7||1
|-
|Lema_bi_wappoyî||7||2
|-
|Lema_bi_ajië||7||1
|-
|Lema_bi_tsimaneyî||7||1
|-
|Lema_bi_basayî||7||2
|-
|Lema_bi_lusîtanî||7||2
|-
|Lema_bi_kreyoliya_guwiyanîsî||7||2
|-
|Lema_bi_apaçiya_deştan||7||1
|-
|Lema_bi_kutenaiyî||7||1
|-
|Lema_bi_danmarkiya_jersey||7||1
|-
|Lema_bi_wastekî||7||1
|-
|Lema_bi_rejangî||7||1
|-
|Lema_bi_dogonî||7||2
|-
|Lema_bi_lorrainî||7||2
|-
|Lema_bi_embalohî||7||1
|-
|Lema_bi_taînoyî||7||3
|-
|Lema_bi_kriya_rojhilat_ya_başûrî||7||1
|-
|Lema_bi_nyolî_(Uganda)||7||1
|-
|Lema_bi_danmarkiya_kevn||7||2
|-
|Lema_bi_axvaxî||7||1
|-
|Lema_bi_dogriyî||7||2
|-
|Lema_bi_kokborokî||7||2
|-
|Lema_bi_hutterisçî||7||2
|-
|Lema_bi_gullahî||7||2
|-
|Lema_bi_comoxî||7||1
|-
|Lema_bi_biseniyî||7||2
|-
|Lema_bi_îtaliya_cihû||7||2
|-
|Lema_bi_romaniya_karpatyayî||7||1
|-
|Lema_bi_gottscheerîşî||7||2
|-
|Lema_bi_tutongî||7||3
|-
|Lema_bi_nahwatliya_guerrero||7||1
|-
|Lema_bi_malayiya_navendî||7||2
|-
|Lema_bi_nubiya_kevn||7||2
|-
|Lema_bi_kuwileytî||7||2
|-
|Lema_bi_gelaoyiya_spî||7||1
|-
|Lema_bi_ojibweyiya_rojavayî||7||1
|-
|Lema_bi_gayoyî||7||2
|-
|Lema_bi_romaniya_welşî||7||2
|-
|Lema_bi_nahwatliya_huastecaya_rojavayî||7||1
|-
|Lema_bi_bakungî||7||1
|-
|Lema_bi_loziyî||7||1
|-
|Lema_bi_yindcîbarndî||7||1
|-
|Lema_bi_krytsî||7||3
|-
|Lema_bi_palueyî||7||1
|-
|Lema_bi_tahltanî||7||2
|-
|Lema_bi_bay_miwokî||7||2
|-
|Lema_bi_maiayî||7||1
|-
|Lema_bi_besisî||7||2
|-
|Lema_bi_mangarevanî||7||2
|-
|Lema_bi_naromî||6||2
|-
|Lema_bi_çîpewî||6||1
|-
|Lema_bi_biloxî||6||1
|-
|Lema_bi_kendayanî||6||1
|-
|Lema_bi_khowarî||6||1
|-
|Lema_bi_diwalayî||6||1
|-
|Lema_bi_şampanyî||6||2
|-
|Lema_bi_guaraniyiya_paraguayanî||6||3
|-
|Lema_bi_dusnerî||6||1
|-
|Lema_bi_tuaregî||6||1
|-
|Lema_bi_pamonayî||6||2
|-
|Lema_bi_samoyî||6||1
|-
|Lema_bi_talî||6||2
|-
|Lema_bi_yuçî||6||2
|-
|Lema_bi_manggarayî||6||2
|-
|Lema_bi_batakiya_simalungun||6||2
|-
|Lema_bi_totonakiya_çiyayî||6||1
|-
|Lema_bi_oyratayî||6||1
|-
|Lema_bi_balantak||6||2
|-
|Lema_bi_baruga||6||1
|-
|Lema_bi_karekareyî||6||2
|-
|Lema_bi_zapotekiya_yatzaçî||6||1
|-
|Lema_bi_okodiayî||6||2
|-
|Lema_bi_nde-nsele-nta||6||1
|-
|Lema_bi_moçikayî||6||2
|-
|Lema_bi_iriga_bikolanoyî||6||2
|-
|Lema_bi_kirikeyî||6||2
|-
|Lema_bi_totonakiya_papantla||6||1
|-
|Lema_bi_xerenteyî||6||1
|-
|Lema_bi_lîkî||6||3
|-
|Lema_bi_mandaicî||6||1
|-
|Lema_bi_suyayî||6||1
|-
|Lema_bi_ozumacin_çinantecî||6||1
|-
|Lema_bi_tenharimî||6||1
|-
|Lema_bi_tillamookî||6||2
|-
|Lema_bi_defakayî||6||2
|-
|Lema_bi_wayuuyî||6||1
|-
|Lema_bi_japoniya_kevn||6||1
|-
|Lema_bi_limbuyî||6||1
|-
|Lema_bi_efikî||6||2
|-
|Lema_bi_mêkêoyî||6||1
|-
|Lema_bi_erebiya_lîbyayî||6||1
|-
|Lema_bi_phuthî||6||2
|-
|Lema_bi_kankanaeyî||6||1
|-
|Lema_bi_karitiyanayî||6||1
|-
|Lema_bi_abûngî||6||2
|-
|Lema_bi_rotumanî||6||2
|-
|Lema_bi_ngiyambaayî||6||1
|-
|Lema_bi_mîçîfî||6||1
|-
|Lema_bi_kuiyî_(Hindistan)||6||1
|-
|Lema_bi_bicolanoyiya_northern_catanduanes||6||1
|-
|Lema_bi_zarmayî||6||2
|-
|Lema_bi_palawanoyî||6||1
|-
|Lema_bi_luwiyanî||6||2
|-
|Lema_bi_koyukonî||6||1
|-
|Lema_bi_makhuwayî||6||1
|-
|Lema_bi_frankiya_rojhilatî||6||1
|-
|Lema_bi_bruyiya_rojhilatî||6||1
|-
|Lema_bi_kimbunduyî||6||2
|-
|Lema_bi_sabaeanî||6||2
|-
|Lema_bi_tagbanwayiya_kalamî||6||2
|-
|Lema_bi_tambunan_dusunî||6||1
|-
|Lema_bi_mongoliya_navîn||6||2
|-
|Lema_bi_açangî||6||2
|-
|Lema_bi_bu-nao_bunuyî||6||1
|-
|Lema_bi_çewongî||6||1
|-
|Lema_bi_mbabaramî||6||1
|-
|Lema_bi_îjoyiya_başûr-rojhilat||6||2
|-
|Lema_bi_assînîboyî||6||1
|-
|Lema_bi_nzadî||6||1
|-
|Lema_bi_îtawitî||6||1
|-
|Lema_bi_lavukaleveyî||6||2
|-
|Lema_bi_badeyî||6||1
|-
|Lema_bi_takyayî||6||1
|-
|Lema_bi_aneme_wakeyî||6||1
|-
|Lema_bi_urubú-kaaporî||6||1
|-
|Lema_bi_çiçonyi-çidzihana-çikauma||6||2
|-
|Lema_bi_ida'anî||6||1
|-
|Lema_bi_bolinaoyî||6||1
|-
|Lema_bi_lawanganî||6||1
|-
|Lema_bi_kaççiyî||6||1
|-
|Lema_bi_nga_layî||6||2
|-
|Lema_bi_angaatahayî||6||1
|-
|Lema_bi_firîgî||6||1
|-
|Lema_bi_simeulueyî||6||1
|-
|Lema_bi_martuthunirayî||6||1
|-
|Lema_bi_guajajarayî||6||1
|-
|Lema_bi_tabasco_çontalî||6||1
|-
|Lema_bi_makyaniya_rojava||6||2
|-
|Lema_bi_îbaniyî||6||2
|-
|Lema_bi_qiangiya_bakurî||6||1
|-
|Lema_bi_jakaltekî||6||2
|-
|Lema_bi_torwalî||5||1
|-
|Lema_bi_lêtîyî||5||1
|-
|Lema_bi_şinayî||5||1
|-
|Lema_bi_gwereyî||5||1
|-
|Lema_bi_casiguran_dumagat_agtayî||5||1
|-
|Lema_bi_batakiya_mandaîlîng||5||2
|-
|Lema_bi_punan_tubuyî||5||1
|-
|Lema_bi_okanaganî||5||1
|-
|Lema_bi_gerkayî||5||2
|-
|Lema_bi_matlatzincayî||5||2
|-
|Lema_bi_kiowayî||5||2
|-
|Lema_bi_koasatî||5||1
|-
|Lema_bi_kamasauyî||5||1
|-
|Lema_bi_erebiya_endulusî||5||1
|-
|Lema_bi_maleku_jaikayî||5||1
|-
|Lema_bi_a'ou||5||1
|-
|Lema_bi_îlamî||5||2
|-
|Lema_bi_bonanî||5||1
|-
|Lema_bi_îrlendiya_prîmîtîv||5||1
|-
|Lema_bi_masabayî||5||1
|-
|Lema_bi_supyireyî||5||1
|-
|Lema_bi_narragansettî||5||1
|-
|Lema_bi_caddoyî||5||1
|-
|Lema_bi_pará_arárayî||5||1
|-
|Lema_bi_angloromanî||5||1
|-
|Lema_bi_urarinayî||5||2
|-
|Lema_bi_mixteciya_yosondúa||5||1
|-
|Lema_bi_popolocayiya_san_juan_atzingo||5||1
|-
|Lema_bi_surigaononî||5||1
|-
|Lema_bi_komodoyî||5||1
|-
|Lema_bi_kaduglî||5||1
|-
|Lema_bi_tunjungî||5||1
|-
|Lema_bi_san_pedro_amuzgos_amuzgo||5||1
|-
|Lema_bi_pazehî||5||1
|-
|Lema_bi_uldemeyî||5||2
|-
|Lema_bi_sekapanî||5||1
|-
|Lema_bi_nkem-nkumî||5||1
|-
|Lema_bi_warrayî||5||1
|-
|Lema_bi_îsekiriyî||5||2
|-
|Lema_bi_tobilungî||5||1
|-
|Lema_bi_bandjalangî||5||1
|-
|Lema_bi_samayiya_başûrî||5||2
|-
|Lema_bi_hanunooyî||5||2
|-
|Lema_bi_engenniyî||5||1
|-
|Lema_bi_saramakkanî||5||1
|-
|Lema_bi_damariya_rojhilat||5||1
|-
|Lema_bi_jangkangî||5||1
|-
|Lema_bi_kîlîvîlayî||5||1
|-
|Lema_bi_tae'||5||1
|-
|Lema_bi_sandaweyî||5||1
|-
|Lema_bi_harariyî||5||1
|-
|Lema_bi_hovonganî||5||1
|-
|Lema_bi_popolucayiya_sayula||5||1
|-
|Lema_bi_bokarî||5||1
|-
|Lema_bi_kensiuyî||5||1
|-
|Lema_bi_dibabawon_manoboyî||5||1
|-
|Lema_bi_tocantins_asurînî||5||1
|-
|Lema_bi_şawneeyî||5||1
|-
|Lema_bi_butuanonî||5||2
|-
|Lema_bi_jutişî||5||2
|-
|Lema_bi_tagabawayî||5||1
|-
|Lema_bi_sambalî||5||1
|-
|Lema_bi_miyayî||5||1
|-
|Lema_bi_çeke_holoyî||5||1
|-
|Lema_bi_kuikúroyî||5||1
|-
|Lema_bi_hupayî||5||2
|-
|Lema_bi_abanyomî||5||2
|-
|Lema_bi_muak_sa-aakî||5||1
|-
|Lema_bi_bontociya_navendî||5||1
|-
|Lema_bi_duwaiyî||5||1
|-
|Lema_bi_hupdëî||5||1
|-
|Lema_bi_çopiyî||5||1
|-
|Lema_bi_muyangî||5||2
|-
|Lema_bi_agtayiya_kagayanî_ya_navendî||5||1
|-
|Lema_bi_sangirî||5||2
|-
|Lema_bi_kreyoliya_holendî_ya_berbiceyî||5||2
|-
|Lema_bi_yukaghiriya_başûrî||5||1
|-
|Lema_bi_zapotekiya_çiçicapan||5||1
|-
|Lema_bi_atesoyî||5||1
|-
|Lema_bi_dieriyî||5||1
|-
|Lema_bi_mazateciya_çiquihuitlan||5||1
|-
|Lema_bi_şughnî||5||2
|-
|Lema_bi_guwançî||5||1
|-
|Lema_bi_egayî||5||1
|-
|Lema_bi_camsayî||5||2
|-
|Lema_bi_bangî||5||1
|-
|Lema_bi_tajioyî||5||1
|-
|Lema_bi_ngizimî||5||1
|-
|Lema_bi_beothukî||5||2
|-
|Lema_bi_pokangayî||5||1
|-
|Lema_bi_muyuwî||5||1
|-
|Lema_bi_bukîtan||5||2
|-
|Lema_bi_dyulayî||5||1
|-
|Lema_bi_xingú_asuriní||5||1
|-
|Lema_bi_cermayî||5||1
|-
|Lema_bi_takanayî||5||1
|-
|Lema_bi_miamî||5||1
|-
|Lema_bi_epieyî||5||1
|-
|Lema_bi_eseyî||5||1
|-
|Lema_bi_kayahiya_rojavayî||5||2
|-
|Lema_bi_pykobjê||5||1
|-
|Lema_bi_zapotekiya_sierra_de_juarez||5||1
|-
|Lema_bi_dehûyî||5||2
|-
|Lema_bi_bukusuyî||5||1
|-
|Lema_bi_nahwatliya_tlamacazapa||5||1
|-
|Lema_bi_tregamî||5||2
|-
|Lema_bi_capiznonî||5||1
|-
|Lema_bi_pangutaran_samayî||5||1
|-
|Lema_bi_cia-ciayî||5||1
|-
|Lema_bi_erebiya_bahranî||5||1
|-
|Lema_bi_berawanî||5||1
|-
|Lema_bi_mogholî||5||1
|-
|Lema_bi_rennelleseyî||5||1
|-
|Lema_bi_gelaoyiya_sor||5||1
|-
|Lema_bi_badagayî||5||1
|-
|Lema_bi_woiwurrungî||5||1
|-
|Lema_bi_eyakî||5||2
|-
|Lema_bi_awabakal||5||1
|-
|Lema_bi_zoqueyiya_copainala||5||1
|-
|Lema_bi_sumbawayî||5||1
|-
|Lema_bi_goemayî||5||1
|-
|Lema_bi_maxakalî||5||1
|-
|Lema_bi_kakî_aeyî||5||1
|-
|Lema_bi_nez_perceyî||5||2
|-
|Lema_bi_corayî||5||1
|-
|Lema_bi_tapayunayî||5||1
|-
|Lema_bi_senekayî||5||1
|-
|Lema_bi_huaveyî||5||1
|-
|Lema_bi_apinayé||5||1
|-
|Lema_bi_malayiya_pattani||5||2
|-
|Lema_bi_karriyerî||5||1
|-
|Lema_bi_mamî||5||1
|-
|Lema_bi_îbaloiyî||5||1
|-
|Lema_bi_çujî||5||1
|-
|Lema_bi_kuyî||5||2
|-
|Lema_bi_tlahuicayî||5||2
|-
|Lema_bi_sabuyî||5||1
|-
|Lema_bi_cabecarî||5||2
|-
|Lema_bi_kombioyî||5||1
|-
|Lema_bi_krahô||5||1
|-
|Lema_bi_bella_koola||5||1
|-
|Lema_bi_pomoyiya_başûrî||5||1
|-
|Lema_bi_bilbayî||5||1
|-
|Lema_bi_movimayî||5||1
|-
|Lema_bi_lahuyî||5||2
|-
|Lema_bi_komeringî||5||1
|-
|Lema_bi_tuyukayî||5||1
|-
|Lema_bi_tananaya_jêrîn||5||1
|-
|Lema_bi_kreyoliya_portugalî_ya_korlai||5||1
|-
|Lema_bi_mnongiya_navendî||5||1
|-
|Lema_bi_mojaveyî||5||2
|-
|Lema_bi_kaskayî||5||1
|-
|Lema_bi_zaparoyî||5||1
|-
|Lema_bi_munayî||5||2
|-
|Lema_bi_murînpatayî||5||1
|-
|Lema_bi_goguryeoyî||5||1
|-
|Lema_bi_kiwaiyiya_bakur-rojhilat||4||1
|-
|Lema_bi_ebrieyî||4||1
|-
|Lema_bi_tuamotuanî||4||1
|-
|Lema_bi_angevinî||4||1
|-
|Lema_bi_seimatî||4||1
|-
|Lema_bi_huiçolî||4||1
|-
|Lema_bi_betawî||4||1
|-
|Lema_bi_yucunayî||4||1
|-
|Lema_bi_nukak_makuyî||4||1
|-
|Lema_bi_a-pucikwar||4||1
|-
|Lema_bi_nyamwezî||4||1
|-
|Lema_bi_gaamî||4||1
|-
|Lema_bi_obispeñoyî||4||1
|-
|Lema_bi_paicî||4||1
|-
|Lema_bi_luba-katangayî||4||2
|-
|Lema_bi_tyapî||4||2
|-
|Lema_bi_yurutî||4||1
|-
|Lema_bi_kendemî||4||1
|-
|Lema_bi_aukanî||4||1
|-
|Lema_bi_ribunî||4||1
|-
|Lema_bi_laragiayî||4||1
|-
|Lema_bi_wintuyî||4||1
|-
|Lema_bi_woleayî||4||1
|-
|Lema_bi_li’oyî||4||1
|-
|Lema_bi_kîkapûyî||4||1
|-
|Lema_bi_ndalî||4||1
|-
|Lema_bi_hadiyyayî||4||1
|-
|Lema_bi_caşinahuayî||4||1
|-
|Lema_bi_baram_kayanî||4||1
|-
|Lema_bi_ngadhayî||4||1
|-
|Lema_bi_hixkaryanayî||4||1
|-
|Lema_bi_majangî||4||1
|-
|Lema_bi_molbogî||4||2
|-
|Lema_bi_nyankoleyî||4||1
|-
|Lema_bi_îlayî||4||1
|-
|Lema_bi_qiwenyayî||4||1
|-
|Lema_bi_garawayî||4||1
|-
|Lema_bi_dezfuliyî||4||2
|-
|Lema_bi_wayampî||4||1
|-
|Lema_bi_rikbaktsayî||4||1
|-
|Lema_bi_masakarayî||4||1
|-
|Lema_bi_îtzayî||4||1
|-
|Lema_bi_kipsigisî||4||1
|-
|Lema_bi_paipaî||4||2
|-
|Lema_bi_tujiayiya_bakurî||4||2
|-
|Lema_bi_yakîmayî||4||1
|-
|Lema_bi_para_gaviãoyî||4||1
|-
|Lema_bi_maçameyî||4||1
|-
|Lema_bi_bayiya_başûrî||4||1
|-
|Lema_bi_nicobariya_navendî||4||1
|-
|Lema_bi_kubuyî||4||1
|-
|Lema_bi_venturenyoyî||4||2
|-
|Lema_bi_popolucayiya_highland||4||1
|-
|Lema_bi_bintuluyî||4||1
|-
|Lema_bi_bîmayî||4||1
|-
|Lema_bi_nyaturuyî||4||1
|-
|Lema_bi_sogdî||4||1
|-
|Lema_bi_ratahanî||4||2
|-
|Lema_bi_museyî||4||1
|-
|Lema_bi_nahwatliya_mîçoakanê||4||1
|-
|Lema_bi_akîpayiya_rojhilatî||4||1
|-
|Lema_bi_paiuteyiya_bakurî||4||1
|-
|Lema_bi_yaayî||4||1
|-
|Lema_bi_taişanîzî||4||2
|-
|Lema_bi_koreguajeyî||4||1
|-
|Lema_bi_serranoyî||4||2
|-
|Lema_bi_nkonyayî||4||1
|-
|Lema_bi_malilayî||4||1
|-
|Lema_bi_folopayî||4||1
|-
|Lema_bi_kawésqar||4||1
|-
|Lema_bi_abagayî||4||1
|-
|Lema_bi_wororayî||4||1
|-
|Lema_bi_panarayî||4||1
|-
|Lema_bi_turkanayî||4||1
|-
|Lema_bi_taitayî||4||1
|-
|Lema_bi_umayî||4||2
|-
|Lema_bi_katalaniya_kevn||4||1
|-
|Lema_bi_çolyanî||4||1
|-
|Lema_bi_mundurukú||4||2
|-
|Lema_bi_deccaniyî||4||2
|-
|Lema_bi_laşiyî||4||2
|-
|Lema_bi_gongî||4||1
|-
|Lema_bi_nambikwarayî||4||1
|-
|Lema_bi_lillooetî||4||1
|-
|Lema_bi_guiqiongî||4||1
|-
|Lema_bi_alekanoyî||4||2
|-
|Lema_bi_natçezî||4||1
|-
|Lema_bi_komoyî||4||1
|-
|Lema_bi_paraukî||4||2
|-
|Lema_bi_beaverî||4||1
|-
|Lema_bi_sikayanayî||4||1
|-
|Lema_bi_puinaveyî||4||1
|-
|Lema_bi_kusundayî||4||1
|-
|Lema_bi_ragayî||4||1
|-
|Lema_bi_orejónî||4||1
|-
|Lema_bi_babariya_başûr-rojhilat||4||1
|-
|Lema_bi_wiwayî||4||1
|-
|Lema_bi_baltî||4||1
|-
|Lema_bi_lugbarayî||4||1
|-
|Lema_bi_modangî||4||1
|-
|Lema_bi_isthmus_mixeyî||4||1
|-
|Lema_bi_forest_enetsî||4||1
|-
|Lema_bi_pukapukanî||4||1
|-
|Lema_bi_kelabît_bariyoyî||4||1
|-
|Lema_bi_waraoyî||4||1
|-
|Lema_bi_ǁxegwî||4||1
|-
|Lema_bi_palantla_çinantecî||4||1
|-
|Lema_bi_mendeyî||4||1
|-
|Lema_bi_batuyî||4||1
|-
|Lema_bi_piscatawayî||4||1
|-
|Lema_bi_hurî||4||1
|-
|Lema_bi_foreyî||4||2
|-
|Lema_bi_degemayî||4||1
|-
|Lema_bi_otomacoyî||4||1
|-
|Lema_bi_nahwatliya_temascaltepec||4||1
|-
|Lema_bi_gothîkiya_krimî||4||1
|-
|Lema_bi_kîputî||4||1
|-
|Lema_bi_lîtwanyayiya_kevn||4||1
|-
|Lema_bi_aluneyî||4||1
|-
|Lema_bi_ndoeyî||4||1
|-
|Lema_bi_loteyî||4||1
|-
|Lema_bi_parecî||4||1
|-
|Lema_bi_ngamoyî||4||1
|-
|Lema_bi_kannadayiya_kevn||4||1
|-
|Lema_bi_ankaveyî||4||1
|-
|Lema_bi_vîtûyî||4||1
|-
|Lema_bi_kunzayî||4||1
|-
|Lema_bi_zaiwa||4||2
|-
|Lema_bi_açaguwayî||4||1
|-
|Lema_bi_maranungkuyî||4||1
|-
|Lema_bi_kerehoyî||4||1
|-
|Lema_bi_îşkaşimiyî||4||1
|-
|Lema_bi_digoyî||4||1
|-
|Lema_bi_agutaynenî||4||1
|-
|Lema_bi_burjî||4||1
|-
|Lema_bi_linduyî||4||1
|-
|Lema_bi_baniwayî||4||1
|-
|Lema_bi_yagariayî||4||1
|-
|Lema_bi_menomineeyî||4||1
|-
|Lema_bi_kajamanî||4||1
|-
|Lema_bi_hassaniyayî||4||1
|-
|Lema_bi_umotinayî||4||1
|-
|Lema_bi_yidinyî||4||1
|-
|Lema_bi_tawoyanî||4||1
|-
|Lema_bi_katoyî||4||1
|-
|Lema_bi_arîkara||4||1
|-
|Lema_bi_sirenikî||4||1
|-
|Lema_bi_adzerayî||4||1
|-
|Lema_bi_spokanî||4||1
|-
|Lema_bi_rukîgayî||4||1
|-
|Lema_bi_wuvulu-auayî||4||1
|-
|Lema_bi_ejaghamî||4||1
|-
|Lema_bi_yamdenayî||4||1
|-
|Lema_bi_ma'anyanî||4||1
|-
|Lema_bi_taryanayî||4||1
|-
|Lema_bi_karangî||4||1
|-
|Lema_bi_nong_zhuangî||4||1
|-
|Lema_bi_yupikiya_sîberyaya_navendî||4||1
|-
|Lema_bi_teke-tegeyî||4||1
|-
|Lema_bi_çuanqiandian_cluster_miaoyî||4||2
|-
|Lema_bi_sirianoyî||4||1
|-
|Lema_bi_dagbaniyî||4||1
|-
|Lema_bi_warekenayî||4||1
|-
|Lema_bi_laurentî||4||2
|-
|Lema_bi_kitemboyî||4||1
|-
|Lema_bi_paelignianî||4||1
|-
|Lema_bi_lingaoyî||4||1
|-
|Lema_bi_pataxó_hã-ha||4||1
|-
|Lema_bi_minigirî||4||2
|-
|Lema_bi_yazghulamî||4||1
|-
|Lema_bi_kanowitî||4||1
|-
|Lema_bi_makondeyî||4||1
|-
|Lema_bi_apiaká||4||1
|-
|Lema_bi_çîniya_kevn||4||2
|-
|Lema_bi_prînsîpenî||4||1
|-
|Lema_bi_mambwe-lunguyî||4||1
|-
|Lema_bi_tepehuaniya_başûr-rojhilat||4||1
|-
|Lema_bi_kayapa_kallahanî||4||1
|-
|Lema_bi_mantayî||4||1
|-
|Lema_bi_keresiya_rojhilatî||4||2
|-
|Lema_bi_matalî||4||1
|-
|Lema_bi_bakumpaî||4||1
|-
|Lema_bi_alaba||4||1
|-
|Lema_bi_sabirî||4||1
|-
|Lema_bi_logûlî||4||1
|-
|Lema_bi_midobî||4||1
|-
|Lema_bi_mahicanî||4||1
|-
|Lema_bi_belî||4||1
|-
|Lema_bi_nooneyî||4||1
|-
|Lema_bi_katuyiya_rojavayî||4||2
|-
|Lema_bi_tepeuxila_cuicatecî||4||1
|-
|Lema_bi_nyakyusayî||4||1
|-
|Lema_bi_murikî_(Gîneya_nû)||4||1
|-
|Lema_bi_margî||4||1
|-
|Lema_bi_martu_wangkayî||4||1
|-
|Lema_bi_klîngonî||4||1
|-
|Lema_bi_tundra_enetsî||4||1
|-
|Lema_bi_coroado_purî||4||1
|-
|Lema_bi_ukitî||4||1
|-
|Lema_bi_tanakrosî||4||1
|-
|Lema_bi_karatayî||4||1
|-
|Lema_bi_vandalî||4||2
|-
|Lema_bi_kasemî||4||1
|-
|Lema_bi_çîniya_navîn||4||2
|-
|Lema_bi_yuracareyî||4||1
|-
|Lema_bi_biyakî||4||1
|-
|Lema_bi_soqotrî||4||1
|-
|Lema_bi_deniyî||4||1
|-
|Lema_bi_lawayiya_rojavayî||4||1
|-
|Lema_bi_akatepekiya_me'phaayî||4||1
|-
|Lema_bi_akawaîo||4||1
|-
|Lema_bi_jeberoyî||4||1
|-
|Lema_bi_gunwingguyî||4||1
|-
|Lema_bi_eblaiteyî||4||1
|-
|Lema_bi_xîtanî||4||1
|-
|Lema_bi_luangî||4||1
|-
|Lema_bi_minriqî||4||1
|-
|Lema_bi_angamî||4||1
|-
|Lema_bi_segayî||4||1
|-
|Lema_bi_holîkaçukî||4||1
|-
|Lema_bi_huehuetla_tepehuayî||4||1
|-
|Lema_bi_bileyî||4||1
|-
|Lema_bi_genî||4||1
|-
|Lema_bi_wik-mungkanî||4||1
|-
|Lema_bi_oydayî||3||1
|-
|Lema_bi_guajayî||3||1
|-
|Lema_bi_balangao||3||1
|-
|Lema_bi_pahîyî||3||1
|-
|Lema_bi_cacanî||3||1
|-
|Lema_bi_xoklengî||3||1
|-
|Lema_bi_taboyî||3||1
|-
|Lema_bi_salibayî_(Kolombiya)||3||1
|-
|Lema_bi_nayî||3||1
|-
|Lema_bi_bantîkî||3||1
|-
|Lema_bi_yakamulî||3||1
|-
|Lema_bi_yanda_dogonî||3||1
|-
|Lema_bi_sãotomenseyî||3||1
|-
|Lema_bi_erebiya_çadî||3||1
|-
|Lema_bi_creoleyiya_torres_strait||3||1
|-
|Lema_bi_sathmar_swabî||3||1
|-
|Lema_bi_miraya_bikolî||3||1
|-
|Lema_bi_macaguanî||3||1
|-
|Lema_bi_mailuyî||3||1
|-
|Lema_bi_yineyî||3||1
|-
|Lema_bi_kuamasî||3||1
|-
|Lema_bi_kaskihayî||3||1
|-
|Lema_bi_yurumanguî||3||1
|-
|Lema_bi_çulymî||3||1
|-
|Lema_bi_bîkolanoyiya_başûr_katanduanî||3||1
|-
|Lema_bi_mozarabîkî||3||1
|-
|Lema_bi_sobeyî||3||1
|-
|Lema_bi_agarabiyî||3||1
|-
|Lema_bi_ongotayî||3||1
|-
|Lema_bi_îtonamayî||3||1
|-
|Lema_bi_aisî||3||1
|-
|Lema_bi_zulgo-gemzekî||3||1
|-
|Lema_bi_wik-ngathanayî||3||1
|-
|Lema_bi_tommo_soyî||3||1
|-
|Lema_bi_sunwarî||3||1
|-
|Lema_bi_romblomanonî||3||1
|-
|Lema_bi_lawî||3||1
|-
|Lema_bi_jamamadiyî||3||1
|-
|Lema_bi_bundelî||3||1
|-
|Lema_bi_wolayttayî||3||1
|-
|Lema_bi_oyguriya_kevn||3||1
|-
|Lema_bi_balanta-ganjayî||3||1
|-
|Lema_bi_alakî||3||1
|-
|Lema_bi_naroyî||3||1
|-
|Lema_bi_almaniya_volga||3||1
|-
|Lema_bi_nehanî||3||1
|-
|Lema_bi_kalaganî||3||1
|-
|Lema_bi_endeyî||3||1
|-
|Lema_bi_ngadcurî||3||1
|-
|Lema_bi_hayayî||3||1
|-
|Lema_bi_ulau-suainî||3||1
|-
|Lema_bi_sauraştrayî||3||1
|-
|Lema_bi_miriwungî||3||1
|-
|Lema_bi_eritaiyî||3||1
|-
|Lema_bi_yendangî||3||1
|-
|Lema_bi_mixteciya_tezoatlan||3||1
|-
|Lema_bi_plains_miwokî||3||1
|-
|Lema_bi_fangî_(Beboid)||3||1
|-
|Lema_bi_betoî||3||1
|-
|Lema_bi_arabela||3||1
|-
|Lema_bi_tayoyî||3||1
|-
|Lema_bi_nornî||3||1
|-
|Lema_bi_kassonkeyî||3||1
|-
|Lema_bi_bilua||3||1
|-
|Lema_bi_wabî||3||1
|-
|Lema_bi_kwaioyî||3||1
|-
|Lema_bi_abronî||3||1
|-
|Lema_bi_wanjî||3||1
|-
|Lema_bi_soçiapam_çinantecî||3||1
|-
|Lema_bi_kwomayî||3||1
|-
|Lema_bi_dawera-daweloorî||3||1
|-
|Lema_bi_zapotekiya_yareni||3||1
|-
|Lema_bi_rasawayî||3||1
|-
|Lema_bi_brajî||3||1
|-
|Lema_bi_nahwatliya_koatepek||3||1
|-
|Lema_bi_kipçakî||3||1
|-
|Lema_bi_maybratî||3||1
|-
|Lema_bi_alamblakî||3||1
|-
|Lema_bi_lizuyî||3||1
|-
|Lema_bi_jumjumî||3||1
|-
|Lema_bi_tübatulabalî||3||1
|-
|Lema_bi_pamosuyî||3||1
|-
|Lema_bi_kadiweuyî||3||1
|-
|Lema_bi_tunikayî||3||1
|-
|Lema_bi_cocamayî||3||1
|-
|Lema_bi_ambulasî||3||1
|-
|Lema_bi_yaneşa'||3||1
|-
|Lema_bi_hdî||3||1
|-
|Lema_bi_yarebayî||3||1
|-
|Lema_bi_macuşî||3||1
|-
|Lema_bi_malalî||3||1
|-
|Lema_bi_kasuayî||3||1
|-
|Lema_bi_temî||3||1
|-
|Lema_bi_manamî||3||1
|-
|Lema_bi_bîlîwayî||3||1
|-
|Lema_bi_zapotekiya_amatlan||3||1
|-
|Lema_bi_teribeyî||3||1
|-
|Lema_bi_gabrielino-fernandeñoyî||3||1
|-
|Lema_bi_abu'_arapeşî||3||1
|-
|Lema_bi_adangî||3||1
|-
|Lema_bi_ratagnonî||3||1
|-
|Lema_bi_gbariyî||3||1
|-
|Lema_bi_subayî||3||1
|-
|Lema_bi_onobasuluyî||3||1
|-
|Lema_bi_aî-çamî||3||1
|-
|Lema_bi_jamsayî||3||1
|-
|Lema_bi_bunguyî||3||1
|-
|Lema_bi_bahauyî||3||1
|-
|Lema_bi_akha||3||1
|-
|Lema_bi_jemezî||3||1
|-
|Lema_bi_dusun_wituyî||3||1
|-
|Lema_bi_alanganî||3||1
|-
|Lema_bi_safwayî||3||1
|-
|Lema_bi_xotanî||3||1
|-
|Lema_bi_ndambayî||3||1
|-
|Lema_bi_mehinakuyî||3||1
|-
|Lema_bi_long_watî||3||1
|-
|Lema_bi_catacaoyî||3||1
|-
|Lema_bi_kalangayî||3||1
|-
|Lema_bi_yangbenî||3||1
|-
|Lema_bi_heheyî||3||1
|-
|Lema_bi_sawayî||3||1
|-
|Lema_bi_phakeyî||3||1
|-
|Lema_bi_angolar||3||1
|-
|Lema_bi_urartûyî||3||1
|-
|Lema_bi_taranganiya_rojava||3||1
|-
|Lema_bi_pilenî||3||1
|-
|Lema_bi_mixtekiya_alcozauca||3||1
|-
|Lema_bi_uteyî||3||1
|-
|Lema_bi_tauseyî||3||1
|-
|Lema_bi_yugî||3||1
|-
|Lema_bi_kumzarî||3||1
|-
|Lema_bi_nukuoroyî||3||1
|-
|Lema_bi_kawaiisuyî||3||1
|-
|Lema_bi_mpotoyî||3||1
|-
|Lema_bi_mangî||3||1
|-
|Lema_bi_gaddangî||3||1
|-
|Lema_bi_damariya_rojava||3||1
|-
|Lema_bi_ocainayî||3||1
|-
|Lema_bi_mapoyoyî||3||1
|-
|Lema_bi_garhwaliyî||3||1
|-
|Lema_bi_sorî-harenganî||3||1
|-
|Lema_bi_kewayî||3||1
|-
|Lema_bi_dhatkî||3||1
|-
|Lema_bi_bretoniya_kevn||3||1
|-
|Lema_bi_larike-wakasihu||3||1
|-
|Lema_bi_baagandjiyî||3||1
|-
|Lema_bi_tongayî_(Malawî)||3||1
|-
|Lema_bi_surî||3||1
|-
|Lema_bi_matoyî||3||1
|-
|Lema_bi_lealao_çinantecî||3||1
|-
|Lema_bi_jamtîşî||3||1
|-
|Lema_bi_golinî||3||1
|-
|Lema_bi_totonakiya_misantla||3||1
|-
|Lema_bi_busang_kayanî||3||1
|-
|Lema_bi_kovêyî||3||1
|-
|Lema_bi_kamayurayî||3||1
|-
|Lema_bi_heiltsukî||3||1
|-
|Lema_bi_uratî||3||1
|-
|Lema_bi_nihalî||3||1
|-
|Lema_bi_bendeyî||3||1
|-
|Lema_bi_yuguriya_rojavayî||3||1
|-
|Lema_bi_numanayî||3||1
|-
|Lema_bi_mandahuacayî||3||1
|-
|Lema_bi_wapişanayî||3||1
|-
|Lema_bi_dazagayî||3||1
|-
|Lema_bi_warunguyî||3||1
|-
|Lema_bi_tivî||3||1
|-
|Lema_bi_tobî||3||1
|-
|Lema_bi_dobelî||3||1
|-
|Lema_bi_buhi'non_bikolî||3||1
|-
|Lema_bi_ajayî||3||1
|-
|Lema_bi_tongayî_(Zambiya)||3||1
|-
|Lema_bi_susuyî||3||1
|-
|Lema_bi_nahwatliya_morelos||3||1
|-
|Lema_bi_matsesî||3||1
|-
|Lema_bi_ledo_kailiyî||3||1
|-
|Lema_bi_cakayî||3||1
|-
|Lema_bi_bangalayî||3||1
|-
|Lema_bi_nemî||3||1
|-
|Lema_bi_meta'||3||1
|-
|Lema_bi_engganoyî||3||1
|-
|Lema_bi_coeur_d'aleneyî||3||1
|-
|Lema_bi_basapî||3||1
|-
|Lema_bi_cuibayî||3||1
|-
|Lema_bi_erromintxelayî||3||1
|-
|Lema_bi_baysoyî||3||1
|-
|Lema_bi_pimbweyî||3||1
|-
|Lema_bi_nilambayî||3||1
|-
|Lema_bi_makanîzî||3||1
|-
|Lema_bi_aoyî||3||1
|-
|Lema_bi_uyajitayayî||3||1
|-
|Lema_bi_moçî||3||1
|-
|Lema_bi_aramiya_samarî||3||1
|-
|Lema_bi_malinkî||3||1
|-
|Lema_bi_kawişanayî||3||1
|-
|Lema_bi_mruyî||3||1
|-
|Lema_bi_mapunî||3||1
|-
|Lema_bi_bongoyî||3||1
|-
|Lema_bi_lama_baiyî||3||1
|-
|Lema_bi_agî||3||1
|-
|Lema_bi_masbate_sorsogon||3||1
|-
|Lema_bi_îwaidjayî||3||1
|-
|Lema_bi_dobûyî||3||1
|-
|Lema_bi_woun_meuyî||3||1
|-
|Lema_bi_totonakiya_xicotepec_de_juarez||3||1
|-
|Lema_bi_duvleyî||3||1
|-
|Lema_bi_baloyî||3||1
|-
|Lema_bi_mbulayî||3||1
|-
|Lema_bi_panareyî||3||1
|-
|Lema_bi_cavineñayî||3||1
|-
|Lema_bi_sanggauyî||3||1
|-
|Lema_bi_cofanî||3||1
|-
|Lema_bi_ubirî||3||1
|-
|Lema_bi_pele-ata||3||1
|-
|Lema_bi_ngieyî||3||1
|-
|Lema_bi_ersuyî||3||1
|-
|Lema_bi_taraoyî||3||1
|-
|Lema_bi_yokeyî||3||1
|-
|Lema_bi_tauyayî||3||1
|-
|Lema_bi_biaoyî||3||1
|-
|Lema_bi_tedagayî||3||1
|-
|Lema_bi_arinî||3||1
|-
|Lema_bi_mandanî||3||1
|-
|Lema_bi_kaxarariyî||3||1
|-
|Lema_bi_blagarî||3||1
|-
|Lema_bi_asaro'oyî||3||1
|-
|Lema_bi_zapotekiya_coatecas_altas||3||1
|-
|Lema_bi_manîdeyî||3||1
|-
|Lema_bi_îmondayî||3||1
|-
|Lema_bi_ofoyî||3||1
|-
|Lema_bi_avá-kanoeîro||3||1
|-
|Lema_bi_rejang_kayanî||3||1
|-
|Lema_bi_khalingî||3||1
|-
|Lema_bi_dibiyasoyî||3||1
|-
|Lema_bi_bribriyî||3||1
|-
|Lema_bi_îwamî||3||1
|-
|Lema_bi_bukatî||3||1
|-
|Lema_bi_matumbî||3||1
|-
|Lema_bi_wulguruyî||3||1
|-
|Lema_bi_totontepec_mixeyî||3||1
|-
|Lema_bi_gujaratiya_kevn||3||1
|-
|Lema_bi_kohoyî||3||1
|-
|Lema_bi_banggaî||3||1
|-
|Lema_bi_tagakaulu_kalaganî||3||1
|-
|Lema_bi_sambeyî||3||1
|-
|Lema_bi_panayî_(Afrîkaya_navendî)||3||1
|-
|Lema_bi_sangilî||3||1
|-
|Lema_bi_pemon||3||1
|-
|Lema_bi_culinayî||3||1
|-
|Lema_bi_ngindoyî||3||1
|-
|Lema_bi_çamalalî||3||1
|-
|Lema_bi_urhoboyî||3||1
|-
|Lema_bi_hoyî||3||1
|-
|Lema_bi_yokutiya_geliyê_bakurî||3||1
|-
|Lema_bi_nnamî||3||1
|-
|Lema_bi_kuiripî||3||1
|-
|Lema_bi_sikayî||3||1
|-
|Lema_bi_wahau_kenyahî||3||1
|-
|Lema_bi_sirayayî||3||1
|-
|Lema_bi_nungonî||3||1
|-
|Lema_bi_mualangî||3||1
|-
|Lema_bi_mara_çinî||3||1
|-
|Lema_bi_keoru-ahiayî||3||1
|-
|Lema_bi_îpulo||3||1
|-
|Lema_bi_deg_xinagî||3||1
|-
|Lema_bi_adjayî||3||1
|-
|Lema_bi_khamî||3||1
|-
|Lema_bi_wedauyî||3||1
|-
|Lema_bi_maselayiya_navendî||3||1
|-
|Lema_bi_akoyeyî||3||1
|-
|Lema_bi_limilnganî||3||1
|-
|Lema_bi_tukî||3||1
|-
|Lema_bi_bareinî||3||1
|-
|Lema_bi_yalunkayî||3||1
|-
|Lema_bi_pare||3||1
|-
|Lema_bi_colanî||3||1
|-
|Lema_bi_yankunytjatjarayî||3||1
|-
|Lema_bi_penaniya_rojavayî||3||1
|-
|Lema_bi_minayî||3||1
|-
|Lema_bi_erebiya_mezopotamyayî_ya_bakur||3||1
|-
|Lema_bi_çambriyî||3||1
|-
|Lema_bi_yeyî||3||1
|-
|Lema_bi_semaq_beriyî||3||1
|-
|Lema_bi_benyadu'||3||1
|-
|Lema_bi_yokutiya_geliyê_başûrî||3||1
|-
|Lema_bi_setayî||3||1
|-
|Lema_bi_araona||3||1
|-
|Lema_bi_nottowayî||3||1
|-
|Lema_bi_isubuyî||3||1
|-
|Lema_bi_çrauyî||3||1
|-
|Lema_bi_kayabiyî||3||1
|-
|Lema_bi_asîluluyî||3||1
|-
|Lema_bi_abay-sembwakî||3||1
|-
|Lema_bi_mubamî||3||1
|-
|Lema_bi_keley-i_kallahanî||3||1
|-
|Lema_bi_waray_sorsogonî||3||1
|-
|Lema_bi_oloyî||3||1
|-
|Lema_bi_muyayî||3||1
|-
|Lema_bi_lambayî||3||1
|-
|Lema_bi_zimanê_destan_ê_îzlandê||3||1
|-
|Lema_bi_wemba-wembayî||3||1
|-
|Lema_bi_îxilî||3||1
|-
|Lema_bi_bukiyîpî||3||1
|-
|Lema_bi_rufijî||3||1
|-
|Lema_bi_mauwakeyî||3||1
|-
|Lema_bi_lengoyî||3||1
|-
|Lema_bi_namuyî||3||1
|-
|Lema_bi_naunayî||3||1
|-
|Lema_bi_penaniya_rojhilatî||3||1
|-
|Lema_bi_mixiforeyî||3||1
|-
|Lema_bi_bekatî'||3||1
|-
|Lema_bi_yidghayî||3||1
|-
|Lema_bi_kriya_woods||3||1
|-
|Lema_bi_mamanwayî||3||1
|-
|Lema_bi_kathlametî||3||1
|-
|Lema_bi_çruyî||3||1
|-
|Lema_bi_arîkapûyî||3||1
|-
|Lema_bi_futuna-anîwayî||3||1
|-
|Lema_bi_wandamenî||3||1
|-
|Lema_bi_tewayî||3||1
|-
|Lema_bi_nyoroyî||3||1
|-
|Lema_bi_bokyî||3||1
|-
|Lema_bi_timucuayî||3||1
|-
|Lema_bi_sonagayî||3||1
|-
|Lema_bi_ogbronuagumî||3||1
|-
|Lema_bi_munjî||3||1
|-
|Lema_bi_gawwadayî||3||1
|-
|Lema_bi_west_albay_bikolî||3||1
|-
|Lema_bi_îyiveyî||3||1
|-
|Lema_bi_bakairí||3||1
|-
|Lema_bi_akpesî||3||1
|-
|Lema_bi_mazateciya_san_jerónimo_tecóatl||3||1
|-
|Lema_bi_jinguluyî||3||1
|-
|Lema_bi_tsuvadî||3||1
|-
|Lema_bi_kokodayî||3||1
|-
|Lema_bi_amondawayî||3||1
|-
|Lema_bi_yanomamöî||3||1
|-
|Lema_bi_sarikolî||3||1
|-
|Lema_bi_ngan'gityemerrî||3||1
|-
|Lema_bi_minica_huitotoyî||3||1
|-
|Lema_bi_yaweyuhayî||3||1
|-
|Lema_bi_uru-eu-wau-wau||3||1
|-
|Lema_bi_ewondoyî||3||1
|-
|Lema_bi_karolînî||3||1
|-
|Lema_bi_arara-karo||3||1
|-
|Lema_bi_yukpayî||3||1
|-
|Lema_bi_îaaiyî||3||1
|-
|Lema_bi_wandayî||3||1
|-
|Lema_bi_mudburrayî||3||1
|-
|Lema_bi_keloyî||3||1
|-
|Lema_bi_ramayî||3||1
|-
|Lema_bi_zayî||3||1
|-
|Lema_bi_mûssaû-emîrakî||3||1
|-
|Lema_bi_lambyayî||3||1
|-
|Lema_bi_dimeyî||3||1
|-
|Lema_bi_agwakatekî||3||1
|-
|Lema_bi_zinzayî||3||1
|-
|Lema_bi_kimbuyî||3||1
|-
|Lema_bi_dogul_domî||3||1
|-
|Lema_bi_babuzayî||3||1
|-
|Lema_bi_leoniya_kevn||3||1
|-
|Lema_bi_şerbroyî||3||1
|-
|Lema_bi_gumatjî||3||1
|-
|Lema_bi_bûrî||3||1
|-
|Lema_bi_palenqueroyî||3||1
|-
|Lema_bi_guwarî||3||1
|-
|Lema_bi_tagbanwayiya_navendî||3||1
|-
|Lema_bi_mentawaî||3||1
|-
|Lema_bi_kakabeyî||3||1
|-
|Lema_bi_mianî||3||1
|-
|Lema_bi_koronadal_blaanî||3||1
|-
|Lema_bi_tamîliya_kevn||3||1
|-
|Lema_bi_yawuruyî||3||1
|-
|Lema_bi_tapaçultecî||3||1
|-
|Lema_bi_seçurayî||3||1
|-
|Lema_bi_piaroayî||3||1
|-
|Lema_bi_mixteciya_çayuco||3||1
|-
|Lema_bi_kreyoliya_îngilîzî_ya_îslanderê||3||1
|-
|Lema_bi_hobyótî||3||1
|-
|Lema_bi_annoboneseyî||3||1
|-
|Lema_bi_semnamî||3||1
|-
|Lema_bi_nisga'ayî||3||1
|-
|Lema_bi_makî_(Çîn)||3||1
|-
|Lema_bi_malayiya_moluccana_bakur||3||1
|-
|Lema_bi_zanakî||3||1
|-
|Lema_bi_kuviyî||3||1
|-
|Lema_bi_kayan_river_kayanî||3||1
|-
|Lema_bi_fuyugî||3||1
|-
|Lema_bi_zapotekiya_laçixio||3||1
|-
|Lema_bi_kwara'aeyî||3||1
|-
|Lema_bi_îngilîziya_kreyolî_ya_antîgua_û_barbud||3||1
|-
|Lema_bi_ramoaainayî||3||1
|-
|Lema_bi_dohoyî||3||1
|-
|Lema_bi_akuwagelî||3||1
|-
|Lema_bi_nawaruyî||3||1
|-
|Lema_bi_tumleoyî||3||1
|-
|Lema_bi_tagişî||3||1
|-
|Lema_bi_pangwayî||3||1
|-
|Lema_bi_louyî||3||1
|-
|Lema_bi_emberayiya_bakurî||3||1
|-
|Lema_bi_takuuyî||3||1
|-
|Lema_bi_kalulî||3||1
|-
|Lema_bi_batad_ifugaoyî||3||1
|-
|Lema_bi_yanyuwayî||3||1
|-
|Lema_bi_hindiya_kevn||3||2
|-
|Lema_bi_cupeñoyî||3||1
|-
|Lema_bi_bawuleyî||3||1
|-
|Lema_bi_ngonî||3||1
|-
|Lema_bi_anongî||3||1
|-
|Lema_bi_yimasî||3||1
|-
|Lema_bi_krobuyî||3||1
|-
|Lema_bi_huambisayî||3||1
|-
|Lema_bi_kumakî||3||1
|-
|Lema_bi_iceve-macî||3||1
|-
|Lema_bi_simbarî||3||1
|-
|Lema_bi_kuriayî||3||1
|-
|Lema_bi_îatmulî||3||1
|-
|Lema_bi_çuaveyî||3||1
|-
|Lema_bi_zandeyî||3||1
|-
|Lema_bi_siroî||3||1
|-
|Lema_bi_nyah_kurî||3||1
|-
|Lema_bi_wangayî||3||1
|-
|Lema_bi_muinanî||3||1
|-
|Lema_bi_kwayayî||3||1
|-
|Lema_bi_kembayanî||3||1
|-
|Lema_bi_açeronî||3||1
|-
|Lema_bi_wari'||3||1
|-
|Lema_bi_demotîkî||3||1
|-
|Lema_bi_botlixî||3||1
|-
|Lema_bi_lammayî||3||1
|-
|Lema_bi_budibudî||3||1
|-
|Lema_bi_bulî||3||1
|-
|Lema_bi_toroyî||3||1
|-
|Lema_bi_rumuyî||3||1
|-
|Lema_bi_javayiya_ontongê||3||1
|-
|Lema_bi_burunî||3||1
|-
|Lema_bi_wyandotî||3||1
|-
|Lema_bi_paezî||3||1
|-
|Lema_bi_lingua_franca_nova||3||2
|-
|Lema_bi_jitayî||3||1
|-
|Lema_bi_amahaî||3||1
|-
|Lema_bi_mepaya_malînaltepekî||3||1
|-
|Lema_bi_embuyî||3||1
|-
|Lema_bi_ambayî||3||1
|-
|Lema_bi_penrhynî||3||1
|-
|Lema_bi_ansus||3||1
|-
|Lema_bi_pomoyiya_bakurî||3||1
|-
|Lema_bi_kumanî||3||1
|-
|Lema_bi_fipayî||3||1
|-
|Lema_bi_nubiyî||3||1
|-
|Lema_bi_mongoyî||3||1
|-
|Lema_bi_biwaydokayî||3||1
|-
|Lema_bi_arosî||3||1
|-
|Lema_bi_zangskarî||3||1
|-
|Lema_bi_punan_aputî||3||1
|-
|Lema_bi_îkizuyî||3||1
|-
|Lema_bi_bobongko||3||1
|-
|Lema_bi_tharakayî||3||1
|-
|Lema_bi_mujiya_başûrî||3||1
|-
|Lema_bi_manyawayî||3||1
|-
|Lema_bi_kwazayî||3||1
|-
|Lema_bi_warisî||3||1
|-
|Lema_bi_tipaî||3||1
|-
|Lema_bi_sooyî||3||1
|-
|Lema_bi_kereweyî||3||1
|-
|Lema_bi_suaboyî||3||1
|-
|Lema_bi_resigaroyî||3||1
|-
|Lema_bi_budumayî||3||1
|-
|Lema_bi_nakameyî||3||1
|-
|Lema_bi_leyponî||3||1
|-
|Lema_bi_guahiboyî||3||1
|-
|Lema_bi_burusuyî||3||1
|-
|Lema_bi_lipan||3||1
|-
|Lema_bi_banda||3||1
|-
|Lema_bi_tşanglayî||3||1
|-
|Lema_bi_mediya_kevn||3||1
|-
|Lema_bi_papapanayî||3||1
|-
|Lema_bi_kala_lagaw_yayî||3||1
|-
|Lema_bi_bariyî||3||1
|-
|Lema_bi_paulohî||3||1
|-
|Lema_bi_batakiya_dairî||3||1
|-
|Lema_bi_uruyî||3||1
|-
|Lema_bi_tatariya_sîberî||3||1
|-
|Lema_bi_mmaniyî||3||1
|-
|Lema_bi_yorta_yortayî||3||1
|-
|Lema_bi_malayîk_dayakî||3||1
|-
|Lema_bi_kumarbhag_pahariayî||3||1
|-
|Lema_bi_vunjoyî||3||1
|-
|Lema_bi_çukayî||3||1
|-
|Lema_bi_walayî||3||1
|-
|Lema_bi_punan_bah-biauyî||3||1
|-
|Lema_bi_nyamboyî||3||1
|-
|Lema_bi_ga'andayî||3||1
|-
|Lema_bi_thavungî||3||1
|-
|Lema_bi_açiyî||3||1
|-
|Lema_bi_tiriyî||3||1
|-
|Lema_bi_murîkî_(Malezya)||3||1
|-
|Lema_bi_suauyî||3||1
|-
|Lema_bi_zoqueyiya_rayón||3||1
|-
|Lema_bi_wiçitayî||3||1
|-
|Lema_bi_sumbwayî||3||1
|-
|Lema_bi_buluyî_(Kamerûn)||3||1
|-
|Lema_bi_rungwayî||3||1
|-
|Lema_bi_nakanayî||3||1
|-
|Lema_bi_trîkuyiya_çicahuaxtla||3||1
|-
|Lema_bi_lipoyî||3||1
|-
|Lema_bi_gwenoyî||3||1
|-
|Lema_bi_carijonayî||3||1
|-
|Lema_bi_barî||3||1
|-
|Lema_bi_taliabuyî||3||1
|-
|Lema_bi_sanumayî||3||1
|-
|Lema_bi_mijî||3||1
|-
|Lema_bi_peroyî||3||1
|-
|Lema_bi_erebiya_ummanî||3||1
|-
|Lema_bi_yembayî||3||1
|-
|Lema_bi_unserdeutsch||3||1
|-
|Lema_bi_yindjilandjî||3||1
|-
|Lema_bi_kua-nsî||3||1
|-
|Lema_bi_apurinã||3||1
|-
|Lema_bi_sissanoyî||3||1
|-
|Lema_bi_punan_merapî||3||1
|-
|Lema_bi_nyamwangayî||3||1
|-
|Lema_bi_dakakayî||3||1
|-
|Lema_bi_maonanî||3||1
|-
|Lema_bi_bolonî||3||1
|-
|Lema_bi_attié||3||1
|-
|Lema_bi_warjî||3||1
|-
|Lema_bi_rara_bakati'||3||1
|-
|Lema_bi_toabaîtayî||3||1
|-
|Lema_bi_bunamayî||2||1
|-
|Lema_bi_bafutî||2||1
|-
|Lema_bi_akebuyî||2||1
|-
|Lema_bi_wolanî||2||1
|-
|Lema_bi_şambalayî||2||1
|-
|Lema_bi_nakî||2||1
|-
|Lema_bi_durango_nahuatliya_rojavayî_ya_jêrîn||2||1
|-
|Lema_bi_buruwayî||2||1
|-
|Lema_bi_alago||2||1
|-
|Lema_bi_trumaî||2||1
|-
|Lema_bi_mbesayî||2||1
|-
|Lema_bi_koalibî||2||1
|-
|Lema_bi_juangî||2||1
|-
|Lema_bi_gupapuynguyî||2||1
|-
|Lema_bi_banda-bambariyî||2||1
|-
|Lema_bi_pamiguayî||2||1
|-
|Lema_bi_lolodayî||2||1
|-
|Lema_bi_elemeyî||2||1
|-
|Lema_bi_amalî||2||1
|-
|Lema_bi_tungagî||2||1
|-
|Lema_bi_tai_dónî||2||1
|-
|Lema_bi_papumayî||2||1
|-
|Lema_bi_meroytîkî||2||1
|-
|Lema_bi_konoyî_(sierra_leone)||2||1
|-
|Lema_bi_kalabrî||2||1
|-
|Lema_bi_emplawasî||2||1
|-
|Lema_bi_pawnakayî||2||1
|-
|Lema_bi_ngäbereyî||2||1
|-
|Lema_bi_mijuyî||2||1
|-
|Lema_bi_lundayî||2||1
|-
|Lema_bi_kosraeyî||2||1
|-
|Lema_bi_kamarianî||2||1
|-
|Lema_bi_anambeyî||2||1
|-
|Lema_bi_ukwayî||2||1
|-
|Lema_bi_tananaya_jorîn||2||1
|-
|Lema_bi_ngas||2||1
|-
|Lema_bi_kreyola_fransî_ya_réunion||2||1
|-
|Lema_bi_kanamariyî||2||1
|-
|Lema_bi_baybayanonî||2||1
|-
|Lema_bi_yemsayî||2||1
|-
|Lema_bi_unuayî||2||1
|-
|Lema_bi_tara_bakayî||2||1
|-
|Lema_bi_pijaoyî||2||1
|-
|Lema_bi_mixteciya_silacayoapan||2||1
|-
|Lema_bi_honeyî||2||1
|-
|Lema_bi_etenî||2||1
|-
|Lema_bi_çarruayî||2||1
|-
|Lema_bi_anukî||2||1
|-
|Lema_bi_usila_çinantecî||2||1
|-
|Lema_bi_tatiya_kevn||2||1
|-
|Lema_bi_njenî||2||1
|-
|Lema_bi_mnongiya_rojhilatî||2||1
|-
|Lema_bi_çinaliyî||2||1
|-
|Lema_bi_arabana||2||1
|-
|Lema_bi_vehesî||2||1
|-
|Lema_bi_taykatî||2||1
|-
|Lema_bi_pomoyiya_rojhilatî||2||1
|-
|Lema_bi_kumbrîkî||2||1
|-
|Lema_bi_iduyî||2||1
|-
|Lema_bi_aremî||2||1
|-
|Lema_bi_vuteyî||2||1
|-
|Lema_bi_temeinî||2||1
|-
|Lema_bi_sinagenî||2||1
|-
|Lema_bi_manado_malayî||2||1
|-
|Lema_bi_kurtjarî||2||1
|-
|Lema_bi_kauwerayî||2||1
|-
|Lema_bi_arta||2||1
|-
|Lema_bi_zapoteciya_rincona_başûrî||2||1
|-
|Lema_bi_walmajarrî||2||1
|-
|Lema_bi_terenoyî||2||1
|-
|Lema_bi_situyî||2||1
|-
|Lema_bi_mangasî||2||1
|-
|Lema_bi_kwadiyî||2||1
|-
|Lema_bi_îkoyî||2||1
|-
|Lema_bi_aşeninka_pereneyî||2||1
|-
|Lema_bi_zapotekiya_quioquitani-quieri||2||1
|-
|Lema_bi_wanî||2||1
|-
|Lema_bi_thrasî||2||1
|-
|Lema_bi_qimant||2||1
|-
|Lema_bi_mundablî||2||1
|-
|Lema_bi_kwiniyî||2||1
|-
|Lema_bi_înorî||2||1
|-
|Lema_bi_bolyuyî||2||1
|-
|Lema_bi_au||2||1
|-
|Lema_bi_zapotekiya_yalalagî||2||1
|-
|Lema_bi_warkay-bîpîmî||2||1
|-
|Lema_bi_sorayî||2||1
|-
|Lema_bi_murui_huitotoyî||2||1
|-
|Lema_bi_marimanindjî||2||1
|-
|Lema_bi_kermanî||2||1
|-
|Lema_bi_gbanuyî||2||1
|-
|Lema_bi_awetí||2||1
|-
|Lema_bi_zhang-zhungî||2||1
|-
|Lema_bi_wawonî||2||1
|-
|Lema_bi_toaripî||2||1
|-
|Lema_bi_subaneniya_navendî||2||1
|-
|Lema_bi_riangî||2||1
|-
|Lema_bi_n'koyî||2||1
|-
|Lema_bi_langoyî_(Uganda)||2||1
|-
|Lema_bi_buganî||2||1
|-
|Lema_bi_orumayî||2||1
|-
|Lema_bi_gojriyî||2||1
|-
|Lema_bi_dongotonoyî||2||1
|-
|Lema_bi_dongşanba_laloyî||2||1
|-
|Lema_bi_baguayî||2||1
|-
|Lema_bi_akeî||2||1
|-
|Lema_bi_totolî||2||1
|-
|Lema_bi_nalikî||2||1
|-
|Lema_bi_kîbenayî||2||1
|-
|Lema_bi_jehî||2||1
|-
|Lema_bi_safaitîkî||2||1
|-
|Lema_bi_mbreyî||2||1
|-
|Lema_bi_jumaytepequeyî||2||1
|-
|Lema_bi_ebughuyî||2||1
|-
|Lema_bi_cacuayî||2||1
|-
|Lema_bi_bandayiya_navendî_ya_başûr||2||1
|-
|Lema_bi_xolosî||2||1
|-
|Lema_bi_tabriakî||2||1
|-
|Lema_bi_salînanî||2||1
|-
|Lema_bi_ncaneyî||2||1
|-
|Lema_bi_kadazaniya_çemê_kliasê||2||1
|-
|Lema_bi_caşibo-cacataiboyî||2||1
|-
|Lema_bi_tunggareyî||2||1
|-
|Lema_bi_tai_doyî||2||1
|-
|Lema_bi_korafe-yeghayî||2||1
|-
|Lema_bi_hamtaiyî||2||1
|-
|Lema_bi_coast_miwokî||2||1
|-
|Lema_bi_barombî||2||1
|-
|Lema_bi_ambrîmiya_başûr-rojhilat||2||1
|-
|Lema_bi_yandruwandhayî||2||1
|-
|Lema_bi_saparayî||2||1
|-
|Lema_bi_mikasukî||2||1
|-
|Lema_bi_koşinî||2||1
|-
|Lema_bi_batakiya_palawan||2||1
|-
|Lema_bi_anauyayî||2||1
|-
|Lema_bi_yarawatayî||2||1
|-
|Lema_bi_tanemayî||2||1
|-
|Lema_bi_peveyî||2||1
|-
|Lema_bi_ngbaka_ma'boyî||2||1
|-
|Lema_bi_macunayî||2||1
|-
|Lema_bi_çacoboyî||2||1
|-
|Lema_bi_angîka||2||1
|-
|Lema_bi_seimî||2||1
|-
|Lema_bi_nhandayî||2||1
|-
|Lema_bi_kaondeyî||2||1
|-
|Lema_bi_eteocretanî||2||1
|-
|Lema_bi_çaurayî||2||1
|-
|Lema_bi_benabenayî||2||1
|-
|Lema_bi_anuta||2||1
|-
|Lema_bi_yir-yorontî||2||1
|-
|Lema_bi_uspantekoyî||2||1
|-
|Lema_bi_serayî||2||1
|-
|Lema_bi_njyemî||2||1
|-
|Lema_bi_mobilianî||2||1
|-
|Lema_bi_malalamaî||2||1
|-
|Lema_bi_karayî_(Gîneya_nû)||2||1
|-
|Lema_bi_molaleyî||2||1
|-
|Lema_bi_ikpengî||2||1
|-
|Lema_bi_sinaugoroyî||2||1
|-
|Lema_bi_nukî||2||1
|-
|Lema_bi_manambuyî||2||1
|-
|Lema_bi_kuruayayî||2||1
|-
|Lema_bi_îbatanî||2||1
|-
|Lema_bi_çuruyayî||2||1
|-
|Lema_bi_aruopî||2||1
|-
|Lema_bi_zapotekiya_aloapam||2||1
|-
|Lema_bi_teressayî||2||1
|-
|Lema_bi_sivandî||2||1
|-
|Lema_bi_nyangboyî||2||1
|-
|Lema_bi_mpadeyî||2||1
|-
|Lema_bi_kayî||2||1
|-
|Lema_bi_gabadiyî||2||1
|-
|Lema_bi_dakpayî||2||1
|-
|Lema_bi_bofî||2||1
|-
|Lema_bi_aşeyî||2||1
|-
|Lema_bi_zapotekiya_rincón||2||1
|-
|Lema_bi_tibetiya_klasîk||2||1
|-
|Lema_bi_obokuîtayî||2||1
|-
|Lema_bi_mundanî||2||1
|-
|Lema_bi_mapidianî||2||1
|-
|Lema_bi_ganzayî||2||1
|-
|Lema_bi_açumawî||2||1
|-
|Lema_bi_muruwarî||2||1
|-
|Lema_bi_maringarrî||2||1
|-
|Lema_bi_lakkiayî||2||1
|-
|Lema_bi_gbanziriyî||2||1
|-
|Lema_bi_desanoyî||2||1
|-
|Lema_bi_awhelawayî||2||1
|-
|Lema_bi_agatuyî||2||1
|-
|Lema_bi_tobayî||2||1
|-
|Lema_bi_subanoniya_rojavayî||2||1
|-
|Lema_bi_onînî||2||1
|-
|Lema_bi_nabayî||2||1
|-
|Lema_bi_îtu_mbon_uzoyî||2||1
|-
|Lema_bi_geser-goromî||2||1
|-
|Lema_bi_azhayî||2||1
|-
|Lema_bi_aiwooyî||2||1
|-
|Lema_bi_tomoipî||2||1
|-
|Lema_bi_romboyî||2||1
|-
|Lema_bi_oryayî||2||1
|-
|Lema_bi_mato_grosso_arára||2||1
|-
|Lema_bi_jambî_malayî||2||1
|-
|Lema_bi_gokanayî||2||1
|-
|Lema_bi_gokhyî||2||1
|-
|Lema_bi_bungku||2||1
|-
|Lema_bi_akeyî||2||1
|-
|Lema_bi_totonaciya_nekaksaya_jorîn||2||1
|-
|Lema_bi_şangayî||2||1
|-
|Lema_bi_russenorskî||2||1
|-
|Lema_bi_nalî||2||1
|-
|Lema_bi_guayaberoyî||2||1
|-
|Lema_bi_dusun_deyahî||2||1
|-
|Lema_bi_busamiyî||2||1
|-
|Lema_bi_balanta-kentohe||2||1
|-
|Lema_bi_xaragure||2||1
|-
|Lema_bi_şixingî||2||1
|-
|Lema_bi_safeyoka||2||1
|-
|Lema_bi_paikonekayî||2||1
|-
|Lema_bi_mbu'||2||1
|-
|Lema_bi_kobolî||2||1
|-
|Lema_bi_edopiyî||2||1
|-
|Lema_bi_bandayiya_rojavayî_ya_navendî||2||1
|-
|Lema_bi_saluanî||2||1
|-
|Lema_bi_mehekî||2||1
|-
|Lema_bi_elkeiyî||2||1
|-
|Lema_bi_yakayî||2||1
|-
|Lema_bi_tai_hongjinî||2||1
|-
|Lema_bi_samtaoyî||2||1
|-
|Lema_bi_nekginî||2||1
|-
|Lema_bi_korakî||2||1
|-
|Lema_bi_barranbinyayî||2||1
|-
|Lema_bi_talîsî||2||1
|-
|Lema_bi_sapeyî||2||1
|-
|Lema_bi_payaguayî||2||1
|-
|Lema_bi_milangî||2||1
|-
|Lema_bi_kamasayî||2||1
|-
|Lema_bi_cruzeñoyî||2||1
|-
|Lema_bi_ancamî||2||1
|-
|Lema_bi_tangaleyî||2||1
|-
|Lema_bi_savosavoyî||2||1
|-
|Lema_bi_peyî||2||1
|-
|Lema_bi_ngbaka_manzayî||2||1
|-
|Lema_bi_misima-paneatî||2||1
|-
|Lema_bi_kangayî||2||1
|-
|Lema_bi_çaçiyî||2||1
|-
|Lema_bi_bayiya_bakurî||2||1
|-
|Lema_bi_yeniçeyî||2||1
|-
|Lema_bi_tarairiú||2||1
|-
|Lema_bi_pilagayî||2||1
|-
|Lema_bi_horomî||2||1
|-
|Lema_bi_benayî||2||1
|-
|Lema_bi_anyî||2||1
|-
|Lema_bi_yisî||2||1
|-
|Lema_bi_uşojoyî||2||1
|-
|Lema_bi_tatuyoyî||2||1
|-
|Lema_bi_serilî||2||1
|-
|Lema_bi_playeroyî||2||1
|-
|Lema_bi_nkarî||2||1
|-
|Lema_bi_mocovî||2||1
|-
|Lema_bi_kuboyî||2||1
|-
|Lema_bi_karayî_(Tanzanya)||2||1
|-
|Lema_bi_hulayî||2||1
|-
|Lema_bi_çinookî||2||1
|-
|Lema_bi_yugambalî||2||1
|-
|Lema_bi_tayrorayiya_bakur||2||1
|-
|Lema_bi_maleyî||2||1
|-
|Lema_bi_kumukioyî||2||1
|-
|Lema_bi_indus_kohistanî||2||1
|-
|Lema_bi_foiyî||2||1
|-
|Lema_bi_çoçotecî||2||1
|-
|Lema_bi_bimobayî||2||1
|-
|Lema_bi_argunî||2||1
|-
|Lema_bi_wabodayî||2||1
|-
|Lema_bi_montolî||2||1
|-
|Lema_bi_kuruduyî||2||1
|-
|Lema_bi_kawaçayî||2||1
|-
|Lema_bi_îbinoyî||2||1
|-
|Lema_bi_çutî||2||1
|-
|Lema_bi_arutanî||2||1
|-
|Lema_bi_mpotovoroyî||2||1
|-
|Lema_bi_kayrîrûyî||2||1
|-
|Lema_bi_bogayayî||2||1
|-
|Lema_bi_zapotekiya_san_baltazar_loxiça||2||1
|-
|Lema_bi_wantoatî||2||1
|-
|Lema_bi_tidongiya_başûrî||2||1
|-
|Lema_bi_sogayî||2||1
|-
|Lema_bi_obolo||2||1
|-
|Lema_bi_mundarî||2||1
|-
|Lema_bi_mapos_buangî||2||1
|-
|Lema_bi_kyengayî||2||1
|-
|Lema_bi_kengayî||2||1
|-
|Lema_bi_dâwî||2||1
|-
|Lema_bi_bondeyî||2||1
|-
|Lema_bi_aulua||2||1
|-
|Lema_bi_zapotekiya_yatee||2||1
|-
|Lema_bi_waropenî||2||1
|-
|Lema_bi_musarî||2||1
|-
|Lema_bi_bremî||2||1
|-
|Lema_bi_awjîla||2||1
|-
|Lema_bi_aghu_tharrnggalayî||2||1
|-
|Lema_bi_zialoyî||2||1
|-
|Lema_bi_tobeloyî||2||1
|-
|Lema_bi_nabî||2||1
|-
|Lema_bi_lardilî||2||1
|-
|Lema_bi_gêdagêdî||2||1
|-
|Lema_bi_dizinî||2||1
|-
|Lema_bi_bugotûyî||2||1
|-
|Lema_bi_azoyú_me'phaayî||2||1
|-
|Lema_bi_zumbunî||2||1
|-
|Lema_bi_tondanoyî||2||1
|-
|Lema_bi_rongayî||2||1
|-
|Lema_bi_matorî||2||1
|-
|Lema_bi_jaminjungî||2||1
|-
|Lema_bi_golayî||2||1
|-
|Lema_bi_dorzeyî||2||1
|-
|Lema_bi_namakurayî||2||1
|-
|Lema_bi_maykulanî||2||1
|-
|Lema_bi_libon_bikolî||2||1
|-
|Lema_bi_gudeyî||2||1
|-
|Lema_bi_busamî||2||1
|-
|Lema_bi_mbudumî||2||1
|-
|Lema_bi_koçî||2||1
|-
|Lema_bi_cahuaranoyî||2||1
|-
|Lema_bi_bandiyî||2||1
|-
|Lema_bi_alseayî||2||1
|-
|Lema_bi_tadaksahakî||2||1
|-
|Lema_bi_samarokenayî||2||1
|-
|Lema_bi_pamplona_atta||2||1
|-
|Lema_bi_hadramî||2||1
|-
|Lema_bi_barapasiyî||2||1
|-
|Lema_bi_tairorayiya_başûr||2||1
|-
|Lema_bi_nekî||2||1
|-
|Lema_bi_mesakayî||2||1
|-
|Lema_bi_lucumiyî||2||1
|-
|Lema_bi_koranayî||2||1
|-
|Lema_bi_cocopayî||2||1
|-
|Lema_bi_amdang||2||1
|-
|Lema_bi_talokî||2||1
|-
|Lema_bi_saponî||2||1
|-
|Lema_bi_ngaingî||2||1
|-
|Lema_bi_miltuyî||2||1
|-
|Lema_bi_luriya_başûrî||2||1
|-
|Lema_bi_kamassî||2||1
|-
|Lema_bi_cuayî||2||1
|-
|Lema_bi_andaî||2||1
|-
|Lema_bi_yarlî||2||1
|-
|Lema_bi_tangamî||2||1
|-
|Lema_bi_ngbakayî||2||1
|-
|Lema_bi_misingî||2||1
|-
|Lema_bi_kanggapeyî||2||1
|-
|Lema_bi_yeretuarî||2||1
|-
|Lema_bi_makahî||2||1
|-
|Lema_bi_kapîngamarancîyî||2||1
|-
|Lema_bi_horpayî||2||1
|-
|Lema_bi_etonî_(Kamerûn)||2||1
|-
|Lema_bi_bençî||2||1
|-
|Lema_bi_sererî||2||1
|-
|Lema_bi_malasangayî||2||1
|-
|Lema_bi_huliyî||2||1
|-
|Lema_bi_çipayayî||2||1
|-
|Lema_bi_tayrumayî||2||1
|-
|Lema_bi_molimayî||2||1
|-
|Lema_bi_ipaî||2||1
|-
|Lema_bi_arhuako||2||1
|-
|Lema_bi_wadjiginyî||2||1
|-
|Lema_bi_temneyî||2||1
|-
|Lema_bi_sionayî||2||1
|-
|Lema_bi_monumboyî||2||1
|-
|Lema_bi_kurukhî||2||1
|-
|Lema_bi_asamiya_navîn||2||1
|-
|Lema_bi_zapotekiya_asunción_mixtepec||2||1
|-
|Lema_bi_wambuleyî||2||1
|-
|Lema_bi_puragî||2||1
|-
|Lema_bi_kwalhioqua-tlatskanaî||2||1
|-
|Lema_bi_kaytetyeyî||2||1
|-
|Lema_bi_boghomî||2||1
|-
|Lema_bi_ata||2||1
|-
|Lema_bi_abuayî||2||1
|-
|Lema_bi_zapotekiya_san_juan_guelavia||2||1
|-
|Lema_bi_wanyî||2||1
|-
|Lema_bi_quitemoyî||2||1
|-
|Lema_bi_mundatî||2||1
|-
|Lema_bi_laalî||2||1
|-
|Lema_bi_keningau_murutî||2||1
|-
|Lema_bi_dawroyî||2||1
|-
|Lema_bi_bondoyî||2||1
|-
|Lema_bi_aurá||2||1
|-
|Lema_bi_titanî||2||1
|-
|Lema_bi_lalayî_(Gîneya_nû)||2||1
|-
|Lema_bi_gbaya-bossangoayî||2||1
|-
|Lema_bi_awngî||2||1
|-
|Lema_bi_ziayî||2||1
|-
|Lema_bi_wayanayî||2||1
|-
|Lema_bi_subtiabayî||2||1
|-
|Lema_bi_roglayiya_bakurî||2||1
|-
|Lema_bi_onondagayî||2||1
|-
|Lema_bi_nadëbî||2||1
|-
|Lema_bi_masalitî||2||1
|-
|Lema_bi_ghomalayî'||2||1
|-
|Lema_bi_djiminiyî||2||1
|-
|Lema_bi_bugunî||2||1
|-
|Lema_bi_aîmeleyî||2||1
|-
|Lema_bi_wirafedî||2||1
|-
|Lema_bi_ronî||2||1
|-
|Lema_bi_osatuyî||2||1
|-
|Lema_bi_kir-balarî||2||1
|-
|Lema_bi_bunogeyî||2||1
|-
|Lema_bi_bahayî||2||1
|-
|Lema_bi_şaranahuayî||2||1
|-
|Lema_bi_rwayî||2||1
|-
|Lema_bi_mayoyao_ifugaoyî||2||1
|-
|Lema_bi_ligbiyî||2||1
|-
|Lema_bi_jeri_kuoyî||2||1
|-
|Lema_bi_guhu-samaneyî||2||1
|-
|Lema_bi_baldemuyî||2||1
|-
|Lema_bi_xengxayî||2||1
|-
|Lema_bi_tsamaî||2||1
|-
|Lema_bi_şolagayî||2||1
|-
|Lema_bi_sahaptinî||2||1
|-
|Lema_bi_nasioyî||2||1
|-
|Lema_bi_mbuguyî||2||1
|-
|Lema_bi_kodavayî||2||1
|-
|Lema_bi_jurúnayî||2||1
|-
|Lema_bi_guroyî||2||1
|-
|Lema_bi_efaiyî||2||1
|-
|Lema_bi_altaya_bakurî||2||1
|-
|Lema_bi_tujyayiya_başûrî||2||1
|-
|Lema_bi_tadyawanî||2||1
|-
|Lema_bi_loniuyî||2||1
|-
|Lema_bi_kaerayî||2||1
|-
|Lema_bi_eloyî||2||1
|-
|Lema_bi_catio_çibçayî||2||1
|-
|Lema_bi_barasanayî||2||1
|-
|Lema_bi_amanayé||2||1
|-
|Lema_bi_sanavironî||2||1
|-
|Lema_bi_paraçî||2||1
|-
|Lema_bi_nekoyî||2||1
|-
|Lema_bi_messapicî||2||1
|-
|Lema_bi_kalapuyayî||2||1
|-
|Lema_bi_coçimiyî||2||1
|-
|Lema_bi_baruyayî||2||1
|-
|Lema_bi_ameleyî||2||1
|-
|Lema_bi_yangkaalî||2||1
|-
|Lema_bi_taluyî||2||1
|-
|Lema_bi_peç||2||1
|-
|Lema_bi_lusengoyî||2||1
|-
|Lema_bi_cubeoyî||2||1
|-
|Lema_bi_andamaniya_mezin_a_têkel||2||1
|-
|Lema_bi_yarluyandî||2||1
|-
|Lema_bi_tangoayî||2||1
|-
|Lema_bi_sawriya_pahariayî||2||1
|-
|Lema_bi_phalurayî||2||1
|-
|Lema_bi_ngeqî||2||1
|-
|Lema_bi_kangrî||2||1
|-
|Lema_bi_çaimayî||2||1
|-
|Lema_bi_bayiya_navendî||2||1
|-
|Lema_bi_angoram||2||1
|-
|Lema_bi_yerongî||2||1
|-
|Lema_bi_sekarî||2||1
|-
|Lema_bi_pima_bajoyî||2||1
|-
|Lema_bi_makaleroyî||2||1
|-
|Lema_bi_hoteyî||2||1
|-
|Lema_bi_çayahuitayî||2||1
|-
|Lema_bi_aore||2||1
|-
|Lema_bi_uveyiya_rojava||2||1
|-
|Lema_bi_pnarî||2||1
|-
|Lema_bi_malasî||2||1
|-
|Lema_bi_kueyuyî||2||1
|-
|Lema_bi_çiquimulillayî||2||1
|-
|Lema_bi_bhilalî||2||1
|-
|Lema_bi_sieyî||2||1
|-
|Lema_bi_popolucayiya_oluta||2||1
|-
|Lema_bi_molmo_one||2||1
|-
|Lema_bi_kunamayî||2||1
|-
|Lema_bi_aribwatsayî||2||1
|-
|Lema_bi_waffayî||2||1
|-
|Lema_bi_sioyî||2||1
|-
|Lema_bi_îbuoroyî||2||1
|-
|Lema_bi_zapotekiya_ayoquesco||2||1
|-
|Lema_bi_wamparî||2||1
|-
|Lema_bi_teseyî||2||1
|-
|Lema_bi_nyawaygî||2||1
|-
|Lema_bi_mpur||2||1
|-
|Lema_bi_manikionî||2||1
|-
|Lema_bi_kwamayî||2||1
|-
|Lema_bi_keaparayî||2||1
|-
|Lema_bi_îlongotî||2||1
|-
|Lema_bi_gadsupî||2||1
|-
|Lema_bi_atakapa||2||1
|-
|Lema_bi_abunî||2||1
|-
|Lema_bi_zapotekiya_san_pedro_quiatoni||2||1
|-
|Lema_bi_sokoroyî||2||1
|-
|Lema_bi_odualî||2||1
|-
|Lema_bi_mündü||2||1
|-
|Lema_bi_labelî||2||1
|-
|Lema_bi_keninjalî||2||1
|-
|Lema_bi_boneratî||2||1
|-
|Lema_bi_auyana||2||1
|-
|Lema_bi_adeleyî||2||1
|-
|Lema_bi_zapotekiya_zaniza||2||1
|-
|Lema_bi_oksapminî||2||1
|-
|Lema_bi_musguyî||2||1
|-
|Lema_bi_mariyiya_awistronezî||2||1
|-
|Lema_bi_laluyiya_rojavayî||2||1
|-
|Lema_bi_kêdangî||2||1
|-
|Lema_bi_gbaya-bozoumî||2||1
|-
|Lema_bi_bretoniya_navîn||2||1
|-
|Lema_bi_awtuwî||2||1
|-
|Lema_bi_zigulayî||2||1
|-
|Lema_bi_wayî||2||1
|-
|Lema_bi_sudestî||2||1
|-
|Lema_bi_opaoyî||2||1
|-
|Lema_bi_laruyî||2||1
|-
|Lema_bi_khweyî||2||1
|-
|Lema_bi_gidarî||2||1
|-
|Lema_bi_baanî||2||1
|-
|Lema_bi_zuojiang_zhuangî||2||1
|-
|Lema_bi_wirö||2||1
|-
|Lema_bi_roonî||2||1
|-
|Lema_bi_dourayî||2||1
|-
|Lema_bi_bahingî||2||1
|-
|Lema_bi_likumî||2||1
|-
|Lema_bi_jeru||2||1
|-
|Lema_bi_guinauyî||2||1
|-
|Lema_bi_duunî||2||1
|-
|Lema_bi_busayî||2||1
|-
|Lema_bi_naskapî||2||1
|-
|Lema_bi_mbukoyî||2||1
|-
|Lema_bi_kofyarî||2||1
|-
|Lema_bi_jutiapayî||2||1
|-
|Lema_bi_guruntumî||2||1
|-
|Lema_bi_efateyiya_bakur||2||1
|-
|Lema_bi_altaya_başûrî||2||1
|-
|Lema_bi_yabaranayî||2||1
|-
|Lema_bi_tukang_besiya_bakur||2||1
|-
|Lema_bi_sambaliya_botolan||2||1
|-
|Lema_bi_lonwolwolî||2||1
|-
|Lema_bi_kagoroyî||2||1
|-
|Lema_bi_haidayiya_bakurî||2||1
|-
|Lema_bi_catuquinaruyî||2||1
|-
|Lema_bi_barayî||2||1
|-
|Lema_bi_amarakaerî||2||1
|-
|Lema_bi_yakomayî||2||1
|-
|Lema_bi_yangkamî||2||1
|-
|Lema_bi_tamanakuyî||2||1
|-
|Lema_bi_sarasirayî||2||1
|-
|Lema_bi_ngalakanî||2||1
|-
|Lema_bi_lusiyî||2||1
|-
|Lema_bi_kowakî||2||1
|-
|Lema_bi_hembayî||2||1
|-
|Lema_bi_erebiya_jubayê||2||1
|-
|Lema_bi_batharî||2||1
|-
|Lema_bi_andioyî||2||1
|-
|Lema_bi_yasayî||2||1
|-
|Lema_bi_sayî||2||1
|-
|Lema_bi_pholayî||2||1
|-
|Lema_bi_ngiemboonî||2||1
|-
|Lema_bi_maçinereyî||2||1
|-
|Lema_bi_kreyoliya_giravên_virginê||2||1
|-
|Lema_bi_kaningdon-nindemî||2||1
|-
|Lema_bi_çairelî||2||1
|-
|Lema_bi_yeskwayî||2||1
|-
|Lema_bi_urayî_(Vanuatu)||2||1
|-
|Lema_bi_taraonî||2||1
|-
|Lema_bi_selaruyî||2||1
|-
|Lema_bi_mixtekiya_diuxi-tilantongo||2||1
|-
|Lema_bi_etuloyî||2||1
|-
|Lema_bi_benerafî||2||1
|-
|Lema_bi_yoidikî||2||1
|-
|Lema_bi_tauşîroyî||2||1
|-
|Lema_bi_serudung_murutî||2||1
|-
|Lema_bi_poçutekî||2||1
|-
|Lema_bi_nkorooyî||2||1
|-
|Lema_bi_kugboyî||2||1
|-
|Lema_bi_karipúnayî||2||1
|-
|Lema_bi_çiquitanoyî||2||1
|-
|Lema_bi_biangaî||2||1
|-
|Lema_bi_vilelayî||2||1
|-
|Lema_bi_tebul_ure_dogonî||2||1
|-
|Lema_bi_sikaritaî||2||1
|-
|Lema_bi_norweciya_traveller||2||1
|-
|Lema_bi_molokoyî||2||1
|-
|Lema_bi_bipî||2||1
|-
|Lema_bi_aribwaungî||2||1
|-
|Lema_bi_wagayayî||2||1
|-
|Lema_bi_ten'ednî||2||1
|-
|Lema_bi_sipakapenseyî||2||1
|-
|Lema_bi_puelçeyî||2||1
|-
|Lema_bi_numanggangî||2||1
|-
|Lema_bi_mori_atasî||2||1
|-
|Lema_bi_kustenauyî||2||1
|-
|Lema_bi_îdî||2||1
|-
|Lema_bi_da'a_kailiyî||2||1
|-
|Lema_bi_bîssayî||2||1
|-
|Lema_bi_zapotekiya_cajonos||2||1
|-
|Lema_bi_wampurî||2||1
|-
|Lema_bi_tetelayî||2||1
|-
|Lema_bi_puruborayî||2||1
|-
|Lema_bi_nyihayî||2||1
|-
|Lema_bi_kwamerayî||2||1
|-
|Lema_bi_îlueyî||2||1
|-
|Lema_bi_damayî_(Sierra_leone)||2||1
|-
|Lema_bi_atanquesî||2||1
|-
|Lema_bi_abureyî||2||1
|-
|Lema_bi_zapotekiya_san_vicente_coatlan||2||1
|-
|Lema_bi_solongyî||2||1
|-
|Lema_bi_ofayeyî||2||1
|-
|Lema_bi_labuk-kinabatangan_kadazanî||2||1
|-
|Lema_bi_înuvialuktunî||2||1
|-
|Lema_bi_auye||2||1
|-
|Lema_bi_adî||2||1
|-
|Lema_bi_waskiayî||2||1
|-
|Lema_bi_tiwayiya_başûrî||2||1
|-
|Lema_bi_reel||2||1
|-
|Lema_bi_musî||2||1
|-
|Lema_bi_îsokoyî||2||1
|-
|Lema_bi_gbayayiya_bakur-rojava||2||1
|-
|Lema_bi_awyî||2||1
|-
|Lema_bi_zimakanî||2||1
|-
|Lema_bi_wayumarayî||2||1
|-
|Lema_bi_suenayî||2||1
|-
|Lema_bi_opónî||2||1
|-
|Lema_bi_nafî||2||1
|-
|Lema_bi_kiangiya_başûrî||2||1
|-
|Lema_bi_gituayî||2||1
|-
|Lema_bi_babariya_bakur||2||1
|-
|Lema_bi_ǀxamî||2||1
|-
|Lema_bi_wiruyî||2||1
|-
|Lema_bi_roroyî||2||1
|-
|Lema_bi_osingî||2||1
|-
|Lema_bi_mattolî||2||1
|-
|Lema_bi_matukarî||2||1
|-
|Lema_bi_leleyî_(Çad)||2||1
|-
|Lema_bi_kirikiriyî||2||1
|-
|Lema_bi_japhugî||2||1
|-
|Lema_bi_doutaî||2||1
|-
|Lema_bi_buol||2||1
|-
|Lema_bi_akolet||2||1
|-
|Lema_bi_sa'a||2||1
|-
|Lema_bi_maypureyî||2||1
|-
|Lema_bi_jerungî||2||1
|-
|Lema_bi_sahuyî||2||1
|-
|Lema_bi_pakanhayî||2||1
|-
|Lema_bi_kohinî||2||1
|-
|Lema_bi_calusayî||2||1
|-
|Lema_bi_banganduyî||2||1
|-
|Lema_bi_yabenî||2||1
|-
|Lema_bi_tukang_besî_başûr||2||1
|-
|Lema_bi_mele-filayî||2||1
|-
|Lema_bi_loomayî||2||1
|-
|Lema_bi_kaheyî||2||1
|-
|Lema_bi_emanî||2||1
|-
|Lema_bi_barbarenyoyî||2||1
|-
|Lema_bi_amarayî||2||1
|-
|Lema_bi_nendî||2||1
|-
|Lema_bi_meyahî||2||1
|-
|Lema_bi_kalayî||2||1
|-
|Lema_bi_haroiyî||2||1
|-
|Lema_bi_enî||2||1
|-
|Lema_bi_amî||2||1
|-
|Lema_bi_yangum_deyî||2||1
|-
|Lema_bi_tamangiya_rojhilatî||2||1
|-
|Lema_bi_saravekayî||2||1
|-
|Lema_bi_ngalumî||2||1
|-
|Lema_bi_minaeanî||2||1
|-
|Lema_bi_kowyayî||2||1
|-
|Lema_bi_herdeyî||2||1
|-
|Lema_bi_cuitlatecî||2||1
|-
|Lema_bi_yaviteroyî||2||1
|-
|Lema_bi_sebat_bet_gurageyî||2||1
|-
|Lema_bi_phomî||2||1
|-
|Lema_bi_mişipî||2||1
|-
|Lema_bi_madayî_(Nîjerya)||2||1
|-
|Lema_bi_kaninuwayî||2||1
|-
|Lema_bi_anîî||2||1
|-
|Lema_bi_yessan-mayoyî||2||1
|-
|Lema_bi_selk'namî||2||1
|-
|Lema_bi_pinyinî||2||1
|-
|Lema_bi_nimadî||2||1
|-
|Lema_bi_kriya_mûsî||2||1
|-
|Lema_bi_hoyahoyayî||2||1
|-
|Lema_bi_evantî||2||1
|-
|Lema_bi_apabhramsayî||2||1
|-
|Lema_bi_uyî||2||1
|-
|Lema_bi_serui-lautî||2||1
|-
|Lema_bi_podokoyî||2||1
|-
|Lema_bi_moçoyî||2||1
|-
|Lema_bi_kaririyî||2||1
|-
|Lema_bi_fasuyî||2||1
|-
|Lema_bi_çirinoyî||2||1
|-
|Lema_bi_yuhupî||2||1
|-
|Lema_bi_vitî||2||1
|-
|Lema_bi_momayî||2||1
|-
|Lema_bi_island_caribî||2||1
|-
|Lema_bi_forakî||2||1
|-
|Lema_bi_çongî||2||1
|-
|Lema_bi_birgidî||2||1
|-
|Lema_bi_wagemanî||2||1
|-
|Lema_bi_nunggubuyuyî||2||1
|-
|Lema_bi_morigî||2||1
|-
|Lema_bi_îdomayî||2||1
|-
|Lema_bi_fulniôî||2||1
|-
|Lema_bi_daai_çinî||2||1
|-
|Lema_bi_wanambreyî||2||1
|-
|Lema_bi_skouyî||2||1
|-
|Lema_bi_purukotó||2||1
|-
|Lema_bi_nyimangî||2||1
|-
|Lema_bi_kwangaliyî||2||1
|-
|Lema_bi_keigayî||2||1
|-
|Lema_bi_gagaduyî||2||1
|-
|Lema_bi_danî||2||1
|-
|Lema_bi_bokobaruyî||2||1
|-
|Lema_bi_abuyî||2||1
|-
|Lema_bi_zapotekiya_santa_ines_yatzeçi||2||1
|-
|Lema_bi_war-jaîntî||2||1
|-
|Lema_bi_mungbamî||2||1
|-
|Lema_bi_labuyî||2||1
|-
|Lema_bi_kenyangî||2||1
|-
|Lema_bi_îpikoyî||2||1
|-
|Lema_bi_zapotekoyiya_mahuatlana_navendî||2||1
|-
|Lema_bi_wasko-wişramî||2||1
|-
|Lema_bi_sowayî||2||1
|-
|Lema_bi_musomî||2||1
|-
|Lema_bi_markayî||2||1
|-
|Lema_bi_lamaholotî||2||1
|-
|Lema_bi_gbayayiya_başûr-rojava||2||1
|-
|Lema_bi_axamb||2||1
|-
|Lema_bi_agobî||2||1
|-
|Lema_bi_zimanê_destan_ê_brîtanî||2||1
|-
|Lema_bi_toçoyî||2||1
|-
|Lema_bi_suî||2||1
|-
|Lema_bi_kibirî||2||1
|-
|Lema_bi_gizigayiya_bakur||2||1
|-
|Lema_bi_doeyî||2||1
|-
|Lema_bi_aka-beayî||2||1
|-
|Lema_bi_ǁaniyî||2||1
|-
|Lema_bi_rotokasî||2||1
|-
|Lema_bi_nahwatliya_orizaba||2||1
|-
|Lema_bi_nahwatliya_pueblaya_başûr-rojhilatî||2||1
|-
|Lema_bi_leleyî_(Gîne)||2||1
|-
|Lema_bi_kirya-konzelî||2||1
|-
|Lema_bi_bura_mabangî||2||1
|-
|Lema_bi_bajwayiya_endonezyayî||2||1
|-
|Lema_bi_akooseyî||2||1
|-
|Lema_bi_şayî||2||1
|-
|Lema_bi_saamiayî||2||1
|-
|Lema_bi_pa'ayî||2||1
|-
|Lema_bi_nambyayî||2||1
|-
|Lema_bi_maysînî||2||1
|-
|Lema_bi_jibuyî||2||1
|-
|Lema_bi_buwalî||2||1
|-
|Lema_bi_xibeyî||2||1
|-
|Lema_bi_pal||2||1
|-
|Lema_bi_naueteyî||2||1
|-
|Lema_bi_mbundayî||2||1
|-
|Lema_bi_juxtlahuaca_mixteciya_rojavayî||2||1
|-
|Lema_bi_caluyanunî||2||1
|-
|Lema_bi_yabongî||2||1
|-
|Lema_bi_tukanoyî||2||1
|-
|Lema_bi_ndemlî||2||1
|-
|Lema_bi_meloyî||2||1
|-
|Lema_bi_lopayî||2||1
|-
|Lema_bi_komyandaretî||2||1
|-
|Lema_bi_kaianî||2||1
|-
|Lema_bi_haislayî||2||1
|-
|Lema_bi_emayî||2||1
|-
|Lema_bi_cayubabayî||2||1
|-
|Lema_bi_bardî||2||1
|-
|Lema_bi_amarizanayî||2||1
|-
|Lema_bi_yalarnngayî||2||1
|-
|Lema_bi_taînaeyî||2||1
|-
|Lema_bi_parawenî||2||1
|-
|Lema_bi_enwangî||2||1
|-
|Lema_bi_coguiyî||2||1
|-
|Lema_bi_basketoyî||2||1
|-
|Lema_bi_yangum_monî||2||1
|-
|Lema_bi_udayî||2||1
|-
|Lema_bi_tamayî_(Çad)||2||1
|-
|Lema_bi_sarayî||2||1
|-
|Lema_bi_ngamamboyî||2||1
|-
|Lema_bi_minanibaî||2||1
|-
|Lema_bi_koyoyî||2||1
|-
|Lema_bi_batuî||2||1
|-
|Lema_bi_andoa||2||1
|-
|Lema_bi_yawalapitî||2||1
|-
|Lema_bi_tanimuca-retuarã||2||1
|-
|Lema_bi_seberuangî||2||1
|-
|Lema_bi_hlepho_phowayî||2||1
|-
|Lema_bi_bebeyî||2||1
|-
|Lema_bi_anîmere||2||1
|-
|Lema_bi_yetfayî||2||1
|-
|Lema_bi_piratapuyoyî||2||1
|-
|Lema_bi_nimoayî||2||1
|-
|Lema_bi_bengî||2||1
|-
|Lema_bi_tawalayî||2||1
|-
|Lema_bi_seruyî||2||1
|-
|Lema_bi_pogoloyî||2||1
|-
|Lema_bi_malayiya_berau||2||1
|-
|Lema_bi_çitimaçayî||2||1
|-
|Lema_bi_aranadanî||2||1
|-
|Lema_bi_viyetnamiya_navîn||2||1
|-
|Lema_bi_mondeyî||2||1
|-
|Lema_bi_malvî||2||1
|-
|Lema_bi_kuniyî||2||1
|-
|Lema_bi_birgîtî||2||1
|-
|Lema_bi_ariyî||2||1
|-
|Lema_bi_tennetî||2||1
|-
|Lema_bi_kaxuyanayî||2||1
|-
|Lema_bi_fungwayî||2||1
|-
|Lema_bi_daasanaçî||2||1
|-
|Lema_bi_zapotekiya_coatlan||2||1
|-
|Lema_bi_wanapî||2||1
|-
|Lema_bi_slaveyiya_bakur||2||1
|-
|Lema_bi_nyindrouyî||2||1
|-
|Lema_bi_kwangî||2||1
|-
|Lema_bi_îndo-portegîzî||2||1
|-
|Lema_bi_bokotoyî||2||1
|-
|Lema_bi_atemble||2||1
|-
|Lema_bi_zapotekiya_santa_maria_quiegolani||2||1
|-
|Lema_bi_timor_pidginî||2||1
|-
|Lema_bi_solosî||2||1
|-
|Lema_bi_rajbanşî||2||1
|-
|Lema_bi_ogbahî||2||1
|-
|Lema_bi_mungguî||2||1
|-
|Lema_bi_gavakî||2||1
|-
|Lema_bi_zaramoyî||2||1
|-
|Lema_bi_soyî||2||1
|-
|Lema_bi_okwanuçuyî||2||1
|-
|Lema_bi_lamangî||2||1
|-
|Lema_bi_gbayiyî||2||1
|-
|Lema_bi_dicamay_agtayî||2||1
|-
|Lema_bi_brokpakeyî||2||1
|-
|Lema_bi_axi_yî||2||1
|-
|Lema_bi_todayî||2||1
|-
|Lema_bi_sukî||2||1
|-
|Lema_bi_nagtipunan_agtayî||2||1
|-
|Lema_bi_îxcatecî||2||1
|-
|Lema_bi_gizigayiya_başûr||2||1
|-
|Lema_bi_babatanayî||2||1
|-
|Lema_bi_aka-bo||2||1
|-
|Lema_bi_wiyotî||2||1
|-
|Lema_bi_tontemboanî||2||1
|-
|Lema_bi_otankî||2||1
|-
|Lema_bi_nahwatliya_tabasco||2||1
|-
|Lema_bi_maungî||2||1
|-
|Lema_bi_lenduyî||2||1
|-
|Lema_bi_kisiyî||2||1
|-
|Lema_bi_duauyî||2||1
|-
|Lema_bi_burarrayî||2||1
|-
|Lema_bi_wusa_nasuyî||2||1
|-
|Lema_bi_tourayî||2||1
|-
|Lema_bi_şehrî||2||1
|-
|Lema_bi_namiayî||2||1
|-
|Lema_bi_jicaqueyiya_rojavayî||2||1
|-
|Lema_bi_duwetî||2||1
|-
|Lema_bi_buyangiya_langnî||2||1
|-
|Lema_bi_baluan-pam||2||1
|-
|Lema_bi_şuarî||2||1
|-
|Lema_bi_sakapultekoyî||2||1
|-
|Lema_bi_naukanskî||2||1
|-
|Lema_bi_mbungayî||2||1
|-
|Lema_bi_koiariyiya_çiyayî||2||1
|-
|Lema_bi_juǀ'hoanî||2||1
|-
|Lema_bi_efutopî||2||1
|-
|Lema_bi_cameroon_pidginî||2||1
|-
|Lema_bi_bangi_meyî||2||1
|-
|Lema_bi_alumu-tesuyî||2||1
|-
|Lema_bi_pande||2||1
|-
|Lema_bi_ndengerekoyî||2||1
|-
|Lema_bi_konabereyî||2||1
|-
|Lema_bi_kaimbulawayî||2||1
|-
|Lema_bi_haiǁomî||2||1
|-
|Lema_bi_amasî||2||1
|-
|Lema_bi_tutçoneyiya_bakurî||2||1
|-
|Lema_bi_nengoneyî||2||1
|-
|Lema_bi_mfinuyî||2||1
|-
|Lema_bi_luguruyî||2||1
|-
|Lema_bi_korkuyî||2||1
|-
|Lema_bi_haruaî||2||1
|-
|Lema_bi_eotileyî||2||1
|-
|Lema_bi_ammoniteyî||2||1
|-
|Lema_bi_tambasî||2||1
|-
|Lema_bi_ngambayî||2||1
|-
|Lema_bi_luvaleyî||2||1
|-
|Lema_bi_koyra_çiiniyî||2||1
|-
|Lema_bi_kamiya_bakurî||2||1
|-
|Lema_bi_cullî||2||1
|-
|Lema_bi_andoque||2||1
|-
|Lema_bi_yawarawargayî||2||1
|-
|Lema_bi_tanjijilî||2||1
|-
|Lema_bi_phuzayî||2||1
|-
|Lema_bi_miwokiya_sierraya_bakurî||2||1
|-
|Lema_bi_mag-ançî_aytayî||2||1
|-
|Lema_bi_esanî||2||1
|-
|Lema_bi_anîndîlyakwa||2||1
|-
|Lema_bi_urimî||2||1
|-
|Lema_bi_tarokî||2||1
|-
|Lema_bi_ninamî||2||1
|-
|Lema_bi_karajayî||2||1
|-
|Lema_bi_hozoyî||2||1
|-
|Lema_bi_tawang_monpayî||2||1
|-
|Lema_bi_modoleyî||2||1
|-
|Lema_bi_malayiya_kedah||2||1
|-
|Lema_bi_karnaî||2||1
|-
|Lema_bi_fembeyî||2||1
|-
|Lema_bi_çittagonianî||2||1
|-
|Lema_bi_teeyî||2||1
|-
|Lema_bi_mamaindeyî||2||1
|-
|Lema_bi_kunjenî||2||1
|-
|Lema_bi_kâteyî||2||1
|-
|Lema_bi_biritaiyî||2||1
|-
|Lema_bi_arîfama-mînîafîayî||2||1
|-
|Lema_bi_sirayî||2||1
|-
|Lema_bi_puluwatî||2||1
|-
|Lema_bi_nunguyî||2||1
|-
|Lema_bi_moromî||2||1
|-
|Lema_bi_kuturmiyî||2||1
|-
|Lema_bi_furî||2||1
|-
|Lema_bi_dabayî||2||1
|-
|Lema_bi_blang||2||1
|-
|Lema_bi_wandalayî||2||1
|-
|Lema_bi_slaveyiya_başûr||2||1
|-
|Lema_bi_pwoyiya_bakurî||2||1
|-
|Lema_bi_kwanjayî||2||1
|-
|Lema_bi_galelayî||2||1
|-
|Lema_bi_bokoyî||2||1
|-
|Lema_bi_zapotekiya_santiago_xanica||2||1
|-
|Lema_bi_timoteyî||2||1
|-
|Lema_bi_rakhineyî||2||1
|-
|Lema_bi_ogbiayî||2||1
|-
|Lema_bi_mungkipî||2||1
|-
|Lema_bi_kerayî||2||1
|-
|Lema_bi_îquitoyî||2||1
|-
|Lema_bi_gavarî||2||1
|-
|Lema_bi_boorî||2||1
|-
|Lema_bi_avavayî||2||1
|-
|Lema_bi_waşoyî||2||1
|-
|Lema_bi_tîkopyayî||2||1
|-
|Lema_bi_rembongî||2||1
|-
|Lema_bi_khanayî||2||1
|-
|Lema_bi_gcirikuyî||2||1
|-
|Lema_bi_oro_wînî||2||1
|-
|Lema_bi_nahalî||2||1
|-
|Lema_bi_maselayiya_rojhilat||2||1
|-
|Lema_bi_latundê||2||1
|-
|Lema_bi_baboleyî||2||1
|-
|Lema_bi_aka-karî||2||1
|-
|Lema_bi_rovyanayî||2||1
|-
|Lema_bi_kissiya_bakurî||2||1
|-
|Lema_bi_dubuyî||2||1
|-
|Lema_bi_burayî||2||1
|-
|Lema_bi_baka||2||1
|-
|Lema_bi_akpayî||2||1
|-
|Lema_bi_wutungî||2||1
|-
|Lema_bi_şekoyî||2||1
|-
|Lema_bi_paamayî||2||1
|-
|Lema_bi_jilî||2||1
|-
|Lema_bi_gulayî||2||1
|-
|Lema_bi_dyaabugayî||2||1
|-
|Lema_bi_aliyî||2||1
|-
|Lema_bi_xincayî||2||1
|-
|Lema_bi_sakirabiayî||2||1
|-
|Lema_bi_mbuunî||2||1
|-
|Lema_bi_jûr_modoyî||2||1
|-
|Lema_bi_menkayî||2||1
|-
|Lema_bi_konda-dorayî||2||1
|-
|Lema_bi_kaîepî||2||1
|-
|Lema_bi_embera-catioyî||2||1
|-
|Lema_bi_cemuhî||2||1
|-
|Lema_bi_baré||2||1
|-
|Lema_bi_tutçoneyiya_başûrî||2||1
|-
|Lema_bi_mfumteyî||2||1
|-
|Lema_bi_luhuyî||2||1
|-
|Lema_bi_korniya_kevn||2||1
|-
|Lema_bi_kalkatunguyî||2||1
|-
|Lema_bi_epenayî||2||1
|-
|Lema_bi_columbia-wenatçiyî||2||1
|-
|Lema_bi_amol||2||1
|-
|Lema_bi_yanomamî||2||1
|-
|Lema_bi_tamborayî||2||1
|-
|Lema_bi_heyo||2||1
|-
|Lema_bi_cumanagotoyî||2||1
|-
|Lema_bi_andoqueroyî||2||1
|-
|Lema_bi_yawayî||2||1
|-
|Lema_bi_umiray_dumaget_agtayî||2||1
|-
|Lema_bi_tanudan_kalingayî||2||1
|-
|Lema_bi_piamatsinayî||2||1
|-
|Lema_bi_mag-îndî_ayta||2||1
|-
|Lema_bi_kreyoliya_îngilîzî_ya_grenadî||2||1
|-
|Lema_bi_ese_ejjayî||2||1
|-
|Lema_bi_urî||2||1
|-
|Lema_bi_semayî||2||1
|-
|Lema_bi_ninzoyî||2||1
|-
|Lema_bi_hrangkholî||2||1
|-
|Lema_bi_tawasayî||2||1
|-
|Lema_bi_setî||2||1
|-
|Lema_bi_moereyî||2||1
|-
|Lema_bi_malayiya_kota_bangun_kutai||2||1
|-
|Lema_bi_kuku-uwanhî||2||1
|-
|Lema_bi_çiwereyî||2||1
|-
|Lema_bi_bidiyoyî||2||1
|-
|Lema_bi_yukî||2||1
|-
|Lema_bi_tehuelçeyî||2||1
|-
|Lema_bi_siliputî||2||1
|-
|Lema_bi_novgorodiya_kevn||2||1
|-
|Lema_bi_waima'ayî||2||1
|-
|Lema_bi_teopî||2||1
|-
|Lema_bi_pumeyî||2||1
|-
|Lema_bi_moroneneyî||2||1
|-
|Lema_bi_mandayî_(Awistralya)||2||1
|-
|Lema_bi_kutuyî||2||1
|-
|Lema_bi_kayagarî||2||1
|-
|Lema_bi_dadibî||2||1
|-
|Lema_bi_blinî||2||1
|-
|Lema_bi_asmatiya_navendî||2||1
|-
|Lema_bi_abayî||2||1
|-
|Lema_bi_zapotekiya_çoapan||2||1
|-
|Lema_bi_slaveyî||2||1
|-
|Lema_bi_pwoyiya_rojavayî||2||1
|-
|Lema_bi_mubî||2||1
|-
|Lema_bi_manoyî||2||1
|-
|Lema_bi_kwankayî||2||1
|-
|Lema_bi_kelonî||2||1
|-
|Lema_bi_îngayî||2||1
|-
|Lema_bi_athpare||2||1
|-
|Lema_bi_zapotekiya_santo_domingo_albarradas||2||1
|-
|Lema_bi_ralteyî||2||1
|-
|Lema_bi_îrantxeyî||2||1
|-
|Lema_bi_degenanî||2||1
|-
|Lema_bi_borayî||2||1
|-
|Lema_bi_adyukruyî||2||1
|-
|Lema_bi_zauzouyî||2||1
|-
|Lema_bi_watamî||2||1
|-
|Lema_bi_tîkunayî||2||1
|-
|Lema_bi_remontado_agta||2||1
|-
|Lema_bi_omaguayî||2||1
|-
|Lema_bi_marriammuyî||2||1
|-
|Lema_bi_khandeşiyî||2||1
|-
|Lema_bi_gejiyî||2||1
|-
|Lema_bi_ayabadhu||2||1
|-
|Lema_bi_zimbayî||2||1
|-
|Lema_bi_tojolabalî||2||1
|-
|Lema_bi_sukurî||2||1
|-
|Lema_bi_masiwang||2||1
|-
|Lema_bi_glavdayî||2||1
|-
|Lema_bi_babungoyî||2||1
|-
|Lema_bi_aka-kede||2||1
|-
|Lema_bi_otomiya_estado_de_meksîka||2||1
|-
|Lema_bi_mawakî||2||1
|-
|Lema_bi_lenjeyî||2||1
|-
|Lema_bi_kissiyiya_başûrî||2||1
|-
|Lema_bi_duhwayî||2||1
|-
|Lema_bi_şeltayî||2||1
|-
|Lema_bi_bambassî||2||1
|-
|Lema_bi_alladînî||2||1
|-
|Lema_bi_eggonî||2||1
|-
|Lema_bi_candoşi-şaprayî||2||1
|-
|Lema_bi_tumakî||2||1
|-
|Lema_bi_pangsengî||2||1
|-
|Lema_bi_ndogoyî||2||1
|-
|Lema_bi_kondayî||2||1
|-
|Lema_bi_hajongî||2||1
|-
|Lema_bi_embera-çamiyî||2||1
|-
|Lema_bi_bargamî||2||1
|-
|Lema_bi_yambetayî||2||1
|-
|Lema_bi_başkardiyî||2||1
|-
|Lema_bi_pençalî||2||1
|-
|Lema_bi_luwoyî||2||1
|-
|Lema_bi_kpanî||2||1
|-
|Lema_bi_kamî||2||1
|-
|Lema_bi_cungî||2||1
|-
|Lema_bi_andra-hus||2||1
|-
|Lema_bi_secoyayî||2||1
|-
|Lema_bi_piapocoyî||2||1
|-
|Lema_bi_ngombayî||2||1
|-
|Lema_bi_mixteciya_ayutla||2||1
|-
|Lema_bi_kreyoliya_îngilîzî_ya_guyanî||2||1
|-
|Lema_bi_hoavayî||2||1
|-
|Lema_bi_anmatyerre||2||1
|-
|Lema_bi_tarumayî||2||1
|-
|Lema_bi_semelayî||2||1
|-
|Lema_bi_pitta-pittayî||2||1
|-
|Lema_bi_nisenanî||2||1
|-
|Lema_bi_mîmiya_decorseyî||2||1
|-
|Lema_bi_makianiya_rojhilat||2||1
|-
|Lema_bi_karamojongî||2||1
|-
|Lema_bi_hreyî||2||1
|-
|Lema_bi_bepourî||2||1
|-
|Lema_bi_apaliyî||2||1
|-
|Lema_bi_vaghrî||2||1
|-
|Lema_bi_sezeyî||2||1
|-
|Lema_bi_nomatsiguengayî||2||1
|-
|Lema_bi_mofu-gudurî||2||1
|-
|Lema_bi_malayiya_makassar||2||1
|-
|Lema_bi_kulereyî||2||1
|-
|Lema_bi_huyî||2||1
|-
|Lema_bi_biete||2||1
|-
|Lema_bi_teiwayî||2||1
|-
|Lema_bi_silt'eyî||2||1
|-
|Lema_bi_mamasayî||2||1
|-
|Lema_bi_kupayî||2||1
|-
|Lema_bi_çuaboyî||2||1
|-
|Lema_bi_zakhringî||2||1
|-
|Lema_bi_waiwaî||2||1
|-
|Lema_bi_tepehuaniya_bakurî||2||1
|-
|Lema_bi_pumiya_bakurî||2||1
|-
|Lema_bi_nüpode_huitotoyî||2||1
|-
|Lema_bi_moroyî||2||1
|-
|Lema_bi_mandayî_(Hindistan)||2||1
|-
|Lema_bi_kuuk_thaayorreyî||2||1
|-
|Lema_bi_dagayî||2||1
|-
|Lema_bi_bo-rukulî||2||1
|-
|Lema_bi_assangorî||2||1
|-
|Lema_bi_zapotekiya_guevea_de_humboldt||2||1
|-
|Lema_bi_thado_çinî||2||1
|-
|Lema_bi_nyulnyulî||2||1
|-
|Lema_bi_dano||2||1
|-
|Lema_bi_bolango||2||1
|-
|Lema_bi_soninkeyî||2||1
|-
|Lema_bi_maratinoyî||2||1
|-
|Lema_bi_lafofayî||2||1
|-
|Lema_bi_kerekî||2||1
|-
|Lema_bi_gayilî||2||1
|-
|Lema_bi_borongî||2||1
|-
|Lema_bi_avîkam||2||1
|-
|Lema_bi_watubelayî||2||1
|-
|Lema_bi_tlacoapa_me'phaayî||2||1
|-
|Lema_bi_marrithiyelî||2||1
|-
|Lema_bi_khariayî||2||1
|-
|Lema_bi_gelaoyiya_hêşîn||2||1
|-
|Lema_bi_ayere||2||1
|-
|Lema_bi_weylsiya_kevn||2||1
|-
|Lema_bi_sukurumî||2||1
|-
|Lema_bi_nahwatliya_cosoleacaque||2||1
|-
|Lema_bi_laujeyî||2||1
|-
|Lema_bi_îzereyî||2||1
|-
|Lema_bi_gobasiyî||2||1
|-
|Lema_bi_wogamusinî||2||1
|-
|Lema_bi_torauyî||2||1
|-
|Lema_bi_toro_so_dogonî||2||1
|-
|Lema_bi_mawayî||2||1
|-
|Lema_bi_kitanemukî||2||1
|-
|Lema_bi_jaruyî||2||1
|-
|Lema_bi_dumayî||2||1
|-
|Lema_bi_bakoko||2||1
|-
|Lema_bi_akuntsu||2||1
|-
|Lema_bi_padoeyî||2||1
|-
|Lema_bi_nandeyî||2||1
|-
|Lema_bi_dzalayî||2||1
|-
|Lema_bi_bamumî||2||1
|-
|Lema_bi_xipayayî||2||1
|-
|Lema_bi_t'enî||2||1
|-
|Lema_bi_lo-togayî||2||1
|-
|Lema_bi_kokotayî||2||1
|-
|Lema_bi_lotukoyî||2||1
|-
|Lema_bi_embera-tadó||2||1
|-
|Lema_bi_barijî||2||1
|-
|Lema_bi_ambakîç||2||1
|-
|Lema_bi_takelmayî||2||1
|-
|Lema_bi_sanguyî_(Tanzanya)||2||1
|-
|Lema_bi_patagónî||2||1
|-
|Lema_bi_neververî||2||1
|-
|Lema_bi_haşayî||2||1
|-
|Lema_bi_amurdag||2||1
|-
|Lema_bi_yansî||2||1
|-
|Lema_bi_udukî||2||1
|-
|Lema_bi_sarî||2||1
|-
|Lema_bi_pendauyî||2||1
|-
|Lema_bi_minidienî||2||1
|-
|Lema_bi_kpasamî||2||1
|-
|Lema_bi_cunî||2||1
|-
|Lema_bi_bauyî||2||1
|-
|Lema_bi_aneityum||2||1
|-
|Lema_bi_ngombeyî_(Kongo)||2||1
|-
|Lema_bi_kanoeyî||2||1
|-
|Lema_bi_esîmbî||2||1
|-
|Lema_bi_belanda_borî||2||1
|-
|Lema_bi_uruangnirinî||2||1
|-
|Lema_bi_mîmiya_naçtigalî||2||1
|-
|Lema_bi_hrusoyî||2||1
|-
|Lema_bi_apatanî||2||1
|-
|Lema_bi_yongkomî||2||1
|-
|Lema_bi_vaglayî||2||1
|-
|Lema_bi_kulisusuyî||2||1
|-
|Lema_bi_karoyî||2||1
|-
|Lema_bi_hyamî||2||1
|-
|Lema_bi_simbalî||2||1
|-
|Lema_bi_nsarî||2||1
|-
|Lema_bi_kurankoyî||2||1
|-
|Lema_bi_katsoyî||2||1
|-
|Lema_bi_îamaleleyî||2||1
|-
|Lema_bi_bitareyî||2||1
|-
|Lema_bi_waîmaha||2||1
|-
|Lema_bi_tepehuaniya_başûr-rojavayî||2||1
|-
|Lema_bi_pumiya_başûrî||2||1
|-
|Lema_bi_nusuyî||2||1
|-
|Lema_bi_mortlockeseyî||2||1
|-
|Lema_bi_mandingoyî||2||1
|-
|Lema_bi_îgnacianoyî||2||1
|-
|Lema_bi_boanoyî_(Maluku)||2||1
|-
|Lema_bi_assanî||2||1
|-
|Lema_bi_wanecî||2||1
|-
|Lema_bi_thangmî||2||1
|-
|Lema_bi_q'anjob'alî||2||1
|-
|Lema_bi_mucuçî||2||1
|-
|Lema_bi_mansoankayî||2||1
|-
|Lema_bi_kemakî||2||1
|-
|Lema_bi_bolayî||2||1
|-
|Lema_bi_atohwaim||2||1
|-
|Lema_bi_zapotekiya_tabaa||2||1
|-
|Lema_bi_sonsorolî||2||1
|-
|Lema_bi_lahananî||2||1
|-
|Lema_bi_keresiya_rojavayî||2||1
|-
|Lema_bi_demisayî||2||1
|-
|Lema_bi_awa-cuaiquerî||2||1
|-
|Lema_bi_aekayî||2||1
|-
|Lema_bi_zayse-zergullayî||2||1
|-
|Lema_bi_watutiya_bakur||2||1
|-
|Lema_bi_tlacoatzintepec_çinantecî||2||1
|-
|Lema_bi_squamîşî||2||1
|-
|Lema_bi_ombayî||2||1
|-
|Lema_bi_mwaghavulî||2||1
|-
|Lema_bi_marrusînî||2||1
|-
|Lema_bi_lametî||2||1
|-
|Lema_bi_dinapigue_agtayî||2||1
|-
|Lema_bi_bubiyî||2||1
|-
|Lema_bi_ahàn||2||1
|-
|Lema_bi_zirenkelî||2||1
|-
|Lema_bi_sulodî||2||1
|-
|Lema_bi_orohayî||2||1
|-
|Lema_bi_matagalpayî||2||1
|-
|Lema_bi_kinalaknayî||2||1
|-
|Lema_bi_a-hmaoyî||2||1
|-
|Lema_bi_wogeoyî||2||1
|-
|Lema_bi_toronayî||2||1
|-
|Lema_bi_rumaî_palaungî||2||1
|-
|Lema_bi_otomiya_temoaya||2||1
|-
|Lema_bi_nahwatliya_zacatlan-ahuacatlan-tepetzintla||2||1
|-
|Lema_bi_mawesî||2||1
|-
|Lema_bi_dumiyî||2||1
|-
|Lema_bi_burmesoyî||2||1
|-
|Lema_bi_bakulungî||2||1
|-
|Lema_bi_trinitarioyî||2||1
|-
|Lema_bi_şerdukpenî||2||1
|-
|Lema_bi_sabineyî||2||1
|-
|Lema_bi_jirajirayî||2||1
|-
|Lema_bi_gumawanayî||2||1
|-
|Lema_bi_dzuunî||2||1
|-
|Lema_bi_bwanabwanayî||2||1
|-
|Lema_bi_bamuyî||2||1
|-
|Lema_bi_xiriânayî||2||1
|-
|Lema_bi_tswapongî||2||1
|-
|Lema_bi_tabancaleyî||2||1
|-
|Lema_bi_logbayî||2||1
|-
|Lema_bi_kolomî||2||1
|-
|Lema_bi_gvokoyî||2||1
|-
|Lema_bi_ekajukî||2||1
|-
|Lema_bi_bankan_tey_dogonî||2||1
|-
|Lema_bi_alyawarr||2||1
|-
|Lema_bi_yaguayî||2||1
|-
|Lema_bi_ndoyî||2||1
|-
|Lema_bi_menyayî||2||1
|-
|Lema_bi_konkombayî||2||1
|-
|Lema_bi_kakandayî||2||1
|-
|Lema_bi_haköyî||2||1
|-
|Lema_bi_cibakî||2||1
|-
|Lema_bi_barikewayî||2||1
|-
|Lema_bi_ambala_ayta||2||1
|-
|Lema_bi_yaminahuayî||2||1
|-
|Lema_bi_saniyo-hiyeweyî||2||1
|-
|Lema_bi_miçoacan_mazahuayî||2||1
|-
|Lema_bi_koronî||2||1
|-
|Lema_bi_hatamî||2||1
|-
|Lema_bi_copallenî||2||1
|-
|Lema_bi_saruayî||2||1
|-
|Lema_bi_ngandî||2||1
|-
|Lema_bi_ma'dî||2||1
|-
|Lema_bi_kpeeyî||2||1
|-
|Lema_bi_anem||2||1
|-
|Lema_bi_unde_kailî||2||1
|-
|Lema_bi_taparitayî||2||1
|-
|Lema_bi_sedangî||2||1
|-
|Lema_bi_piçinglisî||2||1
|-
|Lema_bi_mixteciya_noçixtlana_başûr-rojhilatî||2||1
|-
|Lema_bi_mahasu_paharî||2||1
|-
|Lema_bi_esmeraldayî||2||1
|-
|Lema_bi_uruavayî||2||1
|-
|Lema_bi_senayî||2||1
|-
|Lema_bi_pîkeneyiya_başûr||2||1
|-
|Lema_bi_nivacleyî||2||1
|-
|Lema_bi_karankawayî||2||1
|-
|Lema_bi_berik||2||1
|-
|Lema_bi_yopnoyî||2||1
|-
|Lema_bi_vaî||2||1
|-
|Lema_bi_sialumî||2||1
|-
|Lema_bi_nonuyayî||2||1
|-
|Lema_bi_karrieriya_başûrî||2||1
|-
|Lema_bi_finonganî||2||1
|-
|Lema_bi_bihî||2||1
|-
|Lema_bi_araweté||2||1
|-
|Lema_bi_teke-tyeeyî||2||1
|-
|Lema_bi_mongondowî||2||1
|-
|Lema_bi_katukinayî||2||1
|-
|Lema_bi_biwatî||2||1
|-
|Lema_bi_arop-lokep||2||1
|-
|Lema_bi_waîmîrî-atroarî||2||1
|-
|Lema_bi_motayî||2||1
|-
|Lema_bi_fyamî||2||1
|-
|Lema_bi_dahalikî||2||1
|-
|Lema_bi_boanoyî_(sulawesî)||2||1
|-
|Lema_bi_abenlen_ayta||2||1
|-
|Lema_bi_zapotekiya_mitla||2||1
|-
|Lema_bi_slavomolisanoyî||2||1
|-
|Lema_bi_zapotekiya_texmelucan||2||1
|-
|Lema_bi_tiniguayî||2||1
|-
|Lema_bi_rangî||2||1
|-
|Lema_bi_muratayak||2||1
|-
|Lema_bi_marauyî||2||1
|-
|Lema_bi_lahayî_(Viyetnam)||2||1
|-
|Lema_bi_îrarûtûyî||2||1
|-
|Lema_bi_gayónî||2||1
|-
|Lema_bi_aekyom||2||1
|-
|Lema_bi_watutiya_başûr||2||1
|-
|Lema_bi_tlaçiçilco_tepehuayî||2||1
|-
|Lema_bi_stoneyî||2||1
|-
|Lema_bi_rerauyî||2||1
|-
|Lema_bi_ömie||2||1
|-
|Lema_bi_khehekî||2||1
|-
|Lema_bi_dineorî||2||1
|-
|Lema_bi_orokoloyî||2||1
|-
|Lema_bi_akar-baleyî||2||1
|-
|Lema_bi_woî||2||1
|-
|Lema_bi_otomiya_tenango||2||1
|-
|Lema_bi_kitjayî||2||1
|-
|Lema_bi_gros_ventre||2||1
|-
|Lema_bi_trió||2||1
|-
|Lema_bi_mbandjayî||2||1
|-
|Lema_bi_e'ma_buyangî||2||1
|-
|Lema_bi_bwatûyî||2||1
|-
|Lema_bi_banayî||2||1
|-
|Lema_bi_xişanba_laloyî||2||1
|-
|Lema_bi_tswayî||2||1
|-
|Lema_bi_saksoniya_transylvanyayê||2||1
|-
|Lema_bi_palorî||2||1
|-
|Lema_bi_nawathinehenayî||2||1
|-
|Lema_bi_media_lenguayî||2||1
|-
|Lema_bi_kaçama-ganjuleyî||2||1
|-
|Lema_bi_gwahatikeyî||2||1
|-
|Lema_bi_ekariyî||2||1
|-
|Lema_bi_carapanayî||2||1
|-
|Lema_bi_bankayî||2||1
|-
|Lema_bi_yagwoiayî||2||1
|-
|Lema_bi_tumtumî||2||1
|-
|Lema_bi_tagwana_senoufoyî||2||1
|-
|Lema_bi_panimî||2||1
|-
|Lema_bi_ndyuka-trio_pidginî||2||1
|-
|Lema_bi_lovonoyî||2||1
|-
|Lema_bi_konniyî||2||1
|-
|Lema_bi_halangî||2||1
|-
|Lema_bi_cicipu||2||1
|-
|Lema_bi_bariyayî||2||1
|-
|Lema_bi_patpatarî||2||1
|-
|Lema_bi_luleyî||2||1
|-
|Lema_bi_kamakanî||2||1
|-
|Lema_bi_hattîkî||2||1
|-
|Lema_bi_batakiya_alas-kluet||2||1
|-
|Lema_bi_ana_tinga_dogonî||2||1
|-
|Lema_bi_yaoureyî||2||1
|-
|Lema_bi_ujirî||2||1
|-
|Lema_bi_tampuanî||2||1
|-
|Lema_bi_ngarinyinî||2||1
|-
|Lema_bi_minjungbalî||2||1
|-
|Lema_bi_ma'yayî||2||1
|-
|Lema_bi_kpelleyî||2||1
|-
|Lema_bi_kamulayî||2||1
|-
|Lema_bi_curripacoyî||2||1
|-
|Lema_bi_bawziyî||2||1
|-
|Lema_bi_yekheeyî||2||1
|-
|Lema_bi_uneapayî||2||1
|-
|Lema_bi_sedoayî||2||1
|-
|Lema_bi_pidginiya_samoan_plantation||2||1
|-
|Lema_bi_ngoremeyî||2||1
|-
|Lema_bi_mixteciya_peñoles||2||1
|-
|Lema_bi_çanayî||2||1
|-
|Lema_bi_yinbaw_karenî||2||1
|-
|Lema_bi_tatanayî||2||1
|-
|Lema_bi_maku'ayî||2||1
|-
|Lema_bi_fakkanciyî||2||1
|-
|Lema_bi_beromî||2||1
|-
|Lema_bi_valle_nacional_çinantecî||2||1
|-
|Lema_bi_siangî||2||1
|-
|Lema_bi_bilakurayî||2||1
|-
|Lema_bi_arbore||2||1
|-
|Lema_bi_yupuayî||2||1
|-
|Lema_bi_vunapuyî||2||1
|-
|Lema_bi_simboyî||2||1
|-
|Lema_bi_proto-cermeniya_rojava||2||1
|-
|Lema_bi_kurî||2||1
|-
|Lema_bi_wajarrî||2||1
|-
|Lema_bi_moûk-arîakî||2||1
|-
|Lema_bi_mandobo_bawahî||2||1
|-
|Lema_bi_fyerî||2||1
|-
|Lema_bi_dahaloyî||2||1
|-
|Lema_bi_abeyî||2||1
|-
|Lema_bi_zapotekiya_mixtepec||2||1
|-
|Lema_bi_wangkayutyuruyî||2||1
|-
|Lema_bi_qabiaoyî||2||1
|-
|Lema_bi_nzanyî||2||1
|-
|Lema_bi_kemezungî||2||1
|-
|Lema_bi_daro-matu_melanauyî||2||1
|-
|Lema_bi_atong_(Kamerun)||2||1
|-
|Lema_bi_açeyî||2||1
|-
|Lema_bi_zapotekiya_tilquiapan||2||1
|-
|Lema_bi_lahndayî||2||1
|-
|Lema_bi_îrayayî||2||1
|-
|Lema_bi_bourbonnais-berriçonî||2||1
|-
|Lema_bi_afadeyî||2||1
|-
|Lema_bi_zenzontepekiya_çatîno||2||1
|-
|Lema_bi_watutiya_navîn||2||1
|-
|Lema_bi_lamogayî||2||1
|-
|Lema_bi_gelayî||2||1
|-
|Lema_bi_ayoreoyî||2||1
|-
|Lema_bi_zoqueyiya_çimalapa||2||1
|-
|Lema_bi_wiçi_lhamtes_noctenî||2||1
|-
|Lema_bi_sulungî||2||1
|-
|Lema_bi_matbatî||2||1
|-
|Lema_bi_kingayî||2||1
|-
|Lema_bi_jabutiyî||2||1
|-
|Lema_bi_gofayî||2||1
|-
|Lema_bi_domarî||2||1
|-
|Lema_bi_bulî_(Gana)||2||1
|-
|Lema_bi_wojenakayî||2||1
|-
|Lema_bi_torricelli_yauyî||2||1
|-
|Lema_bi_şaboyî||2||1
|-
|Lema_bi_mayangnayî||2||1
|-
|Lema_bi_kitsaiyî||2||1
|-
|Lema_bi_trîkuyiya_copala||2||1
|-
|Lema_bi_şeyî||2||1
|-
|Lema_bi_paguyî||2||1
|-
|Lema_bi_mbatoyî||2||1
|-
|Lema_bi_jola-fonyiyî||2||1
|-
|Lema_bi_gunuyî||2||1
|-
|Lema_bi_ebirayî||2||1
|-
|Lema_bi_paluanî||2||1
|-
|Lema_bi_gwarayî||2||1
|-
|Lema_bi_ekitî||2||1
|-
|Lema_bi_carayî||2||1
|-
|Lema_bi_bankonî||2||1
|-
|Lema_bi_amahuaca||2||1
|-
|Lema_bi_yahangî||2||1
|-
|Lema_bi_mereiyî||2||1
|-
|Lema_bi_konomalayî||2||1
|-
|Lema_bi_halbiyî||2||1
|-
|Lema_bi_emerillonî||2||1
|-
|Lema_bi_ciguayoyî||2||1
|-
|Lema_bi_ambeleyî||2||1
|-
|Lema_bi_yan-nhanguyî||2||1
|-
|Lema_bi_talayî||2||1
|-
|Lema_bi_migaamayî||2||1
|-
|Lema_bi_lumunî||2||1
|-
|Lema_bi_korwayî||2||1
|-
|Lema_bi_kamangî||2||1
|-
|Lema_bi_anakalunguyî||2||1
|-
|Lema_bi_pericú||2||1
|-
|Lema_bi_ngarlumayî||2||1
|-
|Lema_bi_maakayî||2||1
|-
|Lema_bi_kamweyî||2||1
|-
|Lema_bi_hindkoyiya_başûrî||2||1
|-
|Lema_bi_cuvokî||2||1
|-
|Lema_bi_yeloguyî||2||1
|-
|Lema_bi_unemeyî||2||1
|-
|Lema_bi_tapieteyî||2||1
|-
|Lema_bi_seenkuyî||2||1
|-
|Lema_bi_ngoşieyî||2||1
|-
|Lema_bi_mixteciya_pueblaya_başûr||2||1
|-
|Lema_bi_mahouyî||2||1
|-
|Lema_bi_kreyoliya_nîkaraguayî||2||1
|-
|Lema_bi_esselenî||2||1
|-
|Lema_bi_çangî||2||1
|-
|Lema_bi_anuak||2||1
|-
|Lema_bi_senggî||2||1
|-
|Lema_bi_makurapî||2||1
|-
|Lema_bi_hubayî||2||1
|-
|Lema_bi_çimilayî||2||1
|-
|Lema_bi_bertayî||2||1
|-
|Lema_bi_apma||2||1
|-
|Lema_bi_sianî||2||1
|-
|Lema_bi_noonî||2||1
|-
|Lema_bi_moikodî||2||1
|-
|Lema_bi_idunayî||2||1
|-
|Lema_bi_proto-cermenî||2||1
|-
|Lema_bi_moniya_kevn||2||1
|-
|Lema_bi_mamprulî||2||1
|-
|Lema_bi_arrernteya_rojavayî||2||1
|-
|Lema_bi_zangwalî||2||1
|-
|Lema_bi_sisaalayiya_rojavayî||2||1
|-
|Lema_bi_mangarayî||2||1
|-
|Lema_bi_kuynaultî||2||1
|-
|Lema_bi_kayardildî||2||1
|-
|Lema_bi_îkî||2||1
|-
|Lema_bi_daiyî||2||1
|-
|Lema_bi_boboyiya_başûrî||2||1
|-
|Lema_bi_asu||2||1
|-
|Lema_bi_abipon||2||1
|-
|Lema_bi_zapotekiya_ocotlan||2||1
|-
|Lema_bi_wangkumarayî||2||1
|-
|Lema_bi_nzimayî||2||1
|-
|Lema_bi_manzayî||2||1
|-
|Lema_bi_kwerbayî||2||1
|-
|Lema_bi_kemi_samî||2||1
|-
|Lema_bi_gamoyî||2||1
|-
|Lema_bi_bolokî||2||1
|-
|Lema_bi_atsugewî||2||1
|-
|Lema_bi_zapotekiya_tlacolulita||2||1
|-
|Lema_bi_waritaî||2||1
|-
|Lema_bi_rapayî||2||1
|-
|Lema_bi_ojibweyiya_severnê||2||1
|-
|Lema_bi_maridanî||2||1
|-
|Lema_bi_kerewoyî||2||1
|-
|Lema_bi_îrî||2||1
|-
|Lema_bi_gbagyiyî||2||1
|-
|Lema_bi_bozoyiya_hainyaxo||2||1
|-
|Lema_bi_awar||2||1
|-
|Lema_bi_reşeyî||2||1
|-
|Lema_bi_oneyiya_inebu||2||1
|-
|Lema_bi_mwerayî||2||1
|-
|Lema_bi_îteneyî||2||1
|-
|Lema_bi_gendeyî||2||1
|-
|Lema_bi_diraşayî||2||1
|-
|Lema_bi_ahwayî||2||1
|-
|Lema_bi_tolomakoyî||2||1
|-
|Lema_bi_matengoyî||2||1
|-
|Lema_bi_kinikinaoyî||2||1
|-
|Lema_bi_jah_hutî||2||1
|-
|Lema_bi_gogoyî||2||1
|-
|Lema_bi_dompoyî||2||1
|-
|Lema_bi_bafanjî||2||1
|-
|Lema_bi_wokkonî||2||1
|-
|Lema_bi_torricellî||2||1
|-
|Lema_bi_şall-zwallî||2||1
|-
|Lema_bi_owayî||2||1
|-
|Lema_bi_mayaniya_epigrafîk||2||1
|-
|Lema_bi_durango_nahuatliya_rojavayî||2||1
|-
|Lema_bi_balaesang||2||1
|-
|Lema_bi_alabat_island_agtayî||2||1
|-
|Lema_bi_xamtangayî||2||1
|-
|Lema_bi_şinayiya_kohistanî||2||1
|-
|Lema_bi_sacatayî||2||1
|-
|Lema_bi_pahanan_agta||2||1
|-
|Lema_bi_nar_phuyî||2||1
|-
|Lema_bi_mbembeyiya_çema_crossê||2||1
|-
|Lema_bi_knaanicî||2||1
|-
|Lema_bi_jowuluyî||2||1
|-
|Lema_bi_cabiyariyî||2||1
|-
|Lema_bi_banda_malayî||2||1
|-
|Lema_bi_tşobdunî||2||1
|-
|Lema_bi_salibayî_(Gîneya_nû)||2||1
|-
|Lema_bi_mefeleyî||2||1
|-
|Lema_bi_lokoyî||2||1
|-
|Lema_bi_kadaruyî||2||1
|-
|Lema_bi_ekpeyeyî||2||1
|-
|Lema_bi_bantawa||2||1
|-
|Lema_bi_amaimonî||2||1
|-
|Lema_bi_yahunayî||2||1
|-
|Lema_bi_tuneboyiya_navendî||2||1
|-
|Lema_bi_paporayî||2||1
|-
|Lema_bi_negerhollandsî||2||1
|-
|Lema_bi_mereyî||2||1
|-
|Lema_bi_konomihuyî||2||1
|-
|Lema_bi_kalabariyî||2||1
|-
|Lema_bi_haliayî||2||1
|-
|Lema_bi_amblongî||2||1
|-
|Lema_bi_yanayî||2||1
|-
|Lema_bi_ngaanyatjarrayî||2||1
|-
|Lema_bi_kamanoyî||2||1
|-
|Lema_bi_analî||2||1
|-
|Lema_bi_ukurigumayî||2||1
|-
|Lema_bi_satere-maweyî||2||1
|-
|Lema_bi_mabaanî||2||1
|-
|Lema_bi_krenakî||2||1
|-
|Lema_bi_hindustaniyiya_karibî||2||1
|-
|Lema_bi_tapirapeyî||2||1
|-
|Lema_bi_mixteciya_san_miguel_el_grande||2||1
|-
|Lema_bi_kanufiyî||2||1
|-
|Lema_bi_çapacurayî||2||1
|-
|Lema_bi_anufoyî||2||1
|-
|Lema_bi_usanî||2||1
|-
|Lema_bi_sepayî_(Gîneya_nû)||2||1
|-
|Lema_bi_karawayî||2||1
|-
|Lema_bi_çimwiinî||2||1
|-
|Lema_bi_vanimoyî||2||1
|-
|Lema_bi_siar-lakî||2||1
|-
|Lema_bi_pomoyiya_navendî||2||1
|-
|Lema_bi_malaynonî||2||1
|-
|Lema_bi_kumbewahayî||2||1
|-
|Lema_bi_idunî||2||1
|-
|Lema_bi_tembeyî||2||1
|-
|Lema_bi_sinacantanî||2||1
|-
|Lema_bi_nuguriayî||2||1
|-
|Lema_bi_mamujuyî||2||1
|-
|Lema_bi_kurnayî||2||1
|-
|Lema_bi_bîbaalî||2||1
|-
|Lema_bi_terayî||2||1
|-
|Lema_bi_moyî||2||1
|-
|Lema_bi_kayeliyî||2||1
|-
|Lema_bi_îkomayî||2||1
|-
|Lema_bi_ga'dangî||2||1
|-
|Lema_bi_bodo_gadabayî||2||1
|-
|Lema_bi_abîdjî||2||1
|-
|Lema_bi_zapotekiya_ozolotepec||2||1
|-
|Lema_bi_wanhamî||2||1
|-
|Lema_bi_thompsonî||2||1
|-
|Lema_bi_kwereyî||2||1
|-
|Lema_bi_kenaboî||2||1
|-
|Lema_bi_ganayî||2||1
|-
|Lema_bi_datoogayî||2||1
|-
|Lema_bi_zapotekiya_xanaguia||2||1
|-
|Lema_bi_maridjabinî||2||1
|-
|Lema_bi_lakayî||2||1
|-
|Lema_bi_kerînçî||2||1
|-
|Lema_bi_gbanî||2||1
|-
|Lema_bi_denya||2||1
|-
|Lema_bi_bragat||2||1
|-
|Lema_bi_awera||2||1
|-
|Lema_bi_zhabayî||2||1
|-
|Lema_bi_wawayî||2||1
|-
|Lema_bi_subaneniya_bakurî||2||1
|-
|Lema_bi_rettayî||2||1
|-
|Lema_bi_öngeyî||2||1
|-
|Lema_bi_mwotlapî||2||1
|-
|Lema_bi_marúboyî||2||1
|-
|Lema_bi_langiyî||2||1
|-
|Lema_bi_khonsoyî||2||1
|-
|Lema_bi_îtikî||2||1
|-
|Lema_bi_budza||2||1
|-
|Lema_bi_ayuyî||2||1
|-
|Lema_bi_aikanayî||2||1
|-
|Lema_bi_tominî||2||1
|-
|Lema_bi_oroyî||2||1
|-
|Lema_bi_nahwatliya_huaxcaleca||2||1
|-
|Lema_bi_matisî||2||1
|-
|Lema_bi_kinnauriyî||2||1
|-
|Lema_bi_dongolawiyî||2||1
|-
|Lema_bi_bunabayî||2||1
|-
|Lema_bi_bafiayî||2||1
|}
==== Modul:zimanên etîmolojiyê====
{{Special:PrefixIndex/Modul:zimanên etîmolojiyê/|stripprefix=yes}}
==== Modul:etymology languages====
{{Special:PrefixIndex/Modul:etymology languages/|stripprefix=yes}}
==== Binêre herwiha ====
{{veşêre-ser}}
{| class="wikitable"
!wikilink
|-
|[[Pêvek:Bêçavkanî]]
|-
|[[Pêvek:Bêçavkanî/a]]
|-
|[[Pêvek:Bêçavkanî/a/alozbûn wekî wayra]]
|-
|[[Pêvek:Bêçavkanî/aloq]]
|-
|[[Pêvek:Bêçavkanî/alozbûn]]
|-
|[[Pêvek:Bêçavkanî/amerzandin]]
|-
|[[Pêvek:Bêçavkanî/asûm]]
|-
|[[Pêvek:Bêçavkanî/bester]]
|-
|[[Pêvek:Bêçavkanî/cewser]]
|-
|[[Pêvek:Bêçavkanî/derbest]]
|-
|[[Pêvek:Bêçavkanî/dogirme]]
|-
|[[Pêvek:Bêçavkanî/dolivandin]]
|-
|[[Pêvek:Bêçavkanî/dêziman]]
|-
|[[Pêvek:Bêçavkanî/girêmestî]]
|-
|[[Pêvek:Bêçavkanî/hesoskî]]
|-
|[[Pêvek:Bêçavkanî/hilinder]]
|-
|[[Pêvek:Bêçavkanî/ji barê ve]]
|-
|[[Pêvek:Bêçavkanî/kakilîk]]
|-
|[[Pêvek:Bêçavkanî/kedpîr]]
|-
|[[Pêvek:Bêçavkanî/kilûç]]
|-
|[[Pêvek:Bêçavkanî/nêremê]]
|-
|[[Pêvek:Bêçavkanî/nû]]
|-
|[[Pêvek:Bêçavkanî/oc bûn]]
|-
|[[Pêvek:Bêçavkanî/qomik]]
|-
|[[Pêvek:Bêçavkanî/rojol]]
|-
|[[Pêvek:Bêçavkanî/sîniyar]]
|-
|[[Pêvek:Bêçavkanî/tazîger]]
|-
|[[Pêvek:Bêçavkanî/tevilîn]]
|-
|[[Pêvek:Bêçavkanî/torecivîn]]
|-
|[[Pêvek:Bêçavkanî/zelîn]]
|-
|[[Pêvek:Bêçavkanî/şeebî]]
|}
{{veşêre-bin}}
fofjfkp3y3vwttya1nv5rvq3vguo1ma
6292080
6292079
2026-07-29T20:44:52Z
Wikihez
7344
/* */ bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re
6292080
wikitext
text/x-wiki
==== lmea ====
{| class="wikitable sortable"
!subcategory!!item_count!!subcategory_count
|-
|Lema_bi_kurmancî||160941||27
|-
|Lema_bi_îngilîzî||64960||24
|-
|Lema_bi_tirkî||63177||21
|-
|Lema_bi_almanî||25958||22
|-
|Lema_bi_polonî||15447||14
|-
|Lema_bi_japonî||13399||14
|-
|Lema_bi_farisî||10285||19
|-
|Lema_bi_sirboxirwatî||6644||13
|-
|Lema_bi_fransî||6377||16
|-
|Lema_bi_gurcî||5826||13
|-
|Lema_bi_îtalî||5318||14
|-
|Lema_bi_fînî||5187||15
|-
|Lema_bi_rusî||5045||15
|-
|Lema_bi_spanî||4713||14
|-
|Lema_bi_erebî||4566||18
|-
|Lema_bi_holendî||4165||14
|-
|Lema_bi_hindî||4102||13
|-
|Lema_bi_çekî||3880||13
|-
|Lema_bi_mandarînî||3842||13
|-
|Lema_bi_portugalî||3645||14
|-
|Lema_bi_ûkraynî||3594||13
|-
|Lema_bi_mecarî||3558||13
|-
|Lema_bi_koreyî||3517||15
|-
|Lema_bi_belarusî||3508||13
|-
|Lema_bi_latînî||3464||14
|-
|Lema_bi_soranî||3449||20
|-
|Lema_bi_swêdî||3311||14
|-
|Lema_bi_ermenî||3268||14
|-
|Lema_bi_bulgarî||3219||13
|-
|Lema_bi_romanyayî||3199||12
|-
|Lema_bi_danmarkî||3130||13
|-
|Lema_bi_galîsî||3130||13
|-
|Lema_bi_yûnanî||3113||14
|-
|Lema_bi_esperantoyî||3086||16
|-
|Lema_bi_tagalogî||3018||14
|-
|Lema_bi_ferî||2967||13
|-
|Lema_bi_viyetnamî||2936||12
|-
|Lema_bi_katalanî||2933||13
|-
|Lema_bi_îzlendî||2892||13
|-
|Lema_bi_estonî||2827||13
|-
|Lema_bi_azerî||2822||14
|-
|Lema_bi_sebwanoyî||2681||13
|-
|Lema_bi_makedonî||2665||13
|-
|Lema_bi_îbranî||2642||14
|-
|Lema_bi_tayî||2608||13
|-
|Lema_bi_latviyayî||2606||13
|-
|Lema_bi_slovakî||2552||13
|-
|Lema_bi_malezî||2540||13
|-
|Lema_bi_îrlendî||2505||13
|-
|Lema_bi_tacikî||2491||12
|-
|Lema_bi_yûnaniya_kevn||2418||12
|-
|Lema_bi_slovenî||2406||12
|-
|Lema_bi_qazaxî||2358||13
|-
|Lema_bi_maorî||2335||13
|-
|Lema_bi_mongolî||2281||12
|-
|Lema_bi_albanî||2280||13
|-
|Lema_bi_ozbekî||2240||13
|-
|Lema_bi_lîtwanî||2221||13
|-
|Lema_bi_urdûyî||2190||14
|-
|Lema_bi_ximêrî||2190||13
|-
|Lema_bi_endonezyayî||2059||14
|-
|Lema_bi_weylsî||2037||12
|-
|Lema_bi_lawsî||2029||13
|-
|Lema_bi_bengalî||2016||12
|-
|Lema_bi_zazakî||1992||15
|-
|Lema_bi_kirgizî||1971||12
|-
|Lema_bi_yidîşî||1917||13
|-
|Lema_bi_gaelîka_skotî||1903||11
|-
|Lema_bi_burmayî||1860||13
|-
|Lema_bi_telûgûyî||1802||11
|-
|Lema_bi_norweciya_bokmålî||1790||11
|-
|Lema_bi_çînî||1670||6
|-
|Lema_bi_peştûyî||1600||12
|-
|Lema_bi_baskî||1588||13
|-
|Lema_bi_oksîtanî||1577||12
|-
|Lema_bi_swahîlî||1547||14
|-
|Lema_bi_astûrî||1536||13
|-
|Lema_bi_afrîkansî||1535||13
|-
|Lema_bi_tirkmenî||1521||11
|-
|Lema_bi_norweciya_nînorskî||1508||12
|-
|Lema_bi_kantonî||1502||12
|-
|Lema_bi_oygurî||1483||12
|-
|Lema_bi_romancî||1455||10
|-
|Lema_bi_sardînî||1447||12
|-
|Lema_bi_volapûkî||1379||10
|-
|Lema_bi_îdoyî||1377||14
|-
|Lema_bi_malayalamî||1370||11
|-
|Lema_bi_maltayî||1348||13
|-
|Lema_bi_başkîrî||1339||12
|-
|Lema_bi_tamîlî||1327||13
|-
|Lema_bi_îngilîziya_kevn||1243||12
|-
|Lema_bi_sanskrîtî||1228||12
|-
|Lema_bi_teterî||1220||10
|-
|Lema_bi_aromanî||1217||12
|-
|Lema_bi_normandî||1180||11
|-
|Lema_bi_norwecî||1154||14
|-
|Lema_bi_sicîlî||1143||10
|-
|Lema_bi_bretonî||1137||13
|-
|Lema_bi_asamî||1132||11
|-
|Lema_bi_tîbetî||1109||10
|-
|Lema_bi_minnanî||1105||10
|-
|Lema_bi_navajoyî||1077||13
|-
|Lema_bi_frîsî||1063||13
|-
|Lema_bi_puncabî||1057||11
|-
|Lema_bi_venîsî||1055||10
|-
|Lema_bi_friyolî||1019||11
|-
|Lema_bi_walonî||992||12
|-
|Lema_bi_hawayî||964||12
|-
|Lema_bi_luksembûrgî||961||13
|-
|Lema_bi_amharî||949||11
|-
|Lema_bi_erebiya_misrî||938||11
|-
|Lema_bi_înterlîngua||921||11
|-
|Lema_bi_kalalîsûtî||916||10
|-
|Lema_bi_maratî||914||11
|-
|Lema_bi_manksî||911||10
|-
|Lema_bi_keçwayî||898||11
|-
|Lema_bi_sorbiya_jêrîn||876||12
|-
|Lema_bi_kîngalî||867||11
|-
|Lema_bi_kannadayî||834||10
|-
|Lema_bi_kurdiya_başûrî||830||12
|-
|Lema_bi_osmanî||774||10
|-
|Lema_bi_gujaratî||771||11
|-
|Lema_bi_çeçenî||766||11
|-
|Lema_bi_javayî||751||11
|-
|Lema_bi_plodîşî||750||8
|-
|Lema_bi_çerokî||745||11
|-
|Lema_bi_nedersaksî||739||11
|-
|Lema_bi_erebiya_hîcazî||718||11
|-
|Lema_bi_slaviya_kevn||713||11
|-
|Lema_bi_nepalî||696||11
|-
|Lema_bi_kornî||696||10
|-
|Lema_bi_sorbiya_jorîn||661||10
|-
|Lema_bi_zhuangî||660||10
|-
|Lema_bi_osetî||655||13
|-
|Lema_bi_samiya_bakurî||654||13
|-
|Lema_bi_dunganî||648||10
|-
|Lema_bi_îngriyî||633||9
|-
|Lema_bi_skotî||626||12
|-
|Lema_bi_gotî||626||11
|-
|Lema_bi_oriyayî||624||9
|-
|Lema_bi_mançûyî||614||10
|-
|Lema_bi_teteriya_krîmî||610||10
|-
|Lema_bi_latgalî||610||10
|-
|Lema_bi_yakutî||592||11
|-
|Lema_bi_haîtî||590||10
|-
|Lema_bi_erebiya_fasî||580||11
|-
|Lema_bi_hawsayî||544||9
|-
|Lema_bi_zuluyî||539||10
|-
|Lema_bi_çuvaşî||524||10
|-
|Lema_bi_yorubayî||517||10
|-
|Lema_bi_abxazî||511||10
|-
|Lema_bi_somalî||510||10
|-
|Lema_bi_frîsiya_bakur||507||9
|-
|Lema_bi_ladînoyî||505||10
|-
|Lema_bi_aragonî||502||10
|-
|Lema_bi_tigrînî||494||11
|-
|Lema_bi_aramiya_nû_ya_asûrî||487||9
|-
|Lema_bi_hakkayî||481||9
|-
|Lema_bi_îngilîziya_navîn||480||10
|-
|Lema_bi_palî||474||6
|-
|Lema_bi_navzimanî||472||7
|-
|Lema_bi_çîçewayî||456||10
|-
|Lema_bi_oromoyî||453||8
|-
|Lema_bi_almaniya_jêrîn_a_almanî||450||9
|-
|Lema_bi_lombardî||449||9
|-
|Lema_bi_kaşûbî||445||8
|-
|Lema_bi_altayiya_başûrî||436||10
|-
|Lema_bi_aramî||432||11
|-
|Lema_bi_bîkoliya_naverast||426||11
|-
|Lema_bi_korsîkayî||423||10
|-
|Lema_bi_ojibweyî||422||11
|-
|Lema_bi_papyamentoyî||421||10
|-
|Lema_bi_rusînî||420||11
|-
|Lema_bi_avarî||412||9
|-
|Lema_bi_toxarî_B||410||8
|-
|Lema_bi_kalmîkî||410||9
|-
|Lema_bi_qiptî||402||9
|-
|Lema_bi_malagasî||401||10
|-
|Lema_bi_napolîtanî||400||11
|-
|Lema_bi_elmanîşî||395||11
|-
|Lema_bi_dalmatî||393||8
|-
|Lema_bi_guwaranî||393||11
|-
|Lema_bi_slaviya_rojavayî_ya_kevn||393||9
|-
|Lema_bi_tuvanî||392||11
|-
|Lema_bi_divehî||391||10
|-
|Lema_bi_adîgeyî||389||9
|-
|Lema_bi_buryatî||387||8
|-
|Lema_bi_wuyî||384||9
|-
|Lema_bi_kapampanganî||376||11
|-
|Lema_bi_erzayî||357||9
|-
|Lema_bi_udmurtî||347||9
|-
|Lema_bi_lueyî||346||8
|-
|Lema_bi_romanî||346||11
|-
|Lema_bi_sundanî||339||11
|-
|Lema_bi_îlokanoyî||336||10
|-
|Lema_bi_siryaniya_klasîk||334||9
|-
|Lema_bi_şîngazîcayî||330||10
|-
|Lema_bi_min_dongî||330||9
|-
|Lema_bi_evenkî||328||6
|-
|Lema_bi_kumikî||327||8
|-
|Lema_bi_belûçî||327||9
|-
|Lema_bi_ladînî||319||10
|-
|Lema_bi_îngûşî||316||8
|-
|Lema_bi_sindhî||315||9
|-
|Lema_bi_lezgînî||314||6
|-
|Lema_bi_fransiya_kevn||311||11
|-
|Lema_bi_norsiya_kevn||308||10
|-
|Lema_bi_lîvonî||308||10
|-
|Lema_bi_tetûmî||306||7
|-
|Lema_bi_tokpisinî||293||11
|-
|Lema_bi_şanî||290||9
|-
|Lema_bi_wolofî||287||10
|-
|Lema_bi_maranaoyî||286||9
|-
|Lema_bi_nanayî||278||6
|-
|Lema_bi_nahwatlî||278||8
|-
|Lema_bi_kîkûyûyî||277||9
|-
|Lema_bi_sotoyiya_başûr||277||9
|-
|Lema_bi_hmongî||277||9
|-
|Lema_bi_lîgûrî||275||10
|-
|Lema_bi_romagnolî||273||8
|-
|Lema_bi_lîmbûrgî||267||9
|-
|Lema_bi_samoayî||265||10
|-
|Lema_bi_îrlendiya_kevn||265||10
|-
|Lema_bi_keşmîrî||261||7
|-
|Lema_bi_piedmontîsî||258||7
|-
|Lema_bi_çamicuroyî||256||8
|-
|Lema_bi_hîlîgaynonî||253||11
|-
|Lema_bi_megrelî||251||9
|-
|Lema_bi_hunsrikî||249||7
|-
|Lema_bi_tarifitî||248||5
|-
|Lema_bi_karaçay-balkarî||247||7
|-
|Lema_bi_warayî||247||9
|-
|Lema_bi_mîrandî||246||8
|-
|Lema_bi_sîlhetî||245||10
|-
|Lema_bi_eweyî||245||9
|-
|Lema_bi_lingalayî||242||9
|-
|Lema_bi_almaniya_Pennsylvania||239||9
|-
|Lema_bi_almaniya_bilind_a_kevn||236||9
|-
|Lema_bi_talişî||235||7
|-
|Lema_bi_nahwatliya_klasîk||234||10
|-
|Lema_bi_çukçî||234||8
|-
|Lema_bi_aynuyî||232||9
|-
|Lema_bi_ugarîtî||231||7
|-
|Lema_bi_xosayî||225||8
|-
|Lema_bi_samiya_skoltî||223||8
|-
|Lema_bi_kapverdî||221||6
|-
|Lema_bi_erebiya_başûrê_şamê||221||9
|-
|Lema_bi_xakasî||218||7
|-
|Lema_bi_înuîtî||217||10
|-
|Lema_bi_conxayî||215||9
|-
|Lema_bi_sirananî||212||8
|-
|Lema_bi_voroyî||210||8
|-
|Lema_bi_mokşayî||209||8
|-
|Lema_bi_ermeniya_kevn||209||8
|-
|Lema_bi_mariya_rojhilatî||209||6
|-
|Lema_bi_çîkasawî||208||8
|-
|Lema_bi_yupîkiya_navendî||207||8
|-
|Lema_bi_şorî||206||7
|-
|Lema_bi_wîlamowî||206||8
|-
|Lema_bi_apaçiya_rojava||205||9
|-
|Lema_bi_higaononî||203||6
|-
|Lema_bi_javayiya_kevn||201||6
|-
|Lema_bi_elfdalî||200||8
|-
|Lema_bi_tongî||200||9
|-
|Lema_bi_îstriyotî||200||8
|-
|Lema_bi_silesî||200||8
|-
|Lema_bi_mayayiya_yukatekî||198||8
|-
|Lema_bi_tausugî||198||7
|-
|Lema_bi_zêlandî||198||9
|-
|Lema_bi_bayerî||197||9
|-
|Lema_bi_luhyayî||196||6
|-
|Lema_bi_mazenderanî||195||8
|-
|Lema_bi_mòçenoyî||191||10
|-
|Lema_bi_bruneyî||191||4
|-
|Lema_bi_lazî||190||9
|-
|Lema_bi_kabardî||189||8
|-
|Lema_bi_erebiya_kendavî||186||9
|-
|Lema_bi_karelî||185||10
|-
|Lema_bi_evenî||185||6
|-
|Lema_bi_frîsiya_saterlandî||181||9
|-
|Lema_bi_akanî||180||7
|-
|Lema_bi_tabasaranî||179||7
|-
|Lema_bi_santalî||179||8
|-
|Lema_bi_fîjî||179||9
|-
|Lema_bi_svanî||178||5
|-
|Lema_bi_misrî||176||4
|-
|Lema_bi_îgboyî||174||9
|-
|Lema_bi_hewramî||173||9
|-
|Lema_bi_aymarayî||173||7
|-
|Lema_bi_farefareyî||172||6
|-
|Lema_bi_kînyarwandayî||172||7
|-
|Lema_bi_taosî||172||4
|-
|Lema_bi_komî-permyakî||168||6
|-
|Lema_bi_lakotayî||167||9
|-
|Lema_bi_aklanon||165||6
|-
|Lema_bi_yagnobî||164||8
|-
|Lema_bi_okînawanî||162||8
|-
|Lema_bi_rohingyayî||159||7
|-
|Lema_bi_vepsî||158||8
|-
|Lema_bi_samiya_înarî||158||9
|-
|Lema_bi_emilî||156||7
|-
|Lema_bi_tahîtî||154||9
|-
|Lema_bi_maguindanaoyî||152||5
|-
|Lema_bi_gagawzî||151||5
|-
|Lema_bi_temazîxtiya_atlasa_navendî||151||8
|-
|Lema_bi_samogîtî||150||6
|-
|Lema_bi_fulahî||149||6
|-
|Lema_bi_kreyoliya_fransî_ya_Louisiana||145||7
|-
|Lema_bi_melanauyiya_navendî||144||2
|-
|Lema_bi_nîvxî||141||5
|-
|Lema_bi_afarî||141||7
|-
|Lema_bi_etiyopiya_klasîk||137||8
|-
|Lema_bi_extremaduranî||136||8
|-
|Lema_bi_frankoprovansî||136||7
|-
|Lema_bi_komî-zîriyî||135||9
|-
|Lema_bi_udî||135||5
|-
|Lema_bi_samiya_başûr||134||9
|-
|Lema_bi_nogayî||133||9
|-
|Lema_bi_akadî||129||5
|-
|Lema_bi_lakî||128||6
|-
|Lema_bi_mînangkabawî||128||7
|-
|Lema_bi_kîkongoyî||127||9
|-
|Lema_bi_balînî||126||7
|-
|Lema_bi_dolganî||126||7
|-
|Lema_bi_açehî||123||7
|-
|Lema_bi_polabî||122||8
|-
|Lema_bi_pîpîlî||122||8
|-
|Lema_bi_monî||121||7
|-
|Lema_bi_karakalpakî||121||6
|-
|Lema_bi_kabîlî||120||8
|-
|Lema_bi_votî||120||6
|-
|Lema_bi_luoyî||118||5
|-
|Lema_bi_şonayî||116||6
|-
|Lema_bi_komorî||116||8
|-
|Lema_bi_tarantinoyî||115||7
|-
|Lema_bi_lugandayî||115||8
|-
|Lema_bi_saksoniya_jêrîn_ya_holendî||115||7
|-
|Lema_bi_dusuniya_navendî||114||7
|-
|Lema_bi_taşelhitî||113||8
|-
|Lema_bi_mansakayî||112||6
|-
|Lema_bi_rapanuyî||112||9
|-
|Lema_bi_meruyî||111||4
|-
|Lema_bi_înupîakî||108||6
|-
|Lema_bi_prusiya_kevn||107||7
|-
|Lema_bi_çûkî||107||8
|-
|Lema_bi_kambayî||107||2
|-
|Lema_bi_çeyenî||107||6
|-
|Lema_bi_tayiya_bakurî||107||7
|-
|Lema_bi_alabamayî||107||5
|-
|Lema_bi_aghwanî||106||7
|-
|Lema_bi_zimanê_destan_ê_emerîkî||104||11
|-
|Lema_bi_ǃxóõ||104||7
|-
|Lema_bi_mbya_guaraniyî||104||8
|-
|Lema_bi_krî||103||6
|-
|Lema_bi_yamanayî||102||5
|-
|Lema_bi_tirkiya_kevn||100||7
|-
|Lema_bi_sidamoyî||97||6
|-
|Lema_bi_tumbukayî||97||7
|-
|Lema_bi_pîttcantcatcarayî||96||7
|-
|Lema_bi_sûmerî||95||6
|-
|Lema_bi_batsbî||94||3
|-
|Lema_bi_jejuyî||93||8
|-
|Lema_bi_bambarayî||93||5
|-
|Lema_bi_fransiya_navîn||92||8
|-
|Lema_bi_tupînambayî||91||7
|-
|Lema_bi_farisiya_navîn||91||6
|-
|Lema_bi_bîslamayî||91||8
|-
|Lema_bi_s'gaw_karenî||91||5
|-
|Lema_bi_sahoyî||90||5
|-
|Lema_bi_bajwayiya_kendava_rojava||90||4
|-
|Lema_bi_bau_bidayuh||90||4
|-
|Lema_bi_samiya_kildînî||90||5
|-
|Lema_bi_nawrûyî||90||5
|-
|Lema_bi_pangasînanî||89||8
|-
|Lema_bi_abazayî||89||4
|-
|Lema_bi_tswanayî||89||7
|-
|Lema_bi_saksoniya_kevn||88||8
|-
|Lema_bi_arçî||88||6
|-
|Lema_bi_şerpayî||87||7
|-
|Lema_bi_konkanî||86||6
|-
|Lema_bi_kalencînî||84||3
|-
|Lema_bi_wînnebagoyî||84||6
|-
|Lema_bi_dargwayî||84||5
|-
|Lema_bi_kreyoliya_morîtanî||83||6
|-
|Lema_bi_îbanî||82||5
|-
|Lema_bi_avestayî||82||5
|-
|Lema_bi_moreyî||81||3
|-
|Lema_bi_mapuçî||81||6
|-
|Lema_bi_îranunî||81||3
|-
|Lema_bi_mariya_rojavayî||80||4
|-
|Lema_bi_ohloniya_bakur||80||8
|-
|Lema_bi_tay_dam||80||6
|-
|Lema_bi_erebiya_bakûrê_şamê||80||8
|-
|Lema_bi_ganî||79||5
|-
|Lema_bi_yiyiya_siçuwayî||79||8
|-
|Lema_bi_toxarî_A||79||6
|-
|Lema_bi_mwanî||79||4
|-
|Lema_bi_elwîrî-wîderî||78||6
|-
|Lema_bi_oksîtaniya_kevn||78||6
|-
|Lema_bi_buyî||78||5
|-
|Lema_bi_jarayî||78||6
|-
|Lema_bi_newarî||78||4
|-
|Lema_bi_unamî||77||5
|-
|Lema_bi_mîkmakî||76||5
|-
|Lema_bi_çamiya_rojhilatî||76||4
|-
|Lema_bi_galûrîsî||76||5
|-
|Lema_bi_mizoyî||75||5
|-
|Lema_bi_jinî||75||5
|-
|Lema_bi_tlingitî||75||5
|-
|Lema_bi_bugî||74||5
|-
|Lema_bi_pîkardî||74||9
|-
|Lema_bi_hopîyî||73||6
|-
|Lema_bi_frîsiya_kevn||73||7
|-
|Lema_bi_ternateyî||73||5
|-
|Lema_bi_portugaliya_kevn||72||6
|-
|Lema_bi_kîrîbatî||72||5
|-
|Lema_bi_cingphoyî||71||8
|-
|Lema_bi_sierra_mîwokiya_navendî||71||7
|-
|Lema_bi_sassarîsî||71||5
|-
|Lema_bi_o'odhamî||70||4
|-
|Lema_bi_xiangî||69||4
|-
|Lema_bi_îstro-romanyayî||69||7
|-
|Lema_bi_bukidnon_manoboyiya_rojavayî||68||5
|-
|Lema_bi_bojpûrî||67||8
|-
|Lema_bi_andî||66||5
|-
|Lema_bi_kayingangî||65||8
|-
|Lema_bi_swazî||65||5
|-
|Lema_bi_min_beî||64||4
|-
|Lema_bi_ahomî||64||5
|-
|Lema_bi_montagnaîsî||64||3
|-
|Lema_bi_namayî||62||5
|-
|Lema_bi_miyakoyî||62||7
|-
|Lema_bi_drungî||62||5
|-
|Lema_bi_luşûtsîdî||62||4
|-
|Lema_bi_dongşîangî||61||3
|-
|Lema_bi_bextiyarî||61||7
|-
|Lema_bi_marîkopayî||61||4
|-
|Lema_bi_almaniya_bilind_a_navîn||61||7
|-
|Lema_bi_cimbrî||61||5
|-
|Lema_bi_arrernteyiya_rojavayî||61||5
|-
|Lema_bi_argobbayî||60||6
|-
|Lema_bi_îu_mienî||60||5
|-
|Lema_bi_atayalî||60||4
|-
|Lema_bi_alêwîtî||60||6
|-
|Lema_bi_saanîçî||60||6
|-
|Lema_bi_kaurnayî||60||4
|-
|Lema_bi_yûnaniya_pontî||59||4
|-
|Lema_bi_frankoniya_navendî||59||3
|-
|Lema_bi_pelayî||58||6
|-
|Lema_bi_alutîqî||58||5
|-
|Lema_bi_muongî||58||5
|-
|Lema_bi_hîtîtî||57||6
|-
|Lema_bi_makasarî||57||4
|-
|Lema_bi_banjarî||57||4
|-
|Lema_bi_ngarrindjerî||57||6
|-
|Lema_bi_dakotayî||56||5
|-
|Lema_bi_nenetsiya_tundra||56||4
|-
|Lema_bi_pacohî||56||5
|-
|Lema_bi_çamoroyî||56||5
|-
|Lema_bi_flamiya_rojava||55||4
|-
|Lema_bi_erebiya_iraqî||55||6
|-
|Lema_bi_samiya_lule||55||7
|-
|Lema_bi_lamboyayî||54||7
|-
|Lema_bi_kreyoliya_jameîkî||54||6
|-
|Lema_bi_yakanî||53||4
|-
|Lema_bi_almaniya_navendî_ya_rojhilat||53||8
|-
|Lema_bi_sûdovî||52||4
|-
|Lema_bi_çepangî||52||4
|-
|Lema_bi_buduxî||52||3
|-
|Lema_bi_îsnagî||51||5
|-
|Lema_bi_amazîxiya_fasî||51||6
|-
|Lema_bi_ohloniya_başûr||51||7
|-
|Lema_bi_kîmaragangî||50||1
|-
|Lema_bi_gîlekî||50||7
|-
|Lema_bi_erebiya_tunusî||50||7
|-
|Lema_bi_lekî||49||6
|-
|Lema_bi_karaîmî||49||5
|-
|Lema_bi_gamîlaraayî||49||5
|-
|Lema_bi_tayî_nüa||49||5
|-
|Lema_bi_karaxanîdî||48||6
|-
|Lema_bi_sotoyiya_bakur||48||3
|-
|Lema_bi_kreyoliya_seyşelî||47||3
|-
|Lema_bi_tagal_murutî||47||1
|-
|Lema_bi_tofalarî||47||6
|-
|Lema_bi_swabî||47||5
|-
|Lema_bi_palawî||47||7
|-
|Lema_bi_wiradhurî||46||6
|-
|Lema_bi_çoktawî||46||7
|-
|Lema_bi_tigreyî||46||3
|-
|Lema_bi_îvatanî||46||4
|-
|Lema_bi_fatalukuyî||46||3
|-
|Lema_bi_romaniya_kalo_fînî||46||5
|-
|Lema_bi_pîtkarnî-norfolkî||46||6
|-
|Lema_bi_fenîkî||45||3
|-
|Lema_bi_kitubayî||45||4
|-
|Lema_bi_marwarî||44||2
|-
|Lema_bi_warlpirî||44||4
|-
|Lema_bi_zuniyî||44||4
|-
|Lema_bi_kriya_bejayî||44||5
|-
|Lema_bi_bontociya_rojhilatî||44||3
|-
|Lema_bi_nupeyî||44||4
|-
|Lema_bi_yonagunî||44||5
|-
|Lema_bi_atîkamekwî||44||3
|-
|Lema_bi_dupaningan_agtayî||44||5
|-
|Lema_bi_xantî||43||3
|-
|Lema_bi_daurî||43||3
|-
|Lema_bi_rarotongî||43||3
|-
|Lema_bi_abenakî||43||4
|-
|Lema_bi_atong_(Hindistan)||43||5
|-
|Lema_bi_osageyî||42||5
|-
|Lema_bi_amîs||42||5
|-
|Lema_bi_semaî||42||3
|-
|Lema_bi_marşalî||42||5
|-
|Lema_bi_madurayî||41||4
|-
|Lema_bi_sêriyî||41||3
|-
|Lema_bi_mohawkî||41||5
|-
|Lema_bi_hîrî_motuyî||40||5
|-
|Lema_bi_paîwanî||40||5
|-
|Lema_bi_koreyiya_navîn||40||6
|-
|Lema_bi_kunigamî||40||7
|-
|Lema_bi_amuzgoyî||40||5
|-
|Lema_bi_proto-hindûewropî||40||6
|-
|Lema_bi_tzotzîlî||39||3
|-
|Lema_bi_kalingayiya_başûrî||39||3
|-
|Lema_bi_sebopî||39||1
|-
|Lema_bi_ûrûmî||39||5
|-
|Lema_bi_khinalugî||39||4
|-
|Lema_bi_pijînî||38||5
|-
|Lema_bi_farisiya_kevn||38||5
|-
|Lema_bi_sangoyî||38||4
|-
|Lema_bi_tàyî||38||4
|-
|Lema_bi_koryakî||38||3
|-
|Lema_bi_megleno-romanyayî||37||4
|-
|Lema_bi_ambonezî-malezî||37||6
|-
|Lema_bi_masayî||37||1
|-
|Lema_bi_bahnarî||37||4
|-
|Lema_bi_makasaeyî||37||3
|-
|Lema_bi_magahî||37||3
|-
|Lema_bi_orokî||37||3
|-
|Lema_bi_dinkayî||37||3
|-
|Lema_bi_slovînsî||37||4
|-
|Lema_bi_livvî||36||4
|-
|Lema_bi_maithilî||36||3
|-
|Lema_bi_nahwatliya_navendî||36||3
|-
|Lema_bi_teoçewî||36||5
|-
|Lema_bi_wutunhuayî||36||5
|-
|Lema_bi_tûpiya_kevn||35||4
|-
|Lema_bi_kreyoliya_antîlleyî||35||3
|-
|Lema_bi_lubuagan_kalingayî||35||2
|-
|Lema_bi_ketî||35||2
|-
|Lema_bi_purepeçayî||35||3
|-
|Lema_bi_kamberayî||35||3
|-
|Lema_bi_bororoyî||35||2
|-
|Lema_bi_romaniya_vlaks||35||4
|-
|Lema_bi_yamî||35||1
|-
|Lema_bi_erebiya_cezayirî||35||5
|-
|Lema_bi_brahuiyî||34||6
|-
|Lema_bi_çinook_jargonî||34||4
|-
|Lema_bi_çavacanoyî||34||4
|-
|Lema_bi_tidoreyî||34||5
|-
|Lema_bi_waigalî||34||9
|-
|Lema_bi_nganasanî||34||1
|-
|Lema_bi_kamkata-viriyî||34||9
|-
|Lema_bi_galoyî||34||4
|-
|Lema_bi_kinaray-ayî||34||6
|-
|Lema_bi_yûnaniya_mîkenî||33||6
|-
|Lema_bi_tedim_çinî||33||5
|-
|Lema_bi_udiheyî||33||4
|-
|Lema_bi_frankoniya_rhine||33||3
|-
|Lema_bi_tuvalûyî||33||4
|-
|Lema_bi_îbanagî||33||7
|-
|Lema_bi_aşkunî||32||7
|-
|Lema_bi_çakmayî||32||2
|-
|Lema_bi_tsongayî||32||2
|-
|Lema_bi_pite_samî||32||5
|-
|Lema_bi_iştihardî||32||4
|-
|Lema_bi_k'içe'||32||4
|-
|Lema_bi_hirî_motuyî||31||4
|-
|Lema_bi_fiji_hindiyî||31||4
|-
|Lema_bi_oroqenî||31||4
|-
|Lema_bi_etrûskî||30||4
|-
|Lema_bi_îsthmus_zapotekî||30||2
|-
|Lema_bi_blakfotî||30||3
|-
|Lema_bi_poloniya_kevn||30||4
|-
|Lema_bi_sonxayî||30||1
|-
|Lema_bi_lisuyî||29||2
|-
|Lema_bi_kanuriyî||29||2
|-
|Lema_bi_bataktobayî||29||4
|-
|Lema_bi_umbunduyî||29||5
|-
|Lema_bi_yaeyamayî||29||6
|-
|Lema_bi_arapaho||29||4
|-
|Lema_bi_boleyî||29||1
|-
|Lema_bi_komançî||29||3
|-
|Lema_bi_tuwali_ifugaoyî||29||3
|-
|Lema_bi_vendayî||28||4
|-
|Lema_bi_krioyî||28||6
|-
|Lema_bi_uab_meto||28||3
|-
|Lema_bi_yagarayî||28||4
|-
|Lema_bi_zouyî||28||5
|-
|Lema_bi_tatî||27||1
|-
|Lema_bi_amamî-oşîmayiya_başûrî||27||5
|-
|Lema_bi_isanî||27||6
|-
|Lema_bi_îgalayî||27||3
|-
|Lema_bi_darkinjungî||27||1
|-
|Lema_bi_kvenî||27||4
|-
|Lema_bi_çaxatayî||26||4
|-
|Lema_bi_oyratiya_nivîsî||26||6
|-
|Lema_bi_garîfunayî||26||3
|-
|Lema_bi_altayiya_bakurî||26||4
|-
|Lema_bi_tiwî||26||1
|-
|Lema_bi_meänkiyelî||26||5
|-
|Lema_bi_mandinkayî||26||3
|-
|Lema_bi_yoronî||26||4
|-
|Lema_bi_dena'inayî||26||2
|-
|Lema_bi_halkomelemî||25||3
|-
|Lema_bi_amamî-oşimayiya_bakurî||25||6
|-
|Lema_bi_kriolî||25||3
|-
|Lema_bi_kavalanî||25||2
|-
|Lema_bi_ulçî||25||2
|-
|Lema_bi_hadzayî||25||5
|-
|Lema_bi_jarawa||25||2
|-
|Lema_bi_dogrîbî||25||2
|-
|Lema_bi_pîrahayî||25||3
|-
|Lema_bi_faliskanî||25||7
|-
|Lema_bi_hinukhî||24||3
|-
|Lema_bi_malecite-passamaquoddyî||24||1
|-
|Lema_bi_manipurî||24||3
|-
|Lema_bi_tangutî||24||3
|-
|Lema_bi_tarokoyî||24||1
|-
|Lema_bi_khasiyî||24||3
|-
|Lema_bi_holendiya_kevn||24||5
|-
|Lema_bi_tabaruyî||24||4
|-
|Lema_bi_rungusî||24||1
|-
|Lema_bi_yurokî||24||1
|-
|Lema_bi_negidalî||23||3
|-
|Lema_bi_îrlendiya_navîn||23||3
|-
|Lema_bi_gorontaloyî||23||4
|-
|Lema_bi_tuluyî||23||2
|-
|Lema_bi_oroçî||23||3
|-
|Lema_bi_nîasî||23||5
|-
|Lema_bi_saekî||22||3
|-
|Lema_bi_biatah_bidayuhî||22||4
|-
|Lema_bi_nottoway-meherrînî||22||3
|-
|Lema_bi_katawbayî||22||2
|-
|Lema_bi_haryanvî||22||2
|-
|Lema_bi_timugon_murutî||22||1
|-
|Lema_bi_îtelmenî||22||2
|-
|Lema_bi_almaniya_jêrîn_a_navîn||22||4
|-
|Lema_bi_xîkarîyayî||22||3
|-
|Lema_bi_yaoyî||22||3
|-
|Lema_bi_oki-no-erabu||21||4
|-
|Lema_bi_jurçenî||21||3
|-
|Lema_bi_bununî||21||3
|-
|Lema_bi_nambasiya_mezin||21||4
|-
|Lema_bi_kunayî||21||3
|-
|Lema_bi_ûbîkî||21||4
|-
|Lema_bi_manîpûriya_bîşnûpriyayî||21||2
|-
|Lema_bi_alutor||21||2
|-
|Lema_bi_nyungayî||21||1
|-
|Lema_bi_nandî||21||1
|-
|Lema_bi_nanticokeyî||21||1
|-
|Lema_bi_şawî||20||3
|-
|Lema_bi_umbriyî||20||4
|-
|Lema_bi_kikaiyî||20||4
|-
|Lema_bi_pa'o_karen||20||3
|-
|Lema_bi_ǃkungî||20||3
|-
|Lema_bi_neo-aramiya_rojavayî||20||2
|-
|Lema_bi_karokî||20||1
|-
|Lema_bi_arawak||20||1
|-
|Lema_bi_kamtayî||20||5
|-
|Lema_bi_îzonî||20||3
|-
|Lema_bi_krymçakî||20||3
|-
|Lema_bi_mohegan-pequotî||20||1
|-
|Lema_bi_lundayehî||20||3
|-
|Lema_bi_kanakanabuyî||20||2
|-
|Lema_bi_nîwî||20||3
|-
|Lema_bi_walîsî||20||2
|-
|Lema_bi_ermeniya_navîn||19||2
|-
|Lema_bi_bezhtayî||19||2
|-
|Lema_bi_yukaghiriya_bakurî||19||2
|-
|Lema_bi_guugu_yimidhirrî||19||1
|-
|Lema_bi_hmongiya_hêşîn||19||2
|-
|Lema_bi_lotudî||19||1
|-
|Lema_bi_klamatî-modokî||19||3
|-
|Lema_bi_falayî||19||3
|-
|Lema_bi_ter_samî||19||2
|-
|Lema_bi_naxî||19||2
|-
|Lema_bi_gurciya_kevn||18||3
|-
|Lema_bi_çîrîkawayî||18||2
|-
|Lema_bi_tzutucîlî||18||3
|-
|Lema_bi_tbolî||18||3
|-
|Lema_bi_asamiya_zû||18||4
|-
|Lema_bi_haidayî||18||3
|-
|Lema_bi_taiya_başûrî||18||5
|-
|Lema_bi_oskanî||18||4
|-
|Lema_bi_şoşonî||18||3
|-
|Lema_bi_morî_bawah||18||3
|-
|Lema_bi_ume_samî||18||5
|-
|Lema_bi_partî||18||4
|-
|Lema_bi_gayî||18||5
|-
|Lema_bi_nahwatliya_huastecaya_navendî||18||2
|-
|Lema_bi_buruşaskiyî||18||3
|-
|Lema_bi_kreyoliya_belizeyî||17||5
|-
|Lema_bi_nahwatliya_mekayapan||17||2
|-
|Lema_bi_kambaatayî||17||2
|-
|Lema_bi_kankanayiya_bakurî||17||4
|-
|Lema_bi_potawatomî||17||1
|-
|Lema_bi_aguarunayî||17||1
|-
|Lema_bi_bisayayiya_bruneyî||17||3
|-
|Lema_bi_çamiya_rojavayî||17||4
|-
|Lema_bi_noviyalî||17||4
|-
|Lema_bi_kabiyeyî||17||2
|-
|Lema_bi_toku-no-şîmayî||17||4
|-
|Lema_bi_çîniya_klasîk||17||2
|-
|Lema_bi_ç'orti'||16||3
|-
|Lema_bi_pawnî||16||2
|-
|Lema_bi_waxiyî||16||4
|-
|Lema_bi_rutulî||16||3
|-
|Lema_bi_ludianî||16||2
|-
|Lema_bi_gondiyî||16||2
|-
|Lema_bi_lîşana_denî||16||2
|-
|Lema_bi_puyumayî||16||1
|-
|Lema_bi_bejayî||16||4
|-
|Lema_bi_saaroayî||16||1
|-
|Lema_bi_bassayî||16||2
|-
|Lema_bi_mongoliya_klasîk||16||3
|-
|Lema_bi_krîkî||16||3
|-
|Lema_bi_sasakî||16||2
|-
|Lema_bi_mulamî||16||3
|-
|Lema_bi_aytonî||16||3
|-
|Lema_bi_nootkayî||16||5
|-
|Lema_bi_aarî||15||2
|-
|Lema_bi_engayî||15||3
|-
|Lema_bi_cahuillayî||15||1
|-
|Lema_bi_hunzibî||15||2
|-
|Lema_bi_garoyî||15||3
|-
|Lema_bi_hlaiyî||15||3
|-
|Lema_bi_nobiinî||15||2
|-
|Lema_bi_spaniya_kevn||15||3
|-
|Lema_bi_amayî||15||1
|-
|Lema_bi_otomiya_mezquital||15||1
|-
|Lema_bi_leonîzî||15||1
|-
|Lema_bi_holendiya_navîn||15||2
|-
|Lema_bi_awadhî||15||3
|-
|Lema_bi_ottawayî||15||2
|-
|Lema_bi_baxterî||15||3
|-
|Lema_bi_bembayî||14||2
|-
|Lema_bi_proto-îranî||14||1
|-
|Lema_bi_diyirbalî||14||3
|-
|Lema_bi_kristangî||14||3
|-
|Lema_bi_çolî||14||2
|-
|Lema_bi_yûnaniya_mariupol||14||2
|-
|Lema_bi_tangsayî||14||4
|-
|Lema_bi_kaqçikelî||14||2
|-
|Lema_bi_kreyoliya_guinea-bissau||14||2
|-
|Lema_bi_malayiya_baba||14||2
|-
|Lema_bi_saisiyatî||14||1
|-
|Lema_bi_asî||14||1
|-
|Lema_bi_ladakhiyî||14||1
|-
|Lema_bi_adnyamatanhayî||14||2
|-
|Lema_bi_tooroyî||14||2
|-
|Lema_bi_apalayî||14||1
|-
|Lema_bi_powhatanî||14||1
|-
|Lema_bi_bûrgûndî||14||2
|-
|Lema_bi_sakizayayî||14||1
|-
|Lema_bi_tokelawî||14||3
|-
|Lema_bi_weylsiya_navîn||14||3
|-
|Lema_bi_godoberî||14||1
|-
|Lema_bi_erebiya_sanaanî||14||4
|-
|Lema_bi_kansayî||14||2
|-
|Lema_bi_ahtnayî||14||1
|-
|Lema_bi_batakiya_karo||14||2
|-
|Lema_bi_tatiya_cihû||14||2
|-
|Lema_bi_aşanînkayî||14||2
|-
|Lema_bi_seraikî||13||5
|-
|Lema_bi_proto-hindûîranî||13||1
|-
|Lema_bi_nhêngatûyî||13||4
|-
|Lema_bi_sîkkîmî||13||2
|-
|Lema_bi_înterlîngue||13||3
|-
|Lema_bi_edoyî||13||3
|-
|Lema_bi_foksî||13||2
|-
|Lema_bi_komoriya_ndzwanî||13||5
|-
|Lema_bi_batekî||13||1
|-
|Lema_bi_binukid||13||2
|-
|Lema_bi_skanî||13||2
|-
|Lema_bi_rabhayî||13||2
|-
|Lema_bi_tsezî||13||2
|-
|Lema_bi_solonî||13||2
|-
|Lema_bi_gooniyandiyî||13||1
|-
|Lema_bi_romaniya_balkanî||13||2
|-
|Lema_bi_poitevin-saintongeaisî||13||2
|-
|Lema_bi_marquesana_başûr||13||2
|-
|Lema_bi_tsouyî||13||1
|-
|Lema_bi_yolayî||13||2
|-
|Lema_bi_futunî||13||2
|-
|Lema_bi_munsî||13||2
|-
|Lema_bi_massaçusettî||13||1
|-
|Lema_bi_sabah_bisayayî||13||1
|-
|Lema_bi_prasunî||13||3
|-
|Lema_bi_klallamî||13||3
|-
|Lema_bi_thaoyî||13||1
|-
|Lema_bi_lojbanî||13||4
|-
|Lema_bi_nuerî||13||1
|-
|Lema_bi_lhao_voyî||12||3
|-
|Lema_bi_huişui_hmongiya_navendî||12||3
|-
|Lema_bi_luriya_bakurî||12||3
|-
|Lema_bi_tirurayî||12||2
|-
|Lema_bi_khünî||12||4
|-
|Lema_bi_nafaanrayî||12||3
|-
|Lema_bi_zapotekiya_zoogoço||12||1
|-
|Lema_bi_sukumayî||12||3
|-
|Lema_bi_romaniya_baltîkî||12||1
|-
|Lema_bi_nahwatliya_bakurê_puebla||12||2
|-
|Lema_bi_nahwatliya_tetelcingo||12||2
|-
|Lema_bi_erebiya_necdî||12||4
|-
|Lema_bi_biharî||12||2
|-
|Lema_bi_car_nicobareseyî||12||3
|-
|Lema_bi_mwalî_komorî||12||4
|-
|Lema_bi_erebiya_sudanî||12||2
|-
|Lema_bi_mayayiya_mopanî||11||2
|-
|Lema_bi_yaquî||11||2
|-
|Lema_bi_ponpeyî||11||2
|-
|Lema_bi_kwak'walayî||11||3
|-
|Lema_bi_wolioyî||11||3
|-
|Lema_bi_narunggayî||11||1
|-
|Lema_bi_aghulî||11||2
|-
|Lema_bi_doteliyî||11||2
|-
|Lema_bi_yakkhayî||11||3
|-
|Lema_bi_puebla_nahuatliya_çiyayî||11||2
|-
|Lema_bi_yuguriya_rojhilat||11||1
|-
|Lema_bi_tonkawayî||11||2
|-
|Lema_bi_harsusiyî||11||1
|-
|Lema_bi_mandarî||11||2
|-
|Lema_bi_mazahuayiya_navendî||11||1
|-
|Lema_bi_îfèî||11||2
|-
|Lema_bi_limos_kalingayî||11||1
|-
|Lema_bi_şuswapî||11||2
|-
|Lema_bi_hidatsayî||11||2
|-
|Lema_bi_baureyî||11||2
|-
|Lema_bi_wardamanî||11||1
|-
|Lema_bi_kîsî||11||2
|-
|Lema_bi_erebiya_qibrisî||11||4
|-
|Lema_bi_tindî||11||1
|-
|Lema_bi_swêdiya_kevn||11||4
|-
|Lema_bi_havasupaî-walapaî-yavapaî||11||2
|-
|Lema_bi_darûkî||11||1
|-
|Lema_bi_waujayî||11||2
|-
|Lema_bi_lampungî||11||2
|-
|Lema_bi_areareyî||11||3
|-
|Lema_bi_açolî||11||1
|-
|Lema_bi_komiya_kamerûnî||10||2
|-
|Lema_bi_ngwoyî||10||1
|-
|Lema_bi_abînomnî||10||2
|-
|Lema_bi_deoriyî||10||2
|-
|Lema_bi_şipibo-coniboyî||10||2
|-
|Lema_bi_lolopoyî||10||2
|-
|Lema_bi_kuapawî||10||1
|-
|Lema_bi_proto-norsî||10||4
|-
|Lema_bi_nukunuyî||10||2
|-
|Lema_bi_kottî||10||2
|-
|Lema_bi_khvarşiyî||10||1
|-
|Lema_bi_ngajuyî||10||2
|-
|Lema_bi_yogadî||10||2
|-
|Lema_bi_rawangî||10||3
|-
|Lema_bi_mayoyî||10||3
|-
|Lema_bi_ndebeliya_bakurî||10||2
|-
|Lema_bi_koreyiya_kevn||10||3
|-
|Lema_bi_fonî||10||1
|-
|Lema_bi_abaknonî||10||1
|-
|Lema_bi_radeyî||10||2
|-
|Lema_bi_khalajî||10||3
|-
|Lema_bi_turoyo||10||1
|-
|Lema_bi_naga_pidginî||10||2
|-
|Lema_bi_kriya_rojhilat_ya_bakurî||10||1
|-
|Lema_bi_çekiya_kevn||10||3
|-
|Lema_bi_abauyî||10||1
|-
|Lema_bi_marquesana_bakur||10||1
|-
|Lema_bi_samiya_akkalayî||10||2
|-
|Lema_bi_mongghulî||10||1
|-
|Lema_bi_galîbî_karîbî||10||2
|-
|Lema_bi_torangî||10||1
|-
|Lema_bi_rendilleyî||10||1
|-
|Lema_bi_omaha-poncayî||10||2
|-
|Lema_bi_kaloyî||10||2
|-
|Lema_bi_romaniya_sinte||10||2
|-
|Lema_bi_lepçayî||10||1
|-
|Lema_bi_gunî||10||3
|-
|Lema_bi_akatekî||10||2
|-
|Lema_bi_salarî||10||1
|-
|Lema_bi_erebiya_başûrî_ya_kevn||10||1
|-
|Lema_bi_paumarî||10||1
|-
|Lema_bi_yapî||10||1
|-
|Lema_bi_ngunawalî||10||3
|-
|Lema_bi_kadazaniya_beravî||9||2
|-
|Lema_bi_fangî_(Bantu)||9||3
|-
|Lema_bi_bodoyî_(Hindistan)||9||2
|-
|Lema_bi_xârâcùù||9||1
|-
|Lema_bi_crowî||9||3
|-
|Lema_bi_kanelayî||9||1
|-
|Lema_bi_temiarî||9||1
|-
|Lema_bi_khumi_çinî||9||1
|-
|Lema_bi_tsakhurî||9||2
|-
|Lema_bi_meryamî||9||1
|-
|Lema_bi_tzeltalî||9||1
|-
|Lema_bi_kotavayî||9||2
|-
|Lema_bi_mangghuerî||9||1
|-
|Lema_bi_xavanteyî||9||2
|-
|Lema_bi_kreyoliya_fransî_ya_karipúna||9||1
|-
|Lema_bi_aasayî||9||2
|-
|Lema_bi_gusiiyî||9||2
|-
|Lema_bi_efateyiya_başûr||9||3
|-
|Lema_bi_nlûyî||9||1
|-
|Lema_bi_gaulisî||9||2
|-
|Lema_bi_hereroyî||9||1
|-
|Lema_bi_algonquinî||9||1
|-
|Lema_bi_cayugayî||9||2
|-
|Lema_bi_înesenyoyî||9||1
|-
|Lema_bi_sangisarî||9||1
|-
|Lema_bi_mingoyî||9||1
|-
|Lema_bi_rukaiyî||9||1
|-
|Lema_bi_tuteloyî||9||2
|-
|Lema_bi_luiseñoyî||9||2
|-
|Lema_bi_mambayî||9||2
|-
|Lema_bi_pumpokolî||9||2
|-
|Lema_bi_karaoyî||9||1
|-
|Lema_bi_tolaiyî||9||2
|-
|Lema_bi_baekceyî||9||1
|-
|Lema_bi_pidgîniya_nîjeryayî||9||3
|-
|Lema_bi_khmuyî||9||2
|-
|Lema_bi_cowlitzî||9||2
|-
|Lema_bi_cuyunonî||9||2
|-
|Lema_bi_vuresî||9||1
|-
|Lema_bi_jehaiyî||8||1
|-
|Lema_bi_banyumasanî||8||2
|-
|Lema_bi_montana_salişî||8||1
|-
|Lema_bi_sierra_miwokiya_başûrî||8||1
|-
|Lema_bi_punîkî||8||3
|-
|Lema_bi_tsakonî||8||1
|-
|Lema_bi_gurindjiyî||8||1
|-
|Lema_bi_krisayî||8||1
|-
|Lema_bi_aohengî||8||1
|-
|Lema_bi_panamintî||8||2
|-
|Lema_bi_ulukwumî||8||2
|-
|Lema_bi_miskitoyî||8||3
|-
|Lema_bi_maçiguengayî||8||1
|-
|Lema_bi_kalaşayî||8||1
|-
|Lema_bi_bukar-sadung_bidayuhî||8||2
|-
|Lema_bi_ndebeliya_başûrî||8||1
|-
|Lema_bi_maquiritarî||8||1
|-
|Lema_bi_masbatenyoyî||8||1
|-
|Lema_bi_tsimşî||8||2
|-
|Lema_bi_gutnişî||8||2
|-
|Lema_bi_tuskarorayî||8||1
|-
|Lema_bi_miwokiya_golî||8||2
|-
|Lema_bi_sarceeyî||8||2
|-
|Lema_bi_zaghawayî||8||2
|-
|Lema_bi_kiliwayî||8||2
|-
|Lema_bi_kamiya_başûrî||8||1
|-
|Lema_bi_belaîtî||8||3
|-
|Lema_bi_prakrîtiya_aşokanît||8||4
|-
|Lema_bi_kwanyamayî||8||1
|-
|Lema_bi_ndongayî||8||1
|-
|Lema_bi_îraqwî||8||1
|-
|Lema_bi_grîkoyî||8||1
|-
|Lema_bi_penobskotî||8||1
|-
|Lema_bi_q'eqçiyî||8||2
|-
|Lema_bi_ojibweyiya_bakurî||8||1
|-
|Lema_bi_kayapó||8||1
|-
|Lema_bi_oneidayî||8||1
|-
|Lema_bi_katuyiya_rojhilatî||8||2
|-
|Lema_bi_nahwatliya_huastekaya_rojhilatî||8||1
|-
|Lema_bi_lawayiya_rojhilatî||8||1
|-
|Lema_bi_luba-kasayî||7||1
|-
|Lema_bi_barngarla||7||1
|-
|Lema_bi_açuarî||7||1
|-
|Lema_bi_tsafikiyî||7||2
|-
|Lema_bi_gwiçinî||7||1
|-
|Lema_bi_urak_lawoi'||7||2
|-
|Lema_bi_tarahumarayiya_navendî||7||2
|-
|Lema_bi_bagvalalî||7||1
|-
|Lema_bi_haniyî||7||2
|-
|Lema_bi_sekanî||7||1
|-
|Lema_bi_yûnaniya_kapadokyayî||7||1
|-
|Lema_bi_wambayayî||7||1
|-
|Lema_bi_lîdyayî||7||2
|-
|Lema_bi_amanabî||7||2
|-
|Lema_bi_hänî||7||1
|-
|Lema_bi_çadongî||7||2
|-
|Lema_bi_arakî||7||1
|-
|Lema_bi_kaşayayî||7||1
|-
|Lema_bi_adangmeyî||7||3
|-
|Lema_bi_alawayî||7||1
|-
|Lema_bi_mehriyî||7||1
|-
|Lema_bi_temoqî||7||1
|-
|Lema_bi_kusaalî||7||1
|-
|Lema_bi_dhuwalî||7||2
|-
|Lema_bi_parakanã||7||1
|-
|Lema_bi_angorî||7||1
|-
|Lema_bi_wappoyî||7||2
|-
|Lema_bi_ajië||7||1
|-
|Lema_bi_tsimaneyî||7||1
|-
|Lema_bi_basayî||7||2
|-
|Lema_bi_lusîtanî||7||2
|-
|Lema_bi_kreyoliya_guwiyanîsî||7||2
|-
|Lema_bi_apaçiya_deştan||7||1
|-
|Lema_bi_kutenaiyî||7||1
|-
|Lema_bi_danmarkiya_jersey||7||1
|-
|Lema_bi_wastekî||7||1
|-
|Lema_bi_rejangî||7||1
|-
|Lema_bi_dogonî||7||2
|-
|Lema_bi_lorrainî||7||2
|-
|Lema_bi_embalohî||7||1
|-
|Lema_bi_taînoyî||7||3
|-
|Lema_bi_kriya_rojhilat_ya_başûrî||7||1
|-
|Lema_bi_nyolî_(Uganda)||7||1
|-
|Lema_bi_danmarkiya_kevn||7||2
|-
|Lema_bi_axvaxî||7||1
|-
|Lema_bi_dogriyî||7||2
|-
|Lema_bi_kokborokî||7||2
|-
|Lema_bi_hutterisçî||7||2
|-
|Lema_bi_gullahî||7||2
|-
|Lema_bi_comoxî||7||1
|-
|Lema_bi_biseniyî||7||2
|-
|Lema_bi_îtaliya_cihû||7||2
|-
|Lema_bi_romaniya_karpatyayî||7||1
|-
|Lema_bi_gottscheerîşî||7||2
|-
|Lema_bi_tutongî||7||3
|-
|Lema_bi_nahwatliya_guerrero||7||1
|-
|Lema_bi_malayiya_navendî||7||2
|-
|Lema_bi_nubiya_kevn||7||2
|-
|Lema_bi_kuwileytî||7||2
|-
|Lema_bi_gelaoyiya_spî||7||1
|-
|Lema_bi_ojibweyiya_rojavayî||7||1
|-
|Lema_bi_gayoyî||7||2
|-
|Lema_bi_romaniya_welşî||7||2
|-
|Lema_bi_nahwatliya_huastecaya_rojavayî||7||1
|-
|Lema_bi_bakungî||7||1
|-
|Lema_bi_loziyî||7||1
|-
|Lema_bi_yindcîbarndî||7||1
|-
|Lema_bi_krytsî||7||3
|-
|Lema_bi_palueyî||7||1
|-
|Lema_bi_tahltanî||7||2
|-
|Lema_bi_bay_miwokî||7||2
|-
|Lema_bi_maiayî||7||1
|-
|Lema_bi_besisî||7||2
|-
|Lema_bi_mangarevanî||7||2
|-
|Lema_bi_naromî||6||2
|-
|Lema_bi_çîpewî||6||1
|-
|Lema_bi_biloxî||6||1
|-
|Lema_bi_kendayanî||6||1
|-
|Lema_bi_khowarî||6||1
|-
|Lema_bi_diwalayî||6||1
|-
|Lema_bi_şampanyî||6||2
|-
|Lema_bi_guaraniyiya_paraguayanî||6||3
|-
|Lema_bi_dusnerî||6||1
|-
|Lema_bi_tuaregî||6||1
|-
|Lema_bi_pamonayî||6||2
|-
|Lema_bi_samoyî||6||1
|-
|Lema_bi_talî||6||2
|-
|Lema_bi_yuçî||6||2
|-
|Lema_bi_manggarayî||6||2
|-
|Lema_bi_batakiya_simalungun||6||2
|-
|Lema_bi_totonakiya_çiyayî||6||1
|-
|Lema_bi_oyratayî||6||1
|-
|Lema_bi_balantak||6||2
|-
|Lema_bi_baruga||6||1
|-
|Lema_bi_karekareyî||6||2
|-
|Lema_bi_zapotekiya_yatzaçî||6||1
|-
|Lema_bi_okodiayî||6||2
|-
|Lema_bi_nde-nsele-nta||6||1
|-
|Lema_bi_moçikayî||6||2
|-
|Lema_bi_iriga_bikolanoyî||6||2
|-
|Lema_bi_kirikeyî||6||2
|-
|Lema_bi_totonakiya_papantla||6||1
|-
|Lema_bi_xerenteyî||6||1
|-
|Lema_bi_lîkî||6||3
|-
|Lema_bi_mandaicî||6||1
|-
|Lema_bi_suyayî||6||1
|-
|Lema_bi_ozumacin_çinantecî||6||1
|-
|Lema_bi_tenharimî||6||1
|-
|Lema_bi_tillamookî||6||2
|-
|Lema_bi_defakayî||6||2
|-
|Lema_bi_wayuuyî||6||1
|-
|Lema_bi_japoniya_kevn||6||1
|-
|Lema_bi_limbuyî||6||1
|-
|Lema_bi_efikî||6||2
|-
|Lema_bi_mêkêoyî||6||1
|-
|Lema_bi_erebiya_lîbyayî||6||1
|-
|Lema_bi_phuthî||6||2
|-
|Lema_bi_kankanaeyî||6||1
|-
|Lema_bi_karitiyanayî||6||1
|-
|Lema_bi_abûngî||6||2
|-
|Lema_bi_rotumanî||6||2
|-
|Lema_bi_ngiyambaayî||6||1
|-
|Lema_bi_mîçîfî||6||1
|-
|Lema_bi_kuiyî_(Hindistan)||6||1
|-
|Lema_bi_bicolanoyiya_northern_catanduanes||6||1
|-
|Lema_bi_zarmayî||6||2
|-
|Lema_bi_palawanoyî||6||1
|-
|Lema_bi_luwiyanî||6||2
|-
|Lema_bi_koyukonî||6||1
|-
|Lema_bi_makhuwayî||6||1
|-
|Lema_bi_frankiya_rojhilatî||6||1
|-
|Lema_bi_bruyiya_rojhilatî||6||1
|-
|Lema_bi_kimbunduyî||6||2
|-
|Lema_bi_sabaeanî||6||2
|-
|Lema_bi_tagbanwayiya_kalamî||6||2
|-
|Lema_bi_tambunan_dusunî||6||1
|-
|Lema_bi_mongoliya_navîn||6||2
|-
|Lema_bi_açangî||6||2
|-
|Lema_bi_bu-nao_bunuyî||6||1
|-
|Lema_bi_çewongî||6||1
|-
|Lema_bi_mbabaramî||6||1
|-
|Lema_bi_îjoyiya_başûr-rojhilat||6||2
|-
|Lema_bi_assînîboyî||6||1
|-
|Lema_bi_nzadî||6||1
|-
|Lema_bi_îtawitî||6||1
|-
|Lema_bi_lavukaleveyî||6||2
|-
|Lema_bi_badeyî||6||1
|-
|Lema_bi_takyayî||6||1
|-
|Lema_bi_aneme_wakeyî||6||1
|-
|Lema_bi_urubú-kaaporî||6||1
|-
|Lema_bi_çiçonyi-çidzihana-çikauma||6||2
|-
|Lema_bi_ida'anî||6||1
|-
|Lema_bi_bolinaoyî||6||1
|-
|Lema_bi_lawanganî||6||1
|-
|Lema_bi_kaççiyî||6||1
|-
|Lema_bi_nga_layî||6||2
|-
|Lema_bi_angaatahayî||6||1
|-
|Lema_bi_firîgî||6||1
|-
|Lema_bi_simeulueyî||6||1
|-
|Lema_bi_martuthunirayî||6||1
|-
|Lema_bi_guajajarayî||6||1
|-
|Lema_bi_tabasco_çontalî||6||1
|-
|Lema_bi_makyaniya_rojava||6||2
|-
|Lema_bi_îbaniyî||6||2
|-
|Lema_bi_qiangiya_bakurî||6||1
|-
|Lema_bi_jakaltekî||6||2
|-
|Lema_bi_torwalî||5||1
|-
|Lema_bi_lêtîyî||5||1
|-
|Lema_bi_şinayî||5||1
|-
|Lema_bi_gwereyî||5||1
|-
|Lema_bi_casiguran_dumagat_agtayî||5||1
|-
|Lema_bi_batakiya_mandaîlîng||5||2
|-
|Lema_bi_punan_tubuyî||5||1
|-
|Lema_bi_okanaganî||5||1
|-
|Lema_bi_gerkayî||5||2
|-
|Lema_bi_matlatzincayî||5||2
|-
|Lema_bi_kiowayî||5||2
|-
|Lema_bi_koasatî||5||1
|-
|Lema_bi_kamasauyî||5||1
|-
|Lema_bi_erebiya_endulusî||5||1
|-
|Lema_bi_maleku_jaikayî||5||1
|-
|Lema_bi_a'ou||5||1
|-
|Lema_bi_îlamî||5||2
|-
|Lema_bi_bonanî||5||1
|-
|Lema_bi_îrlendiya_prîmîtîv||5||1
|-
|Lema_bi_masabayî||5||1
|-
|Lema_bi_supyireyî||5||1
|-
|Lema_bi_narragansettî||5||1
|-
|Lema_bi_caddoyî||5||1
|-
|Lema_bi_pará_arárayî||5||1
|-
|Lema_bi_angloromanî||5||1
|-
|Lema_bi_urarinayî||5||2
|-
|Lema_bi_mixteciya_yosondúa||5||1
|-
|Lema_bi_popolocayiya_san_juan_atzingo||5||1
|-
|Lema_bi_surigaononî||5||1
|-
|Lema_bi_komodoyî||5||1
|-
|Lema_bi_kaduglî||5||1
|-
|Lema_bi_tunjungî||5||1
|-
|Lema_bi_san_pedro_amuzgos_amuzgo||5||1
|-
|Lema_bi_pazehî||5||1
|-
|Lema_bi_uldemeyî||5||2
|-
|Lema_bi_sekapanî||5||1
|-
|Lema_bi_nkem-nkumî||5||1
|-
|Lema_bi_warrayî||5||1
|-
|Lema_bi_îsekiriyî||5||2
|-
|Lema_bi_tobilungî||5||1
|-
|Lema_bi_bandjalangî||5||1
|-
|Lema_bi_samayiya_başûrî||5||2
|-
|Lema_bi_hanunooyî||5||2
|-
|Lema_bi_engenniyî||5||1
|-
|Lema_bi_saramakkanî||5||1
|-
|Lema_bi_damariya_rojhilat||5||1
|-
|Lema_bi_jangkangî||5||1
|-
|Lema_bi_kîlîvîlayî||5||1
|-
|Lema_bi_tae'||5||1
|-
|Lema_bi_sandaweyî||5||1
|-
|Lema_bi_harariyî||5||1
|-
|Lema_bi_hovonganî||5||1
|-
|Lema_bi_popolucayiya_sayula||5||1
|-
|Lema_bi_bokarî||5||1
|-
|Lema_bi_kensiuyî||5||1
|-
|Lema_bi_dibabawon_manoboyî||5||1
|-
|Lema_bi_tocantins_asurînî||5||1
|-
|Lema_bi_şawneeyî||5||1
|-
|Lema_bi_butuanonî||5||2
|-
|Lema_bi_jutişî||5||2
|-
|Lema_bi_tagabawayî||5||1
|-
|Lema_bi_sambalî||5||1
|-
|Lema_bi_miyayî||5||1
|-
|Lema_bi_çeke_holoyî||5||1
|-
|Lema_bi_kuikúroyî||5||1
|-
|Lema_bi_hupayî||5||2
|-
|Lema_bi_abanyomî||5||2
|-
|Lema_bi_muak_sa-aakî||5||1
|-
|Lema_bi_bontociya_navendî||5||1
|-
|Lema_bi_duwaiyî||5||1
|-
|Lema_bi_hupdëî||5||1
|-
|Lema_bi_çopiyî||5||1
|-
|Lema_bi_muyangî||5||2
|-
|Lema_bi_agtayiya_kagayanî_ya_navendî||5||1
|-
|Lema_bi_sangirî||5||2
|-
|Lema_bi_kreyoliya_holendî_ya_berbiceyî||5||2
|-
|Lema_bi_yukaghiriya_başûrî||5||1
|-
|Lema_bi_zapotekiya_çiçicapan||5||1
|-
|Lema_bi_atesoyî||5||1
|-
|Lema_bi_dieriyî||5||1
|-
|Lema_bi_mazateciya_çiquihuitlan||5||1
|-
|Lema_bi_şughnî||5||2
|-
|Lema_bi_guwançî||5||1
|-
|Lema_bi_egayî||5||1
|-
|Lema_bi_camsayî||5||2
|-
|Lema_bi_bangî||5||1
|-
|Lema_bi_tajioyî||5||1
|-
|Lema_bi_ngizimî||5||1
|-
|Lema_bi_beothukî||5||2
|-
|Lema_bi_pokangayî||5||1
|-
|Lema_bi_muyuwî||5||1
|-
|Lema_bi_bukîtan||5||2
|-
|Lema_bi_dyulayî||5||1
|-
|Lema_bi_xingú_asuriní||5||1
|-
|Lema_bi_cermayî||5||1
|-
|Lema_bi_takanayî||5||1
|-
|Lema_bi_miamî||5||1
|-
|Lema_bi_epieyî||5||1
|-
|Lema_bi_eseyî||5||1
|-
|Lema_bi_kayahiya_rojavayî||5||2
|-
|Lema_bi_pykobjê||5||1
|-
|Lema_bi_zapotekiya_sierra_de_juarez||5||1
|-
|Lema_bi_dehûyî||5||2
|-
|Lema_bi_bukusuyî||5||1
|-
|Lema_bi_nahwatliya_tlamacazapa||5||1
|-
|Lema_bi_tregamî||5||2
|-
|Lema_bi_capiznonî||5||1
|-
|Lema_bi_pangutaran_samayî||5||1
|-
|Lema_bi_cia-ciayî||5||1
|-
|Lema_bi_erebiya_bahranî||5||1
|-
|Lema_bi_berawanî||5||1
|-
|Lema_bi_mogholî||5||1
|-
|Lema_bi_rennelleseyî||5||1
|-
|Lema_bi_gelaoyiya_sor||5||1
|-
|Lema_bi_badagayî||5||1
|-
|Lema_bi_woiwurrungî||5||1
|-
|Lema_bi_eyakî||5||2
|-
|Lema_bi_awabakal||5||1
|-
|Lema_bi_zoqueyiya_copainala||5||1
|-
|Lema_bi_sumbawayî||5||1
|-
|Lema_bi_goemayî||5||1
|-
|Lema_bi_maxakalî||5||1
|-
|Lema_bi_kakî_aeyî||5||1
|-
|Lema_bi_nez_perceyî||5||2
|-
|Lema_bi_corayî||5||1
|-
|Lema_bi_tapayunayî||5||1
|-
|Lema_bi_senekayî||5||1
|-
|Lema_bi_huaveyî||5||1
|-
|Lema_bi_apinayé||5||1
|-
|Lema_bi_malayiya_pattani||5||2
|-
|Lema_bi_karriyerî||5||1
|-
|Lema_bi_mamî||5||1
|-
|Lema_bi_îbaloiyî||5||1
|-
|Lema_bi_çujî||5||1
|-
|Lema_bi_kuyî||5||2
|-
|Lema_bi_tlahuicayî||5||2
|-
|Lema_bi_sabuyî||5||1
|-
|Lema_bi_cabecarî||5||2
|-
|Lema_bi_kombioyî||5||1
|-
|Lema_bi_krahô||5||1
|-
|Lema_bi_bella_koola||5||1
|-
|Lema_bi_pomoyiya_başûrî||5||1
|-
|Lema_bi_bilbayî||5||1
|-
|Lema_bi_movimayî||5||1
|-
|Lema_bi_lahuyî||5||2
|-
|Lema_bi_komeringî||5||1
|-
|Lema_bi_tuyukayî||5||1
|-
|Lema_bi_tananaya_jêrîn||5||1
|-
|Lema_bi_kreyoliya_portugalî_ya_korlai||5||1
|-
|Lema_bi_mnongiya_navendî||5||1
|-
|Lema_bi_mojaveyî||5||2
|-
|Lema_bi_kaskayî||5||1
|-
|Lema_bi_zaparoyî||5||1
|-
|Lema_bi_munayî||5||2
|-
|Lema_bi_murînpatayî||5||1
|-
|Lema_bi_goguryeoyî||5||1
|-
|Lema_bi_kiwaiyiya_bakur-rojhilat||4||1
|-
|Lema_bi_ebrieyî||4||1
|-
|Lema_bi_tuamotuanî||4||1
|-
|Lema_bi_angevinî||4||1
|-
|Lema_bi_seimatî||4||1
|-
|Lema_bi_huiçolî||4||1
|-
|Lema_bi_betawî||4||1
|-
|Lema_bi_yucunayî||4||1
|-
|Lema_bi_nukak_makuyî||4||1
|-
|Lema_bi_a-pucikwar||4||1
|-
|Lema_bi_nyamwezî||4||1
|-
|Lema_bi_gaamî||4||1
|-
|Lema_bi_obispeñoyî||4||1
|-
|Lema_bi_paicî||4||1
|-
|Lema_bi_luba-katangayî||4||2
|-
|Lema_bi_tyapî||4||2
|-
|Lema_bi_yurutî||4||1
|-
|Lema_bi_kendemî||4||1
|-
|Lema_bi_aukanî||4||1
|-
|Lema_bi_ribunî||4||1
|-
|Lema_bi_laragiayî||4||1
|-
|Lema_bi_wintuyî||4||1
|-
|Lema_bi_woleayî||4||1
|-
|Lema_bi_li’oyî||4||1
|-
|Lema_bi_kîkapûyî||4||1
|-
|Lema_bi_ndalî||4||1
|-
|Lema_bi_hadiyyayî||4||1
|-
|Lema_bi_caşinahuayî||4||1
|-
|Lema_bi_baram_kayanî||4||1
|-
|Lema_bi_ngadhayî||4||1
|-
|Lema_bi_hixkaryanayî||4||1
|-
|Lema_bi_majangî||4||1
|-
|Lema_bi_molbogî||4||2
|-
|Lema_bi_nyankoleyî||4||1
|-
|Lema_bi_îlayî||4||1
|-
|Lema_bi_qiwenyayî||4||1
|-
|Lema_bi_garawayî||4||1
|-
|Lema_bi_dezfuliyî||4||2
|-
|Lema_bi_wayampî||4||1
|-
|Lema_bi_rikbaktsayî||4||1
|-
|Lema_bi_masakarayî||4||1
|-
|Lema_bi_îtzayî||4||1
|-
|Lema_bi_kipsigisî||4||1
|-
|Lema_bi_paipaî||4||2
|-
|Lema_bi_tujiayiya_bakurî||4||2
|-
|Lema_bi_yakîmayî||4||1
|-
|Lema_bi_para_gaviãoyî||4||1
|-
|Lema_bi_maçameyî||4||1
|-
|Lema_bi_bayiya_başûrî||4||1
|-
|Lema_bi_nicobariya_navendî||4||1
|-
|Lema_bi_kubuyî||4||1
|-
|Lema_bi_venturenyoyî||4||2
|-
|Lema_bi_popolucayiya_highland||4||1
|-
|Lema_bi_bintuluyî||4||1
|-
|Lema_bi_bîmayî||4||1
|-
|Lema_bi_nyaturuyî||4||1
|-
|Lema_bi_sogdî||4||1
|-
|Lema_bi_ratahanî||4||2
|-
|Lema_bi_museyî||4||1
|-
|Lema_bi_nahwatliya_mîçoakanê||4||1
|-
|Lema_bi_akîpayiya_rojhilatî||4||1
|-
|Lema_bi_paiuteyiya_bakurî||4||1
|-
|Lema_bi_yaayî||4||1
|-
|Lema_bi_taişanîzî||4||2
|-
|Lema_bi_koreguajeyî||4||1
|-
|Lema_bi_serranoyî||4||2
|-
|Lema_bi_nkonyayî||4||1
|-
|Lema_bi_malilayî||4||1
|-
|Lema_bi_folopayî||4||1
|-
|Lema_bi_kawésqar||4||1
|-
|Lema_bi_abagayî||4||1
|-
|Lema_bi_wororayî||4||1
|-
|Lema_bi_panarayî||4||1
|-
|Lema_bi_turkanayî||4||1
|-
|Lema_bi_taitayî||4||1
|-
|Lema_bi_umayî||4||2
|-
|Lema_bi_katalaniya_kevn||4||1
|-
|Lema_bi_çolyanî||4||1
|-
|Lema_bi_mundurukú||4||2
|-
|Lema_bi_deccaniyî||4||2
|-
|Lema_bi_laşiyî||4||2
|-
|Lema_bi_gongî||4||1
|-
|Lema_bi_nambikwarayî||4||1
|-
|Lema_bi_lillooetî||4||1
|-
|Lema_bi_guiqiongî||4||1
|-
|Lema_bi_alekanoyî||4||2
|-
|Lema_bi_natçezî||4||1
|-
|Lema_bi_komoyî||4||1
|-
|Lema_bi_paraukî||4||2
|-
|Lema_bi_beaverî||4||1
|-
|Lema_bi_sikayanayî||4||1
|-
|Lema_bi_puinaveyî||4||1
|-
|Lema_bi_kusundayî||4||1
|-
|Lema_bi_ragayî||4||1
|-
|Lema_bi_orejónî||4||1
|-
|Lema_bi_babariya_başûr-rojhilat||4||1
|-
|Lema_bi_wiwayî||4||1
|-
|Lema_bi_baltî||4||1
|-
|Lema_bi_lugbarayî||4||1
|-
|Lema_bi_modangî||4||1
|-
|Lema_bi_isthmus_mixeyî||4||1
|-
|Lema_bi_forest_enetsî||4||1
|-
|Lema_bi_pukapukanî||4||1
|-
|Lema_bi_kelabît_bariyoyî||4||1
|-
|Lema_bi_waraoyî||4||1
|-
|Lema_bi_ǁxegwî||4||1
|-
|Lema_bi_palantla_çinantecî||4||1
|-
|Lema_bi_mendeyî||4||1
|-
|Lema_bi_batuyî||4||1
|-
|Lema_bi_piscatawayî||4||1
|-
|Lema_bi_hurî||4||1
|-
|Lema_bi_foreyî||4||2
|-
|Lema_bi_degemayî||4||1
|-
|Lema_bi_otomacoyî||4||1
|-
|Lema_bi_nahwatliya_temascaltepec||4||1
|-
|Lema_bi_gothîkiya_krimî||4||1
|-
|Lema_bi_kîputî||4||1
|-
|Lema_bi_lîtwanyayiya_kevn||4||1
|-
|Lema_bi_aluneyî||4||1
|-
|Lema_bi_ndoeyî||4||1
|-
|Lema_bi_loteyî||4||1
|-
|Lema_bi_parecî||4||1
|-
|Lema_bi_ngamoyî||4||1
|-
|Lema_bi_kannadayiya_kevn||4||1
|-
|Lema_bi_ankaveyî||4||1
|-
|Lema_bi_vîtûyî||4||1
|-
|Lema_bi_kunzayî||4||1
|-
|Lema_bi_zaiwa||4||2
|-
|Lema_bi_açaguwayî||4||1
|-
|Lema_bi_maranungkuyî||4||1
|-
|Lema_bi_kerehoyî||4||1
|-
|Lema_bi_îşkaşimiyî||4||1
|-
|Lema_bi_digoyî||4||1
|-
|Lema_bi_agutaynenî||4||1
|-
|Lema_bi_burjî||4||1
|-
|Lema_bi_linduyî||4||1
|-
|Lema_bi_baniwayî||4||1
|-
|Lema_bi_yagariayî||4||1
|-
|Lema_bi_menomineeyî||4||1
|-
|Lema_bi_kajamanî||4||1
|-
|Lema_bi_hassaniyayî||4||1
|-
|Lema_bi_umotinayî||4||1
|-
|Lema_bi_yidinyî||4||1
|-
|Lema_bi_tawoyanî||4||1
|-
|Lema_bi_katoyî||4||1
|-
|Lema_bi_arîkara||4||1
|-
|Lema_bi_sirenikî||4||1
|-
|Lema_bi_adzerayî||4||1
|-
|Lema_bi_spokanî||4||1
|-
|Lema_bi_rukîgayî||4||1
|-
|Lema_bi_wuvulu-auayî||4||1
|-
|Lema_bi_ejaghamî||4||1
|-
|Lema_bi_yamdenayî||4||1
|-
|Lema_bi_ma'anyanî||4||1
|-
|Lema_bi_taryanayî||4||1
|-
|Lema_bi_karangî||4||1
|-
|Lema_bi_nong_zhuangî||4||1
|-
|Lema_bi_yupikiya_sîberyaya_navendî||4||1
|-
|Lema_bi_teke-tegeyî||4||1
|-
|Lema_bi_çuanqiandian_cluster_miaoyî||4||2
|-
|Lema_bi_sirianoyî||4||1
|-
|Lema_bi_dagbaniyî||4||1
|-
|Lema_bi_warekenayî||4||1
|-
|Lema_bi_laurentî||4||2
|-
|Lema_bi_kitemboyî||4||1
|-
|Lema_bi_paelignianî||4||1
|-
|Lema_bi_lingaoyî||4||1
|-
|Lema_bi_pataxó_hã-ha||4||1
|-
|Lema_bi_minigirî||4||2
|-
|Lema_bi_yazghulamî||4||1
|-
|Lema_bi_kanowitî||4||1
|-
|Lema_bi_makondeyî||4||1
|-
|Lema_bi_apiaká||4||1
|-
|Lema_bi_çîniya_kevn||4||2
|-
|Lema_bi_prînsîpenî||4||1
|-
|Lema_bi_mambwe-lunguyî||4||1
|-
|Lema_bi_tepehuaniya_başûr-rojhilat||4||1
|-
|Lema_bi_kayapa_kallahanî||4||1
|-
|Lema_bi_mantayî||4||1
|-
|Lema_bi_keresiya_rojhilatî||4||2
|-
|Lema_bi_matalî||4||1
|-
|Lema_bi_bakumpaî||4||1
|-
|Lema_bi_alaba||4||1
|-
|Lema_bi_sabirî||4||1
|-
|Lema_bi_logûlî||4||1
|-
|Lema_bi_midobî||4||1
|-
|Lema_bi_mahicanî||4||1
|-
|Lema_bi_belî||4||1
|-
|Lema_bi_nooneyî||4||1
|-
|Lema_bi_katuyiya_rojavayî||4||2
|-
|Lema_bi_tepeuxila_cuicatecî||4||1
|-
|Lema_bi_nyakyusayî||4||1
|-
|Lema_bi_murikî_(Gîneya_nû)||4||1
|-
|Lema_bi_margî||4||1
|-
|Lema_bi_martu_wangkayî||4||1
|-
|Lema_bi_klîngonî||4||1
|-
|Lema_bi_tundra_enetsî||4||1
|-
|Lema_bi_coroado_purî||4||1
|-
|Lema_bi_ukitî||4||1
|-
|Lema_bi_tanakrosî||4||1
|-
|Lema_bi_karatayî||4||1
|-
|Lema_bi_vandalî||4||2
|-
|Lema_bi_kasemî||4||1
|-
|Lema_bi_çîniya_navîn||4||2
|-
|Lema_bi_yuracareyî||4||1
|-
|Lema_bi_biyakî||4||1
|-
|Lema_bi_soqotrî||4||1
|-
|Lema_bi_deniyî||4||1
|-
|Lema_bi_lawayiya_rojavayî||4||1
|-
|Lema_bi_akatepekiya_me'phaayî||4||1
|-
|Lema_bi_akawaîo||4||1
|-
|Lema_bi_jeberoyî||4||1
|-
|Lema_bi_gunwingguyî||4||1
|-
|Lema_bi_eblaiteyî||4||1
|-
|Lema_bi_xîtanî||4||1
|-
|Lema_bi_luangî||4||1
|-
|Lema_bi_minriqî||4||1
|-
|Lema_bi_angamî||4||1
|-
|Lema_bi_segayî||4||1
|-
|Lema_bi_holîkaçukî||4||1
|-
|Lema_bi_huehuetla_tepehuayî||4||1
|-
|Lema_bi_bileyî||4||1
|-
|Lema_bi_genî||4||1
|-
|Lema_bi_wik-mungkanî||4||1
|-
|Lema_bi_oydayî||3||1
|-
|Lema_bi_guajayî||3||1
|-
|Lema_bi_balangao||3||1
|-
|Lema_bi_pahîyî||3||1
|-
|Lema_bi_cacanî||3||1
|-
|Lema_bi_xoklengî||3||1
|-
|Lema_bi_taboyî||3||1
|-
|Lema_bi_salibayî_(Kolombiya)||3||1
|-
|Lema_bi_nayî||3||1
|-
|Lema_bi_bantîkî||3||1
|-
|Lema_bi_yakamulî||3||1
|-
|Lema_bi_yanda_dogonî||3||1
|-
|Lema_bi_sãotomenseyî||3||1
|-
|Lema_bi_erebiya_çadî||3||1
|-
|Lema_bi_creoleyiya_torres_strait||3||1
|-
|Lema_bi_sathmar_swabî||3||1
|-
|Lema_bi_miraya_bikolî||3||1
|-
|Lema_bi_macaguanî||3||1
|-
|Lema_bi_mailuyî||3||1
|-
|Lema_bi_yineyî||3||1
|-
|Lema_bi_kuamasî||3||1
|-
|Lema_bi_kaskihayî||3||1
|-
|Lema_bi_yurumanguî||3||1
|-
|Lema_bi_çulymî||3||1
|-
|Lema_bi_bîkolanoyiya_başûr_katanduanî||3||1
|-
|Lema_bi_mozarabîkî||3||1
|-
|Lema_bi_sobeyî||3||1
|-
|Lema_bi_agarabiyî||3||1
|-
|Lema_bi_ongotayî||3||1
|-
|Lema_bi_îtonamayî||3||1
|-
|Lema_bi_aisî||3||1
|-
|Lema_bi_zulgo-gemzekî||3||1
|-
|Lema_bi_wik-ngathanayî||3||1
|-
|Lema_bi_tommo_soyî||3||1
|-
|Lema_bi_sunwarî||3||1
|-
|Lema_bi_romblomanonî||3||1
|-
|Lema_bi_lawî||3||1
|-
|Lema_bi_jamamadiyî||3||1
|-
|Lema_bi_bundelî||3||1
|-
|Lema_bi_wolayttayî||3||1
|-
|Lema_bi_oyguriya_kevn||3||1
|-
|Lema_bi_balanta-ganjayî||3||1
|-
|Lema_bi_alakî||3||1
|-
|Lema_bi_naroyî||3||1
|-
|Lema_bi_almaniya_volga||3||1
|-
|Lema_bi_nehanî||3||1
|-
|Lema_bi_kalaganî||3||1
|-
|Lema_bi_endeyî||3||1
|-
|Lema_bi_ngadcurî||3||1
|-
|Lema_bi_hayayî||3||1
|-
|Lema_bi_ulau-suainî||3||1
|-
|Lema_bi_sauraştrayî||3||1
|-
|Lema_bi_miriwungî||3||1
|-
|Lema_bi_eritaiyî||3||1
|-
|Lema_bi_yendangî||3||1
|-
|Lema_bi_mixteciya_tezoatlan||3||1
|-
|Lema_bi_plains_miwokî||3||1
|-
|Lema_bi_fangî_(Beboid)||3||1
|-
|Lema_bi_betoî||3||1
|-
|Lema_bi_arabela||3||1
|-
|Lema_bi_tayoyî||3||1
|-
|Lema_bi_nornî||3||1
|-
|Lema_bi_kassonkeyî||3||1
|-
|Lema_bi_bilua||3||1
|-
|Lema_bi_wabî||3||1
|-
|Lema_bi_kwaioyî||3||1
|-
|Lema_bi_abronî||3||1
|-
|Lema_bi_wanjî||3||1
|-
|Lema_bi_soçiapam_çinantecî||3||1
|-
|Lema_bi_kwomayî||3||1
|-
|Lema_bi_dawera-daweloorî||3||1
|-
|Lema_bi_zapotekiya_yareni||3||1
|-
|Lema_bi_rasawayî||3||1
|-
|Lema_bi_brajî||3||1
|-
|Lema_bi_nahwatliya_koatepek||3||1
|-
|Lema_bi_kipçakî||3||1
|-
|Lema_bi_maybratî||3||1
|-
|Lema_bi_alamblakî||3||1
|-
|Lema_bi_lizuyî||3||1
|-
|Lema_bi_jumjumî||3||1
|-
|Lema_bi_tübatulabalî||3||1
|-
|Lema_bi_pamosuyî||3||1
|-
|Lema_bi_kadiweuyî||3||1
|-
|Lema_bi_tunikayî||3||1
|-
|Lema_bi_cocamayî||3||1
|-
|Lema_bi_ambulasî||3||1
|-
|Lema_bi_yaneşa'||3||1
|-
|Lema_bi_hdî||3||1
|-
|Lema_bi_yarebayî||3||1
|-
|Lema_bi_macuşî||3||1
|-
|Lema_bi_malalî||3||1
|-
|Lema_bi_kasuayî||3||1
|-
|Lema_bi_temî||3||1
|-
|Lema_bi_manamî||3||1
|-
|Lema_bi_bîlîwayî||3||1
|-
|Lema_bi_zapotekiya_amatlan||3||1
|-
|Lema_bi_teribeyî||3||1
|-
|Lema_bi_gabrielino-fernandeñoyî||3||1
|-
|Lema_bi_abu'_arapeşî||3||1
|-
|Lema_bi_adangî||3||1
|-
|Lema_bi_ratagnonî||3||1
|-
|Lema_bi_gbariyî||3||1
|-
|Lema_bi_subayî||3||1
|-
|Lema_bi_onobasuluyî||3||1
|-
|Lema_bi_aî-çamî||3||1
|-
|Lema_bi_jamsayî||3||1
|-
|Lema_bi_bunguyî||3||1
|-
|Lema_bi_bahauyî||3||1
|-
|Lema_bi_akha||3||1
|-
|Lema_bi_jemezî||3||1
|-
|Lema_bi_dusun_wituyî||3||1
|-
|Lema_bi_alanganî||3||1
|-
|Lema_bi_safwayî||3||1
|-
|Lema_bi_xotanî||3||1
|-
|Lema_bi_ndambayî||3||1
|-
|Lema_bi_mehinakuyî||3||1
|-
|Lema_bi_long_watî||3||1
|-
|Lema_bi_catacaoyî||3||1
|-
|Lema_bi_kalangayî||3||1
|-
|Lema_bi_yangbenî||3||1
|-
|Lema_bi_heheyî||3||1
|-
|Lema_bi_sawayî||3||1
|-
|Lema_bi_phakeyî||3||1
|-
|Lema_bi_angolar||3||1
|-
|Lema_bi_urartûyî||3||1
|-
|Lema_bi_taranganiya_rojava||3||1
|-
|Lema_bi_pilenî||3||1
|-
|Lema_bi_mixtekiya_alcozauca||3||1
|-
|Lema_bi_uteyî||3||1
|-
|Lema_bi_tauseyî||3||1
|-
|Lema_bi_yugî||3||1
|-
|Lema_bi_kumzarî||3||1
|-
|Lema_bi_nukuoroyî||3||1
|-
|Lema_bi_kawaiisuyî||3||1
|-
|Lema_bi_mpotoyî||3||1
|-
|Lema_bi_mangî||3||1
|-
|Lema_bi_gaddangî||3||1
|-
|Lema_bi_damariya_rojava||3||1
|-
|Lema_bi_ocainayî||3||1
|-
|Lema_bi_mapoyoyî||3||1
|-
|Lema_bi_garhwaliyî||3||1
|-
|Lema_bi_sorî-harenganî||3||1
|-
|Lema_bi_kewayî||3||1
|-
|Lema_bi_dhatkî||3||1
|-
|Lema_bi_bretoniya_kevn||3||1
|-
|Lema_bi_larike-wakasihu||3||1
|-
|Lema_bi_baagandjiyî||3||1
|-
|Lema_bi_tongayî_(Malawî)||3||1
|-
|Lema_bi_surî||3||1
|-
|Lema_bi_matoyî||3||1
|-
|Lema_bi_lealao_çinantecî||3||1
|-
|Lema_bi_jamtîşî||3||1
|-
|Lema_bi_golinî||3||1
|-
|Lema_bi_totonakiya_misantla||3||1
|-
|Lema_bi_busang_kayanî||3||1
|-
|Lema_bi_kovêyî||3||1
|-
|Lema_bi_kamayurayî||3||1
|-
|Lema_bi_heiltsukî||3||1
|-
|Lema_bi_uratî||3||1
|-
|Lema_bi_nihalî||3||1
|-
|Lema_bi_bendeyî||3||1
|-
|Lema_bi_yuguriya_rojavayî||3||1
|-
|Lema_bi_numanayî||3||1
|-
|Lema_bi_mandahuacayî||3||1
|-
|Lema_bi_wapişanayî||3||1
|-
|Lema_bi_dazagayî||3||1
|-
|Lema_bi_warunguyî||3||1
|-
|Lema_bi_tivî||3||1
|-
|Lema_bi_tobî||3||1
|-
|Lema_bi_dobelî||3||1
|-
|Lema_bi_buhi'non_bikolî||3||1
|-
|Lema_bi_ajayî||3||1
|-
|Lema_bi_tongayî_(Zambiya)||3||1
|-
|Lema_bi_susuyî||3||1
|-
|Lema_bi_nahwatliya_morelos||3||1
|-
|Lema_bi_matsesî||3||1
|-
|Lema_bi_ledo_kailiyî||3||1
|-
|Lema_bi_cakayî||3||1
|-
|Lema_bi_bangalayî||3||1
|-
|Lema_bi_nemî||3||1
|-
|Lema_bi_meta'||3||1
|-
|Lema_bi_engganoyî||3||1
|-
|Lema_bi_coeur_d'aleneyî||3||1
|-
|Lema_bi_basapî||3||1
|-
|Lema_bi_cuibayî||3||1
|-
|Lema_bi_erromintxelayî||3||1
|-
|Lema_bi_baysoyî||3||1
|-
|Lema_bi_pimbweyî||3||1
|-
|Lema_bi_nilambayî||3||1
|-
|Lema_bi_makanîzî||3||1
|-
|Lema_bi_aoyî||3||1
|-
|Lema_bi_uyajitayayî||3||1
|-
|Lema_bi_moçî||3||1
|-
|Lema_bi_aramiya_samarî||3||1
|-
|Lema_bi_malinkî||3||1
|-
|Lema_bi_kawişanayî||3||1
|-
|Lema_bi_mruyî||3||1
|-
|Lema_bi_mapunî||3||1
|-
|Lema_bi_bongoyî||3||1
|-
|Lema_bi_lama_baiyî||3||1
|-
|Lema_bi_agî||3||1
|-
|Lema_bi_masbate_sorsogon||3||1
|-
|Lema_bi_îwaidjayî||3||1
|-
|Lema_bi_dobûyî||3||1
|-
|Lema_bi_woun_meuyî||3||1
|-
|Lema_bi_totonakiya_xicotepec_de_juarez||3||1
|-
|Lema_bi_duvleyî||3||1
|-
|Lema_bi_baloyî||3||1
|-
|Lema_bi_mbulayî||3||1
|-
|Lema_bi_panareyî||3||1
|-
|Lema_bi_cavineñayî||3||1
|-
|Lema_bi_sanggauyî||3||1
|-
|Lema_bi_cofanî||3||1
|-
|Lema_bi_ubirî||3||1
|-
|Lema_bi_pele-ata||3||1
|-
|Lema_bi_ngieyî||3||1
|-
|Lema_bi_ersuyî||3||1
|-
|Lema_bi_taraoyî||3||1
|-
|Lema_bi_yokeyî||3||1
|-
|Lema_bi_tauyayî||3||1
|-
|Lema_bi_biaoyî||3||1
|-
|Lema_bi_tedagayî||3||1
|-
|Lema_bi_arinî||3||1
|-
|Lema_bi_mandanî||3||1
|-
|Lema_bi_kaxarariyî||3||1
|-
|Lema_bi_blagarî||3||1
|-
|Lema_bi_asaro'oyî||3||1
|-
|Lema_bi_zapotekiya_coatecas_altas||3||1
|-
|Lema_bi_manîdeyî||3||1
|-
|Lema_bi_îmondayî||3||1
|-
|Lema_bi_ofoyî||3||1
|-
|Lema_bi_avá-kanoeîro||3||1
|-
|Lema_bi_rejang_kayanî||3||1
|-
|Lema_bi_khalingî||3||1
|-
|Lema_bi_dibiyasoyî||3||1
|-
|Lema_bi_bribriyî||3||1
|-
|Lema_bi_îwamî||3||1
|-
|Lema_bi_bukatî||3||1
|-
|Lema_bi_matumbî||3||1
|-
|Lema_bi_wulguruyî||3||1
|-
|Lema_bi_totontepec_mixeyî||3||1
|-
|Lema_bi_gujaratiya_kevn||3||1
|-
|Lema_bi_kohoyî||3||1
|-
|Lema_bi_banggaî||3||1
|-
|Lema_bi_tagakaulu_kalaganî||3||1
|-
|Lema_bi_sambeyî||3||1
|-
|Lema_bi_panayî_(Afrîkaya_navendî)||3||1
|-
|Lema_bi_sangilî||3||1
|-
|Lema_bi_pemon||3||1
|-
|Lema_bi_culinayî||3||1
|-
|Lema_bi_ngindoyî||3||1
|-
|Lema_bi_çamalalî||3||1
|-
|Lema_bi_urhoboyî||3||1
|-
|Lema_bi_hoyî||3||1
|-
|Lema_bi_yokutiya_geliyê_bakurî||3||1
|-
|Lema_bi_nnamî||3||1
|-
|Lema_bi_kuiripî||3||1
|-
|Lema_bi_sikayî||3||1
|-
|Lema_bi_wahau_kenyahî||3||1
|-
|Lema_bi_sirayayî||3||1
|-
|Lema_bi_nungonî||3||1
|-
|Lema_bi_mualangî||3||1
|-
|Lema_bi_mara_çinî||3||1
|-
|Lema_bi_keoru-ahiayî||3||1
|-
|Lema_bi_îpulo||3||1
|-
|Lema_bi_deg_xinagî||3||1
|-
|Lema_bi_adjayî||3||1
|-
|Lema_bi_khamî||3||1
|-
|Lema_bi_wedauyî||3||1
|-
|Lema_bi_maselayiya_navendî||3||1
|-
|Lema_bi_akoyeyî||3||1
|-
|Lema_bi_limilnganî||3||1
|-
|Lema_bi_tukî||3||1
|-
|Lema_bi_bareinî||3||1
|-
|Lema_bi_yalunkayî||3||1
|-
|Lema_bi_pare||3||1
|-
|Lema_bi_colanî||3||1
|-
|Lema_bi_yankunytjatjarayî||3||1
|-
|Lema_bi_penaniya_rojavayî||3||1
|-
|Lema_bi_minayî||3||1
|-
|Lema_bi_erebiya_mezopotamyayî_ya_bakur||3||1
|-
|Lema_bi_çambriyî||3||1
|-
|Lema_bi_yeyî||3||1
|-
|Lema_bi_semaq_beriyî||3||1
|-
|Lema_bi_benyadu'||3||1
|-
|Lema_bi_yokutiya_geliyê_başûrî||3||1
|-
|Lema_bi_setayî||3||1
|-
|Lema_bi_araona||3||1
|-
|Lema_bi_nottowayî||3||1
|-
|Lema_bi_isubuyî||3||1
|-
|Lema_bi_çrauyî||3||1
|-
|Lema_bi_kayabiyî||3||1
|-
|Lema_bi_asîluluyî||3||1
|-
|Lema_bi_abay-sembwakî||3||1
|-
|Lema_bi_mubamî||3||1
|-
|Lema_bi_keley-i_kallahanî||3||1
|-
|Lema_bi_waray_sorsogonî||3||1
|-
|Lema_bi_oloyî||3||1
|-
|Lema_bi_muyayî||3||1
|-
|Lema_bi_lambayî||3||1
|-
|Lema_bi_zimanê_destan_ê_îzlandê||3||1
|-
|Lema_bi_wemba-wembayî||3||1
|-
|Lema_bi_îxilî||3||1
|-
|Lema_bi_bukiyîpî||3||1
|-
|Lema_bi_rufijî||3||1
|-
|Lema_bi_mauwakeyî||3||1
|-
|Lema_bi_lengoyî||3||1
|-
|Lema_bi_namuyî||3||1
|-
|Lema_bi_naunayî||3||1
|-
|Lema_bi_penaniya_rojhilatî||3||1
|-
|Lema_bi_mixiforeyî||3||1
|-
|Lema_bi_bekatî'||3||1
|-
|Lema_bi_yidghayî||3||1
|-
|Lema_bi_kriya_woods||3||1
|-
|Lema_bi_mamanwayî||3||1
|-
|Lema_bi_kathlametî||3||1
|-
|Lema_bi_çruyî||3||1
|-
|Lema_bi_arîkapûyî||3||1
|-
|Lema_bi_futuna-anîwayî||3||1
|-
|Lema_bi_wandamenî||3||1
|-
|Lema_bi_tewayî||3||1
|-
|Lema_bi_nyoroyî||3||1
|-
|Lema_bi_bokyî||3||1
|-
|Lema_bi_timucuayî||3||1
|-
|Lema_bi_sonagayî||3||1
|-
|Lema_bi_ogbronuagumî||3||1
|-
|Lema_bi_munjî||3||1
|-
|Lema_bi_gawwadayî||3||1
|-
|Lema_bi_west_albay_bikolî||3||1
|-
|Lema_bi_îyiveyî||3||1
|-
|Lema_bi_bakairí||3||1
|-
|Lema_bi_akpesî||3||1
|-
|Lema_bi_mazateciya_san_jerónimo_tecóatl||3||1
|-
|Lema_bi_jinguluyî||3||1
|-
|Lema_bi_tsuvadî||3||1
|-
|Lema_bi_kokodayî||3||1
|-
|Lema_bi_amondawayî||3||1
|-
|Lema_bi_yanomamöî||3||1
|-
|Lema_bi_sarikolî||3||1
|-
|Lema_bi_ngan'gityemerrî||3||1
|-
|Lema_bi_minica_huitotoyî||3||1
|-
|Lema_bi_yaweyuhayî||3||1
|-
|Lema_bi_uru-eu-wau-wau||3||1
|-
|Lema_bi_ewondoyî||3||1
|-
|Lema_bi_karolînî||3||1
|-
|Lema_bi_arara-karo||3||1
|-
|Lema_bi_yukpayî||3||1
|-
|Lema_bi_îaaiyî||3||1
|-
|Lema_bi_wandayî||3||1
|-
|Lema_bi_mudburrayî||3||1
|-
|Lema_bi_keloyî||3||1
|-
|Lema_bi_ramayî||3||1
|-
|Lema_bi_zayî||3||1
|-
|Lema_bi_mûssaû-emîrakî||3||1
|-
|Lema_bi_lambyayî||3||1
|-
|Lema_bi_dimeyî||3||1
|-
|Lema_bi_agwakatekî||3||1
|-
|Lema_bi_zinzayî||3||1
|-
|Lema_bi_kimbuyî||3||1
|-
|Lema_bi_dogul_domî||3||1
|-
|Lema_bi_babuzayî||3||1
|-
|Lema_bi_leoniya_kevn||3||1
|-
|Lema_bi_şerbroyî||3||1
|-
|Lema_bi_gumatjî||3||1
|-
|Lema_bi_bûrî||3||1
|-
|Lema_bi_palenqueroyî||3||1
|-
|Lema_bi_guwarî||3||1
|-
|Lema_bi_tagbanwayiya_navendî||3||1
|-
|Lema_bi_mentawaî||3||1
|-
|Lema_bi_kakabeyî||3||1
|-
|Lema_bi_mianî||3||1
|-
|Lema_bi_koronadal_blaanî||3||1
|-
|Lema_bi_tamîliya_kevn||3||1
|-
|Lema_bi_yawuruyî||3||1
|-
|Lema_bi_tapaçultecî||3||1
|-
|Lema_bi_seçurayî||3||1
|-
|Lema_bi_piaroayî||3||1
|-
|Lema_bi_mixteciya_çayuco||3||1
|-
|Lema_bi_kreyoliya_îngilîzî_ya_îslanderê||3||1
|-
|Lema_bi_hobyótî||3||1
|-
|Lema_bi_annoboneseyî||3||1
|-
|Lema_bi_semnamî||3||1
|-
|Lema_bi_nisga'ayî||3||1
|-
|Lema_bi_makî_(Çîn)||3||1
|-
|Lema_bi_malayiya_moluccana_bakur||3||1
|-
|Lema_bi_zanakî||3||1
|-
|Lema_bi_kuviyî||3||1
|-
|Lema_bi_kayan_river_kayanî||3||1
|-
|Lema_bi_fuyugî||3||1
|-
|Lema_bi_zapotekiya_laçixio||3||1
|-
|Lema_bi_kwara'aeyî||3||1
|-
|Lema_bi_îngilîziya_kreyolî_ya_antîgua_û_barbud||3||1
|-
|Lema_bi_ramoaainayî||3||1
|-
|Lema_bi_dohoyî||3||1
|-
|Lema_bi_akuwagelî||3||1
|-
|Lema_bi_nawaruyî||3||1
|-
|Lema_bi_tumleoyî||3||1
|-
|Lema_bi_tagişî||3||1
|-
|Lema_bi_pangwayî||3||1
|-
|Lema_bi_louyî||3||1
|-
|Lema_bi_emberayiya_bakurî||3||1
|-
|Lema_bi_takuuyî||3||1
|-
|Lema_bi_kalulî||3||1
|-
|Lema_bi_batad_ifugaoyî||3||1
|-
|Lema_bi_yanyuwayî||3||1
|-
|Lema_bi_hindiya_kevn||3||2
|-
|Lema_bi_cupeñoyî||3||1
|-
|Lema_bi_bawuleyî||3||1
|-
|Lema_bi_ngonî||3||1
|-
|Lema_bi_anongî||3||1
|-
|Lema_bi_yimasî||3||1
|-
|Lema_bi_krobuyî||3||1
|-
|Lema_bi_huambisayî||3||1
|-
|Lema_bi_kumakî||3||1
|-
|Lema_bi_iceve-macî||3||1
|-
|Lema_bi_simbarî||3||1
|-
|Lema_bi_kuriayî||3||1
|-
|Lema_bi_îatmulî||3||1
|-
|Lema_bi_çuaveyî||3||1
|-
|Lema_bi_zandeyî||3||1
|-
|Lema_bi_siroî||3||1
|-
|Lema_bi_nyah_kurî||3||1
|-
|Lema_bi_wangayî||3||1
|-
|Lema_bi_muinanî||3||1
|-
|Lema_bi_kwayayî||3||1
|-
|Lema_bi_kembayanî||3||1
|-
|Lema_bi_açeronî||3||1
|-
|Lema_bi_wari'||3||1
|-
|Lema_bi_demotîkî||3||1
|-
|Lema_bi_botlixî||3||1
|-
|Lema_bi_lammayî||3||1
|-
|Lema_bi_budibudî||3||1
|-
|Lema_bi_bulî||3||1
|-
|Lema_bi_toroyî||3||1
|-
|Lema_bi_rumuyî||3||1
|-
|Lema_bi_javayiya_ontongê||3||1
|-
|Lema_bi_burunî||3||1
|-
|Lema_bi_wyandotî||3||1
|-
|Lema_bi_paezî||3||1
|-
|Lema_bi_lingua_franca_nova||3||2
|-
|Lema_bi_jitayî||3||1
|-
|Lema_bi_amahaî||3||1
|-
|Lema_bi_mepaya_malînaltepekî||3||1
|-
|Lema_bi_embuyî||3||1
|-
|Lema_bi_ambayî||3||1
|-
|Lema_bi_penrhynî||3||1
|-
|Lema_bi_ansus||3||1
|-
|Lema_bi_pomoyiya_bakurî||3||1
|-
|Lema_bi_kumanî||3||1
|-
|Lema_bi_fipayî||3||1
|-
|Lema_bi_nubiyî||3||1
|-
|Lema_bi_mongoyî||3||1
|-
|Lema_bi_biwaydokayî||3||1
|-
|Lema_bi_arosî||3||1
|-
|Lema_bi_zangskarî||3||1
|-
|Lema_bi_punan_aputî||3||1
|-
|Lema_bi_îkizuyî||3||1
|-
|Lema_bi_bobongko||3||1
|-
|Lema_bi_tharakayî||3||1
|-
|Lema_bi_mujiya_başûrî||3||1
|-
|Lema_bi_manyawayî||3||1
|-
|Lema_bi_kwazayî||3||1
|-
|Lema_bi_warisî||3||1
|-
|Lema_bi_tipaî||3||1
|-
|Lema_bi_sooyî||3||1
|-
|Lema_bi_kereweyî||3||1
|-
|Lema_bi_suaboyî||3||1
|-
|Lema_bi_resigaroyî||3||1
|-
|Lema_bi_budumayî||3||1
|-
|Lema_bi_nakameyî||3||1
|-
|Lema_bi_leyponî||3||1
|-
|Lema_bi_guahiboyî||3||1
|-
|Lema_bi_burusuyî||3||1
|-
|Lema_bi_lipan||3||1
|-
|Lema_bi_banda||3||1
|-
|Lema_bi_tşanglayî||3||1
|-
|Lema_bi_mediya_kevn||3||1
|-
|Lema_bi_papapanayî||3||1
|-
|Lema_bi_kala_lagaw_yayî||3||1
|-
|Lema_bi_bariyî||3||1
|-
|Lema_bi_paulohî||3||1
|-
|Lema_bi_batakiya_dairî||3||1
|-
|Lema_bi_uruyî||3||1
|-
|Lema_bi_tatariya_sîberî||3||1
|-
|Lema_bi_mmaniyî||3||1
|-
|Lema_bi_yorta_yortayî||3||1
|-
|Lema_bi_malayîk_dayakî||3||1
|-
|Lema_bi_kumarbhag_pahariayî||3||1
|-
|Lema_bi_vunjoyî||3||1
|-
|Lema_bi_çukayî||3||1
|-
|Lema_bi_walayî||3||1
|-
|Lema_bi_punan_bah-biauyî||3||1
|-
|Lema_bi_nyamboyî||3||1
|-
|Lema_bi_ga'andayî||3||1
|-
|Lema_bi_thavungî||3||1
|-
|Lema_bi_açiyî||3||1
|-
|Lema_bi_tiriyî||3||1
|-
|Lema_bi_murîkî_(Malezya)||3||1
|-
|Lema_bi_suauyî||3||1
|-
|Lema_bi_zoqueyiya_rayón||3||1
|-
|Lema_bi_wiçitayî||3||1
|-
|Lema_bi_sumbwayî||3||1
|-
|Lema_bi_buluyî_(Kamerûn)||3||1
|-
|Lema_bi_rungwayî||3||1
|-
|Lema_bi_nakanayî||3||1
|-
|Lema_bi_trîkuyiya_çicahuaxtla||3||1
|-
|Lema_bi_lipoyî||3||1
|-
|Lema_bi_gwenoyî||3||1
|-
|Lema_bi_carijonayî||3||1
|-
|Lema_bi_barî||3||1
|-
|Lema_bi_taliabuyî||3||1
|-
|Lema_bi_sanumayî||3||1
|-
|Lema_bi_mijî||3||1
|-
|Lema_bi_peroyî||3||1
|-
|Lema_bi_erebiya_ummanî||3||1
|-
|Lema_bi_yembayî||3||1
|-
|Lema_bi_unserdeutsch||3||1
|-
|Lema_bi_yindjilandjî||3||1
|-
|Lema_bi_kua-nsî||3||1
|-
|Lema_bi_apurinã||3||1
|-
|Lema_bi_sissanoyî||3||1
|-
|Lema_bi_punan_merapî||3||1
|-
|Lema_bi_nyamwangayî||3||1
|-
|Lema_bi_dakakayî||3||1
|-
|Lema_bi_maonanî||3||1
|-
|Lema_bi_bolonî||3||1
|-
|Lema_bi_attié||3||1
|-
|Lema_bi_warjî||3||1
|-
|Lema_bi_rara_bakati'||3||1
|-
|Lema_bi_toabaîtayî||3||1
|-
|Lema_bi_bunamayî||2||1
|-
|Lema_bi_bafutî||2||1
|-
|Lema_bi_akebuyî||2||1
|-
|Lema_bi_wolanî||2||1
|-
|Lema_bi_şambalayî||2||1
|-
|Lema_bi_nakî||2||1
|-
|Lema_bi_durango_nahuatliya_rojavayî_ya_jêrîn||2||1
|-
|Lema_bi_buruwayî||2||1
|-
|Lema_bi_alago||2||1
|-
|Lema_bi_trumaî||2||1
|-
|Lema_bi_mbesayî||2||1
|-
|Lema_bi_koalibî||2||1
|-
|Lema_bi_juangî||2||1
|-
|Lema_bi_gupapuynguyî||2||1
|-
|Lema_bi_banda-bambariyî||2||1
|-
|Lema_bi_pamiguayî||2||1
|-
|Lema_bi_lolodayî||2||1
|-
|Lema_bi_elemeyî||2||1
|-
|Lema_bi_amalî||2||1
|-
|Lema_bi_tungagî||2||1
|-
|Lema_bi_tai_dónî||2||1
|-
|Lema_bi_papumayî||2||1
|-
|Lema_bi_meroytîkî||2||1
|-
|Lema_bi_konoyî_(sierra_leone)||2||1
|-
|Lema_bi_kalabrî||2||1
|-
|Lema_bi_emplawasî||2||1
|-
|Lema_bi_pawnakayî||2||1
|-
|Lema_bi_ngäbereyî||2||1
|-
|Lema_bi_mijuyî||2||1
|-
|Lema_bi_lundayî||2||1
|-
|Lema_bi_kosraeyî||2||1
|-
|Lema_bi_kamarianî||2||1
|-
|Lema_bi_anambeyî||2||1
|-
|Lema_bi_ukwayî||2||1
|-
|Lema_bi_tananaya_jorîn||2||1
|-
|Lema_bi_ngas||2||1
|-
|Lema_bi_kreyola_fransî_ya_réunion||2||1
|-
|Lema_bi_kanamariyî||2||1
|-
|Lema_bi_baybayanonî||2||1
|-
|Lema_bi_yemsayî||2||1
|-
|Lema_bi_unuayî||2||1
|-
|Lema_bi_tara_bakayî||2||1
|-
|Lema_bi_pijaoyî||2||1
|-
|Lema_bi_mixteciya_silacayoapan||2||1
|-
|Lema_bi_honeyî||2||1
|-
|Lema_bi_etenî||2||1
|-
|Lema_bi_çarruayî||2||1
|-
|Lema_bi_anukî||2||1
|-
|Lema_bi_usila_çinantecî||2||1
|-
|Lema_bi_tatiya_kevn||2||1
|-
|Lema_bi_njenî||2||1
|-
|Lema_bi_mnongiya_rojhilatî||2||1
|-
|Lema_bi_çinaliyî||2||1
|-
|Lema_bi_arabana||2||1
|-
|Lema_bi_vehesî||2||1
|-
|Lema_bi_taykatî||2||1
|-
|Lema_bi_pomoyiya_rojhilatî||2||1
|-
|Lema_bi_kumbrîkî||2||1
|-
|Lema_bi_iduyî||2||1
|-
|Lema_bi_aremî||2||1
|-
|Lema_bi_vuteyî||2||1
|-
|Lema_bi_temeinî||2||1
|-
|Lema_bi_sinagenî||2||1
|-
|Lema_bi_manado_malayî||2||1
|-
|Lema_bi_kurtjarî||2||1
|-
|Lema_bi_kauwerayî||2||1
|-
|Lema_bi_arta||2||1
|-
|Lema_bi_zapoteciya_rincona_başûrî||2||1
|-
|Lema_bi_walmajarrî||2||1
|-
|Lema_bi_terenoyî||2||1
|-
|Lema_bi_situyî||2||1
|-
|Lema_bi_mangasî||2||1
|-
|Lema_bi_kwadiyî||2||1
|-
|Lema_bi_îkoyî||2||1
|-
|Lema_bi_aşeninka_pereneyî||2||1
|-
|Lema_bi_zapotekiya_quioquitani-quieri||2||1
|-
|Lema_bi_wanî||2||1
|-
|Lema_bi_thrasî||2||1
|-
|Lema_bi_qimant||2||1
|-
|Lema_bi_mundablî||2||1
|-
|Lema_bi_kwiniyî||2||1
|-
|Lema_bi_înorî||2||1
|-
|Lema_bi_bolyuyî||2||1
|-
|Lema_bi_au||2||1
|-
|Lema_bi_zapotekiya_yalalagî||2||1
|-
|Lema_bi_warkay-bîpîmî||2||1
|-
|Lema_bi_sorayî||2||1
|-
|Lema_bi_murui_huitotoyî||2||1
|-
|Lema_bi_marimanindjî||2||1
|-
|Lema_bi_kermanî||2||1
|-
|Lema_bi_gbanuyî||2||1
|-
|Lema_bi_awetí||2||1
|-
|Lema_bi_zhang-zhungî||2||1
|-
|Lema_bi_wawonî||2||1
|-
|Lema_bi_toaripî||2||1
|-
|Lema_bi_subaneniya_navendî||2||1
|-
|Lema_bi_riangî||2||1
|-
|Lema_bi_n'koyî||2||1
|-
|Lema_bi_langoyî_(Uganda)||2||1
|-
|Lema_bi_buganî||2||1
|-
|Lema_bi_orumayî||2||1
|-
|Lema_bi_gojriyî||2||1
|-
|Lema_bi_dongotonoyî||2||1
|-
|Lema_bi_dongşanba_laloyî||2||1
|-
|Lema_bi_baguayî||2||1
|-
|Lema_bi_akeî||2||1
|-
|Lema_bi_totolî||2||1
|-
|Lema_bi_nalikî||2||1
|-
|Lema_bi_kîbenayî||2||1
|-
|Lema_bi_jehî||2||1
|-
|Lema_bi_safaitîkî||2||1
|-
|Lema_bi_mbreyî||2||1
|-
|Lema_bi_jumaytepequeyî||2||1
|-
|Lema_bi_ebughuyî||2||1
|-
|Lema_bi_cacuayî||2||1
|-
|Lema_bi_bandayiya_navendî_ya_başûr||2||1
|-
|Lema_bi_xolosî||2||1
|-
|Lema_bi_tabriakî||2||1
|-
|Lema_bi_salînanî||2||1
|-
|Lema_bi_ncaneyî||2||1
|-
|Lema_bi_kadazaniya_çemê_kliasê||2||1
|-
|Lema_bi_caşibo-cacataiboyî||2||1
|-
|Lema_bi_tunggareyî||2||1
|-
|Lema_bi_tai_doyî||2||1
|-
|Lema_bi_korafe-yeghayî||2||1
|-
|Lema_bi_hamtaiyî||2||1
|-
|Lema_bi_coast_miwokî||2||1
|-
|Lema_bi_barombî||2||1
|-
|Lema_bi_ambrîmiya_başûr-rojhilat||2||1
|-
|Lema_bi_yandruwandhayî||2||1
|-
|Lema_bi_saparayî||2||1
|-
|Lema_bi_mikasukî||2||1
|-
|Lema_bi_koşinî||2||1
|-
|Lema_bi_batakiya_palawan||2||1
|-
|Lema_bi_anauyayî||2||1
|-
|Lema_bi_yarawatayî||2||1
|-
|Lema_bi_tanemayî||2||1
|-
|Lema_bi_peveyî||2||1
|-
|Lema_bi_ngbaka_ma'boyî||2||1
|-
|Lema_bi_macunayî||2||1
|-
|Lema_bi_çacoboyî||2||1
|-
|Lema_bi_angîka||2||1
|-
|Lema_bi_seimî||2||1
|-
|Lema_bi_nhandayî||2||1
|-
|Lema_bi_kaondeyî||2||1
|-
|Lema_bi_eteocretanî||2||1
|-
|Lema_bi_çaurayî||2||1
|-
|Lema_bi_benabenayî||2||1
|-
|Lema_bi_anuta||2||1
|-
|Lema_bi_yir-yorontî||2||1
|-
|Lema_bi_uspantekoyî||2||1
|-
|Lema_bi_serayî||2||1
|-
|Lema_bi_njyemî||2||1
|-
|Lema_bi_mobilianî||2||1
|-
|Lema_bi_malalamaî||2||1
|-
|Lema_bi_karayî_(Gîneya_nû)||2||1
|-
|Lema_bi_molaleyî||2||1
|-
|Lema_bi_ikpengî||2||1
|-
|Lema_bi_sinaugoroyî||2||1
|-
|Lema_bi_nukî||2||1
|-
|Lema_bi_manambuyî||2||1
|-
|Lema_bi_kuruayayî||2||1
|-
|Lema_bi_îbatanî||2||1
|-
|Lema_bi_çuruyayî||2||1
|-
|Lema_bi_aruopî||2||1
|-
|Lema_bi_zapotekiya_aloapam||2||1
|-
|Lema_bi_teressayî||2||1
|-
|Lema_bi_sivandî||2||1
|-
|Lema_bi_nyangboyî||2||1
|-
|Lema_bi_mpadeyî||2||1
|-
|Lema_bi_kayî||2||1
|-
|Lema_bi_gabadiyî||2||1
|-
|Lema_bi_dakpayî||2||1
|-
|Lema_bi_bofî||2||1
|-
|Lema_bi_aşeyî||2||1
|-
|Lema_bi_zapotekiya_rincón||2||1
|-
|Lema_bi_tibetiya_klasîk||2||1
|-
|Lema_bi_obokuîtayî||2||1
|-
|Lema_bi_mundanî||2||1
|-
|Lema_bi_mapidianî||2||1
|-
|Lema_bi_ganzayî||2||1
|-
|Lema_bi_açumawî||2||1
|-
|Lema_bi_muruwarî||2||1
|-
|Lema_bi_maringarrî||2||1
|-
|Lema_bi_lakkiayî||2||1
|-
|Lema_bi_gbanziriyî||2||1
|-
|Lema_bi_desanoyî||2||1
|-
|Lema_bi_awhelawayî||2||1
|-
|Lema_bi_agatuyî||2||1
|-
|Lema_bi_tobayî||2||1
|-
|Lema_bi_subanoniya_rojavayî||2||1
|-
|Lema_bi_onînî||2||1
|-
|Lema_bi_nabayî||2||1
|-
|Lema_bi_îtu_mbon_uzoyî||2||1
|-
|Lema_bi_geser-goromî||2||1
|-
|Lema_bi_azhayî||2||1
|-
|Lema_bi_aiwooyî||2||1
|-
|Lema_bi_tomoipî||2||1
|-
|Lema_bi_romboyî||2||1
|-
|Lema_bi_oryayî||2||1
|-
|Lema_bi_mato_grosso_arára||2||1
|-
|Lema_bi_jambî_malayî||2||1
|-
|Lema_bi_gokanayî||2||1
|-
|Lema_bi_gokhyî||2||1
|-
|Lema_bi_bungku||2||1
|-
|Lema_bi_akeyî||2||1
|-
|Lema_bi_totonaciya_nekaksaya_jorîn||2||1
|-
|Lema_bi_şangayî||2||1
|-
|Lema_bi_russenorskî||2||1
|-
|Lema_bi_nalî||2||1
|-
|Lema_bi_guayaberoyî||2||1
|-
|Lema_bi_dusun_deyahî||2||1
|-
|Lema_bi_busamiyî||2||1
|-
|Lema_bi_balanta-kentohe||2||1
|-
|Lema_bi_xaragure||2||1
|-
|Lema_bi_şixingî||2||1
|-
|Lema_bi_safeyoka||2||1
|-
|Lema_bi_paikonekayî||2||1
|-
|Lema_bi_mbu'||2||1
|-
|Lema_bi_kobolî||2||1
|-
|Lema_bi_edopiyî||2||1
|-
|Lema_bi_bandayiya_rojavayî_ya_navendî||2||1
|-
|Lema_bi_saluanî||2||1
|-
|Lema_bi_mehekî||2||1
|-
|Lema_bi_elkeiyî||2||1
|-
|Lema_bi_yakayî||2||1
|-
|Lema_bi_tai_hongjinî||2||1
|-
|Lema_bi_samtaoyî||2||1
|-
|Lema_bi_nekginî||2||1
|-
|Lema_bi_korakî||2||1
|-
|Lema_bi_barranbinyayî||2||1
|-
|Lema_bi_talîsî||2||1
|-
|Lema_bi_sapeyî||2||1
|-
|Lema_bi_payaguayî||2||1
|-
|Lema_bi_milangî||2||1
|-
|Lema_bi_kamasayî||2||1
|-
|Lema_bi_cruzeñoyî||2||1
|-
|Lema_bi_ancamî||2||1
|-
|Lema_bi_tangaleyî||2||1
|-
|Lema_bi_savosavoyî||2||1
|-
|Lema_bi_peyî||2||1
|-
|Lema_bi_ngbaka_manzayî||2||1
|-
|Lema_bi_misima-paneatî||2||1
|-
|Lema_bi_kangayî||2||1
|-
|Lema_bi_çaçiyî||2||1
|-
|Lema_bi_bayiya_bakurî||2||1
|-
|Lema_bi_yeniçeyî||2||1
|-
|Lema_bi_tarairiú||2||1
|-
|Lema_bi_pilagayî||2||1
|-
|Lema_bi_horomî||2||1
|-
|Lema_bi_benayî||2||1
|-
|Lema_bi_anyî||2||1
|-
|Lema_bi_yisî||2||1
|-
|Lema_bi_uşojoyî||2||1
|-
|Lema_bi_tatuyoyî||2||1
|-
|Lema_bi_serilî||2||1
|-
|Lema_bi_playeroyî||2||1
|-
|Lema_bi_nkarî||2||1
|-
|Lema_bi_mocovî||2||1
|-
|Lema_bi_kuboyî||2||1
|-
|Lema_bi_karayî_(Tanzanya)||2||1
|-
|Lema_bi_hulayî||2||1
|-
|Lema_bi_çinookî||2||1
|-
|Lema_bi_yugambalî||2||1
|-
|Lema_bi_tayrorayiya_bakur||2||1
|-
|Lema_bi_maleyî||2||1
|-
|Lema_bi_kumukioyî||2||1
|-
|Lema_bi_indus_kohistanî||2||1
|-
|Lema_bi_foiyî||2||1
|-
|Lema_bi_çoçotecî||2||1
|-
|Lema_bi_bimobayî||2||1
|-
|Lema_bi_argunî||2||1
|-
|Lema_bi_wabodayî||2||1
|-
|Lema_bi_montolî||2||1
|-
|Lema_bi_kuruduyî||2||1
|-
|Lema_bi_kawaçayî||2||1
|-
|Lema_bi_îbinoyî||2||1
|-
|Lema_bi_çutî||2||1
|-
|Lema_bi_arutanî||2||1
|-
|Lema_bi_mpotovoroyî||2||1
|-
|Lema_bi_kayrîrûyî||2||1
|-
|Lema_bi_bogayayî||2||1
|-
|Lema_bi_zapotekiya_san_baltazar_loxiça||2||1
|-
|Lema_bi_wantoatî||2||1
|-
|Lema_bi_tidongiya_başûrî||2||1
|-
|Lema_bi_sogayî||2||1
|-
|Lema_bi_obolo||2||1
|-
|Lema_bi_mundarî||2||1
|-
|Lema_bi_mapos_buangî||2||1
|-
|Lema_bi_kyengayî||2||1
|-
|Lema_bi_kengayî||2||1
|-
|Lema_bi_dâwî||2||1
|-
|Lema_bi_bondeyî||2||1
|-
|Lema_bi_aulua||2||1
|-
|Lema_bi_zapotekiya_yatee||2||1
|-
|Lema_bi_waropenî||2||1
|-
|Lema_bi_musarî||2||1
|-
|Lema_bi_bremî||2||1
|-
|Lema_bi_awjîla||2||1
|-
|Lema_bi_aghu_tharrnggalayî||2||1
|-
|Lema_bi_zialoyî||2||1
|-
|Lema_bi_tobeloyî||2||1
|-
|Lema_bi_nabî||2||1
|-
|Lema_bi_lardilî||2||1
|-
|Lema_bi_gêdagêdî||2||1
|-
|Lema_bi_dizinî||2||1
|-
|Lema_bi_bugotûyî||2||1
|-
|Lema_bi_azoyú_me'phaayî||2||1
|-
|Lema_bi_zumbunî||2||1
|-
|Lema_bi_tondanoyî||2||1
|-
|Lema_bi_rongayî||2||1
|-
|Lema_bi_matorî||2||1
|-
|Lema_bi_jaminjungî||2||1
|-
|Lema_bi_golayî||2||1
|-
|Lema_bi_dorzeyî||2||1
|-
|Lema_bi_namakurayî||2||1
|-
|Lema_bi_maykulanî||2||1
|-
|Lema_bi_libon_bikolî||2||1
|-
|Lema_bi_gudeyî||2||1
|-
|Lema_bi_busamî||2||1
|-
|Lema_bi_mbudumî||2||1
|-
|Lema_bi_koçî||2||1
|-
|Lema_bi_cahuaranoyî||2||1
|-
|Lema_bi_bandiyî||2||1
|-
|Lema_bi_alseayî||2||1
|-
|Lema_bi_tadaksahakî||2||1
|-
|Lema_bi_samarokenayî||2||1
|-
|Lema_bi_pamplona_atta||2||1
|-
|Lema_bi_hadramî||2||1
|-
|Lema_bi_barapasiyî||2||1
|-
|Lema_bi_tairorayiya_başûr||2||1
|-
|Lema_bi_nekî||2||1
|-
|Lema_bi_mesakayî||2||1
|-
|Lema_bi_lucumiyî||2||1
|-
|Lema_bi_koranayî||2||1
|-
|Lema_bi_cocopayî||2||1
|-
|Lema_bi_amdang||2||1
|-
|Lema_bi_talokî||2||1
|-
|Lema_bi_saponî||2||1
|-
|Lema_bi_ngaingî||2||1
|-
|Lema_bi_miltuyî||2||1
|-
|Lema_bi_luriya_başûrî||2||1
|-
|Lema_bi_kamassî||2||1
|-
|Lema_bi_cuayî||2||1
|-
|Lema_bi_andaî||2||1
|-
|Lema_bi_yarlî||2||1
|-
|Lema_bi_tangamî||2||1
|-
|Lema_bi_ngbakayî||2||1
|-
|Lema_bi_misingî||2||1
|-
|Lema_bi_kanggapeyî||2||1
|-
|Lema_bi_yeretuarî||2||1
|-
|Lema_bi_makahî||2||1
|-
|Lema_bi_kapîngamarancîyî||2||1
|-
|Lema_bi_horpayî||2||1
|-
|Lema_bi_etonî_(Kamerûn)||2||1
|-
|Lema_bi_bençî||2||1
|-
|Lema_bi_sererî||2||1
|-
|Lema_bi_malasangayî||2||1
|-
|Lema_bi_huliyî||2||1
|-
|Lema_bi_çipayayî||2||1
|-
|Lema_bi_tayrumayî||2||1
|-
|Lema_bi_molimayî||2||1
|-
|Lema_bi_ipaî||2||1
|-
|Lema_bi_arhuako||2||1
|-
|Lema_bi_wadjiginyî||2||1
|-
|Lema_bi_temneyî||2||1
|-
|Lema_bi_sionayî||2||1
|-
|Lema_bi_monumboyî||2||1
|-
|Lema_bi_kurukhî||2||1
|-
|Lema_bi_asamiya_navîn||2||1
|-
|Lema_bi_zapotekiya_asunción_mixtepec||2||1
|-
|Lema_bi_wambuleyî||2||1
|-
|Lema_bi_puragî||2||1
|-
|Lema_bi_kwalhioqua-tlatskanaî||2||1
|-
|Lema_bi_kaytetyeyî||2||1
|-
|Lema_bi_boghomî||2||1
|-
|Lema_bi_ata||2||1
|-
|Lema_bi_abuayî||2||1
|-
|Lema_bi_zapotekiya_san_juan_guelavia||2||1
|-
|Lema_bi_wanyî||2||1
|-
|Lema_bi_quitemoyî||2||1
|-
|Lema_bi_mundatî||2||1
|-
|Lema_bi_laalî||2||1
|-
|Lema_bi_keningau_murutî||2||1
|-
|Lema_bi_dawroyî||2||1
|-
|Lema_bi_bondoyî||2||1
|-
|Lema_bi_aurá||2||1
|-
|Lema_bi_titanî||2||1
|-
|Lema_bi_lalayî_(Gîneya_nû)||2||1
|-
|Lema_bi_gbaya-bossangoayî||2||1
|-
|Lema_bi_awngî||2||1
|-
|Lema_bi_ziayî||2||1
|-
|Lema_bi_wayanayî||2||1
|-
|Lema_bi_subtiabayî||2||1
|-
|Lema_bi_roglayiya_bakurî||2||1
|-
|Lema_bi_onondagayî||2||1
|-
|Lema_bi_nadëbî||2||1
|-
|Lema_bi_masalitî||2||1
|-
|Lema_bi_ghomalayî'||2||1
|-
|Lema_bi_djiminiyî||2||1
|-
|Lema_bi_bugunî||2||1
|-
|Lema_bi_aîmeleyî||2||1
|-
|Lema_bi_wirafedî||2||1
|-
|Lema_bi_ronî||2||1
|-
|Lema_bi_osatuyî||2||1
|-
|Lema_bi_kir-balarî||2||1
|-
|Lema_bi_bunogeyî||2||1
|-
|Lema_bi_bahayî||2||1
|-
|Lema_bi_şaranahuayî||2||1
|-
|Lema_bi_rwayî||2||1
|-
|Lema_bi_mayoyao_ifugaoyî||2||1
|-
|Lema_bi_ligbiyî||2||1
|-
|Lema_bi_jeri_kuoyî||2||1
|-
|Lema_bi_guhu-samaneyî||2||1
|-
|Lema_bi_baldemuyî||2||1
|-
|Lema_bi_xengxayî||2||1
|-
|Lema_bi_tsamaî||2||1
|-
|Lema_bi_şolagayî||2||1
|-
|Lema_bi_sahaptinî||2||1
|-
|Lema_bi_nasioyî||2||1
|-
|Lema_bi_mbuguyî||2||1
|-
|Lema_bi_kodavayî||2||1
|-
|Lema_bi_jurúnayî||2||1
|-
|Lema_bi_guroyî||2||1
|-
|Lema_bi_efaiyî||2||1
|-
|Lema_bi_altaya_bakurî||2||1
|-
|Lema_bi_tujyayiya_başûrî||2||1
|-
|Lema_bi_tadyawanî||2||1
|-
|Lema_bi_loniuyî||2||1
|-
|Lema_bi_kaerayî||2||1
|-
|Lema_bi_eloyî||2||1
|-
|Lema_bi_catio_çibçayî||2||1
|-
|Lema_bi_barasanayî||2||1
|-
|Lema_bi_amanayé||2||1
|-
|Lema_bi_sanavironî||2||1
|-
|Lema_bi_paraçî||2||1
|-
|Lema_bi_nekoyî||2||1
|-
|Lema_bi_messapicî||2||1
|-
|Lema_bi_kalapuyayî||2||1
|-
|Lema_bi_coçimiyî||2||1
|-
|Lema_bi_baruyayî||2||1
|-
|Lema_bi_ameleyî||2||1
|-
|Lema_bi_yangkaalî||2||1
|-
|Lema_bi_taluyî||2||1
|-
|Lema_bi_peç||2||1
|-
|Lema_bi_lusengoyî||2||1
|-
|Lema_bi_cubeoyî||2||1
|-
|Lema_bi_andamaniya_mezin_a_têkel||2||1
|-
|Lema_bi_yarluyandî||2||1
|-
|Lema_bi_tangoayî||2||1
|-
|Lema_bi_sawriya_pahariayî||2||1
|-
|Lema_bi_phalurayî||2||1
|-
|Lema_bi_ngeqî||2||1
|-
|Lema_bi_kangrî||2||1
|-
|Lema_bi_çaimayî||2||1
|-
|Lema_bi_bayiya_navendî||2||1
|-
|Lema_bi_angoram||2||1
|-
|Lema_bi_yerongî||2||1
|-
|Lema_bi_sekarî||2||1
|-
|Lema_bi_pima_bajoyî||2||1
|-
|Lema_bi_makaleroyî||2||1
|-
|Lema_bi_hoteyî||2||1
|-
|Lema_bi_çayahuitayî||2||1
|-
|Lema_bi_aore||2||1
|-
|Lema_bi_uveyiya_rojava||2||1
|-
|Lema_bi_pnarî||2||1
|-
|Lema_bi_malasî||2||1
|-
|Lema_bi_kueyuyî||2||1
|-
|Lema_bi_çiquimulillayî||2||1
|-
|Lema_bi_bhilalî||2||1
|-
|Lema_bi_sieyî||2||1
|-
|Lema_bi_popolucayiya_oluta||2||1
|-
|Lema_bi_molmo_one||2||1
|-
|Lema_bi_kunamayî||2||1
|-
|Lema_bi_aribwatsayî||2||1
|-
|Lema_bi_waffayî||2||1
|-
|Lema_bi_sioyî||2||1
|-
|Lema_bi_îbuoroyî||2||1
|-
|Lema_bi_zapotekiya_ayoquesco||2||1
|-
|Lema_bi_wamparî||2||1
|-
|Lema_bi_teseyî||2||1
|-
|Lema_bi_nyawaygî||2||1
|-
|Lema_bi_mpur||2||1
|-
|Lema_bi_manikionî||2||1
|-
|Lema_bi_kwamayî||2||1
|-
|Lema_bi_keaparayî||2||1
|-
|Lema_bi_îlongotî||2||1
|-
|Lema_bi_gadsupî||2||1
|-
|Lema_bi_atakapa||2||1
|-
|Lema_bi_abunî||2||1
|-
|Lema_bi_zapotekiya_san_pedro_quiatoni||2||1
|-
|Lema_bi_sokoroyî||2||1
|-
|Lema_bi_odualî||2||1
|-
|Lema_bi_mündü||2||1
|-
|Lema_bi_labelî||2||1
|-
|Lema_bi_keninjalî||2||1
|-
|Lema_bi_boneratî||2||1
|-
|Lema_bi_auyana||2||1
|-
|Lema_bi_adeleyî||2||1
|-
|Lema_bi_zapotekiya_zaniza||2||1
|-
|Lema_bi_oksapminî||2||1
|-
|Lema_bi_musguyî||2||1
|-
|Lema_bi_mariyiya_awistronezî||2||1
|-
|Lema_bi_laluyiya_rojavayî||2||1
|-
|Lema_bi_kêdangî||2||1
|-
|Lema_bi_gbaya-bozoumî||2||1
|-
|Lema_bi_bretoniya_navîn||2||1
|-
|Lema_bi_awtuwî||2||1
|-
|Lema_bi_zigulayî||2||1
|-
|Lema_bi_wayî||2||1
|-
|Lema_bi_sudestî||2||1
|-
|Lema_bi_opaoyî||2||1
|-
|Lema_bi_laruyî||2||1
|-
|Lema_bi_khweyî||2||1
|-
|Lema_bi_gidarî||2||1
|-
|Lema_bi_baanî||2||1
|-
|Lema_bi_zuojiang_zhuangî||2||1
|-
|Lema_bi_wirö||2||1
|-
|Lema_bi_roonî||2||1
|-
|Lema_bi_dourayî||2||1
|-
|Lema_bi_bahingî||2||1
|-
|Lema_bi_likumî||2||1
|-
|Lema_bi_jeru||2||1
|-
|Lema_bi_guinauyî||2||1
|-
|Lema_bi_duunî||2||1
|-
|Lema_bi_busayî||2||1
|-
|Lema_bi_naskapî||2||1
|-
|Lema_bi_mbukoyî||2||1
|-
|Lema_bi_kofyarî||2||1
|-
|Lema_bi_jutiapayî||2||1
|-
|Lema_bi_guruntumî||2||1
|-
|Lema_bi_efateyiya_bakur||2||1
|-
|Lema_bi_altaya_başûrî||2||1
|-
|Lema_bi_yabaranayî||2||1
|-
|Lema_bi_tukang_besiya_bakur||2||1
|-
|Lema_bi_sambaliya_botolan||2||1
|-
|Lema_bi_lonwolwolî||2||1
|-
|Lema_bi_kagoroyî||2||1
|-
|Lema_bi_haidayiya_bakurî||2||1
|-
|Lema_bi_catuquinaruyî||2||1
|-
|Lema_bi_barayî||2||1
|-
|Lema_bi_amarakaerî||2||1
|-
|Lema_bi_yakomayî||2||1
|-
|Lema_bi_yangkamî||2||1
|-
|Lema_bi_tamanakuyî||2||1
|-
|Lema_bi_sarasirayî||2||1
|-
|Lema_bi_ngalakanî||2||1
|-
|Lema_bi_lusiyî||2||1
|-
|Lema_bi_kowakî||2||1
|-
|Lema_bi_hembayî||2||1
|-
|Lema_bi_erebiya_jubayê||2||1
|-
|Lema_bi_batharî||2||1
|-
|Lema_bi_andioyî||2||1
|-
|Lema_bi_yasayî||2||1
|-
|Lema_bi_sayî||2||1
|-
|Lema_bi_pholayî||2||1
|-
|Lema_bi_ngiemboonî||2||1
|-
|Lema_bi_maçinereyî||2||1
|-
|Lema_bi_kreyoliya_giravên_virginê||2||1
|-
|Lema_bi_kaningdon-nindemî||2||1
|-
|Lema_bi_çairelî||2||1
|-
|Lema_bi_yeskwayî||2||1
|-
|Lema_bi_urayî_(Vanuatu)||2||1
|-
|Lema_bi_taraonî||2||1
|-
|Lema_bi_selaruyî||2||1
|-
|Lema_bi_mixtekiya_diuxi-tilantongo||2||1
|-
|Lema_bi_etuloyî||2||1
|-
|Lema_bi_benerafî||2||1
|-
|Lema_bi_yoidikî||2||1
|-
|Lema_bi_tauşîroyî||2||1
|-
|Lema_bi_serudung_murutî||2||1
|-
|Lema_bi_poçutekî||2||1
|-
|Lema_bi_nkorooyî||2||1
|-
|Lema_bi_kugboyî||2||1
|-
|Lema_bi_karipúnayî||2||1
|-
|Lema_bi_çiquitanoyî||2||1
|-
|Lema_bi_biangaî||2||1
|-
|Lema_bi_vilelayî||2||1
|-
|Lema_bi_tebul_ure_dogonî||2||1
|-
|Lema_bi_sikaritaî||2||1
|-
|Lema_bi_norweciya_traveller||2||1
|-
|Lema_bi_molokoyî||2||1
|-
|Lema_bi_bipî||2||1
|-
|Lema_bi_aribwaungî||2||1
|-
|Lema_bi_wagayayî||2||1
|-
|Lema_bi_ten'ednî||2||1
|-
|Lema_bi_sipakapenseyî||2||1
|-
|Lema_bi_puelçeyî||2||1
|-
|Lema_bi_numanggangî||2||1
|-
|Lema_bi_mori_atasî||2||1
|-
|Lema_bi_kustenauyî||2||1
|-
|Lema_bi_îdî||2||1
|-
|Lema_bi_da'a_kailiyî||2||1
|-
|Lema_bi_bîssayî||2||1
|-
|Lema_bi_zapotekiya_cajonos||2||1
|-
|Lema_bi_wampurî||2||1
|-
|Lema_bi_tetelayî||2||1
|-
|Lema_bi_puruborayî||2||1
|-
|Lema_bi_nyihayî||2||1
|-
|Lema_bi_kwamerayî||2||1
|-
|Lema_bi_îlueyî||2||1
|-
|Lema_bi_damayî_(Sierra_leone)||2||1
|-
|Lema_bi_atanquesî||2||1
|-
|Lema_bi_abureyî||2||1
|-
|Lema_bi_zapotekiya_san_vicente_coatlan||2||1
|-
|Lema_bi_solongyî||2||1
|-
|Lema_bi_ofayeyî||2||1
|-
|Lema_bi_labuk-kinabatangan_kadazanî||2||1
|-
|Lema_bi_înuvialuktunî||2||1
|-
|Lema_bi_auye||2||1
|-
|Lema_bi_adî||2||1
|-
|Lema_bi_waskiayî||2||1
|-
|Lema_bi_tiwayiya_başûrî||2||1
|-
|Lema_bi_reel||2||1
|-
|Lema_bi_musî||2||1
|-
|Lema_bi_îsokoyî||2||1
|-
|Lema_bi_gbayayiya_bakur-rojava||2||1
|-
|Lema_bi_awyî||2||1
|-
|Lema_bi_zimakanî||2||1
|-
|Lema_bi_wayumarayî||2||1
|-
|Lema_bi_suenayî||2||1
|-
|Lema_bi_opónî||2||1
|-
|Lema_bi_nafî||2||1
|-
|Lema_bi_kiangiya_başûrî||2||1
|-
|Lema_bi_gituayî||2||1
|-
|Lema_bi_babariya_bakur||2||1
|-
|Lema_bi_ǀxamî||2||1
|-
|Lema_bi_wiruyî||2||1
|-
|Lema_bi_roroyî||2||1
|-
|Lema_bi_osingî||2||1
|-
|Lema_bi_mattolî||2||1
|-
|Lema_bi_matukarî||2||1
|-
|Lema_bi_leleyî_(Çad)||2||1
|-
|Lema_bi_kirikiriyî||2||1
|-
|Lema_bi_japhugî||2||1
|-
|Lema_bi_doutaî||2||1
|-
|Lema_bi_buol||2||1
|-
|Lema_bi_akolet||2||1
|-
|Lema_bi_sa'a||2||1
|-
|Lema_bi_maypureyî||2||1
|-
|Lema_bi_jerungî||2||1
|-
|Lema_bi_sahuyî||2||1
|-
|Lema_bi_pakanhayî||2||1
|-
|Lema_bi_kohinî||2||1
|-
|Lema_bi_calusayî||2||1
|-
|Lema_bi_banganduyî||2||1
|-
|Lema_bi_yabenî||2||1
|-
|Lema_bi_tukang_besî_başûr||2||1
|-
|Lema_bi_mele-filayî||2||1
|-
|Lema_bi_loomayî||2||1
|-
|Lema_bi_kaheyî||2||1
|-
|Lema_bi_emanî||2||1
|-
|Lema_bi_barbarenyoyî||2||1
|-
|Lema_bi_amarayî||2||1
|-
|Lema_bi_nendî||2||1
|-
|Lema_bi_meyahî||2||1
|-
|Lema_bi_kalayî||2||1
|-
|Lema_bi_haroiyî||2||1
|-
|Lema_bi_enî||2||1
|-
|Lema_bi_amî||2||1
|-
|Lema_bi_yangum_deyî||2||1
|-
|Lema_bi_tamangiya_rojhilatî||2||1
|-
|Lema_bi_saravekayî||2||1
|-
|Lema_bi_ngalumî||2||1
|-
|Lema_bi_minaeanî||2||1
|-
|Lema_bi_kowyayî||2||1
|-
|Lema_bi_herdeyî||2||1
|-
|Lema_bi_cuitlatecî||2||1
|-
|Lema_bi_yaviteroyî||2||1
|-
|Lema_bi_sebat_bet_gurageyî||2||1
|-
|Lema_bi_phomî||2||1
|-
|Lema_bi_mişipî||2||1
|-
|Lema_bi_madayî_(Nîjerya)||2||1
|-
|Lema_bi_kaninuwayî||2||1
|-
|Lema_bi_anîî||2||1
|-
|Lema_bi_yessan-mayoyî||2||1
|-
|Lema_bi_selk'namî||2||1
|-
|Lema_bi_pinyinî||2||1
|-
|Lema_bi_nimadî||2||1
|-
|Lema_bi_kriya_mûsî||2||1
|-
|Lema_bi_hoyahoyayî||2||1
|-
|Lema_bi_evantî||2||1
|-
|Lema_bi_apabhramsayî||2||1
|-
|Lema_bi_uyî||2||1
|-
|Lema_bi_serui-lautî||2||1
|-
|Lema_bi_podokoyî||2||1
|-
|Lema_bi_moçoyî||2||1
|-
|Lema_bi_kaririyî||2||1
|-
|Lema_bi_fasuyî||2||1
|-
|Lema_bi_çirinoyî||2||1
|-
|Lema_bi_yuhupî||2||1
|-
|Lema_bi_vitî||2||1
|-
|Lema_bi_momayî||2||1
|-
|Lema_bi_island_caribî||2||1
|-
|Lema_bi_forakî||2||1
|-
|Lema_bi_çongî||2||1
|-
|Lema_bi_birgidî||2||1
|-
|Lema_bi_wagemanî||2||1
|-
|Lema_bi_nunggubuyuyî||2||1
|-
|Lema_bi_morigî||2||1
|-
|Lema_bi_îdomayî||2||1
|-
|Lema_bi_fulniôî||2||1
|-
|Lema_bi_daai_çinî||2||1
|-
|Lema_bi_wanambreyî||2||1
|-
|Lema_bi_skouyî||2||1
|-
|Lema_bi_purukotó||2||1
|-
|Lema_bi_nyimangî||2||1
|-
|Lema_bi_kwangaliyî||2||1
|-
|Lema_bi_keigayî||2||1
|-
|Lema_bi_gagaduyî||2||1
|-
|Lema_bi_danî||2||1
|-
|Lema_bi_bokobaruyî||2||1
|-
|Lema_bi_abuyî||2||1
|-
|Lema_bi_zapotekiya_santa_ines_yatzeçi||2||1
|-
|Lema_bi_war-jaîntî||2||1
|-
|Lema_bi_mungbamî||2||1
|-
|Lema_bi_labuyî||2||1
|-
|Lema_bi_kenyangî||2||1
|-
|Lema_bi_îpikoyî||2||1
|-
|Lema_bi_zapotekoyiya_mahuatlana_navendî||2||1
|-
|Lema_bi_wasko-wişramî||2||1
|-
|Lema_bi_sowayî||2||1
|-
|Lema_bi_musomî||2||1
|-
|Lema_bi_markayî||2||1
|-
|Lema_bi_lamaholotî||2||1
|-
|Lema_bi_gbayayiya_başûr-rojava||2||1
|-
|Lema_bi_axamb||2||1
|-
|Lema_bi_agobî||2||1
|-
|Lema_bi_zimanê_destan_ê_brîtanî||2||1
|-
|Lema_bi_toçoyî||2||1
|-
|Lema_bi_suî||2||1
|-
|Lema_bi_kibirî||2||1
|-
|Lema_bi_gizigayiya_bakur||2||1
|-
|Lema_bi_doeyî||2||1
|-
|Lema_bi_aka-beayî||2||1
|-
|Lema_bi_ǁaniyî||2||1
|-
|Lema_bi_rotokasî||2||1
|-
|Lema_bi_nahwatliya_orizaba||2||1
|-
|Lema_bi_nahwatliya_pueblaya_başûr-rojhilatî||2||1
|-
|Lema_bi_leleyî_(Gîne)||2||1
|-
|Lema_bi_kirya-konzelî||2||1
|-
|Lema_bi_bura_mabangî||2||1
|-
|Lema_bi_bajwayiya_endonezyayî||2||1
|-
|Lema_bi_akooseyî||2||1
|-
|Lema_bi_şayî||2||1
|-
|Lema_bi_saamiayî||2||1
|-
|Lema_bi_pa'ayî||2||1
|-
|Lema_bi_nambyayî||2||1
|-
|Lema_bi_maysînî||2||1
|-
|Lema_bi_jibuyî||2||1
|-
|Lema_bi_buwalî||2||1
|-
|Lema_bi_xibeyî||2||1
|-
|Lema_bi_pal||2||1
|-
|Lema_bi_naueteyî||2||1
|-
|Lema_bi_mbundayî||2||1
|-
|Lema_bi_juxtlahuaca_mixteciya_rojavayî||2||1
|-
|Lema_bi_caluyanunî||2||1
|-
|Lema_bi_yabongî||2||1
|-
|Lema_bi_tukanoyî||2||1
|-
|Lema_bi_ndemlî||2||1
|-
|Lema_bi_meloyî||2||1
|-
|Lema_bi_lopayî||2||1
|-
|Lema_bi_komyandaretî||2||1
|-
|Lema_bi_kaianî||2||1
|-
|Lema_bi_haislayî||2||1
|-
|Lema_bi_emayî||2||1
|-
|Lema_bi_cayubabayî||2||1
|-
|Lema_bi_bardî||2||1
|-
|Lema_bi_amarizanayî||2||1
|-
|Lema_bi_yalarnngayî||2||1
|-
|Lema_bi_taînaeyî||2||1
|-
|Lema_bi_parawenî||2||1
|-
|Lema_bi_enwangî||2||1
|-
|Lema_bi_coguiyî||2||1
|-
|Lema_bi_basketoyî||2||1
|-
|Lema_bi_yangum_monî||2||1
|-
|Lema_bi_udayî||2||1
|-
|Lema_bi_tamayî_(Çad)||2||1
|-
|Lema_bi_sarayî||2||1
|-
|Lema_bi_ngamamboyî||2||1
|-
|Lema_bi_minanibaî||2||1
|-
|Lema_bi_koyoyî||2||1
|-
|Lema_bi_batuî||2||1
|-
|Lema_bi_andoa||2||1
|-
|Lema_bi_yawalapitî||2||1
|-
|Lema_bi_tanimuca-retuarã||2||1
|-
|Lema_bi_seberuangî||2||1
|-
|Lema_bi_hlepho_phowayî||2||1
|-
|Lema_bi_bebeyî||2||1
|-
|Lema_bi_anîmere||2||1
|-
|Lema_bi_yetfayî||2||1
|-
|Lema_bi_piratapuyoyî||2||1
|-
|Lema_bi_nimoayî||2||1
|-
|Lema_bi_bengî||2||1
|-
|Lema_bi_tawalayî||2||1
|-
|Lema_bi_seruyî||2||1
|-
|Lema_bi_pogoloyî||2||1
|-
|Lema_bi_malayiya_berau||2||1
|-
|Lema_bi_çitimaçayî||2||1
|-
|Lema_bi_aranadanî||2||1
|-
|Lema_bi_viyetnamiya_navîn||2||1
|-
|Lema_bi_mondeyî||2||1
|-
|Lema_bi_malvî||2||1
|-
|Lema_bi_kuniyî||2||1
|-
|Lema_bi_birgîtî||2||1
|-
|Lema_bi_ariyî||2||1
|-
|Lema_bi_tennetî||2||1
|-
|Lema_bi_kaxuyanayî||2||1
|-
|Lema_bi_fungwayî||2||1
|-
|Lema_bi_daasanaçî||2||1
|-
|Lema_bi_zapotekiya_coatlan||2||1
|-
|Lema_bi_wanapî||2||1
|-
|Lema_bi_slaveyiya_bakur||2||1
|-
|Lema_bi_nyindrouyî||2||1
|-
|Lema_bi_kwangî||2||1
|-
|Lema_bi_îndo-portegîzî||2||1
|-
|Lema_bi_bokotoyî||2||1
|-
|Lema_bi_atemble||2||1
|-
|Lema_bi_zapotekiya_santa_maria_quiegolani||2||1
|-
|Lema_bi_timor_pidginî||2||1
|-
|Lema_bi_solosî||2||1
|-
|Lema_bi_rajbanşî||2||1
|-
|Lema_bi_ogbahî||2||1
|-
|Lema_bi_mungguî||2||1
|-
|Lema_bi_gavakî||2||1
|-
|Lema_bi_zaramoyî||2||1
|-
|Lema_bi_soyî||2||1
|-
|Lema_bi_okwanuçuyî||2||1
|-
|Lema_bi_lamangî||2||1
|-
|Lema_bi_gbayiyî||2||1
|-
|Lema_bi_dicamay_agtayî||2||1
|-
|Lema_bi_brokpakeyî||2||1
|-
|Lema_bi_axi_yî||2||1
|-
|Lema_bi_todayî||2||1
|-
|Lema_bi_sukî||2||1
|-
|Lema_bi_nagtipunan_agtayî||2||1
|-
|Lema_bi_îxcatecî||2||1
|-
|Lema_bi_gizigayiya_başûr||2||1
|-
|Lema_bi_babatanayî||2||1
|-
|Lema_bi_aka-bo||2||1
|-
|Lema_bi_wiyotî||2||1
|-
|Lema_bi_tontemboanî||2||1
|-
|Lema_bi_otankî||2||1
|-
|Lema_bi_nahwatliya_tabasco||2||1
|-
|Lema_bi_maungî||2||1
|-
|Lema_bi_lenduyî||2||1
|-
|Lema_bi_kisiyî||2||1
|-
|Lema_bi_duauyî||2||1
|-
|Lema_bi_burarrayî||2||1
|-
|Lema_bi_wusa_nasuyî||2||1
|-
|Lema_bi_tourayî||2||1
|-
|Lema_bi_şehrî||2||1
|-
|Lema_bi_namiayî||2||1
|-
|Lema_bi_jicaqueyiya_rojavayî||2||1
|-
|Lema_bi_duwetî||2||1
|-
|Lema_bi_buyangiya_langnî||2||1
|-
|Lema_bi_baluan-pam||2||1
|-
|Lema_bi_şuarî||2||1
|-
|Lema_bi_sakapultekoyî||2||1
|-
|Lema_bi_naukanskî||2||1
|-
|Lema_bi_mbungayî||2||1
|-
|Lema_bi_koiariyiya_çiyayî||2||1
|-
|Lema_bi_juǀ'hoanî||2||1
|-
|Lema_bi_efutopî||2||1
|-
|Lema_bi_cameroon_pidginî||2||1
|-
|Lema_bi_bangi_meyî||2||1
|-
|Lema_bi_alumu-tesuyî||2||1
|-
|Lema_bi_pande||2||1
|-
|Lema_bi_ndengerekoyî||2||1
|-
|Lema_bi_konabereyî||2||1
|-
|Lema_bi_kaimbulawayî||2||1
|-
|Lema_bi_haiǁomî||2||1
|-
|Lema_bi_amasî||2||1
|-
|Lema_bi_tutçoneyiya_bakurî||2||1
|-
|Lema_bi_nengoneyî||2||1
|-
|Lema_bi_mfinuyî||2||1
|-
|Lema_bi_luguruyî||2||1
|-
|Lema_bi_korkuyî||2||1
|-
|Lema_bi_haruaî||2||1
|-
|Lema_bi_eotileyî||2||1
|-
|Lema_bi_ammoniteyî||2||1
|-
|Lema_bi_tambasî||2||1
|-
|Lema_bi_ngambayî||2||1
|-
|Lema_bi_luvaleyî||2||1
|-
|Lema_bi_koyra_çiiniyî||2||1
|-
|Lema_bi_kamiya_bakurî||2||1
|-
|Lema_bi_cullî||2||1
|-
|Lema_bi_andoque||2||1
|-
|Lema_bi_yawarawargayî||2||1
|-
|Lema_bi_tanjijilî||2||1
|-
|Lema_bi_phuzayî||2||1
|-
|Lema_bi_miwokiya_sierraya_bakurî||2||1
|-
|Lema_bi_mag-ançî_aytayî||2||1
|-
|Lema_bi_esanî||2||1
|-
|Lema_bi_anîndîlyakwa||2||1
|-
|Lema_bi_urimî||2||1
|-
|Lema_bi_tarokî||2||1
|-
|Lema_bi_ninamî||2||1
|-
|Lema_bi_karajayî||2||1
|-
|Lema_bi_hozoyî||2||1
|-
|Lema_bi_tawang_monpayî||2||1
|-
|Lema_bi_modoleyî||2||1
|-
|Lema_bi_malayiya_kedah||2||1
|-
|Lema_bi_karnaî||2||1
|-
|Lema_bi_fembeyî||2||1
|-
|Lema_bi_çittagonianî||2||1
|-
|Lema_bi_teeyî||2||1
|-
|Lema_bi_mamaindeyî||2||1
|-
|Lema_bi_kunjenî||2||1
|-
|Lema_bi_kâteyî||2||1
|-
|Lema_bi_biritaiyî||2||1
|-
|Lema_bi_arîfama-mînîafîayî||2||1
|-
|Lema_bi_sirayî||2||1
|-
|Lema_bi_puluwatî||2||1
|-
|Lema_bi_nunguyî||2||1
|-
|Lema_bi_moromî||2||1
|-
|Lema_bi_kuturmiyî||2||1
|-
|Lema_bi_furî||2||1
|-
|Lema_bi_dabayî||2||1
|-
|Lema_bi_blang||2||1
|-
|Lema_bi_wandalayî||2||1
|-
|Lema_bi_slaveyiya_başûr||2||1
|-
|Lema_bi_pwoyiya_bakurî||2||1
|-
|Lema_bi_kwanjayî||2||1
|-
|Lema_bi_galelayî||2||1
|-
|Lema_bi_bokoyî||2||1
|-
|Lema_bi_zapotekiya_santiago_xanica||2||1
|-
|Lema_bi_timoteyî||2||1
|-
|Lema_bi_rakhineyî||2||1
|-
|Lema_bi_ogbiayî||2||1
|-
|Lema_bi_mungkipî||2||1
|-
|Lema_bi_kerayî||2||1
|-
|Lema_bi_îquitoyî||2||1
|-
|Lema_bi_gavarî||2||1
|-
|Lema_bi_boorî||2||1
|-
|Lema_bi_avavayî||2||1
|-
|Lema_bi_waşoyî||2||1
|-
|Lema_bi_tîkopyayî||2||1
|-
|Lema_bi_rembongî||2||1
|-
|Lema_bi_khanayî||2||1
|-
|Lema_bi_gcirikuyî||2||1
|-
|Lema_bi_oro_wînî||2||1
|-
|Lema_bi_nahalî||2||1
|-
|Lema_bi_maselayiya_rojhilat||2||1
|-
|Lema_bi_latundê||2||1
|-
|Lema_bi_baboleyî||2||1
|-
|Lema_bi_aka-karî||2||1
|-
|Lema_bi_rovyanayî||2||1
|-
|Lema_bi_kissiya_bakurî||2||1
|-
|Lema_bi_dubuyî||2||1
|-
|Lema_bi_burayî||2||1
|-
|Lema_bi_baka||2||1
|-
|Lema_bi_akpayî||2||1
|-
|Lema_bi_wutungî||2||1
|-
|Lema_bi_şekoyî||2||1
|-
|Lema_bi_paamayî||2||1
|-
|Lema_bi_jilî||2||1
|-
|Lema_bi_gulayî||2||1
|-
|Lema_bi_dyaabugayî||2||1
|-
|Lema_bi_aliyî||2||1
|-
|Lema_bi_xincayî||2||1
|-
|Lema_bi_sakirabiayî||2||1
|-
|Lema_bi_mbuunî||2||1
|-
|Lema_bi_jûr_modoyî||2||1
|-
|Lema_bi_menkayî||2||1
|-
|Lema_bi_konda-dorayî||2||1
|-
|Lema_bi_kaîepî||2||1
|-
|Lema_bi_embera-catioyî||2||1
|-
|Lema_bi_cemuhî||2||1
|-
|Lema_bi_baré||2||1
|-
|Lema_bi_tutçoneyiya_başûrî||2||1
|-
|Lema_bi_mfumteyî||2||1
|-
|Lema_bi_luhuyî||2||1
|-
|Lema_bi_korniya_kevn||2||1
|-
|Lema_bi_kalkatunguyî||2||1
|-
|Lema_bi_epenayî||2||1
|-
|Lema_bi_columbia-wenatçiyî||2||1
|-
|Lema_bi_amol||2||1
|-
|Lema_bi_yanomamî||2||1
|-
|Lema_bi_tamborayî||2||1
|-
|Lema_bi_heyo||2||1
|-
|Lema_bi_cumanagotoyî||2||1
|-
|Lema_bi_andoqueroyî||2||1
|-
|Lema_bi_yawayî||2||1
|-
|Lema_bi_umiray_dumaget_agtayî||2||1
|-
|Lema_bi_tanudan_kalingayî||2||1
|-
|Lema_bi_piamatsinayî||2||1
|-
|Lema_bi_mag-îndî_ayta||2||1
|-
|Lema_bi_kreyoliya_îngilîzî_ya_grenadî||2||1
|-
|Lema_bi_ese_ejjayî||2||1
|-
|Lema_bi_urî||2||1
|-
|Lema_bi_semayî||2||1
|-
|Lema_bi_ninzoyî||2||1
|-
|Lema_bi_hrangkholî||2||1
|-
|Lema_bi_tawasayî||2||1
|-
|Lema_bi_setî||2||1
|-
|Lema_bi_moereyî||2||1
|-
|Lema_bi_malayiya_kota_bangun_kutai||2||1
|-
|Lema_bi_kuku-uwanhî||2||1
|-
|Lema_bi_çiwereyî||2||1
|-
|Lema_bi_bidiyoyî||2||1
|-
|Lema_bi_yukî||2||1
|-
|Lema_bi_tehuelçeyî||2||1
|-
|Lema_bi_siliputî||2||1
|-
|Lema_bi_novgorodiya_kevn||2||1
|-
|Lema_bi_waima'ayî||2||1
|-
|Lema_bi_teopî||2||1
|-
|Lema_bi_pumeyî||2||1
|-
|Lema_bi_moroneneyî||2||1
|-
|Lema_bi_mandayî_(Awistralya)||2||1
|-
|Lema_bi_kutuyî||2||1
|-
|Lema_bi_kayagarî||2||1
|-
|Lema_bi_dadibî||2||1
|-
|Lema_bi_blinî||2||1
|-
|Lema_bi_asmatiya_navendî||2||1
|-
|Lema_bi_abayî||2||1
|-
|Lema_bi_zapotekiya_çoapan||2||1
|-
|Lema_bi_slaveyî||2||1
|-
|Lema_bi_pwoyiya_rojavayî||2||1
|-
|Lema_bi_mubî||2||1
|-
|Lema_bi_manoyî||2||1
|-
|Lema_bi_kwankayî||2||1
|-
|Lema_bi_kelonî||2||1
|-
|Lema_bi_îngayî||2||1
|-
|Lema_bi_athpare||2||1
|-
|Lema_bi_zapotekiya_santo_domingo_albarradas||2||1
|-
|Lema_bi_ralteyî||2||1
|-
|Lema_bi_îrantxeyî||2||1
|-
|Lema_bi_degenanî||2||1
|-
|Lema_bi_borayî||2||1
|-
|Lema_bi_adyukruyî||2||1
|-
|Lema_bi_zauzouyî||2||1
|-
|Lema_bi_watamî||2||1
|-
|Lema_bi_tîkunayî||2||1
|-
|Lema_bi_remontado_agta||2||1
|-
|Lema_bi_omaguayî||2||1
|-
|Lema_bi_marriammuyî||2||1
|-
|Lema_bi_khandeşiyî||2||1
|-
|Lema_bi_gejiyî||2||1
|-
|Lema_bi_ayabadhu||2||1
|-
|Lema_bi_zimbayî||2||1
|-
|Lema_bi_tojolabalî||2||1
|-
|Lema_bi_sukurî||2||1
|-
|Lema_bi_masiwang||2||1
|-
|Lema_bi_glavdayî||2||1
|-
|Lema_bi_babungoyî||2||1
|-
|Lema_bi_aka-kede||2||1
|-
|Lema_bi_otomiya_estado_de_meksîka||2||1
|-
|Lema_bi_mawakî||2||1
|-
|Lema_bi_lenjeyî||2||1
|-
|Lema_bi_kissiyiya_başûrî||2||1
|-
|Lema_bi_duhwayî||2||1
|-
|Lema_bi_şeltayî||2||1
|-
|Lema_bi_bambassî||2||1
|-
|Lema_bi_alladînî||2||1
|-
|Lema_bi_eggonî||2||1
|-
|Lema_bi_candoşi-şaprayî||2||1
|-
|Lema_bi_tumakî||2||1
|-
|Lema_bi_pangsengî||2||1
|-
|Lema_bi_ndogoyî||2||1
|-
|Lema_bi_kondayî||2||1
|-
|Lema_bi_hajongî||2||1
|-
|Lema_bi_embera-çamiyî||2||1
|-
|Lema_bi_bargamî||2||1
|-
|Lema_bi_yambetayî||2||1
|-
|Lema_bi_başkardiyî||2||1
|-
|Lema_bi_pençalî||2||1
|-
|Lema_bi_luwoyî||2||1
|-
|Lema_bi_kpanî||2||1
|-
|Lema_bi_kamî||2||1
|-
|Lema_bi_cungî||2||1
|-
|Lema_bi_andra-hus||2||1
|-
|Lema_bi_secoyayî||2||1
|-
|Lema_bi_piapocoyî||2||1
|-
|Lema_bi_ngombayî||2||1
|-
|Lema_bi_mixteciya_ayutla||2||1
|-
|Lema_bi_kreyoliya_îngilîzî_ya_guyanî||2||1
|-
|Lema_bi_hoavayî||2||1
|-
|Lema_bi_anmatyerre||2||1
|-
|Lema_bi_tarumayî||2||1
|-
|Lema_bi_semelayî||2||1
|-
|Lema_bi_pitta-pittayî||2||1
|-
|Lema_bi_nisenanî||2||1
|-
|Lema_bi_mîmiya_decorseyî||2||1
|-
|Lema_bi_makianiya_rojhilat||2||1
|-
|Lema_bi_karamojongî||2||1
|-
|Lema_bi_hreyî||2||1
|-
|Lema_bi_bepourî||2||1
|-
|Lema_bi_apaliyî||2||1
|-
|Lema_bi_vaghrî||2||1
|-
|Lema_bi_sezeyî||2||1
|-
|Lema_bi_nomatsiguengayî||2||1
|-
|Lema_bi_mofu-gudurî||2||1
|-
|Lema_bi_malayiya_makassar||2||1
|-
|Lema_bi_kulereyî||2||1
|-
|Lema_bi_huyî||2||1
|-
|Lema_bi_biete||2||1
|-
|Lema_bi_teiwayî||2||1
|-
|Lema_bi_silt'eyî||2||1
|-
|Lema_bi_mamasayî||2||1
|-
|Lema_bi_kupayî||2||1
|-
|Lema_bi_çuaboyî||2||1
|-
|Lema_bi_zakhringî||2||1
|-
|Lema_bi_waiwaî||2||1
|-
|Lema_bi_tepehuaniya_bakurî||2||1
|-
|Lema_bi_pumiya_bakurî||2||1
|-
|Lema_bi_nüpode_huitotoyî||2||1
|-
|Lema_bi_moroyî||2||1
|-
|Lema_bi_mandayî_(Hindistan)||2||1
|-
|Lema_bi_kuuk_thaayorreyî||2||1
|-
|Lema_bi_dagayî||2||1
|-
|Lema_bi_bo-rukulî||2||1
|-
|Lema_bi_assangorî||2||1
|-
|Lema_bi_zapotekiya_guevea_de_humboldt||2||1
|-
|Lema_bi_thado_çinî||2||1
|-
|Lema_bi_nyulnyulî||2||1
|-
|Lema_bi_dano||2||1
|-
|Lema_bi_bolango||2||1
|-
|Lema_bi_soninkeyî||2||1
|-
|Lema_bi_maratinoyî||2||1
|-
|Lema_bi_lafofayî||2||1
|-
|Lema_bi_kerekî||2||1
|-
|Lema_bi_gayilî||2||1
|-
|Lema_bi_borongî||2||1
|-
|Lema_bi_avîkam||2||1
|-
|Lema_bi_watubelayî||2||1
|-
|Lema_bi_tlacoapa_me'phaayî||2||1
|-
|Lema_bi_marrithiyelî||2||1
|-
|Lema_bi_khariayî||2||1
|-
|Lema_bi_gelaoyiya_hêşîn||2||1
|-
|Lema_bi_ayere||2||1
|-
|Lema_bi_weylsiya_kevn||2||1
|-
|Lema_bi_sukurumî||2||1
|-
|Lema_bi_nahwatliya_cosoleacaque||2||1
|-
|Lema_bi_laujeyî||2||1
|-
|Lema_bi_îzereyî||2||1
|-
|Lema_bi_gobasiyî||2||1
|-
|Lema_bi_wogamusinî||2||1
|-
|Lema_bi_torauyî||2||1
|-
|Lema_bi_toro_so_dogonî||2||1
|-
|Lema_bi_mawayî||2||1
|-
|Lema_bi_kitanemukî||2||1
|-
|Lema_bi_jaruyî||2||1
|-
|Lema_bi_dumayî||2||1
|-
|Lema_bi_bakoko||2||1
|-
|Lema_bi_akuntsu||2||1
|-
|Lema_bi_padoeyî||2||1
|-
|Lema_bi_nandeyî||2||1
|-
|Lema_bi_dzalayî||2||1
|-
|Lema_bi_bamumî||2||1
|-
|Lema_bi_xipayayî||2||1
|-
|Lema_bi_t'enî||2||1
|-
|Lema_bi_lo-togayî||2||1
|-
|Lema_bi_kokotayî||2||1
|-
|Lema_bi_lotukoyî||2||1
|-
|Lema_bi_embera-tadó||2||1
|-
|Lema_bi_barijî||2||1
|-
|Lema_bi_ambakîç||2||1
|-
|Lema_bi_takelmayî||2||1
|-
|Lema_bi_sanguyî_(Tanzanya)||2||1
|-
|Lema_bi_patagónî||2||1
|-
|Lema_bi_neververî||2||1
|-
|Lema_bi_haşayî||2||1
|-
|Lema_bi_amurdag||2||1
|-
|Lema_bi_yansî||2||1
|-
|Lema_bi_udukî||2||1
|-
|Lema_bi_sarî||2||1
|-
|Lema_bi_pendauyî||2||1
|-
|Lema_bi_minidienî||2||1
|-
|Lema_bi_kpasamî||2||1
|-
|Lema_bi_cunî||2||1
|-
|Lema_bi_bauyî||2||1
|-
|Lema_bi_aneityum||2||1
|-
|Lema_bi_ngombeyî_(Kongo)||2||1
|-
|Lema_bi_kanoeyî||2||1
|-
|Lema_bi_esîmbî||2||1
|-
|Lema_bi_belanda_borî||2||1
|-
|Lema_bi_uruangnirinî||2||1
|-
|Lema_bi_mîmiya_naçtigalî||2||1
|-
|Lema_bi_hrusoyî||2||1
|-
|Lema_bi_apatanî||2||1
|-
|Lema_bi_yongkomî||2||1
|-
|Lema_bi_vaglayî||2||1
|-
|Lema_bi_kulisusuyî||2||1
|-
|Lema_bi_karoyî||2||1
|-
|Lema_bi_hyamî||2||1
|-
|Lema_bi_simbalî||2||1
|-
|Lema_bi_nsarî||2||1
|-
|Lema_bi_kurankoyî||2||1
|-
|Lema_bi_katsoyî||2||1
|-
|Lema_bi_îamaleleyî||2||1
|-
|Lema_bi_bitareyî||2||1
|-
|Lema_bi_waîmaha||2||1
|-
|Lema_bi_tepehuaniya_başûr-rojavayî||2||1
|-
|Lema_bi_pumiya_başûrî||2||1
|-
|Lema_bi_nusuyî||2||1
|-
|Lema_bi_mortlockeseyî||2||1
|-
|Lema_bi_mandingoyî||2||1
|-
|Lema_bi_îgnacianoyî||2||1
|-
|Lema_bi_boanoyî_(Maluku)||2||1
|-
|Lema_bi_assanî||2||1
|-
|Lema_bi_wanecî||2||1
|-
|Lema_bi_thangmî||2||1
|-
|Lema_bi_q'anjob'alî||2||1
|-
|Lema_bi_mucuçî||2||1
|-
|Lema_bi_mansoankayî||2||1
|-
|Lema_bi_kemakî||2||1
|-
|Lema_bi_bolayî||2||1
|-
|Lema_bi_atohwaim||2||1
|-
|Lema_bi_zapotekiya_tabaa||2||1
|-
|Lema_bi_sonsorolî||2||1
|-
|Lema_bi_lahananî||2||1
|-
|Lema_bi_keresiya_rojavayî||2||1
|-
|Lema_bi_demisayî||2||1
|-
|Lema_bi_awa-cuaiquerî||2||1
|-
|Lema_bi_aekayî||2||1
|-
|Lema_bi_zayse-zergullayî||2||1
|-
|Lema_bi_watutiya_bakur||2||1
|-
|Lema_bi_tlacoatzintepec_çinantecî||2||1
|-
|Lema_bi_squamîşî||2||1
|-
|Lema_bi_ombayî||2||1
|-
|Lema_bi_mwaghavulî||2||1
|-
|Lema_bi_marrusînî||2||1
|-
|Lema_bi_lametî||2||1
|-
|Lema_bi_dinapigue_agtayî||2||1
|-
|Lema_bi_bubiyî||2||1
|-
|Lema_bi_ahàn||2||1
|-
|Lema_bi_zirenkelî||2||1
|-
|Lema_bi_sulodî||2||1
|-
|Lema_bi_orohayî||2||1
|-
|Lema_bi_matagalpayî||2||1
|-
|Lema_bi_kinalaknayî||2||1
|-
|Lema_bi_a-hmaoyî||2||1
|-
|Lema_bi_wogeoyî||2||1
|-
|Lema_bi_toronayî||2||1
|-
|Lema_bi_rumaî_palaungî||2||1
|-
|Lema_bi_otomiya_temoaya||2||1
|-
|Lema_bi_nahwatliya_zacatlan-ahuacatlan-tepetzintla||2||1
|-
|Lema_bi_mawesî||2||1
|-
|Lema_bi_dumiyî||2||1
|-
|Lema_bi_burmesoyî||2||1
|-
|Lema_bi_bakulungî||2||1
|-
|Lema_bi_trinitarioyî||2||1
|-
|Lema_bi_şerdukpenî||2||1
|-
|Lema_bi_sabineyî||2||1
|-
|Lema_bi_jirajirayî||2||1
|-
|Lema_bi_gumawanayî||2||1
|-
|Lema_bi_dzuunî||2||1
|-
|Lema_bi_bwanabwanayî||2||1
|-
|Lema_bi_bamuyî||2||1
|-
|Lema_bi_xiriânayî||2||1
|-
|Lema_bi_tswapongî||2||1
|-
|Lema_bi_tabancaleyî||2||1
|-
|Lema_bi_logbayî||2||1
|-
|Lema_bi_kolomî||2||1
|-
|Lema_bi_gvokoyî||2||1
|-
|Lema_bi_ekajukî||2||1
|-
|Lema_bi_bankan_tey_dogonî||2||1
|-
|Lema_bi_alyawarr||2||1
|-
|Lema_bi_yaguayî||2||1
|-
|Lema_bi_ndoyî||2||1
|-
|Lema_bi_menyayî||2||1
|-
|Lema_bi_konkombayî||2||1
|-
|Lema_bi_kakandayî||2||1
|-
|Lema_bi_haköyî||2||1
|-
|Lema_bi_cibakî||2||1
|-
|Lema_bi_barikewayî||2||1
|-
|Lema_bi_ambala_ayta||2||1
|-
|Lema_bi_yaminahuayî||2||1
|-
|Lema_bi_saniyo-hiyeweyî||2||1
|-
|Lema_bi_miçoacan_mazahuayî||2||1
|-
|Lema_bi_koronî||2||1
|-
|Lema_bi_hatamî||2||1
|-
|Lema_bi_copallenî||2||1
|-
|Lema_bi_saruayî||2||1
|-
|Lema_bi_ngandî||2||1
|-
|Lema_bi_ma'dî||2||1
|-
|Lema_bi_kpeeyî||2||1
|-
|Lema_bi_anem||2||1
|-
|Lema_bi_unde_kailî||2||1
|-
|Lema_bi_taparitayî||2||1
|-
|Lema_bi_sedangî||2||1
|-
|Lema_bi_piçinglisî||2||1
|-
|Lema_bi_mixteciya_noçixtlana_başûr-rojhilatî||2||1
|-
|Lema_bi_mahasu_paharî||2||1
|-
|Lema_bi_esmeraldayî||2||1
|-
|Lema_bi_uruavayî||2||1
|-
|Lema_bi_senayî||2||1
|-
|Lema_bi_pîkeneyiya_başûr||2||1
|-
|Lema_bi_nivacleyî||2||1
|-
|Lema_bi_karankawayî||2||1
|-
|Lema_bi_berik||2||1
|-
|Lema_bi_yopnoyî||2||1
|-
|Lema_bi_vaî||2||1
|-
|Lema_bi_sialumî||2||1
|-
|Lema_bi_nonuyayî||2||1
|-
|Lema_bi_karrieriya_başûrî||2||1
|-
|Lema_bi_finonganî||2||1
|-
|Lema_bi_bihî||2||1
|-
|Lema_bi_araweté||2||1
|-
|Lema_bi_teke-tyeeyî||2||1
|-
|Lema_bi_mongondowî||2||1
|-
|Lema_bi_katukinayî||2||1
|-
|Lema_bi_biwatî||2||1
|-
|Lema_bi_arop-lokep||2||1
|-
|Lema_bi_waîmîrî-atroarî||2||1
|-
|Lema_bi_motayî||2||1
|-
|Lema_bi_fyamî||2||1
|-
|Lema_bi_dahalikî||2||1
|-
|Lema_bi_boanoyî_(sulawesî)||2||1
|-
|Lema_bi_abenlen_ayta||2||1
|-
|Lema_bi_zapotekiya_mitla||2||1
|-
|Lema_bi_slavomolisanoyî||2||1
|-
|Lema_bi_zapotekiya_texmelucan||2||1
|-
|Lema_bi_tiniguayî||2||1
|-
|Lema_bi_rangî||2||1
|-
|Lema_bi_muratayak||2||1
|-
|Lema_bi_marauyî||2||1
|-
|Lema_bi_lahayî_(Viyetnam)||2||1
|-
|Lema_bi_îrarûtûyî||2||1
|-
|Lema_bi_gayónî||2||1
|-
|Lema_bi_aekyom||2||1
|-
|Lema_bi_watutiya_başûr||2||1
|-
|Lema_bi_tlaçiçilco_tepehuayî||2||1
|-
|Lema_bi_stoneyî||2||1
|-
|Lema_bi_rerauyî||2||1
|-
|Lema_bi_ömie||2||1
|-
|Lema_bi_khehekî||2||1
|-
|Lema_bi_dineorî||2||1
|-
|Lema_bi_orokoloyî||2||1
|-
|Lema_bi_akar-baleyî||2||1
|-
|Lema_bi_woî||2||1
|-
|Lema_bi_otomiya_tenango||2||1
|-
|Lema_bi_kitjayî||2||1
|-
|Lema_bi_gros_ventre||2||1
|-
|Lema_bi_trió||2||1
|-
|Lema_bi_mbandjayî||2||1
|-
|Lema_bi_e'ma_buyangî||2||1
|-
|Lema_bi_bwatûyî||2||1
|-
|Lema_bi_banayî||2||1
|-
|Lema_bi_xişanba_laloyî||2||1
|-
|Lema_bi_tswayî||2||1
|-
|Lema_bi_saksoniya_transylvanyayê||2||1
|-
|Lema_bi_palorî||2||1
|-
|Lema_bi_nawathinehenayî||2||1
|-
|Lema_bi_media_lenguayî||2||1
|-
|Lema_bi_kaçama-ganjuleyî||2||1
|-
|Lema_bi_gwahatikeyî||2||1
|-
|Lema_bi_ekariyî||2||1
|-
|Lema_bi_carapanayî||2||1
|-
|Lema_bi_bankayî||2||1
|-
|Lema_bi_yagwoiayî||2||1
|-
|Lema_bi_tumtumî||2||1
|-
|Lema_bi_tagwana_senoufoyî||2||1
|-
|Lema_bi_panimî||2||1
|-
|Lema_bi_ndyuka-trio_pidginî||2||1
|-
|Lema_bi_lovonoyî||2||1
|-
|Lema_bi_konniyî||2||1
|-
|Lema_bi_halangî||2||1
|-
|Lema_bi_cicipu||2||1
|-
|Lema_bi_bariyayî||2||1
|-
|Lema_bi_patpatarî||2||1
|-
|Lema_bi_luleyî||2||1
|-
|Lema_bi_kamakanî||2||1
|-
|Lema_bi_hattîkî||2||1
|-
|Lema_bi_batakiya_alas-kluet||2||1
|-
|Lema_bi_ana_tinga_dogonî||2||1
|-
|Lema_bi_yaoureyî||2||1
|-
|Lema_bi_ujirî||2||1
|-
|Lema_bi_tampuanî||2||1
|-
|Lema_bi_ngarinyinî||2||1
|-
|Lema_bi_minjungbalî||2||1
|-
|Lema_bi_ma'yayî||2||1
|-
|Lema_bi_kpelleyî||2||1
|-
|Lema_bi_kamulayî||2||1
|-
|Lema_bi_curripacoyî||2||1
|-
|Lema_bi_bawziyî||2||1
|-
|Lema_bi_yekheeyî||2||1
|-
|Lema_bi_uneapayî||2||1
|-
|Lema_bi_sedoayî||2||1
|-
|Lema_bi_pidginiya_samoan_plantation||2||1
|-
|Lema_bi_ngoremeyî||2||1
|-
|Lema_bi_mixteciya_peñoles||2||1
|-
|Lema_bi_çanayî||2||1
|-
|Lema_bi_yinbaw_karenî||2||1
|-
|Lema_bi_tatanayî||2||1
|-
|Lema_bi_maku'ayî||2||1
|-
|Lema_bi_fakkanciyî||2||1
|-
|Lema_bi_beromî||2||1
|-
|Lema_bi_valle_nacional_çinantecî||2||1
|-
|Lema_bi_siangî||2||1
|-
|Lema_bi_bilakurayî||2||1
|-
|Lema_bi_arbore||2||1
|-
|Lema_bi_yupuayî||2||1
|-
|Lema_bi_vunapuyî||2||1
|-
|Lema_bi_simboyî||2||1
|-
|Lema_bi_proto-cermeniya_rojava||2||1
|-
|Lema_bi_kurî||2||1
|-
|Lema_bi_wajarrî||2||1
|-
|Lema_bi_moûk-arîakî||2||1
|-
|Lema_bi_mandobo_bawahî||2||1
|-
|Lema_bi_fyerî||2||1
|-
|Lema_bi_dahaloyî||2||1
|-
|Lema_bi_abeyî||2||1
|-
|Lema_bi_zapotekiya_mixtepec||2||1
|-
|Lema_bi_wangkayutyuruyî||2||1
|-
|Lema_bi_qabiaoyî||2||1
|-
|Lema_bi_nzanyî||2||1
|-
|Lema_bi_kemezungî||2||1
|-
|Lema_bi_daro-matu_melanauyî||2||1
|-
|Lema_bi_atong_(Kamerun)||2||1
|-
|Lema_bi_açeyî||2||1
|-
|Lema_bi_zapotekiya_tilquiapan||2||1
|-
|Lema_bi_lahndayî||2||1
|-
|Lema_bi_îrayayî||2||1
|-
|Lema_bi_bourbonnais-berriçonî||2||1
|-
|Lema_bi_afadeyî||2||1
|-
|Lema_bi_zenzontepekiya_çatîno||2||1
|-
|Lema_bi_watutiya_navîn||2||1
|-
|Lema_bi_lamogayî||2||1
|-
|Lema_bi_gelayî||2||1
|-
|Lema_bi_ayoreoyî||2||1
|-
|Lema_bi_zoqueyiya_çimalapa||2||1
|-
|Lema_bi_wiçi_lhamtes_noctenî||2||1
|-
|Lema_bi_sulungî||2||1
|-
|Lema_bi_matbatî||2||1
|-
|Lema_bi_kingayî||2||1
|-
|Lema_bi_jabutiyî||2||1
|-
|Lema_bi_gofayî||2||1
|-
|Lema_bi_domarî||2||1
|-
|Lema_bi_bulî_(Gana)||2||1
|-
|Lema_bi_wojenakayî||2||1
|-
|Lema_bi_torricelli_yauyî||2||1
|-
|Lema_bi_şaboyî||2||1
|-
|Lema_bi_mayangnayî||2||1
|-
|Lema_bi_kitsaiyî||2||1
|-
|Lema_bi_trîkuyiya_copala||2||1
|-
|Lema_bi_şeyî||2||1
|-
|Lema_bi_paguyî||2||1
|-
|Lema_bi_mbatoyî||2||1
|-
|Lema_bi_jola-fonyiyî||2||1
|-
|Lema_bi_gunuyî||2||1
|-
|Lema_bi_ebirayî||2||1
|-
|Lema_bi_paluanî||2||1
|-
|Lema_bi_gwarayî||2||1
|-
|Lema_bi_ekitî||2||1
|-
|Lema_bi_carayî||2||1
|-
|Lema_bi_bankonî||2||1
|-
|Lema_bi_amahuaca||2||1
|-
|Lema_bi_yahangî||2||1
|-
|Lema_bi_mereiyî||2||1
|-
|Lema_bi_konomalayî||2||1
|-
|Lema_bi_halbiyî||2||1
|-
|Lema_bi_emerillonî||2||1
|-
|Lema_bi_ciguayoyî||2||1
|-
|Lema_bi_ambeleyî||2||1
|-
|Lema_bi_yan-nhanguyî||2||1
|-
|Lema_bi_talayî||2||1
|-
|Lema_bi_migaamayî||2||1
|-
|Lema_bi_lumunî||2||1
|-
|Lema_bi_korwayî||2||1
|-
|Lema_bi_kamangî||2||1
|-
|Lema_bi_anakalunguyî||2||1
|-
|Lema_bi_pericú||2||1
|-
|Lema_bi_ngarlumayî||2||1
|-
|Lema_bi_maakayî||2||1
|-
|Lema_bi_kamweyî||2||1
|-
|Lema_bi_hindkoyiya_başûrî||2||1
|-
|Lema_bi_cuvokî||2||1
|-
|Lema_bi_yeloguyî||2||1
|-
|Lema_bi_unemeyî||2||1
|-
|Lema_bi_tapieteyî||2||1
|-
|Lema_bi_seenkuyî||2||1
|-
|Lema_bi_ngoşieyî||2||1
|-
|Lema_bi_mixteciya_pueblaya_başûr||2||1
|-
|Lema_bi_mahouyî||2||1
|-
|Lema_bi_kreyoliya_nîkaraguayî||2||1
|-
|Lema_bi_esselenî||2||1
|-
|Lema_bi_çangî||2||1
|-
|Lema_bi_anuak||2||1
|-
|Lema_bi_senggî||2||1
|-
|Lema_bi_makurapî||2||1
|-
|Lema_bi_hubayî||2||1
|-
|Lema_bi_çimilayî||2||1
|-
|Lema_bi_bertayî||2||1
|-
|Lema_bi_apma||2||1
|-
|Lema_bi_sianî||2||1
|-
|Lema_bi_noonî||2||1
|-
|Lema_bi_moikodî||2||1
|-
|Lema_bi_idunayî||2||1
|-
|Lema_bi_proto-cermenî||2||1
|-
|Lema_bi_moniya_kevn||2||1
|-
|Lema_bi_mamprulî||2||1
|-
|Lema_bi_arrernteya_rojavayî||2||1
|-
|Lema_bi_zangwalî||2||1
|-
|Lema_bi_sisaalayiya_rojavayî||2||1
|-
|Lema_bi_mangarayî||2||1
|-
|Lema_bi_kuynaultî||2||1
|-
|Lema_bi_kayardildî||2||1
|-
|Lema_bi_îkî||2||1
|-
|Lema_bi_daiyî||2||1
|-
|Lema_bi_boboyiya_başûrî||2||1
|-
|Lema_bi_asu||2||1
|-
|Lema_bi_abipon||2||1
|-
|Lema_bi_zapotekiya_ocotlan||2||1
|-
|Lema_bi_wangkumarayî||2||1
|-
|Lema_bi_nzimayî||2||1
|-
|Lema_bi_manzayî||2||1
|-
|Lema_bi_kwerbayî||2||1
|-
|Lema_bi_kemi_samî||2||1
|-
|Lema_bi_gamoyî||2||1
|-
|Lema_bi_bolokî||2||1
|-
|Lema_bi_atsugewî||2||1
|-
|Lema_bi_zapotekiya_tlacolulita||2||1
|-
|Lema_bi_waritaî||2||1
|-
|Lema_bi_rapayî||2||1
|-
|Lema_bi_ojibweyiya_severnê||2||1
|-
|Lema_bi_maridanî||2||1
|-
|Lema_bi_kerewoyî||2||1
|-
|Lema_bi_îrî||2||1
|-
|Lema_bi_gbagyiyî||2||1
|-
|Lema_bi_bozoyiya_hainyaxo||2||1
|-
|Lema_bi_awar||2||1
|-
|Lema_bi_reşeyî||2||1
|-
|Lema_bi_oneyiya_inebu||2||1
|-
|Lema_bi_mwerayî||2||1
|-
|Lema_bi_îteneyî||2||1
|-
|Lema_bi_gendeyî||2||1
|-
|Lema_bi_diraşayî||2||1
|-
|Lema_bi_ahwayî||2||1
|-
|Lema_bi_tolomakoyî||2||1
|-
|Lema_bi_matengoyî||2||1
|-
|Lema_bi_kinikinaoyî||2||1
|-
|Lema_bi_jah_hutî||2||1
|-
|Lema_bi_gogoyî||2||1
|-
|Lema_bi_dompoyî||2||1
|-
|Lema_bi_bafanjî||2||1
|-
|Lema_bi_wokkonî||2||1
|-
|Lema_bi_torricellî||2||1
|-
|Lema_bi_şall-zwallî||2||1
|-
|Lema_bi_owayî||2||1
|-
|Lema_bi_mayaniya_epigrafîk||2||1
|-
|Lema_bi_durango_nahuatliya_rojavayî||2||1
|-
|Lema_bi_balaesang||2||1
|-
|Lema_bi_alabat_island_agtayî||2||1
|-
|Lema_bi_xamtangayî||2||1
|-
|Lema_bi_şinayiya_kohistanî||2||1
|-
|Lema_bi_sacatayî||2||1
|-
|Lema_bi_pahanan_agta||2||1
|-
|Lema_bi_nar_phuyî||2||1
|-
|Lema_bi_mbembeyiya_çema_crossê||2||1
|-
|Lema_bi_knaanicî||2||1
|-
|Lema_bi_jowuluyî||2||1
|-
|Lema_bi_cabiyariyî||2||1
|-
|Lema_bi_banda_malayî||2||1
|-
|Lema_bi_tşobdunî||2||1
|-
|Lema_bi_salibayî_(Gîneya_nû)||2||1
|-
|Lema_bi_mefeleyî||2||1
|-
|Lema_bi_lokoyî||2||1
|-
|Lema_bi_kadaruyî||2||1
|-
|Lema_bi_ekpeyeyî||2||1
|-
|Lema_bi_bantawa||2||1
|-
|Lema_bi_amaimonî||2||1
|-
|Lema_bi_yahunayî||2||1
|-
|Lema_bi_tuneboyiya_navendî||2||1
|-
|Lema_bi_paporayî||2||1
|-
|Lema_bi_negerhollandsî||2||1
|-
|Lema_bi_mereyî||2||1
|-
|Lema_bi_konomihuyî||2||1
|-
|Lema_bi_kalabariyî||2||1
|-
|Lema_bi_haliayî||2||1
|-
|Lema_bi_amblongî||2||1
|-
|Lema_bi_yanayî||2||1
|-
|Lema_bi_ngaanyatjarrayî||2||1
|-
|Lema_bi_kamanoyî||2||1
|-
|Lema_bi_analî||2||1
|-
|Lema_bi_ukurigumayî||2||1
|-
|Lema_bi_satere-maweyî||2||1
|-
|Lema_bi_mabaanî||2||1
|-
|Lema_bi_krenakî||2||1
|-
|Lema_bi_hindustaniyiya_karibî||2||1
|-
|Lema_bi_tapirapeyî||2||1
|-
|Lema_bi_mixteciya_san_miguel_el_grande||2||1
|-
|Lema_bi_kanufiyî||2||1
|-
|Lema_bi_çapacurayî||2||1
|-
|Lema_bi_anufoyî||2||1
|-
|Lema_bi_usanî||2||1
|-
|Lema_bi_sepayî_(Gîneya_nû)||2||1
|-
|Lema_bi_karawayî||2||1
|-
|Lema_bi_çimwiinî||2||1
|-
|Lema_bi_vanimoyî||2||1
|-
|Lema_bi_siar-lakî||2||1
|-
|Lema_bi_pomoyiya_navendî||2||1
|-
|Lema_bi_malaynonî||2||1
|-
|Lema_bi_kumbewahayî||2||1
|-
|Lema_bi_idunî||2||1
|-
|Lema_bi_tembeyî||2||1
|-
|Lema_bi_sinacantanî||2||1
|-
|Lema_bi_nuguriayî||2||1
|-
|Lema_bi_mamujuyî||2||1
|-
|Lema_bi_kurnayî||2||1
|-
|Lema_bi_bîbaalî||2||1
|-
|Lema_bi_terayî||2||1
|-
|Lema_bi_moyî||2||1
|-
|Lema_bi_kayeliyî||2||1
|-
|Lema_bi_îkomayî||2||1
|-
|Lema_bi_ga'dangî||2||1
|-
|Lema_bi_bodo_gadabayî||2||1
|-
|Lema_bi_abîdjî||2||1
|-
|Lema_bi_zapotekiya_ozolotepec||2||1
|-
|Lema_bi_wanhamî||2||1
|-
|Lema_bi_thompsonî||2||1
|-
|Lema_bi_kwereyî||2||1
|-
|Lema_bi_kenaboî||2||1
|-
|Lema_bi_ganayî||2||1
|-
|Lema_bi_datoogayî||2||1
|-
|Lema_bi_zapotekiya_xanaguia||2||1
|-
|Lema_bi_maridjabinî||2||1
|-
|Lema_bi_lakayî||2||1
|-
|Lema_bi_kerînçî||2||1
|-
|Lema_bi_gbanî||2||1
|-
|Lema_bi_denya||2||1
|-
|Lema_bi_bragat||2||1
|-
|Lema_bi_awera||2||1
|-
|Lema_bi_zhabayî||2||1
|-
|Lema_bi_wawayî||2||1
|-
|Lema_bi_subaneniya_bakurî||2||1
|-
|Lema_bi_rettayî||2||1
|-
|Lema_bi_öngeyî||2||1
|-
|Lema_bi_mwotlapî||2||1
|-
|Lema_bi_marúboyî||2||1
|-
|Lema_bi_langiyî||2||1
|-
|Lema_bi_khonsoyî||2||1
|-
|Lema_bi_îtikî||2||1
|-
|Lema_bi_budza||2||1
|-
|Lema_bi_ayuyî||2||1
|-
|Lema_bi_aikanayî||2||1
|-
|Lema_bi_tominî||2||1
|-
|Lema_bi_oroyî||2||1
|-
|Lema_bi_nahwatliya_huaxcaleca||2||1
|-
|Lema_bi_matisî||2||1
|-
|Lema_bi_kinnauriyî||2||1
|-
|Lema_bi_dongolawiyî||2||1
|-
|Lema_bi_bunabayî||2||1
|-
|Lema_bi_bafiayî||2||1
|}
==== Modul:zimanên etîmolojiyê====
{{Special:PrefixIndex/Modul:zimanên etîmolojiyê/|stripprefix=yes}}
==== Modul:etymology languages====
{{Special:PrefixIndex/Modul:etymology languages/|stripprefix=yes}}
==== Binêre herwiha ====
{{veşêre-ser}}
{| class="wikitable"
!wikilink
|-
|[[Pêvek:Bêçavkanî]]
|-
|[[Pêvek:Bêçavkanî/a]]
|-
|[[Pêvek:Bêçavkanî/a/alozbûn wekî wayra]]
|-
|[[Pêvek:Bêçavkanî/aloq]]
|-
|[[Pêvek:Bêçavkanî/alozbûn]]
|-
|[[Pêvek:Bêçavkanî/amerzandin]]
|-
|[[Pêvek:Bêçavkanî/asûm]]
|-
|[[Pêvek:Bêçavkanî/bester]]
|-
|[[Pêvek:Bêçavkanî/cewser]]
|-
|[[Pêvek:Bêçavkanî/derbest]]
|-
|[[Pêvek:Bêçavkanî/dogirme]]
|-
|[[Pêvek:Bêçavkanî/dolivandin]]
|-
|[[Pêvek:Bêçavkanî/dêziman]]
|-
|[[Pêvek:Bêçavkanî/girêmestî]]
|-
|[[Pêvek:Bêçavkanî/hesoskî]]
|-
|[[Pêvek:Bêçavkanî/hilinder]]
|-
|[[Pêvek:Bêçavkanî/ji barê ve]]
|-
|[[Pêvek:Bêçavkanî/kakilîk]]
|-
|[[Pêvek:Bêçavkanî/kedpîr]]
|-
|[[Pêvek:Bêçavkanî/kilûç]]
|-
|[[Pêvek:Bêçavkanî/nêremê]]
|-
|[[Pêvek:Bêçavkanî/nû]]
|-
|[[Pêvek:Bêçavkanî/oc bûn]]
|-
|[[Pêvek:Bêçavkanî/qomik]]
|-
|[[Pêvek:Bêçavkanî/rojol]]
|-
|[[Pêvek:Bêçavkanî/sîniyar]]
|-
|[[Pêvek:Bêçavkanî/tazîger]]
|-
|[[Pêvek:Bêçavkanî/tevilîn]]
|-
|[[Pêvek:Bêçavkanî/torecivîn]]
|-
|[[Pêvek:Bêçavkanî/zelîn]]
|-
|[[Pêvek:Bêçavkanî/şeebî]]
|}
{{veşêre-bin}}
8zk167it5kkk4z1gofgcpalu7qcw6ns
6292081
6292080
2026-07-29T20:45:13Z
Wikihez
7344
/* lmea */
6292081
wikitext
text/x-wiki
==== lmea ====
"ku": "kurmancî",
"en": "îngilîzî",
"tr": "tirkî",
"de": "almanî",
"pl": "polonî",
"ja": "japonî",
"fa": "farisî",
"sh": "sirboxirwatî",
"fr": "fransî",
"ka": "gurcî",
"it": "îtalî",
"fi": "fînî",
"ru": "rusî",
"es": "spanî",
"ar": "erebî",
"nl": "holendî",
"hi": "hindî",
"cs": "çekî",
"cmn": "mandarînî",
"pt": "portugalî",
"uk": "ûkraynî",
"hu": "mecarî",
"ko": "koreyî",
"be": "belarusî",
"la": "latînî",
"ckb": "soranî",
"sv": "swêdî",
"hy": "ermenî",
"bg": "bulgarî",
"ro": "romanyayî",
"da": "danmarkî",
"gl": "galîsî",
"el": "yûnanî",
"eo": "esperantoyî",
"tl": "tagalogî",
"fo": "ferî",
"vi": "viyetnamî",
"ca": "katalanî",
"is": "îzlendî",
"et": "estonî",
"az": "azerî",
"ceb": "sebwanoyî",
"mk": "makedonî",
"he": "îbranî",
"th": "tayî",
"lv": "latviyayî",
"sk": "slovakî",
"ms": "malezî",
"ga": "îrlendî",
"tg": "tacikî",
"grc": "yûnaniya kevn",
"sl": "slovenî",
"kk": "qazaxî",
"mi": "maorî",
"mn": "mongolî",
"sq": "albanî",
"uz": "ozbekî",
"lt": "lîtwanî",
"ur": "urdûyî",
"km": "ximêrî",
"id": "endonezyayî",
"cy": "weylsî",
"lo": "lawsî",
"bn": "bengalî",
"zza": "zazakî",
"ky": "kirgizî",
"yi": "yidîşî",
"gd": "gaelîka skotî",
"my": "burmayî",
"te": "telûgûyî",
"nb": "norweciya bokmålî",
"zh": "çînî",
"ps": "peştûyî",
"eu": "baskî",
"oc": "oksîtanî",
"sw": "swahîlî",
"ast": "astûrî",
"af": "afrîkansî",
"tk": "tirkmenî",
"nn": "norweciya nînorskî",
"yue": "kantonî",
"ug": "oygurî",
"rm": "romancî",
"sc": "sardînî",
"vo": "volapûkî",
"io": "îdoyî",
"ml": "malayalamî",
"mt": "maltayî",
"ba": "başkîrî",
"ta": "tamîlî",
"ang": "îngilîziya kevn",
"sa": "sanskrîtî",
"tt": "teterî",
"rup": "aromanî",
"nrf": "normandî",
"no": "norwecî",
"scn": "sicîlî",
"br": "bretonî",
"as": "asamî",
"bo": "tîbetî",
"nan": "minnanî",
"nv": "navajoyî",
"fy": "frîsî",
"pa": "puncabî",
"vec": "venîsî",
"fur": "friyolî",
"wa": "walonî",
"haw": "hawayî",
"lb": "luksembûrgî",
"am": "amharî",
"arz": "erebiya misrî",
"ia": "înterlîngua",
"kl": "kalalîsûtî",
"mr": "maratî",
"gv": "manksî",
"qu": "keçwayî",
"dsb": "sorbiya jêrîn",
"si": "kîngalî",
"kn": "kannadayî",
"sdh": "kurdiya başûrî",
"ota": "osmanî",
"gu": "gujaratî",
"ce": "çeçenî",
"jv": "javayî",
"pdt": "plodîşî",
"chr": "çerokî",
"nds": "nedersaksî",
"acw": "erebiya hîcazî",
"cu": "slaviya kevn",
"ne": "nepalî",
"kw": "kornî",
"hsb": "sorbiya jorîn",
"za": "zhuangî",
"os": "osetî",
"se": "samiya bakurî",
"dng": "dunganî",
"izh": "îngriyî",
"sco": "skotî",
"got": "gotî",
"or": "oriyayî",
"mnc": "mançûyî",
"crh": "teteriya krîmî",
"ltg": "latgalî",
"sah": "yakutî",
"ht": "haîtî",
"ary": "erebiya fasî",
"ha": "hawsayî",
"zu": "zuluyî",
"cv": "çuvaşî",
"yo": "yorubayî",
"ab": "abxazî",
"so": "somalî",
"frr": "frîsiya bakur",
"lad": "ladînoyî",
"an": "aragonî",
"ti": "tigrînî",
"aii": "aramiya nû ya asûrî",
"hak": "hakkayî",
"enm": "îngilîziya navîn",
"pi": "palî",
"navz": "navzimanî",
"ny": "çîçewayî",
"om": "oromoyî",
"nds-de": "almaniya jêrîn a almanî",
"lmo": "lombardî",
"csb": "kaşûbî",
"alt": "altayiya başûrî",
"arc": "aramî",
"bcl": "bîkoliya naverast",
"co": "korsîkayî",
"oj": "ojibweyî",
"pap": "papyamentoyî",
"rue": "rusînî",
"av": "avarî",
"txb": "toxarî B",
"xal": "kalmîkî",
"cop": "qiptî",
"mg": "malagasî",
"nap": "napolîtanî",
"gsw": "elmanîşî",
"dlm": "dalmatî",
"gn": "guwaranî",
"orv": "slaviya rojavayî ya kevn",
"tyv": "tuvanî",
"dv": "divehî",
"ady": "adîgeyî",
"bua": "buryatî",
"wuu": "wuyî",
"pam": "kapampanganî",
"myv": "erzayî",
"udm": "udmurtî",
"khb": "lueyî",
"rom": "romanî",
"su": "sundanî",
"ilo": "îlokanoyî",
"syc": "siryaniya klasîk",
"zdj": "şîngazîcayî",
"cdo": "min dongî",
"evn": "evenkî",
"kum": "kumikî",
"bal": "belûçî",
"lld": "ladînî",
"inh": "îngûşî",
"sd": "sindhî",
"lez": "lezgînî",
"fro": "fransiya kevn",
"non": "norsiya kevn",
"liv": "lîvonî",
"tet": "tetûmî",
"tpi": "tokpisinî",
"shn": "şanî",
"wo": "wolofî",
"mrw": "maranaoyî",
"gld": "nanayî",
"nah": "nahwatlî",
"ki": "kîkûyûyî",
"st": "sotoyiya başûr",
"mww": "hmongî",
"lij": "lîgûrî",
"rgn": "romagnolî",
"li": "lîmbûrgî",
"sm": "samoayî",
"sga": "îrlendiya kevn",
"ks": "keşmîrî",
"pms": "piedmontîsî",
"ccc": "çamicuroyî",
"hil": "hîlîgaynonî",
"xmf": "megrelî",
"hrx": "hunsrikî",
"rif": "tarifitî",
"krc": "karaçay-balkarî",
"war": "warayî",
"mwl": "mîrandî",
"syl": "sîlhetî",
"ee": "eweyî",
"ln": "lingalayî",
"pdc": "almaniya Pennsylvania",
"goh": "almaniya bilind a kevn",
"tly": "talişî",
"nci": "nahwatliya klasîk",
"ckt": "çukçî",
"ain": "aynuyî",
"uga": "ugarîtî",
"xh": "xosayî",
"sms": "samiya skoltî",
"kea": "kapverdî",
"ajp": "erebiya başûrê şamê",
"kjh": "xakasî",
"iu": "înuîtî",
"dz": "conxayî",
"srn": "sirananî",
"vro": "voroyî",
"mdf": "mokşayî",
"xcl": "ermeniya kevn",
"mhr": "mariya rojhilatî",
"cic": "çîkasawî",
"esu": "yupîkiya navendî",
"cjs": "şorî",
"wym": "wîlamowî",
"apw": "apaçiya rojava",
"mba": "higaononî",
"kaw": "javayiya kevn",
"ovd": "elfdalî",
"to": "tongî",
"ist": "îstriyotî",
"szl": "silesî",
"yua": "mayayiya yukatekî",
"tsg": "tausugî",
"zea": "zêlandî",
"bar": "bayerî",
"luy": "luhyayî",
"mzn": "mazenderanî",
"mhn": "mòçenoyî",
"kxd": "bruneyî",
"lzz": "lazî",
"kbd": "kabardî",
"afb": "erebiya kendavî",
"krl": "karelî",
"eve": "evenî",
"stq": "frîsiya saterlandî",
"ak": "akanî",
"tab": "tabasaranî",
"sat": "santalî",
"fj": "fîjî",
"sva": "svanî",
"egy": "misrî",
"ig": "îgboyî",
"hac": "hewramî",
"ay": "aymarayî",
"gur": "farefareyî",
"rw": "kînyarwandayî",
"twf": "taosî",
"koi": "komî-permyakî",
"lkt": "lakotayî",
"akl": "aklanon",
"yai": "yagnobî",
"ryu": "okînawanî",
"rhg": "rohingyayî",
"vep": "vepsî",
"smn": "samiya înarî",
"egl": "emilî",
"ty": "tahîtî",
"mdh": "maguindanaoyî",
"gag": "gagawzî",
"tzm": "temazîxtiya atlasa navendî",
"sgs": "samogîtî",
"ff": "fulahî",
"lou": "kreyoliya fransî ya Louisiana",
"mel": "melanauyiya navendî",
"niv": "nîvxî",
"aa": "afarî",
"gez": "etiyopiya klasîk",
"ext": "extremaduranî",
"frp": "frankoprovansî",
"kpv": "komî-zîriyî",
"udi": "udî",
"sma": "samiya başûr",
"nog": "nogayî",
"akk": "akadî",
"lbe": "lakî",
"min": "mînangkabawî",
"kg": "kîkongoyî",
"ban": "balînî",
"dlg": "dolganî",
"ace": "açehî",
"pox": "polabî",
"ppl": "pîpîlî",
"mnz": "monî",
"kaa": "karakalpakî",
"kab": "kabîlî",
"vot": "votî",
"luo": "luoyî",
"sn": "şonayî",
"swb": "komorî",
"roa-tar": "tarantinoyî",
"lg": "lugandayî",
"nds-nl": "saksoniya jêrîn ya holendî",
"dtp": "dusuniya navendî",
"shi": "taşelhitî",
"msk": "mansakayî",
"rap": "rapanuyî",
"mer": "meruyî",
"ik": "înupîakî",
"prg": "prusiya kevn",
"chk": "çûkî",
"kam": "kambayî",
"chy": "çeyenî",
"nod": "tayiya bakurî",
"akz": "alabamayî",
"xag": "aghwanî",
"ase": "zimanê destan ê emerîkî",
"nmn": "ǃxóõ",
"gun": "mbya guaraniyî",
"cr": "krî",
"yag": "yamanayî",
"otk": "tirkiya kevn",
"sid": "sidamoyî",
"tum": "tumbukayî",
"pjt": "pîttcantcatcarayî",
"sux": "sûmerî",
"bbl": "batsbî",
"jje": "jejuyî",
"bm": "bambarayî",
"frm": "fransiya navîn",
"tpn": "tupînambayî",
"pal": "farisiya navîn",
"bi": "bîslamayî",
"ksw": "s'gaw karenî",
"ssy": "sahoyî",
"bdr": "bajwayiya kendava rojava",
"sne": "bau bidayuh",
"sjd": "samiya kildînî",
"na": "nawrûyî",
"pag": "pangasînanî",
"abq": "abazayî",
"tn": "tswanayî",
"osx": "saksoniya kevn",
"aqc": "arçî",
"xsr": "şerpayî",
"kok": "konkanî",
"kln": "kalencînî",
"win": "wînnebagoyî",
"dar": "dargwayî",
"mfe": "kreyoliya morîtanî",
"iba": "îbanî",
"ae": "avestayî",
"mos": "moreyî",
"arn": "mapuçî",
"ill": "îranunî",
"mrj": "mariya rojavayî",
"cst": "ohloniya bakur",
"blt": "tay dam",
"apc": "erebiya bakûrê şamê",
"gan": "ganî",
"ii": "yiyiya siçuwayî",
"xto": "toxarî A",
"wmw": "mwanî",
"avd": "elwîrî-wîderî",
"pro": "oksîtaniya kevn",
"pcc": "buyî",
"jra": "jarayî",
"new": "newarî",
"unm": "unamî",
"mic": "mîkmakî",
"cjm": "çamiya rojhilatî",
"sdn": "galûrîsî",
"lus": "mizoyî",
"cjy": "jinî",
"tli": "tlingitî",
"bug": "bugî",
"pcd": "pîkardî",
"hop": "hopîyî",
"ofs": "frîsiya kevn",
"tft": "ternateyî",
"roa-opt": "portugaliya kevn",
"gil": "kîrîbatî",
"kac": "cingphoyî",
"csm": "sierra mîwokiya navendî",
"sdc": "sassarîsî",
"ood": "o'odhamî",
"hsn": "xiangî",
"ruo": "îstro-romanyayî",
"mbb": "bukidnon manoboyiya rojavayî",
"bho": "bojpûrî",
"ani": "andî",
"kgp": "kayingangî",
"ss": "swazî",
"mnp": "min beî",
"aho": "ahomî",
"moe": "montagnaîsî",
"naq": "namayî",
"mvi": "miyakoyî",
"duu": "drungî",
"lut": "luşûtsîdî",
"sce": "dongşîangî",
"bqi": "bextiyarî",
"mrc": "marîkopayî",
"gmh": "almaniya bilind a navîn",
"cim": "cimbrî",
"aer": "arrernteyiya rojavayî",
"agj": "argobbayî",
"ium": "îu mienî",
"tay": "atayalî",
"ale": "alêwîtî",
"str": "saanîçî",
"zku": "kaurnayî",
"pnt": "yûnaniya pontî",
"gmw-cfr": "frankoniya navendî",
"bxd": "pelayî",
"ems": "alutîqî",
"mtq": "muongî",
"hit": "hîtîtî",
"mak": "makasarî",
"bjn": "banjarî",
"nay": "ngarrindjerî",
"dak": "dakotayî",
"yrk": "nenetsiya tundra",
"pac": "pacohî",
"ch": "çamoroyî",
"vls": "flamiya rojava",
"acm": "erebiya iraqî",
"smj": "samiya lule",
"lmy": "lamboyayî",
"jam": "kreyoliya jameîkî",
"yka": "yakanî",
"gmw-ecg": "almaniya navendî ya rojhilat",
"xsv": "sûdovî",
"cdm": "çepangî",
"bdk": "buduxî",
"isd": "îsnagî",
"zgh": "amazîxiya fasî",
"css": "ohloniya başûr",
"kqr": "kîmaragangî",
"glk": "gîlekî",
"aeb": "erebiya tunusî",
"lki": "lekî",
"kdr": "karaîmî",
"kld": "gamîlaraayî",
"tdd": "tayî nüa",
"xqa": "karaxanîdî",
"nso": "sotoyiya bakur",
"crs": "kreyoliya seyşelî",
"mvv": "tagal murutî",
"kim": "tofalarî",
"swg": "swabî",
"pau": "palawî",
"wrh": "wiradhurî",
"cho": "çoktawî",
"tig": "tigreyî",
"ivv": "îvatanî",
"ddg": "fatalukuyî",
"rmf": "romaniya kalo fînî",
"pih": "pîtkarnî-norfolkî",
"phn": "fenîkî",
"ktu": "kitubayî",
"mwr": "marwarî",
"wbp": "warlpirî",
"zun": "zuniyî",
"crk": "kriya bejayî",
"ebk": "bontociya rojhilatî",
"nup": "nupeyî",
"yoi": "yonagunî",
"atj": "atîkamekwî",
"duo": "dupaningan agtayî",
"kca": "xantî",
"dta": "daurî",
"rar": "rarotongî",
"abe": "abenakî",
"aot": "atong (Hindistan)",
"osa": "osageyî",
"ami": "amîs",
"sea": "semaî",
"mh": "marşalî",
"mad": "madurayî",
"sei": "sêriyî",
"moh": "mohawkî",
"meu": "hîrî motuyî",
"pwn": "paîwanî",
"okm": "koreyiya navîn",
"xug": "kunigamî",
"amu": "amuzgoyî",
"ine-pro": "proto-hindûewropî",
"tzo": "tzotzîlî",
"ksc": "kalingayiya başûrî",
"sib": "sebopî",
"uum": "ûrûmî",
"kjj": "khinalugî",
"pis": "pijînî",
"peo": "farisiya kevn",
"sg": "sangoyî",
"tyz": "tàyî",
"kpy": "koryakî",
"ruq": "megleno-romanyayî",
"abs": "ambonezî-malezî",
"mas": "masayî",
"bdq": "bahnarî",
"mkz": "makasaeyî",
"mag": "magahî",
"oaa": "orokî",
"din": "dinkayî",
"zlw-slv": "slovînsî",
"olo": "livvî",
"mai": "maithilî",
"nhn": "nahwatliya navendî",
"nan-tws": "teoçewî",
"wuh": "wutunhuayî",
"tpw": "tûpiya kevn",
"gcf": "kreyoliya antîlleyî",
"knb": "lubuagan kalingayî",
"ket": "ketî",
"pua": "purepeçayî",
"xbr": "kamberayî",
"bor": "bororoyî",
"rmy": "romaniya vlaks",
"tao": "yamî",
"arq": "erebiya cezayirî",
"brh": "brahuiyî",
"chn": "çinook jargonî",
"cbk": "çavacanoyî",
"tvo": "tidoreyî",
"wbk": "waigalî",
"nio": "nganasanî",
"bsh": "kamkata-viriyî",
"roa-gal": "galoyî",
"krj": "kinaray-ayî",
"gmy": "yûnaniya mîkenî",
"ctd": "tedim çinî",
"ude": "udiheyî",
"gmw-rfr": "frankoniya rhine",
"tvl": "tuvalûyî",
"ibg": "îbanagî",
"ask": "aşkunî",
"ccp": "çakmayî",
"ts": "tsongayî",
"sje": "pite samî",
"esh": "iştihardî",
"quc": "k'içe'",
"ho": "hirî motuyî",
"hif": "fiji hindiyî",
"orh": "oroqenî",
"ett": "etrûskî",
"zai": "îsthmus zapotekî",
"bla": "blakfotî",
"zlw-opl": "poloniya kevn",
"ses": "sonxayî",
"lis": "lisuyî",
"kr": "kanuriyî",
"bbc": "bataktobayî",
"umb": "umbunduyî",
"rys": "yaeyamayî",
"arp": "arapaho",
"bol": "boleyî",
"com": "komançî",
"ifk": "tuwali ifugaoyî",
"ve": "vendayî",
"kri": "krioyî",
"aoz": "uab meto",
"yxg": "yagarayî",
"zom": "zouyî",
"ttt": "tatî",
"ams": "amamî-oşîmayiya başûrî",
"tts": "isanî",
"igl": "îgalayî",
"xda": "darkinjungî",
"fkv": "kvenî",
"chg": "çaxatayî",
"xwo": "oyratiya nivîsî",
"cab": "garîfunayî",
"atv": "altayiya bakurî",
"tiw": "tiwî",
"fit": "meänkiyelî",
"mnk": "mandinkayî",
"yox": "yoronî",
"tfn": "dena'inayî",
"hur": "halkomelemî",
"ryn": "amamî-oşimayiya bakurî",
"rop": "kriolî",
"ckv": "kavalanî",
"ulc": "ulçî",
"hts": "hadzayî",
"anq": "jarawa",
"dgr": "dogrîbî",
"myp": "pîrahayî",
"xfa": "faliskanî",
"gin": "hinukhî",
"pqm": "malecite-passamaquoddyî",
"mni": "manipurî",
"txg": "tangutî",
"trv": "tarokoyî",
"kha": "khasiyî",
"odt": "holendiya kevn",
"tby": "tabaruyî",
"drg": "rungusî",
"yur": "yurokî",
"neg": "negidalî",
"mga": "îrlendiya navîn",
"gor": "gorontaloyî",
"tcy": "tuluyî",
"oac": "oroçî",
"nia": "nîasî",
"skb": "saekî",
"bth": "biatah bidayuhî",
"nwy": "nottoway-meherrînî",
"chc": "katawbayî",
"bgc": "haryanvî",
"tih": "timugon murutî",
"itl": "îtelmenî",
"gml": "almaniya jêrîn a navîn",
"apj": "xîkarîyayî",
"yao": "yaoyî",
"okn": "oki-no-erabu",
"juc": "jurçenî",
"bnn": "bununî",
"nmb": "nambasiya mezin",
"cuk": "kunayî",
"uby": "ûbîkî",
"bpy": "manîpûriya bîşnûpriyayî",
"alr": "alutor",
"nys": "nyungayî",
"niq": "nandî",
"nnt": "nanticokeyî",
"shy": "şawî",
"xum": "umbriyî",
"kzg": "kikaiyî",
"blk": "pa'o karen",
"khi-kun": "ǃkungî",
"amw": "neo-aramiya rojavayî",
"kyh": "karokî",
"arw": "arawak",
"rkt": "kamtayî",
"ijc": "îzonî",
"jct": "krymçakî",
"xpq": "mohegan-pequotî",
"lnd": "lundayehî",
"xnb": "kanakanabuyî",
"niu": "nîwî",
"wls": "walîsî",
"axm": "ermeniya navîn",
"kap": "bezhtayî",
"ykg": "yukaghiriya bakurî",
"kky": "guugu yimidhirrî",
"hnj": "hmongiya hêşîn",
"dtr": "lotudî",
"kla": "klamatî-modokî",
"fax": "falayî",
"sjt": "ter samî",
"nxq": "naxî",
"oge": "gurciya kevn",
"apm": "çîrîkawayî",
"tzj": "tzutucîlî",
"tbl": "tbolî",
"inc-oas": "asamiya zû",
"hai": "haidayî",
"sou": "taiya başûrî",
"osc": "oskanî",
"shh": "şoşonî",
"xmz": "morî bawah",
"sju": "ume samî",
"xpr": "partî",
"gaa": "gayî",
"nch": "nahwatliya huastecaya navendî",
"bsk": "buruşaskiyî",
"bzj": "kreyoliya belizeyî",
"nhx": "nahwatliya mekayapan",
"ktb": "kambaatayî",
"xnn": "kankanayiya bakurî",
"pot": "potawatomî",
"agr": "aguarunayî",
"bsb": "bisayayiya bruneyî",
"cja": "çamiya rojavayî",
"nov": "noviyalî",
"kbp": "kabiyeyî",
"tkn": "toku-no-şîmayî",
"lzh": "çîniya klasîk",
"caa": "ç'orti'",
"paw": "pawnî",
"wbl": "waxiyî",
"rut": "rutulî",
"lud": "ludianî",
"gon": "gondiyî",
"lsd": "lîşana denî",
"pyu": "puyumayî",
"bej": "bejayî",
"sxr": "saaroayî",
"bsq": "bassayî",
"cmg": "mongoliya klasîk",
"mus": "krîkî",
"sas": "sasakî",
"mlm": "mulamî",
"aio": "aytonî",
"nuk": "nootkayî",
"aiw": "aarî",
"enq": "engayî",
"chl": "cahuillayî",
"huz": "hunzibî",
"grt": "garoyî",
"lic": "hlaiyî",
"fia": "nobiinî",
"osp": "spaniya kevn",
"amm": "amayî",
"ote": "otomiya mezquital",
"roa-leo": "leonîzî",
"dum": "holendiya navîn",
"awa": "awadhî",
"otw": "ottawayî",
"xbc": "baxterî",
"bem": "bembayî",
"ira-pro": "proto-îranî",
"dbl": "diyirbalî",
"mcm": "kristangî",
"ctu": "çolî",
"grk-mar": "yûnaniya mariupol",
"nst": "tangsayî",
"cak": "kaqçikelî",
"pov": "kreyoliya guinea-bissau",
"mbf": "malayiya baba",
"xsy": "saisiyatî",
"bno": "asî",
"lbj": "ladakhiyî",
"adt": "adnyamatanhayî",
"ttj": "tooroyî",
"apy": "apalayî",
"pim": "powhatanî",
"roa-brg": "bûrgûndî",
"szy": "sakizayayî",
"tkl": "tokelawî",
"wlm": "weylsiya navîn",
"gdo": "godoberî",
"ayn": "erebiya sanaanî",
"ksk": "kansayî",
"aht": "ahtnayî",
"btx": "batakiya karo",
"jdt": "tatiya cihû",
"cni": "aşanînkayî",
"skr": "seraikî",
"iir-pro": "proto-hindûîranî",
"yrl": "nhêngatûyî",
"sip": "sîkkîmî",
"ie": "înterlîngue",
"bin": "edoyî",
"sac": "foksî",
"wni": "komoriya ndzwanî",
"btq": "batekî",
"bkd": "binukid",
"gmq-scy": "skanî",
"rah": "rabhayî",
"ddo": "tsezî",
"tuw-sol": "solonî",
"gni": "gooniyandiyî",
"rmn": "romaniya balkanî",
"roa-poi": "poitevin-saintongeaisî",
"mqm": "marquesana başûr",
"tsu": "tsouyî",
"yol": "yolayî",
"fud": "futunî",
"umu": "munsî",
"wam": "massaçusettî",
"bsy": "sabah bisayayî",
"prn": "prasunî",
"clm": "klallamî",
"ssf": "thaoyî",
"jbo": "lojbanî",
"nus": "nuerî",
"mhx": "lhao voyî",
"hmc": "huişui hmongiya navendî",
"lrc": "luriya bakurî",
"tiy": "tirurayî",
"kkh": "khünî",
"nfr": "nafaanrayî",
"zpq": "zapotekiya zoogoço",
"suk": "sukumayî",
"rml": "romaniya baltîkî",
"ncj": "nahwatliya bakurê puebla",
"nhg": "nahwatliya tetelcingo",
"ars": "erebiya necdî",
"bh": "biharî",
"caq": "car nicobareseyî",
"wlc": "mwalî komorî",
"apd": "erebiya sudanî",
"mop": "mayayiya mopanî",
"yaq": "yaquî",
"pon": "ponpeyî",
"kwk": "kwak'walayî",
"wlo": "wolioyî",
"nnr": "narunggayî",
"agx": "aghulî",
"dty": "doteliyî",
"ybh": "yakkhayî",
"azz": "puebla nahuatliya çiyayî",
"yuy": "yuguriya rojhilat",
"tqw": "tonkawayî",
"hss": "harsusiyî",
"mqu": "mandarî",
"maz": "mazahuayiya navendî",
"ife": "îfèî",
"kmk": "limos kalingayî",
"shs": "şuswapî",
"hid": "hidatsayî",
"brg": "baureyî",
"wrr": "wardamanî",
"kis": "kîsî",
"acy": "erebiya qibrisî",
"tin": "tindî",
"gmq-osw": "swêdiya kevn",
"yuf": "havasupaî-walapaî-yavapaî",
"xdk": "darûkî",
"wau": "waujayî",
"ljp": "lampungî",
"alu": "areareyî",
"ach": "açolî",
"bkm": "komiya kamerûnî",
"ngn": "ngwoyî",
"bsa": "abînomnî",
"der": "deoriyî",
"shp": "şipibo-coniboyî",
"ycl": "lolopoyî",
"qua": "kuapawî",
"gmq-pro": "proto-norsî",
"nnv": "nukunuyî",
"zko": "kottî",
"khv": "khvarşiyî",
"nij": "ngajuyî",
"yog": "yogadî",
"raw": "rawangî",
"mfy": "mayoyî",
"nd": "ndebeliya bakurî",
"oko": "koreyiya kevn",
"fon": "fonî",
"abx": "abaknonî",
"rad": "radeyî",
"klj": "khalajî",
"tru": "turoyo",
"nag": "naga pidginî",
"crl": "kriya rojhilat ya bakurî",
"zlw-ocs": "çekiya kevn",
"aau": "abauyî",
"mrq": "marquesana bakur",
"sia": "samiya akkalayî",
"mjg-mgl": "mongghulî",
"car": "galîbî karîbî",
"roa-tou": "torangî",
"rel": "rendilleyî",
"oma": "omaha-poncayî",
"rmq": "kaloyî",
"rmo": "romaniya sinte",
"lep": "lepçayî",
"guw": "gunî",
"knj": "akatekî",
"slr": "salarî",
"sem-srb": "erebiya başûrî ya kevn",
"pad": "paumarî",
"yap": "yapî",
"xul": "ngunawalî",
"kzj": "kadazaniya beravî",
"fan": "fangî (Bantu)",
"brx": "bodoyî (Hindistan)",
"ane": "xârâcùù",
"cro": "crowî",
"ram": "kanelayî",
"tea": "temiarî",
"cnk": "khumi çinî",
"tkr": "tsakhurî",
"ulk": "meryamî",
"tzh": "tzeltalî",
"avk": "kotavayî",
"mjg-mgr": "mangghuerî",
"xav": "xavanteyî",
"kmv": "kreyoliya fransî ya karipúna",
"aas": "aasayî",
"guz": "gusiiyî",
"erk": "efateyiya başûr",
"ngh": "nlûyî",
"cel-gau": "gaulisî",
"hz": "hereroyî",
"alq": "algonquinî",
"cay": "cayugayî",
"inz": "înesenyoyî",
"sgr": "sangisarî",
"iro-min": "mingoyî",
"dru": "rukaiyî",
"tta": "tuteloyî",
"lui": "luiseñoyî",
"mgm": "mambayî",
"xpm": "pumpokolî",
"kyj": "karaoyî",
"ksd": "tolaiyî",
"pkc": "baekceyî",
"pcm": "pidgîniya nîjeryayî",
"kjg": "khmuyî",
"cow": "cowlitzî",
"cyo": "cuyunonî",
"msn": "vuresî",
"jhi": "jehaiyî",
"map-bms": "banyumasanî",
"fla": "montana salişî",
"skd": "sierra miwokiya başûrî",
"xpu": "punîkî",
"tsd": "tsakonî",
"gue": "gurindjiyî",
"ksi": "krisayî",
"pni": "aohengî",
"par": "panamintî",
"ulb": "ulukwumî",
"miq": "miskitoyî",
"mcb": "maçiguengayî",
"kls": "kalaşayî",
"sdo": "bukar-sadung bidayuhî",
"nr": "ndebeliya başûrî",
"mch": "maquiritarî",
"msb": "masbatenyoyî",
"tsi": "tsimşî",
"gmq-gut": "gutnişî",
"tus": "tuskarorayî",
"lmw": "miwokiya golî",
"srs": "sarceeyî",
"zag": "zaghawayî",
"klb": "kiliwayî",
"kmc": "kamiya başûrî",
"beg": "belaîtî",
"inc-ash": "prakrîtiya aşokanît",
"kj": "kwanyamayî",
"ng": "ndongayî",
"irk": "îraqwî",
"grk-ita": "grîkoyî",
"aaq": "penobskotî",
"kek": "q'eqçiyî",
"ojb": "ojibweyiya bakurî",
"txu": "kayapó",
"one": "oneidayî",
"ktv": "katuyiya rojhilatî",
"nhe": "nahwatliya huastekaya rojhilatî",
"lwl": "lawayiya rojhilatî",
"lua": "luba-kasayî",
"bjb": "barngarla",
"acu": "açuarî",
"cof": "tsafikiyî",
"gwi": "gwiçinî",
"urk": "urak lawoi'",
"tar": "tarahumarayiya navendî",
"kva": "bagvalalî",
"hni": "haniyî",
"sek": "sekanî",
"cpg": "yûnaniya kapadokyayî",
"wmb": "wambayayî",
"xld": "lîdyayî",
"amn": "amanabî",
"haa": "hänî",
"cdy": "çadongî",
"akr": "arakî",
"kju": "kaşayayî",
"ada": "adangmeyî",
"alh": "alawayî",
"gdq": "mehriyî",
"tmo": "temoqî",
"kus": "kusaalî",
"dwu": "dhuwalî",
"pak": "parakanã",
"agg": "angorî",
"wao": "wappoyî",
"aji": "ajië",
"cas": "tsimaneyî",
"byq": "basayî",
"xls": "lusîtanî",
"gcr": "kreyoliya guwiyanîsî",
"apk": "apaçiya deştan",
"kut": "kutenaiyî",
"gmw-jdt": "danmarkiya jersey",
"hus": "wastekî",
"rej": "rejangî",
"dog": "dogonî",
"roa-lor": "lorrainî",
"emb": "embalohî",
"tnq": "taînoyî",
"crj": "kriya rojhilat ya başûrî",
"nuj": "nyolî (Uganda)",
"gmq-oda": "danmarkiya kevn",
"akv": "axvaxî",
"doi": "dogriyî",
"trp": "kokborokî",
"geh": "hutterisçî",
"gul": "gullahî",
"coo": "comoxî",
"ije": "biseniyî",
"itk": "îtaliya cihû",
"rmc": "romaniya karpatyayî",
"gmw-gts": "gottscheerîşî",
"ttg": "tutongî",
"ngu": "nahwatliya guerrero",
"pse": "malayiya navendî",
"onw": "nubiya kevn",
"qui": "kuwileytî",
"giw": "gelaoyiya spî",
"ojw": "ojibweyiya rojavayî",
"gay": "gayoyî",
"rmw": "romaniya welşî",
"nhw": "nahwatliya huastecaya rojavayî",
"xkl": "bakungî",
"loz": "loziyî",
"yij": "yindcîbarndî",
"kry": "krytsî",
"ple": "palueyî",
"tht": "tahltanî",
"mkq": "bay miwokî",
"sks": "maiayî",
"mhe": "besisî",
"mrv": "mangarevanî",
"nrm": "naromî",
"chp": "çîpewî",
"bll": "biloxî",
"knx": "kendayanî",
"khw": "khowarî",
"dua": "diwalayî",
"roa-cha": "şampanyî",
"gug": "guaraniyiya paraguayanî",
"dsn": "dusnerî",
"tmh": "tuaregî",
"pmf": "pamonayî",
"smq": "samoyî",
"tal": "talî",
"yuc": "yuçî",
"mqy": "manggarayî",
"bts": "batakiya simalungun",
"tos": "totonakiya çiyayî",
"oia": "oyratayî",
"blz": "balantak",
"bjz": "baruga",
"kai": "karekareyî",
"zav": "zapotekiya yatzaçî",
"okd": "okodiayî",
"ndd": "nde-nsele-nta",
"omc": "moçikayî",
"bto": "iriga bikolanoyî",
"okr": "kirikeyî",
"top": "totonakiya papantla",
"xer": "xerenteyî",
"xlc": "lîkî",
"mid": "mandaicî",
"suy": "suyayî",
"chz": "ozumacin çinantecî",
"pah": "tenharimî",
"til": "tillamookî",
"afn": "defakayî",
"guc": "wayuuyî",
"ojp": "japoniya kevn",
"lif": "limbuyî",
"efi": "efikî",
"mek": "mêkêoyî",
"ayl": "erebiya lîbyayî",
"bnt-phu": "phuthî",
"kne": "kankanaeyî",
"ktn": "karitiyanayî",
"abl": "abûngî",
"rtm": "rotumanî",
"wyb": "ngiyambaayî",
"crg": "mîçîfî",
"kxu": "kuiyî (Hindistan)",
"cts": "bicolanoyiya northern catanduanes",
"dje": "zarmayî",
"plw": "palawanoyî",
"xlu": "luwiyanî",
"koy": "koyukonî",
"vmw": "makhuwayî",
"vmf": "frankiya rojhilatî",
"bru": "bruyiya rojhilatî",
"kmb": "kimbunduyî",
"xsa": "sabaeanî",
"tbk": "tagbanwayiya kalamî",
"kzt": "tambunan dusunî",
"xng": "mongoliya navîn",
"acn": "açangî",
"bwx": "bu-nao bunuyî",
"cwg": "çewongî",
"vmb": "mbabaramî",
"ijs": "îjoyiya başûr-rojhilat",
"asb": "assînîboyî",
"nzd": "nzadî",
"itv": "îtawitî",
"lvk": "lavukaleveyî",
"bde": "badeyî",
"tbc": "takyayî",
"aby": "aneme wakeyî",
"urb": "urubú-kaaporî",
"coh": "çiçonyi-çidzihana-çikauma",
"dbj": "ida'anî",
"smk": "bolinaoyî",
"lbx": "lawanganî",
"kfr": "kaççiyî",
"hlt": "nga layî",
"agm": "angaatahayî",
"xpg": "firîgî",
"smr": "simeulueyî",
"vma": "martuthunirayî",
"gub": "guajajarayî",
"chf": "tabasco çontalî",
"mqs": "makyaniya rojava",
"iby": "îbaniyî",
"cng": "qiangiya bakurî",
"jac": "jakaltekî",
"trw": "torwalî",
"lti": "lêtîyî",
"scl": "şinayî",
"gwr": "gwereyî",
"dgc": "casiguran dumagat agtayî",
"btm": "batakiya mandaîlîng",
"puj": "punan tubuyî",
"oka": "okanaganî",
"gek": "gerkayî",
"mat": "matlatzincayî",
"kio": "kiowayî",
"cku": "koasatî",
"kms": "kamasauyî",
"xaa": "erebiya endulusî",
"gut": "maleku jaikayî",
"aou": "a'ou",
"elx": "îlamî",
"peh": "bonanî",
"pgl": "îrlendiya prîmîtîv",
"myx": "masabayî",
"spp": "supyireyî",
"xnt": "narragansettî",
"cad": "caddoyî",
"aap": "pará arárayî",
"rme": "angloromanî",
"ura": "urarinayî",
"mpm": "mixteciya yosondúa",
"poe": "popolocayiya san juan atzingo",
"sgd": "surigaononî",
"kvh": "komodoyî",
"xtc": "kaduglî",
"tjg": "tunjungî",
"azg": "san pedro amuzgos amuzgo",
"uun": "pazehî",
"udl": "uldemeyî",
"skp": "sekapanî",
"isi": "nkem-nkumî",
"wrz": "warrayî",
"its": "îsekiriyî",
"tgb": "tobilungî",
"bdy": "bandjalangî",
"ssb": "samayiya başûrî",
"hnn": "hanunooyî",
"enn": "engenniyî",
"srm": "saramakkanî",
"dmr": "damariya rojhilat",
"djo": "jangkangî",
"kij": "kîlîvîlayî",
"rob": "tae'",
"sad": "sandaweyî",
"har": "harariyî",
"hov": "hovonganî",
"pos": "popolucayiya sayula",
"sit-bok": "bokarî",
"kns": "kensiuyî",
"mbd": "dibabawon manoboyî",
"asu": "tocantins asurînî",
"sjw": "şawneeyî",
"btw": "butuanonî",
"jut": "jutişî",
"bgs": "tagabawayî",
"xsb": "sambalî",
"mkf": "miyayî",
"mrn": "çeke holoyî",
"kui": "kuikúroyî",
"hup": "hupayî",
"abm": "abanyomî",
"ukk": "muak sa-aakî",
"lbk": "bontociya navendî",
"dbp": "duwaiyî",
"jup": "hupdëî",
"cce": "çopiyî",
"muy": "muyangî",
"agt": "agtayiya kagayanî ya navendî",
"sxn": "sangirî",
"brc": "kreyoliya holendî ya berbiceyî",
"yux": "yukaghiriya başûrî",
"zpv": "zapotekiya çiçicapan",
"teo": "atesoyî",
"dif": "dieriyî",
"maq": "mazateciya çiquihuitlan",
"sgh": "şughnî",
"gnc": "guwançî",
"ega": "egayî",
"kbh": "camsayî",
"bni": "bangî",
"tdj": "tajioyî",
"ngi": "ngizimî",
"bue": "beothukî",
"pok": "pokangayî",
"myw": "muyuwî",
"bkn": "bukîtan",
"dyu": "dyulayî",
"asn": "xingú asuriní",
"cme": "cermayî",
"tna": "takanayî",
"mia": "miamî",
"epi": "epieyî",
"mcq": "eseyî",
"kyu": "kayahiya rojavayî",
"sai-pyk": "pykobjê",
"zaa": "zapotekiya sierra de juarez",
"dhv": "dehûyî",
"bxk": "bukusuyî",
"nuz": "nahwatliya tlamacazapa",
"trm": "tregamî",
"cps": "capiznonî",
"slm": "pangutaran samayî",
"cia": "cia-ciayî",
"abv": "erebiya bahranî",
"lod": "berawanî",
"mhj": "mogholî",
"mnv": "rennelleseyî",
"gir": "gelaoyiya sor",
"bfq": "badagayî",
"wyi": "woiwurrungî",
"eya": "eyakî",
"awk": "awabakal",
"zoc": "zoqueyiya copainala",
"smw": "sumbawayî",
"ank": "goemayî",
"mbl": "maxakalî",
"tbd": "kakî aeyî",
"nez": "nez perceyî",
"crn": "corayî",
"sai-tap": "tapayunayî",
"see": "senekayî",
"huv": "huaveyî",
"apn": "apinayé",
"mfa": "malayiya pattani",
"crx": "karriyerî",
"mam": "mamî",
"ibl": "îbaloiyî",
"cac": "çujî",
"kdt": "kuyî",
"ocu": "tlahuicayî",
"hvn": "sabuyî",
"cjp": "cabecarî",
"xbi": "kombioyî",
"xra": "krahô",
"blc": "bella koola",
"peq": "pomoyiya başûrî",
"bpz": "bilbayî",
"mzp": "movimayî",
"lhu": "lahuyî",
"kge": "komeringî",
"tue": "tuyukayî",
"taa": "tananaya jêrîn",
"vkp": "kreyoliya portugalî ya korlai",
"cmo": "mnongiya navendî",
"mov": "mojaveyî",
"kkz": "kaskayî",
"zro": "zaparoyî",
"mnb": "munayî",
"mwf": "murînpatayî",
"zkg": "goguryeoyî",
"kiw": "kiwaiyiya bakur-rojhilat",
"ebr": "ebrieyî",
"pmt": "tuamotuanî",
"roa-ang": "angevinî",
"ssg": "seimatî",
"hch": "huiçolî",
"bew": "betawî",
"ycn": "yucunayî",
"mbr": "nukak makuyî",
"apq": "a-pucikwar",
"nym": "nyamwezî",
"tbi": "gaamî",
"obi": "obispeñoyî",
"pri": "paicî",
"lu": "luba-katangayî",
"kcg": "tyapî",
"yui": "yurutî",
"kvm": "kendemî",
"djk": "aukanî",
"rir": "ribunî",
"lrg": "laragiayî",
"wnw": "wintuyî",
"woe": "woleayî",
"ljl": "li’oyî",
"kic": "kîkapûyî",
"ndh": "ndalî",
"hdy": "hadiyyayî",
"cbs": "caşinahuayî",
"kys": "baram kayanî",
"nxg": "ngadhayî",
"hix": "hixkaryanayî",
"mpe": "majangî",
"pwm": "molbogî",
"nyn": "nyankoleyî",
"ilb": "îlayî",
"qya": "qiwenyayî",
"wrk": "garawayî",
"def": "dezfuliyî",
"oym": "wayampî",
"rkb": "rikbaktsayî",
"sai-msk": "masakarayî",
"itz": "îtzayî",
"sgc": "kipsigisî",
"ppi": "paipaî",
"tji": "tujiayiya bakurî",
"yak": "yakîmayî",
"gvp": "para gaviãoyî",
"jmc": "maçameyî",
"bfs": "bayiya başûrî",
"ncb": "nicobariya navendî",
"kvb": "kubuyî",
"veo": "venturenyoyî",
"poi": "popolucayiya highland",
"bny": "bintuluyî",
"bhp": "bîmayî",
"rim": "nyaturuyî",
"sog": "sogdî",
"rth": "ratahanî",
"mse": "museyî",
"ncl": "nahwatliya mîçoakanê",
"acp": "akîpayiya rojhilatî",
"pao": "paiuteyiya bakurî",
"iyx": "yaayî",
"zhx-tai": "taişanîzî",
"coe": "koreguajeyî",
"ser": "serranoyî",
"nko": "nkonyayî",
"mgq": "malilayî",
"ppo": "folopayî",
"alc": "kawésqar",
"abg": "abagayî",
"wro": "wororayî",
"kre": "panarayî",
"tuv": "turkanayî",
"dav": "taitayî",
"ppk": "umayî",
"roa-oca": "katalaniya kevn",
"tso-lya": "çolyanî",
"myu": "mundurukú",
"dcc": "deccaniyî",
"lsi": "laşiyî",
"ugo": "gongî",
"nab": "nambikwarayî",
"lil": "lillooetî",
"gqi": "guiqiongî",
"gah": "alekanoyî",
"ncz": "natçezî",
"xom": "komoyî",
"prk": "paraukî",
"bea": "beaverî",
"sky": "sikayanayî",
"pui": "puinaveyî",
"kgg": "kusundayî",
"lml": "ragayî",
"ore": "orejónî",
"vbb": "babariya başûr-rojhilat",
"mbp": "wiwayî",
"bft": "baltî",
"lgg": "lugbarayî",
"mxd": "modangî",
"mir": "isthmus mixeyî",
"enf": "forest enetsî",
"pkp": "pukapukanî",
"kzi": "kelabît bariyoyî",
"wba": "waraoyî",
"xeg": "ǁxegwî",
"cpa": "palantla çinantecî",
"men": "mendeyî",
"btu": "batuyî",
"psy": "piscatawayî",
"xhu": "hurî",
"for": "foreyî",
"deg": "degemayî",
"sai-oto": "otomacoyî",
"nhv": "nahwatliya temascaltepec",
"gme-cgo": "gothîkiya krimî",
"kyi": "kîputî",
"olt": "lîtwanyayiya kevn",
"alp": "aluneyî",
"nbb": "ndoeyî",
"uvl": "loteyî",
"pab": "parecî",
"nbh": "ngamoyî",
"dra-okn": "kannadayiya kevn",
"aak": "ankaveyî",
"wiv": "vîtûyî",
"kuz": "kunzayî",
"atb": "zaiwa",
"aca": "açaguwayî",
"zmr": "maranungkuyî",
"xke": "kerehoyî",
"isk": "îşkaşimiyî",
"dig": "digoyî",
"agn": "agutaynenî",
"bji": "burjî",
"klw": "linduyî",
"bwi": "baniwayî",
"ygr": "yagariayî",
"mez": "menomineeyî",
"kag": "kajamanî",
"mey": "hassaniyayî",
"umo": "umotinayî",
"yii": "yidinyî",
"twy": "tawoyanî",
"ktw": "katoyî",
"ari": "arîkara",
"ysr": "sirenikî",
"adz": "adzerayî",
"spo": "spokanî",
"cgg": "rukîgayî",
"wuv": "wuvulu-auayî",
"etu": "ejaghamî",
"jmd": "yamdenayî",
"mhy": "ma'anyanî",
"tae": "taryanayî",
"kzr": "karangî",
"zhn": "nong zhuangî",
"ess": "yupikiya sîberyaya navendî",
"teg": "teke-tegeyî",
"cqd": "çuanqiandian cluster miaoyî",
"sri": "sirianoyî",
"dag": "dagbaniyî",
"gae": "warekenayî",
"lre": "laurentî",
"tbt": "kitemboyî",
"pgn": "paelignianî",
"onb": "lingaoyî",
"pth": "pataxó hã-ha",
"vmg": "minigirî",
"yah": "yazghulamî",
"kxn": "kanowitî",
"kde": "makondeyî",
"api": "apiaká",
"och": "çîniya kevn",
"pre": "prînsîpenî",
"mgr": "mambwe-lunguyî",
"stp": "tepehuaniya başûr-rojhilat",
"kak": "kayapa kallahanî",
"myg": "mantayî",
"kee": "keresiya rojhilatî",
"mfh": "matalî",
"bkr": "bakumpaî",
"alw": "alaba",
"pml": "sabirî",
"rag": "logûlî",
"mei": "midobî",
"mjy": "mahicanî",
"blm": "belî",
"nhu": "nooneyî",
"kuf": "katuyiya rojavayî",
"cux": "tepeuxila cuicatecî",
"nyy": "nyakyusayî",
"mtf": "murikî (Gîneya nû)",
"mrt": "margî",
"mpj": "martu wangkayî",
"tlh": "klîngonî",
"enh": "tundra enetsî",
"sai-crd": "coroado purî",
"umi": "ukitî",
"tcb": "tanakrosî",
"kpt": "karatayî",
"xvn": "vandalî",
"xsm": "kasemî",
"ltc": "çîniya navîn",
"yuz": "yuracareyî",
"bhw": "biyakî",
"sqt": "soqotrî",
"dny": "deniyî",
"lcp": "lawayiya rojavayî",
"tpx": "akatepekiya me'phaayî",
"ake": "akawaîo",
"jeb": "jeberoyî",
"gup": "gunwingguyî",
"xeb": "eblaiteyî",
"zkt": "xîtanî",
"lex": "luangî",
"mnq": "minriqî",
"njm": "angamî",
"sge": "segayî",
"hoi": "holîkaçukî",
"tee": "huehuetla tepehuayî",
"bil": "bileyî",
"gej": "genî",
"wim": "wik-mungkanî",
"oyd": "oydayî",
"gvj": "guajayî",
"blw": "balangao",
"lgt": "pahîyî",
"sai-cac": "cacanî",
"xok": "xoklengî",
"knv": "taboyî",
"slc": "salibayî (Kolombiya)",
"noz": "nayî",
"bnq": "bantîkî",
"ykm": "yakamulî",
"dym": "yanda dogonî",
"cri": "sãotomenseyî",
"shu": "erebiya çadî",
"tcs": "creoleyiya torres strait",
"gmw-stm": "sathmar swabî",
"rbl": "miraya bikolî",
"mbn": "macaguanî",
"mgu": "mailuyî",
"pib": "yineyî",
"yku": "kuamasî",
"gva": "kaskihayî",
"sai-yur": "yurumanguî",
"clw": "çulymî",
"bln": "bîkolanoyiya başûr katanduanî",
"mxi": "mozarabîkî",
"sob": "sobeyî",
"agd": "agarabiyî",
"bxe": "ongotayî",
"ito": "îtonamayî",
"mmq": "aisî",
"gnd": "zulgo-gemzekî",
"wig": "wik-ngathanayî",
"dto": "tommo soyî",
"suz": "sunwarî",
"rol": "romblomanonî",
"llu": "lawî",
"jaa": "jamamadiyî",
"bns": "bundelî",
"wal": "wolayttayî",
"oui": "oyguriya kevn",
"bjt": "balanta-ganjayî",
"alk": "alakî",
"nhr": "naroyî",
"gmw-vog": "almaniya volga",
"nsn": "nehanî",
"kqe": "kalaganî",
"end": "endeyî",
"jui": "ngadcurî",
"hay": "hayayî",
"svb": "ulau-suainî",
"saz": "sauraştrayî",
"mep": "miriwungî",
"ert": "eritaiyî",
"yen": "yendangî",
"mxb": "mixteciya tezoatlan",
"pmw": "plains miwokî",
"fak": "fangî (Beboid)",
"sai-bet": "betoî",
"arl": "arabela",
"cks": "tayoyî",
"nrn": "nornî",
"kao": "kassonkeyî",
"blb": "bilua",
"wab": "wabî",
"kwd": "kwaioyî",
"abr": "abronî",
"wbi": "wanjî",
"cso": "soçiapam çinantecî",
"kmo": "kwomayî",
"ddw": "dawera-daweloorî",
"zae": "zapotekiya yareni",
"rac": "rasawayî",
"bra": "brajî",
"naz": "nahwatliya koatepek",
"qwm": "kipçakî",
"ayz": "maybratî",
"amp": "alamblakî",
"sit-liz": "lizuyî",
"jum": "jumjumî",
"tub": "tübatulabalî",
"hih": "pamosuyî",
"kbc": "kadiweuyî",
"tun": "tunikayî",
"cod": "cocamayî",
"abt": "ambulasî",
"ame": "yaneşa'",
"xed": "hdî",
"yrb": "yarebayî",
"mbc": "macuşî",
"sai-mal": "malalî",
"khs": "kasuayî",
"soz": "temî",
"mva": "manamî",
"bcu": "bîlîwayî",
"zpo": "zapotekiya amatlan",
"tfr": "teribeyî",
"xgf": "gabrielino-fernandeñoyî",
"aah": "abu' arapeşî",
"adn": "adangî",
"btn": "ratagnonî",
"gby": "gbariyî",
"sxb": "subayî",
"onn": "onobasuluyî",
"aih": "aî-çamî",
"djm": "jamsayî",
"wun": "bunguyî",
"bhv": "bahauyî",
"ahk": "akha",
"tow": "jemezî",
"duw": "dusun wituyî",
"alj": "alanganî",
"sbk": "safwayî",
"kho": "xotanî",
"ndj": "ndambayî",
"mmh": "mehinakuyî",
"ttw": "long watî",
"sai-cat": "catacaoyî",
"kck": "kalangayî",
"yav": "yangbenî",
"heh": "heheyî",
"szw": "sawayî",
"phk": "phakeyî",
"aoa": "angolar",
"xur": "urartûyî",
"txn": "taranganiya rojava",
"piv": "pilenî",
"xta": "mixtekiya alcozauca",
"ute": "uteyî",
"tad": "tauseyî",
"yug": "yugî",
"zum": "kumzarî",
"nkr": "nukuoroyî",
"xaw": "kawaiisuyî",
"mpa": "mpotoyî",
"zng": "mangî",
"gad": "gaddangî",
"drn": "damariya rojava",
"oca": "ocainayî",
"mcg": "mapoyoyî",
"gbm": "garhwaliyî",
"sbh": "sorî-harenganî",
"kew": "kewayî",
"mki": "dhatkî",
"obt": "bretoniya kevn",
"alo": "larike-wakasihu",
"drl": "baagandjiyî",
"tog": "tongayî (Malawî)",
"tdl": "surî",
"met": "matoyî",
"cle": "lealao çinantecî",
"gmq-jmk": "jamtîşî",
"gvf": "golinî",
"tlc": "totonakiya misantla",
"bfg": "busang kayanî",
"kvc": "kovêyî",
"kay": "kamayurayî",
"hei": "heiltsukî",
"urt": "uratî",
"nll": "nihalî",
"bdp": "bendeyî",
"ybe": "yuguriya rojavayî",
"nbr": "numanayî",
"mht": "mandahuacayî",
"wap": "wapişanayî",
"dzg": "dazagayî",
"wrg": "warunguyî",
"tiv": "tivî",
"tox": "tobî",
"kvo": "dobelî",
"ubl": "buhi'non bikolî",
"aja": "ajayî",
"toi": "tongayî (Zambiya)",
"sus": "susuyî",
"nhm": "nahwatliya morelos",
"mcf": "matsesî",
"lew": "ledo kailiyî",
"ckx": "cakayî",
"bxg": "bangalayî",
"nem": "nemî",
"mgo": "meta'",
"eno": "engganoyî",
"crd": "coeur d'aleneyî",
"bdb": "basapî",
"cui": "cuibayî",
"emx": "erromintxelayî",
"bsw": "baysoyî",
"piw": "pimbweyî",
"nim": "nilambayî",
"mzs": "makanîzî",
"njo": "aoyî",
"duk": "uyajitayayî",
"old": "moçî",
"sam": "aramiya samarî",
"mlq": "malinkî",
"awd-kaw": "kawişanayî",
"mro": "mruyî",
"sjm": "mapunî",
"bot": "bongoyî",
"lay": "lama baiyî",
"aif": "agî",
"bks": "masbate sorsogon",
"ibd": "îwaidjayî",
"dob": "dobûyî",
"noa": "woun meuyî",
"too": "totonakiya xicotepec de juarez",
"duv": "duvleyî",
"bqo": "baloyî",
"mna": "mbulayî",
"pbh": "panareyî",
"cav": "cavineñayî",
"scg": "sanggauyî",
"con": "cofanî",
"ubr": "ubirî",
"ata": "pele-ata",
"ngj": "ngieyî",
"ers": "ersuyî",
"tro": "taraoyî",
"yki": "yokeyî",
"tya": "tauyayî",
"byk": "biaoyî",
"tuq": "tedagayî",
"xrn": "arinî",
"mhq": "mandanî",
"ktx": "kaxarariyî",
"beu": "blagarî",
"mtv": "asaro'oyî",
"zca": "zapotekiya coatecas altas",
"abd": "manîdeyî",
"imn": "îmondayî",
"ofo": "ofoyî",
"avv": "avá-kanoeîro",
"ree": "rejang kayanî",
"klr": "khalingî",
"dby": "dibiyasoyî",
"bzd": "bribriyî",
"iwm": "îwamî",
"bvk": "bukatî",
"mgw": "matumbî",
"aus-wul": "wulguruyî",
"mto": "totontepec mixeyî",
"inc-ogu": "gujaratiya kevn",
"kpm": "kohoyî",
"bgz": "banggaî",
"klg": "tagakaulu kalaganî",
"xab": "sambeyî",
"pnz": "panayî (Afrîkaya navendî)",
"snl": "sangilî",
"aoc": "pemon",
"cul": "culinayî",
"nnq": "ngindoyî",
"cji": "çamalalî",
"urh": "urhoboyî",
"hoc": "hoyî",
"yok-nvy": "yokutiya geliyê bakurî",
"nbp": "nnamî",
"qyp": "kuiripî",
"ski": "sikayî",
"whk": "wahau kenyahî",
"fos": "sirayayî",
"paa-nun": "nungonî",
"mtd": "mualangî",
"mrh": "mara çinî",
"xeu": "keoru-ahiayî",
"ass": "îpulo",
"ing": "deg xinagî",
"ajg": "adjayî",
"kjl": "khamî",
"wed": "wedauyî",
"mxz": "maselayiya navendî",
"miw": "akoyeyî",
"lmc": "limilnganî",
"bag": "tukî",
"bva": "bareinî",
"yal": "yalunkayî",
"asa": "pare",
"sai-col": "colanî",
"kdd": "yankunytjatjarayî",
"pne": "penaniya rojavayî",
"hna": "minayî",
"ayp": "erebiya mezopotamyayî ya bakur",
"can": "çambriyî",
"yey": "yeyî",
"szc": "semaq beriyî",
"byd": "benyadu'",
"yok-svy": "yokutiya geliyê başûrî",
"xet": "setayî",
"aro": "araona",
"ntw": "nottowayî",
"szv": "isubuyî",
"crw": "çrauyî",
"kyz": "kayabiyî",
"asl": "asîluluyî",
"poz-abi": "abay-sembwakî",
"tsx": "mubamî",
"ify": "keley-i kallahanî",
"srv": "waray sorsogonî",
"ong": "oloyî",
"mvm": "muyayî",
"lam": "lambayî",
"icl": "zimanê destan ê îzlandê",
"xww": "wemba-wembayî",
"ixl": "îxilî",
"ape": "bukiyîpî",
"rui": "rufijî",
"mhl": "mauwakeyî",
"lgr": "lengoyî",
"nmy": "namuyî",
"ncn": "naunayî",
"pez": "penaniya rojhilatî",
"mfg": "mixiforeyî",
"bei": "bekatî'",
"ydg": "yidghayî",
"cwd": "kriya woods",
"mmn": "mamanwayî",
"nai-kat": "kathlametî",
"cje": "çruyî",
"ark": "arîkapûyî",
"fut": "futuna-anîwayî",
"wad": "wandamenî",
"tew": "tewayî",
"nyo": "nyoroyî",
"bky": "bokyî",
"tjm": "timucuayî",
"ysg": "sonagayî",
"ogu": "ogbronuagumî",
"mnj": "munjî",
"gwd": "gawwadayî",
"fbl": "west albay bikolî",
"uiv": "îyiveyî",
"bkq": "bakairí",
"ibe": "akpesî",
"maa": "mazateciya san jerónimo tecóatl",
"jig": "jinguluyî",
"tvd": "tsuvadî",
"xod": "kokodayî",
"adw": "amondawayî",
"guu": "yanomamöî",
"srh": "sarikolî",
"nam": "ngan'gityemerrî",
"hto": "minica huitotoyî",
"yby": "yaweyuhayî",
"urz": "uru-eu-wau-wau",
"ewo": "ewondoyî",
"cal": "karolînî",
"arr": "arara-karo",
"yup": "yukpayî",
"iai": "îaaiyî",
"wbh": "wandayî",
"dmw": "mudburrayî",
"xel": "keloyî",
"rma": "ramayî",
"zwa": "zayî",
"emi": "mûssaû-emîrakî",
"lai": "lambyayî",
"dim": "dimeyî",
"agu": "agwakatekî",
"zin": "zinzayî",
"kiv": "kimbuyî",
"dbg": "dogul domî",
"bzg": "babuzayî",
"roa-ole": "leoniya kevn",
"bun": "şerbroyî",
"gnn": "gumatjî",
"mhs": "bûrî",
"pln": "palenqueroyî",
"aus-guw": "guwarî",
"tgt": "tagbanwayiya navendî",
"mwv": "mentawaî",
"kke": "kakabeyî",
"pla": "mianî",
"bpr": "koronadal blaanî",
"oty": "tamîliya kevn",
"ywr": "yawuruyî",
"nai-tap": "tapaçultecî",
"sai-sec": "seçurayî",
"pid": "piaroayî",
"mih": "mixteciya çayuco",
"icr": "kreyoliya îngilîzî ya îslanderê",
"hoh": "hobyótî",
"fab": "annoboneseyî",
"ssm": "semnamî",
"ncg": "nisga'ayî",
"mkg": "makî (Çîn)",
"max": "malayiya moluccana bakur",
"zak": "zanakî",
"kxv": "kuviyî",
"xkn": "kayan river kayanî",
"fuy": "fuyugî",
"zpl": "zapotekiya laçixio",
"kwf": "kwara'aeyî",
"aig": "îngilîziya kreyolî ya antîgua û barbud",
"rai": "ramoaainayî",
"otd": "dohoyî",
"bey": "akuwagelî",
"nwr": "nawaruyî",
"tmq": "tumleoyî",
"tgx": "tagişî",
"pbr": "pangwayî",
"loj": "louyî",
"emp": "emberayiya bakurî",
"nho": "takuuyî",
"bco": "kalulî",
"ifb": "batad ifugaoyî",
"jao": "yanyuwayî",
"inc-ohi": "hindiya kevn",
"cup": "cupeñoyî",
"bci": "bawuleyî",
"ngo": "ngonî",
"nun": "anongî",
"yee": "yimasî",
"kxb": "krobuyî",
"hub": "huambisayî",
"nee": "kumakî",
"bec": "iceve-macî",
"smb": "simbarî",
"kuj": "kuriayî",
"ian": "îatmulî",
"cjv": "çuaveyî",
"zne": "zandeyî",
"ssd": "siroî",
"cbn": "nyah kurî",
"lwg": "wangayî",
"bmr": "muinanî",
"kya": "kwayayî",
"xem": "kembayanî",
"acz": "açeronî",
"pav": "wari'",
"egx-dem": "demotîkî",
"bph": "botlixî",
"lev": "lammayî",
"btp": "budibudî",
"bzq": "bulî",
"tdv": "toroyî",
"klq": "rumuyî",
"ojv": "javayiya ontongê",
"bdi": "burunî",
"wya": "wyandotî",
"pbb": "paezî",
"lfn": "lingua franca nova",
"jit": "jitayî",
"amq": "amahaî",
"tcf": "mepaya malînaltepekî",
"ebu": "embuyî",
"rwm": "ambayî",
"pnh": "penrhynî",
"and": "ansus",
"pej": "pomoyiya bakurî",
"kue": "kumanî",
"fip": "fipayî",
"kcn": "nubiyî",
"lol": "mongoyî",
"bwd": "biwaydokayî",
"aia": "arosî",
"zau": "zangskarî",
"pud": "punan aputî",
"ikz": "îkizuyî",
"bgb": "bobongko",
"thk": "tharakayî",
"ymc": "mujiya başûrî",
"mny": "manyawayî",
"xwa": "kwazayî",
"wrs": "warisî",
"nai-tip": "tipaî",
"teu": "sooyî",
"ked": "kereweyî",
"szp": "suaboyî",
"rgr": "resigaroyî",
"bdm": "budumayî",
"nib": "nakameyî",
"lek": "leyponî",
"guh": "guahiboyî",
"bqr": "burusuyî",
"apl": "lipan",
"bnd": "banda",
"tsj": "tşanglayî",
"xme-old": "mediya kevn",
"ppn": "papapanayî",
"mwp": "kala lagaw yayî",
"bfa": "bariyî",
"plh": "paulohî",
"btd": "batakiya dairî",
"ure": "uruyî",
"sty": "tatariya sîberî",
"buy": "mmaniyî",
"xyy": "yorta yortayî",
"xdy": "malayîk dayakî",
"kmj": "kumarbhag pahariayî",
"vun": "vunjoyî",
"cuh": "çukayî",
"lgl": "walayî",
"pna": "punan bah-biauyî",
"now": "nyamboyî",
"gqa": "ga'andayî",
"thm": "thavungî",
"acr": "açiyî",
"cir": "tiriyî",
"mxr": "murîkî (Malezya)",
"swp": "suauyî",
"zor": "zoqueyiya rayón",
"wic": "wiçitayî",
"suw": "sumbwayî",
"bum": "buluyî (Kamerûn)",
"rnw": "rungwayî",
"nak": "nakanayî",
"trs": "trîkuyiya çicahuaxtla",
"lpo": "lipoyî",
"gwe": "gwenoyî",
"cbd": "carijonayî",
"mot": "barî",
"tlv": "taliabuyî",
"xsu": "sanumayî",
"sjl": "mijî",
"pip": "peroyî",
"acx": "erebiya ummanî",
"ybb": "yembayî",
"uln": "unserdeutsch",
"yil": "yindjilandjî",
"ykn": "kua-nsî",
"apu": "apurinã",
"sso": "sissanoyî",
"puc": "punan merapî",
"mwn": "nyamwangayî",
"bpa": "dakakayî",
"mmd": "maonanî",
"bof": "bolonî",
"ati": "attié",
"wji": "warjî",
"lra": "rara bakati'",
"mlu": "toabaîtayî",
"bdd": "bunamayî",
"bfd": "bafutî",
"keu": "akebuyî",
"wod": "wolanî",
"ksb": "şambalayî",
"mff": "nakî",
"azn": "durango nahuatliya rojavayî ya jêrîn",
"asi": "buruwayî",
"ala": "alago",
"tpy": "trumaî",
"zms": "mbesayî",
"kib": "koalibî",
"jun": "juangî",
"guf": "gupapuynguyî",
"liy": "banda-bambariyî",
"sai-pam": "pamiguayî",
"loa": "lolodayî",
"elm": "elemeyî",
"aad": "amalî",
"lcm": "tungagî",
"twh": "tai dónî",
"ppm": "papumayî",
"xmr": "meroytîkî",
"kno": "konoyî (sierra leone)",
"kzz": "kalabrî",
"emw": "emplawasî",
"pnk": "pawnakayî",
"gym": "ngäbereyî",
"mxj": "mijuyî",
"lun": "lundayî",
"kos": "kosraeyî",
"kzx": "kamarianî",
"aan": "anambeyî",
"ukq": "ukwayî",
"tau": "tananaya jorîn",
"anc": "ngas",
"rcf": "kreyola fransî ya réunion",
"knm": "kanamariyî",
"bvy": "baybayanonî",
"jnj": "yemsayî",
"onu": "unuayî",
"bdh": "tara bakayî",
"pij": "pijaoyî",
"mks": "mixteciya silacayoapan",
"juh": "honeyî",
"etx": "etenî",
"sai-chr": "çarruayî",
"aui": "anukî",
"cuc": "usila çinantecî",
"xme-ott": "tatiya kevn",
"njj": "njenî",
"mng": "mnongiya rojhilatî",
"cih": "çinaliyî",
"ard": "arabana",
"val": "vehesî",
"aos": "taykatî",
"peb": "pomoyiya rojhilatî",
"xcb": "kumbrîkî",
"clk": "iduyî",
"aem": "aremî",
"vut": "vuteyî",
"teq": "temeinî",
"siu": "sinagenî",
"xmm": "manado malayî",
"gdj": "kurtjarî",
"xau": "kauwerayî",
"atz": "arta",
"zsr": "zapoteciya rincona başûrî",
"wmt": "walmajarrî",
"ter": "terenoyî",
"sit-sit": "situyî",
"zns": "mangasî",
"kwz": "kwadiyî",
"iki": "îkoyî",
"prq": "aşeninka pereneyî",
"ztq": "zapotekiya quioquitani-quieri",
"wan": "wanî",
"txh": "thrasî",
"ahg": "qimant",
"boe": "mundablî",
"gww": "kwiniyî",
"ior": "înorî",
"ply": "bolyuyî",
"avt": "au",
"zpu": "zapotekiya yalalagî",
"bgv": "warkay-bîpîmî",
"srb": "sorayî",
"huu": "murui huitotoyî",
"zmm": "marimanindjî",
"xme-ker": "kermanî",
"gbv": "gbanuyî",
"awe": "awetí",
"xzh": "zhang-zhungî",
"wow": "wawonî",
"tqo": "toaripî",
"syb": "subaneniya navendî",
"ril": "riangî",
"nqo": "n'koyî",
"laj": "langoyî (Uganda)",
"bbh": "buganî",
"orr": "orumayî",
"gju": "gojriyî",
"ddd": "dongotonoyî",
"yik": "dongşanba laloyî",
"sai-bag": "baguayî",
"tsr": "akeî",
"txe": "totolî",
"nal": "nalikî",
"bez": "kîbenayî",
"jeh": "jehî",
"sem-saf": "safaitîkî",
"mka": "mbreyî",
"nai-jum": "jumaytepequeyî",
"ebg": "ebughuyî",
"cbv": "cacuayî",
"lnl": "bandayiya navendî ya başûr",
"inc-kho": "xolosî",
"tzx": "tabriakî",
"sln": "salînanî",
"ncr": "ncaneyî",
"kqt": "kadazaniya çemê kliasê",
"cbr": "caşibo-cacataiboyî",
"trt": "tunggareyî",
"tyj": "tai doyî",
"kpr": "korafe-yeghayî",
"hmt": "hamtaiyî",
"csi": "coast miwokî",
"bbi": "barombî",
"tvk": "ambrîmiya başûr-rojhilat",
"ynd": "yandruwandhayî",
"sai-sap": "saparayî",
"mik": "mikasukî",
"kid": "koşinî",
"bya": "batakiya palawan",
"awd-ana": "anauyayî",
"yrw": "yarawatayî",
"tnx": "tanemayî",
"lme": "peveyî",
"nbm": "ngbaka ma'boyî",
"myy": "macunayî",
"cao": "çacoboyî",
"anp": "angîka",
"sim": "seimî",
"nha": "nhandayî",
"kqn": "kaondeyî",
"ecr": "eteocretanî",
"crv": "çaurayî",
"bef": "benabenayî",
"aud": "anuta",
"yiy": "yir-yorontî",
"usp": "uspantekoyî",
"sry": "serayî",
"njy": "njyemî",
"mod": "mobilianî",
"mmt": "malalamaî",
"leu": "karayî (Gîneya nû)",
"mbe": "molaleyî",
"txi": "ikpengî",
"snc": "sinaugoroyî",
"noc": "nukî",
"mle": "manambuyî",
"kyr": "kuruayayî",
"ivb": "îbatanî",
"sai-chu": "çuruyayî",
"lsr": "aruopî",
"zaq": "zapotekiya aloapam",
"tef": "teressayî",
"siy": "sivandî",
"nyb": "nyangboyî",
"mpi": "mpadeyî",
"tcq": "kayî",
"kbt": "gabadiyî",
"dka": "dakpayî",
"bff": "bofî",
"ahs": "aşeyî",
"zar": "zapotekiya rincón",
"xct": "tibetiya klasîk",
"afz": "obokuîtayî",
"mnf": "mundanî",
"mpw": "mapidianî",
"gza": "ganzayî",
"acv": "açumawî",
"zmu": "muruwarî",
"zmt": "maringarrî",
"lbc": "lakkiayî",
"gbg": "gbanziriyî",
"des": "desanoyî",
"kud": "awhelawayî",
"agc": "agatuyî",
"tob": "tobayî",
"suc": "subanoniya rojavayî",
"oni": "onînî",
"mne": "nabayî",
"itm": "îtu mbon uzoyî",
"ges": "geser-goromî",
"aza": "azhayî",
"nfl": "aiwooyî",
"tqp": "tomoipî",
"rof": "romboyî",
"ury": "oryayî",
"axg": "mato grosso arára",
"jax": "jambî malayî",
"gkn": "gokanayî",
"tbq-gkh": "gokhyî",
"bkz": "bungku",
"aik": "akeyî",
"tku": "totonaciya nekaksaya jorîn",
"sho": "şangayî",
"crp-rsn": "russenorskî",
"nss": "nalî",
"guo": "guayaberoyî",
"dun": "dusun deyahî",
"bsm": "busamiyî",
"ble": "balanta-kentohe",
"axx": "xaragure",
"sxg": "şixingî",
"apz": "safeyoka",
"awd-pai": "paikonekayî",
"muc": "mbu'",
"kgu": "kobolî",
"dbf": "edopiyî",
"bbp": "bandayiya rojavayî ya navendî",
"loe": "saluanî",
"nux": "mehekî",
"elk": "elkeiyî",
"yaf": "yakayî",
"tiz": "tai hongjinî",
"stu": "samtaoyî",
"nkg": "nekginî",
"koz": "korakî",
"aus-bra": "barranbinyayî",
"tlr": "talîsî",
"spc": "sapeyî",
"sai-pyg": "payaguayî",
"tbq-mil": "milangî",
"klp": "kamasayî",
"crz": "cruzeñoyî",
"boj": "ancamî",
"tan": "tangaleyî",
"svs": "savosavoyî",
"ppq": "peyî",
"ngg": "ngbaka manzayî",
"mpx": "misima-paneatî",
"kcp": "kangayî",
"cbi": "çaçiyî",
"bfc": "bayiya bakurî",
"yec": "yeniçeyî",
"sai-trr": "tarairiú",
"plg": "pilagayî",
"hoe": "horomî",
"yun": "benayî",
"any": "anyî",
"yis": "yisî",
"ush": "uşojoyî",
"tav": "tatuyoyî",
"sve": "serilî",
"gob": "playeroyî",
"nkz": "nkarî",
"moc": "mocovî",
"jko": "kuboyî",
"reg": "karayî (Tanzanya)",
"hul": "hulayî",
"chh": "çinookî",
"yub": "yugambalî",
"tbg": "tayrorayiya bakur",
"mdc": "maleyî",
"kuo": "kumukioyî",
"mvy": "indus kohistanî",
"foi": "foiyî",
"coz": "çoçotecî",
"bim": "bimobayî",
"agf": "argunî",
"kmx": "wabodayî",
"mtl": "montolî",
"kjr": "kuruduyî",
"kcb": "kawaçayî",
"ibn": "îbinoyî",
"scb": "çutî",
"atx": "arutanî",
"mvt": "mpotovoroyî",
"kxa": "kayrîrûyî",
"boq": "bogayayî",
"zpx": "zapotekiya san baltazar loxiça",
"wnc": "wantoatî",
"itd": "tidongiya başûrî",
"xog": "sogayî",
"ann": "obolo",
"unr": "mundarî",
"bzh": "mapos buangî",
"tye": "kyengayî",
"kyq": "kengayî",
"kwa": "dâwî",
"bou": "bondeyî",
"aul": "aulua",
"zty": "zapotekiya yatee",
"wrp": "waropenî",
"mmi": "musarî",
"buq": "bremî",
"auj": "awjîla",
"gtu": "aghu tharrnggalayî",
"zil": "zialoyî",
"tlb": "tobeloyî",
"mty": "nabî",
"lbz": "lardilî",
"gdd": "gêdagêdî",
"mdx": "dizinî",
"bgt": "bugotûyî",
"tpc": "azoyú me'phaayî",
"jmb": "zumbunî",
"tdn": "tondanoyî",
"rng": "rongayî",
"mtm": "matorî",
"djd": "jaminjungî",
"gol": "golayî",
"doz": "dorzeyî",
"nmk": "namakurayî",
"mnt": "maykulanî",
"lbl": "libon bikolî",
"gde": "gudeyî",
"bxs": "busamî",
"xmd": "mbudumî",
"kdq": "koçî",
"cah": "cahuaranoyî",
"bza": "bandiyî",
"aes": "alseayî",
"dsq": "tadaksahakî",
"tmj": "samarokenayî",
"att": "pamplona atta",
"xhd": "hadramî",
"brp": "barapasiyî",
"omw": "tairorayiya başûr",
"nif": "nekî",
"iyo": "mesakayî",
"luq": "lucumiyî",
"kqz": "koranayî",
"coc": "cocopayî",
"amj": "amdang",
"tlk": "talokî",
"spi": "saponî",
"nnf": "ngaingî",
"mlj": "miltuyî",
"luz": "luriya başûrî",
"xas": "kamassî",
"cua": "cuayî",
"afd": "andaî",
"yxl": "yarlî",
"sit-tgm": "tangamî",
"nga": "ngbakayî",
"mrg": "misingî",
"igm": "kanggapeyî",
"gop": "yeretuarî",
"myh": "makahî",
"kpg": "kapîngamarancîyî",
"ero": "horpayî",
"eto": "etonî (Kamerûn)",
"bcq": "bençî",
"srr": "sererî",
"mqz": "malasangayî",
"hui": "huliyî",
"cap": "çipayayî",
"uar": "tayrumayî",
"mox": "molimayî",
"nai-ipa": "ipaî",
"arh": "arhuako",
"wdj": "wadjiginyî",
"tem": "temneyî",
"snn": "sionayî",
"mxk": "monumboyî",
"kru": "kurukhî",
"inc-mas": "asamiya navîn",
"zoo": "zapotekiya asunción mixtepec",
"wme": "wambuleyî",
"pru": "puragî",
"qwt": "kwalhioqua-tlatskanaî",
"gbb": "kaytetyeyî",
"bux": "boghomî",
"atm": "ata",
"abn": "abuayî",
"zab": "zapotekiya san juan guelavia",
"wny": "wanyî",
"sai-qtm": "quitemoyî",
"mmf": "mundatî",
"gdm": "laalî",
"kxi": "keningau murutî",
"dwr": "dawroyî",
"bfw": "bondoyî",
"aux": "aurá",
"ttv": "titanî",
"nrz": "lalayî (Gîneya nû)",
"gbp": "gbaya-bossangoayî",
"awn": "awngî",
"zia": "ziayî",
"way": "wayanayî",
"sut": "subtiabayî",
"rog": "roglayiya bakurî",
"ono": "onondagayî",
"mbj": "nadëbî",
"mls": "masalitî",
"bbj": "ghomalayî'",
"dyi": "djiminiyî",
"bgg": "bugunî",
"ail": "aîmeleyî",
"wir": "wirafedî",
"cla": "ronî",
"ost": "osatuyî",
"kkr": "kir-balarî",
"dgb": "bunogeyî",
"yha": "bahayî",
"mcd": "şaranahuayî",
"rwk": "rwayî",
"ifu": "mayoyao ifugaoyî",
"lig": "ligbiyî",
"jek": "jeri kuoyî",
"ghs": "guhu-samaneyî",
"bdn": "baldemuyî",
"xkf": "xengxayî",
"tsb": "tsamaî",
"sle": "şolagayî",
"nai-spt": "sahaptinî",
"nas": "nasioyî",
"mhd": "mbuguyî",
"kfa": "kodavayî",
"jur": "jurúnayî",
"goa": "guroyî",
"efa": "efaiyî",
"aqn": "altaya bakurî",
"tjs": "tujyayiya başûrî",
"tdy": "tadyawanî",
"los": "loniuyî",
"jka": "kaerayî",
"afo": "eloyî",
"cba-cat": "catio çibçayî",
"bsn": "barasanayî",
"ama": "amanayé",
"sai-san": "sanavironî",
"prc": "paraçî",
"nej": "nekoyî",
"cms": "messapicî",
"kyl": "kalapuyayî",
"coj": "coçimiyî",
"byr": "baruyayî",
"aey": "ameleyî",
"aus-ynk": "yangkaalî",
"yta": "taluyî",
"pay": "peç",
"lse": "lusengoyî",
"cub": "cubeoyî",
"gac": "andamaniya mezin a têkel",
"yry": "yarluyandî",
"tgp": "tangoayî",
"mjt": "sawriya pahariayî",
"phl": "phalurayî",
"ngt": "ngeqî",
"xnr": "kangrî",
"ciy": "çaimayî",
"bca": "bayiya navendî",
"aog": "angoram",
"yrn": "yerongî",
"skz": "sekarî",
"pia": "pima bajoyî",
"mjb": "makaleroyî",
"hot": "hoteyî",
"cbt": "çayahuitayî",
"aor": "aore",
"uve": "uveyiya rojava",
"pbv": "pnarî",
"mkr": "malasî",
"qvy": "kueyuyî",
"nai-chi": "çiquimulillayî",
"bhi": "bhilalî",
"erg": "sieyî",
"plo": "popolucayiya oluta",
"aun": "molmo one",
"kun": "kunamayî",
"laz": "aribwatsayî",
"waj": "waffayî",
"xsi": "sioyî",
"ibr": "îbuoroyî",
"zaf": "zapotekiya ayoquesco",
"lbq": "wamparî",
"keg": "teseyî",
"nyt": "nyawaygî",
"akc": "mpur",
"mnx": "manikionî",
"kmq": "kwamayî",
"khz": "keaparayî",
"ilk": "îlongotî",
"gaj": "gadsupî",
"aqp": "atakapa",
"kgr": "abunî",
"zpf": "zapotekiya san pedro quiatoni",
"sok": "sokoroyî",
"odu": "odualî",
"muh": "mündü",
"lbb": "labelî",
"knl": "keninjalî",
"bna": "boneratî",
"auy": "auyana",
"ade": "adeleyî",
"zpw": "zapotekiya zaniza",
"opm": "oksapminî",
"mug": "musguyî",
"hob": "mariyiya awistronezî",
"ywl": "laluyiya rojavayî",
"ksx": "kêdangî",
"gbq": "gbaya-bozoumî",
"xbm": "bretoniya navîn",
"kmn": "awtuwî",
"ziw": "zigulayî",
"wbm": "wayî",
"tgo": "sudestî",
"opo": "opaoyî",
"lan": "laruyî",
"xuu": "khweyî",
"gid": "gidarî",
"bvj": "baanî",
"zzj": "zuojiang zhuangî",
"wpc": "wirö",
"rnn": "roonî",
"don": "dourayî",
"bhj": "bahingî",
"lib": "likumî",
"akj": "jeru",
"awd-gnu": "guinauyî",
"dux": "duunî",
"bqp": "busayî",
"nsk": "naskapî",
"mqb": "mbukoyî",
"kwl": "kofyarî",
"nai-jtp": "jutiapayî",
"grd": "guruntumî",
"llp": "efateyiya bakur",
"agy": "altaya başûrî",
"yar": "yabaranayî",
"khc": "tukang besiya bakur",
"sbl": "sambaliya botolan",
"crc": "lonwolwolî",
"xkg": "kagoroyî",
"hdn": "haidayiya bakurî",
"sai-ctq": "catuquinaruyî",
"bbb": "barayî",
"amr": "amarakaerî",
"yky": "yakomayî",
"bsx": "yangkamî",
"tmz": "tamanakuyî",
"zsa": "sarasirayî",
"nig": "ngalakanî",
"khl": "lusiyî",
"xow": "kowakî",
"hem": "hembayî",
"pga": "erebiya jubayê",
"bhm": "batharî",
"bzb": "andioyî",
"yko": "yasayî",
"sax": "sayî",
"ypg": "pholayî",
"nnh": "ngiemboonî",
"mpd": "maçinereyî",
"vic": "kreyoliya giravên virginê",
"kdp": "kaningdon-nindemî",
"sit-cha": "çairelî",
"yes": "yeskwayî",
"uur": "urayî (Vanuatu)",
"mhu": "taraonî",
"slu": "selaruyî",
"xtd": "mixtekiya diuxi-tilantongo",
"utr": "etuloyî",
"bnv": "benerafî",
"ydk": "yoidikî",
"trr": "tauşîroyî",
"srk": "serudung murutî",
"xpo": "poçutekî",
"nkx": "nkorooyî",
"kes": "kugboyî",
"kgm": "karipúnayî",
"cax": "çiquitanoyî",
"big": "biangaî",
"vil": "vilelayî",
"dtu": "tebul ure dogonî",
"tty": "sikaritaî",
"rmg": "norweciya traveller",
"mlw": "molokoyî",
"biq": "bipî",
"ylu": "aribwaungî",
"wga": "wagayayî",
"tnz": "ten'ednî",
"qum": "sipakapenseyî",
"pue": "puelçeyî",
"nop": "numanggangî",
"mzq": "mori atasî",
"awd-kus": "kustenauyî",
"idi": "îdî",
"kzf": "da'a kailiyî",
"bib": "bîssayî",
"zad": "zapotekiya cajonos",
"waz": "wampurî",
"tll": "tetelayî",
"pur": "puruborayî",
"nih": "nyihayî",
"tnk": "kwamerayî",
"ilv": "îlueyî",
"dmn-dam": "damayî (Sierra leone)",
"cba-ata": "atanquesî",
"abu": "abureyî",
"zpt": "zapotekiya san vicente coatlan",
"aaw": "solongyî",
"opy": "ofayeyî",
"dtb": "labuk-kinabatangan kadazanî",
"ikt": "înuvialuktunî",
"auu": "auye",
"adi": "adî",
"wsk": "waskiayî",
"tix": "tiwayiya başûrî",
"atu": "reel",
"mui": "musî",
"iso": "îsokoyî",
"gya": "gbayayiya bakur-rojava",
"auw": "awyî",
"zik": "zimakanî",
"sai-way": "wayumarayî",
"sue": "suenayî",
"sai-opo": "opónî",
"srf": "nafî",
"qxs": "kiangiya başûrî",
"ggt": "gituayî",
"bcd": "babariya bakur",
"xam": "ǀxamî",
"wiu": "wiruyî",
"rro": "roroyî",
"osi": "osingî",
"mvb": "mattolî",
"mjk": "matukarî",
"lln": "leleyî (Çad)",
"kiy": "kirikiriyî",
"sit-jap": "japhugî",
"tds": "doutaî",
"blf": "buol",
"akt": "akolet",
"apb": "sa'a",
"awd-mpr": "maypureyî",
"jee": "jerungî",
"saj": "sahuyî",
"pkn": "pakanhayî",
"kkx": "kohinî",
"nai-cal": "calusayî",
"bgf": "banganduyî",
"ybm": "yabenî",
"bhq": "tukang besî başûr",
"mxe": "mele-filayî",
"lom": "loomayî",
"hka": "kaheyî",
"emn": "emanî",
"boi": "barbarenyoyî",
"aie": "amarayî",
"anh": "nendî",
"mej": "meyahî",
"kcl": "kalayî",
"hro": "haroiyî",
"enc": "enî",
"amy": "amî",
"yde": "yangum deyî",
"taj": "tamangiya rojhilatî",
"sar": "saravekayî",
"szb": "ngalumî",
"inm": "minaeanî",
"kwh": "kowyayî",
"hed": "herdeyî",
"cuy": "cuitlatecî",
"yvt": "yaviteroyî",
"sgw": "sebat bet gurageyî",
"nph": "phomî",
"mjs": "mişipî",
"mda": "madayî (Nîjerya)",
"wat": "kaninuwayî",
"blo": "anîî",
"yss": "yessan-mayoyî",
"ona": "selk'namî",
"pny": "pinyinî",
"noe": "nimadî",
"crm": "kriya mûsî",
"hhy": "hoyahoyayî",
"bzz": "evantî",
"inc-apa": "apabhramsayî",
"uuu": "uyî",
"seu": "serui-lautî",
"pbi": "podokoyî",
"mhc": "moçoyî",
"kzw": "kaririyî",
"faa": "fasuyî",
"sai-chi": "çirinoyî",
"yab": "yuhupî",
"vit": "vitî",
"myl": "momayî",
"crb": "island caribî",
"frq": "forakî",
"cog": "çongî",
"brk": "birgidî",
"waq": "wagemanî",
"nuy": "nunggubuyuyî",
"mdb": "morigî",
"idu": "îdomayî",
"fun": "fulniôî",
"dao": "daai çinî",
"wnb": "wanambreyî",
"skv": "skouyî",
"sai-pur": "purukotó",
"nyi": "nyimangî",
"kwn": "kwangaliyî",
"kec": "keigayî",
"gbu": "gagaduyî",
"dnj": "danî",
"bus": "bokobaruyî",
"ado": "abuyî",
"zpn": "zapotekiya santa ines yatzeçi",
"aml": "war-jaîntî",
"mij": "mungbamî",
"lbu": "labuyî",
"ken": "kenyangî",
"ipo": "îpikoyî",
"zam": "zapotekoyiya mahuatlana navendî",
"wac": "wasko-wişramî",
"sww": "sowayî",
"msu": "musomî",
"rkm": "markayî",
"slp": "lamaholotî",
"gso": "gbayayiya başûr-rojava",
"ahb": "axamb",
"kit": "agobî",
"bfi": "zimanê destan ê brîtanî",
"taz": "toçoyî",
"swi": "suî",
"prm": "kibirî",
"gis": "gizigayiya bakur",
"doe": "doeyî",
"abj": "aka-beayî",
"hnh": "ǁaniyî",
"roo": "rotokasî",
"nlv": "nahwatliya orizaba",
"npl": "nahwatliya pueblaya başûr-rojhilatî",
"llc": "leleyî (Gîne)",
"fkk": "kirya-konzelî",
"mde": "bura mabangî",
"bdl": "bajwayiya endonezyayî",
"bss": "akooseyî",
"scw": "şayî",
"lsm": "saamiayî",
"pqa": "pa'ayî",
"nmq": "nambyayî",
"mbq": "maysînî",
"jib": "jibuyî",
"bhs": "buwalî",
"sjo": "xibeyî",
"abw": "pal",
"nxa": "naueteyî",
"mck": "mbundayî",
"jmx": "juxtlahuaca mixteciya rojavayî",
"clu": "caluyanunî",
"ybo": "yabongî",
"tuo": "tukanoyî",
"nml": "ndemlî",
"mfx": "meloyî",
"lop": "lopayî",
"kzv": "komyandaretî",
"kct": "kaianî",
"has": "haislayî",
"mmw": "emayî",
"cyb": "cayubabayî",
"bcj": "bardî",
"awd-ama": "amarizanayî",
"ylr": "yalarnngayî",
"ago": "taînaeyî",
"prw": "parawenî",
"enw": "enwangî",
"kog": "coguiyî",
"bst": "basketoyî",
"ymo": "yangum monî",
"uda": "udayî",
"tma": "tamayî (Çad)",
"sre": "sarayî",
"nbv": "ngamamboyî",
"mcv": "minanibaî",
"koh": "koyoyî",
"zbt": "batuî",
"anb": "andoa",
"yaw": "yawalapitî",
"tnc": "tanimuca-retuarã",
"sbx": "seberuangî",
"yhl": "hlepho phowayî",
"bzv": "bebeyî",
"anf": "anîmere",
"yet": "yetfayî",
"pir": "piratapuyoyî",
"nmw": "nimoayî",
"nhb": "bengî",
"tbo": "tawalayî",
"szd": "seruyî",
"poy": "pogoloyî",
"bve": "malayiya berau",
"ctm": "çitimaçayî",
"aaf": "aranadanî",
"mkh-mvi": "viyetnamiya navîn",
"mnd": "mondeyî",
"mup": "malvî",
"kse": "kuniyî",
"btf": "birgîtî",
"aac": "ariyî",
"tex": "tennetî",
"kbb": "kaxuyanayî",
"ula": "fungwayî",
"dsh": "daasanaçî",
"zps": "zapotekiya coatlan",
"wnp": "wanapî",
"scs": "slaveyiya bakur",
"lid": "nyindrouyî",
"kvi": "kwangî",
"idb": "îndo-portegîzî",
"bdt": "bokotoyî",
"ate": "atemble",
"zpi": "zapotekiya santa maria quiegolani",
"tvy": "timor pidginî",
"sol": "solosî",
"rjs": "rajbanşî",
"ogc": "ogbahî",
"mth": "mungguî",
"dmc": "gavakî",
"zaj": "zaramoyî",
"sss": "soyî",
"nai-okw": "okwanuçuyî",
"hia": "lamangî",
"gyg": "gbayiyî",
"duy": "dicamay agtayî",
"sgt": "brokpakeyî",
"yix": "axi yî",
"tcx": "todayî",
"sui": "sukî",
"phi-nag": "nagtipunan agtayî",
"ixc": "îxcatecî",
"giz": "gizigayiya başûr",
"baa": "babatanayî",
"akm": "aka-bo",
"wiy": "wiyotî",
"tnt": "tontemboanî",
"uta": "otankî",
"nhc": "nahwatliya tabasco",
"mph": "maungî",
"led": "lenduyî",
"kiz": "kisiyî",
"dva": "duauyî",
"bvr": "burarrayî",
"yig": "wusa nasuyî",
"neb": "tourayî",
"shv": "şehrî",
"nnm": "namiayî",
"nai-wji": "jicaqueyiya rojavayî",
"gve": "duwetî",
"yln": "buyangiya langnî",
"blq": "baluan-pam",
"jiv": "şuarî",
"quv": "sakapultekoyî",
"ynk": "naukanskî",
"mgy": "mbungayî",
"kpx": "koiariyiya çiyayî",
"ktz": "juǀ'hoanî",
"ofu": "efutopî",
"wes": "cameroon pidginî",
"dba": "bangi meyî",
"aab": "alumu-tesuyî",
"bkj": "pande",
"ndg": "ndengerekoyî",
"bbo": "konabereyî",
"zka": "kaimbulawayî",
"hgm": "haiǁomî",
"alv-ama": "amasî",
"ttm": "tutçoneyiya bakurî",
"nen": "nengoneyî",
"zmf": "mfinuyî",
"ruf": "luguruyî",
"kfq": "korkuyî",
"tmd": "haruaî",
"eot": "eotileyî",
"sem-amm": "ammoniteyî",
"tdk": "tambasî",
"sba": "ngambayî",
"lue": "luvaleyî",
"khq": "koyra çiiniyî",
"doc": "kamiya bakurî",
"sai-cul": "cullî",
"ano": "andoque",
"yww": "yawarawargayî",
"uji": "tanjijilî",
"ypz": "phuzayî",
"nsq": "miwokiya sierraya bakurî",
"sgb": "mag-ançî aytayî",
"ish": "esanî",
"aoi": "anîndîlyakwa",
"uri": "urimî",
"yer": "tarokî",
"shb": "ninamî",
"kpj": "karajayî",
"hoz": "hozoyî",
"twm": "tawang monpayî",
"mqo": "modoleyî",
"meo": "malayiya kedah",
"bbv": "karnaî",
"agl": "fembeyî",
"ctg": "çittagonianî",
"tkq": "teeyî",
"wmd": "mamaindeyî",
"kjn": "kunjenî",
"kmg": "kâteyî",
"bqq": "biritaiyî",
"aai": "arîfama-mînîafîayî",
"swj": "sirayî",
"puw": "puluwatî",
"rin": "nunguyî",
"bdo": "moromî",
"khj": "kuturmiyî",
"fvr": "furî",
"dbq": "dabayî",
"blr": "blang",
"mfi": "wandalayî",
"xsl": "slaveyiya başûr",
"pww": "pwoyiya bakurî",
"knp": "kwanjayî",
"gbi": "galelayî",
"bqc": "bokoyî",
"zpr": "zapotekiya santiago xanica",
"sai-tim": "timoteyî",
"rki": "rakhineyî",
"ogb": "ogbiayî",
"mpv": "mungkipî",
"ker": "kerayî",
"iqu": "îquitoyî",
"gou": "gavarî",
"bvf": "boorî",
"tmb": "avavayî",
"was": "waşoyî",
"tkp": "tîkopyayî",
"reb": "rembongî",
"ogo": "khanayî",
"diu": "gcirikuyî",
"orw": "oro wînî",
"nlx": "nahalî",
"vme": "maselayiya rojhilat",
"ltn": "latundê",
"bvx": "baboleyî",
"aci": "aka-karî",
"rug": "rovyanayî",
"kqs": "kissiya bakurî",
"dmu": "dubuyî",
"bwr": "burayî",
"bkc": "baka",
"akf": "akpayî",
"wut": "wutungî",
"she": "şekoyî",
"pma": "paamayî",
"mgi": "jilî",
"gvl": "gulayî",
"dyy": "dyaabugayî",
"aiy": "aliyî",
"xin": "xincayî",
"skf": "sakirabiayî",
"zmp": "mbuunî",
"bex": "jûr modoyî",
"mea": "menkayî",
"kfc": "konda-dorayî",
"kbw": "kaîepî",
"cto": "embera-catioyî",
"cam": "cemuhî",
"bae": "baré",
"tce": "tutçoneyiya başûrî",
"nfu": "mfumteyî",
"lcq": "luhuyî",
"oco": "korniya kevn",
"ktg": "kalkatunguyî",
"sja": "epenayî",
"col": "columbia-wenatçiyî",
"alx": "amol",
"wca": "yanomamî",
"xxt": "tamborayî",
"auk": "heyo",
"cuo": "cumanagotoyî",
"sai-and": "andoqueroyî",
"yva": "yawayî",
"due": "umiray dumaget agtayî",
"kml": "tanudan kalingayî",
"ptr": "piamatsinayî",
"blx": "mag-îndî ayta",
"gcl": "kreyoliya îngilîzî ya grenadî",
"ese": "ese ejjayî",
"uvh": "urî",
"nsm": "semayî",
"nin": "ninzoyî",
"hra": "hrangkholî",
"nai-taw": "tawasayî",
"sbi": "setî",
"mvq": "moereyî",
"mqg": "malayiya kota bangun kutai",
"uwa": "kuku-uwanhî",
"iow": "çiwereyî",
"bid": "bidiyoyî",
"yuk": "yukî",
"teh": "tehuelçeyî",
"mkc": "siliputî",
"zle-ono": "novgorodiya kevn",
"wmh": "waima'ayî",
"tio": "teopî",
"yae": "pumeyî",
"mqn": "moroneneyî",
"zma": "mandayî (Awistralya)",
"kdc": "kutuyî",
"kyt": "kayagarî",
"mps": "dadibî",
"byn": "blinî",
"cns": "asmatiya navendî",
"utp": "abayî",
"zpc": "zapotekiya çoapan",
"den": "slaveyî",
"pwo": "pwoyiya rojavayî",
"mub": "mubî",
"mev": "manoyî",
"bij": "kwankayî",
"kyo": "kelonî",
"inb": "îngayî",
"aph": "athpare",
"zas": "zapotekiya santo domingo albarradas",
"ral": "ralteyî",
"irn": "îrantxeyî",
"dge": "degenanî",
"boa": "borayî",
"adj": "adyukruyî",
"zal": "zauzouyî",
"wax": "watamî",
"tca": "tîkunayî",
"agv": "remontado agta",
"omg": "omaguayî",
"xru": "marriammuyî",
"khn": "khandeşiyî",
"gji": "gejiyî",
"ayd": "ayabadhu",
"zmb": "zimbayî",
"toj": "tojolabalî",
"syk": "sukurî",
"bnf": "masiwang",
"glw": "glavdayî",
"bav": "babungoyî",
"akx": "aka-kede",
"ots": "otomiya estado de meksîka",
"mjj": "mawakî",
"leh": "lenjeyî",
"kss": "kissiyiya başûrî",
"kbz": "duhwayî",
"sth": "şeltayî",
"myf": "bambassî",
"ald": "alladînî",
"ego": "eggonî",
"cbu": "candoşi-şaprayî",
"tmc": "tumakî",
"pgs": "pangsengî",
"ndz": "ndogoyî",
"knd": "kondayî",
"haj": "hajongî",
"cmi": "embera-çamiyî",
"mlp": "bargamî",
"yat": "yambetayî",
"bsg": "başkardiyî",
"pek": "pençalî",
"lwo": "luwoyî",
"kpk": "kpanî",
"kdx": "kamî",
"cug": "cungî",
"anx": "andra-hus",
"sey": "secoyayî",
"pio": "piapocoyî",
"jgo": "ngombayî",
"miy": "mixteciya ayutla",
"gyn": "kreyoliya îngilîzî ya guyanî",
"hoa": "hoavayî",
"amx": "anmatyerre",
"tdm": "tarumayî",
"sza": "semelayî",
"pit": "pitta-pittayî",
"nsz": "nisenanî",
"mis-mmd": "mîmiya decorseyî",
"mky": "makianiya rojhilat",
"kdj": "karamojongî",
"hre": "hreyî",
"bie": "bepourî",
"ena": "apaliyî",
"vgr": "vaghrî",
"sze": "sezeyî",
"not": "nomatsiguengayî",
"mif": "mofu-gudurî",
"mfp": "malayiya makassar",
"kul": "kulereyî",
"huo": "huyî",
"biu": "biete",
"twe": "teiwayî",
"stv": "silt'eyî",
"mqj": "mamasayî",
"kug": "kupayî",
"chw": "çuaboyî",
"zkr": "zakhringî",
"waw": "waiwaî",
"ntp": "tepehuaniya bakurî",
"pmi": "pumiya bakurî",
"hux": "nüpode huitotoyî",
"mor": "moroyî",
"mha": "mandayî (Hindistan)",
"thd": "kuuk thaayorreyî",
"dgz": "dagayî",
"mae": "bo-rukulî",
"sjg": "assangorî",
"zpg": "zapotekiya guevea de humboldt",
"tcz": "thado çinî",
"nyv": "nyulnyulî",
"aso": "dano",
"bld": "bolango",
"snk": "soninkeyî",
"sai-mar": "maratinoyî",
"laf": "lafofayî",
"krk": "kerekî",
"gyl": "gayilî",
"ksr": "borongî",
"avi": "avîkam",
"wah": "watubelayî",
"tpl": "tlacoapa me'phaayî",
"mfr": "marrithiyelî",
"khr": "khariayî",
"giq": "gelaoyiya hêşîn",
"aye": "ayere",
"owl": "weylsiya kevn",
"zsu": "sukurumî",
"nhk": "nahwatliya cosoleacaque",
"law": "laujeyî",
"izr": "îzereyî",
"goi": "gobasiyî",
"wog": "wogamusinî",
"ttu": "torauyî",
"dts": "toro so dogonî",
"mcw": "mawayî",
"azc-ktn": "kitanemukî",
"ddj": "jaruyî",
"dma": "dumayî",
"bkh": "bakoko",
"aqz": "akuntsu",
"pdo": "padoeyî",
"nnb": "nandeyî",
"dzl": "dzalayî",
"bax": "bamumî",
"xiy": "xipayayî",
"tct": "t'enî",
"lht": "lo-togayî",
"kkk": "kokotayî",
"lot": "lotukoyî",
"tdc": "embera-tadó",
"bjc": "barijî",
"aew": "ambakîç",
"tkm": "takelmayî",
"sbp": "sanguyî (Tanzanya)",
"sai-ptg": "patagónî",
"lgk": "neververî",
"ybj": "haşayî",
"amg": "amurdag",
"yns": "yansî",
"udu": "udukî",
"mwm": "sarî",
"ums": "pendauyî",
"wii": "minidienî",
"pbn": "kpasamî",
"cuq": "cunî",
"bbd": "bauyî",
"aty": "aneityum",
"ngc": "ngombeyî (Kongo)",
"kxo": "kanoeyî",
"ags": "esîmbî",
"bxb": "belanda borî",
"urn": "uruangnirinî",
"mis-mmn": "mîmiya naçtigalî",
"hru": "hrusoyî",
"apt": "apatanî",
"yon": "yongkomî",
"vag": "vaglayî",
"vkl": "kulisusuyî",
"kxh": "karoyî",
"jab": "hyamî",
"smg": "simbalî",
"asj": "nsarî",
"knk": "kurankoyî",
"kaf": "katsoyî",
"yml": "îamaleleyî",
"brt": "bitareyî",
"bao": "waîmaha",
"tla": "tepehuaniya başûr-rojavayî",
"pmj": "pumiya başûrî",
"nuf": "nusuyî",
"mrl": "mortlockeseyî",
"man": "mandingoyî",
"ign": "îgnacianoyî",
"bzn": "boanoyî (Maluku)",
"xss": "assanî",
"wne": "wanecî",
"thf": "thangmî",
"kjb": "q'anjob'alî",
"sai-muc": "mucuçî",
"msw": "mansoankayî",
"kem": "kemakî",
"bnp": "bolayî",
"aqm": "atohwaim",
"zat": "zapotekiya tabaa",
"sov": "sonsorolî",
"lhn": "lahananî",
"kjq": "keresiya rojavayî",
"dei": "demisayî",
"kwi": "awa-cuaiquerî",
"aez": "aekayî",
"zay": "zayse-zergullayî",
"una": "watutiya bakur",
"ctl": "tlacoatzintepec çinantecî",
"squ": "squamîşî",
"omb": "ombayî",
"sur": "mwaghavulî",
"umc": "marrusînî",
"lbn": "lametî",
"phi-din": "dinapigue agtayî",
"buw": "bubiyî",
"ahn": "ahàn",
"zrn": "zirenkelî",
"srg": "sulodî",
"ora": "orohayî",
"mtn": "matagalpayî",
"kco": "kinalaknayî",
"hmd": "a-hmaoyî",
"woc": "wogeoyî",
"tqr": "toronayî",
"rbb": "rumaî palaungî",
"ott": "otomiya temoaya",
"nhi": "nahwatliya zacatlan-ahuacatlan-tepetzintla",
"mgk": "mawesî",
"dus": "dumiyî",
"bzu": "burmesoyî",
"bbu": "bakulungî",
"trn": "trinitarioyî",
"sdp": "şerdukpenî",
"sbv": "sabineyî",
"sai-jrj": "jirajirayî",
"gvs": "gumawanayî",
"dnn": "dzuunî",
"tte": "bwanabwanayî",
"bcf": "bamuyî",
"xir": "xiriânayî",
"two": "tswapongî",
"sai-tab": "tabancaleyî",
"lgq": "logbayî",
"klm": "kolomî",
"ngs": "gvokoyî",
"eka": "ekajukî",
"dbw": "bankan tey dogonî",
"aly": "alyawarr",
"yad": "yaguayî",
"ndp": "ndoyî",
"mcr": "menyayî",
"xon": "konkombayî",
"kka": "kakandayî",
"hao": "haköyî",
"ckl": "cibakî",
"jbk": "barikewayî",
"abc": "ambala ayta",
"yaa": "yaminahuayî",
"sny": "saniyo-hiyeweyî",
"mmc": "miçoacan mazahuayî",
"xkq": "koronî",
"had": "hatamî",
"sai-cop": "copallenî",
"swy": "saruayî",
"nid": "ngandî",
"mhi": "ma'dî",
"cpo": "kpeeyî",
"anz": "anem",
"unz": "unde kailî",
"sai-tpr": "taparitayî",
"sed": "sedangî",
"fpe": "piçinglisî",
"mxy": "mixteciya noçixtlana başûr-rojhilatî",
"bfz": "mahasu paharî",
"sai-esm": "esmeraldayî",
"urv": "uruavayî",
"seh": "senayî",
"spx": "pîkeneyiya başûr",
"cag": "nivacleyî",
"zkk": "karankawayî",
"bkl": "berik",
"yut": "yopnoyî",
"vai": "vaî",
"slw": "sialumî",
"noj": "nonuyayî",
"caf": "karrieriya başûrî",
"fag": "finonganî",
"ibh": "bihî",
"awt": "araweté",
"tyx": "teke-tyeeyî",
"mog": "mongondowî",
"knt": "katukinayî",
"bwm": "biwatî",
"apr": "arop-lokep",
"atr": "waîmîrî-atroarî",
"mtt": "motayî",
"pym": "fyamî",
"dlk": "dahalikî",
"bzl": "boanoyî (sulawesî)",
"abp": "abenlen ayta",
"zaw": "zapotekiya mitla",
"svm": "slavomolisanoyî",
"zpz": "zapotekiya texmelucan",
"tit": "tiniguayî",
"rax": "rangî",
"asx": "muratayak",
"mvr": "marauyî",
"lha": "lahayî (Viyetnam)",
"irh": "îrarûtûyî",
"sai-gay": "gayónî",
"awi": "aekyom",
"mcy": "watutiya başûr",
"tpt": "tlaçiçilco tepehuayî",
"sto": "stoneyî",
"rea": "rerauyî",
"aom": "ömie",
"tlx": "khehekî",
"mrx": "dineorî",
"oro": "orokoloyî",
"acl": "akar-baleyî",
"wbw": "woî",
"otn": "otomiya tenango",
"gia": "kitjayî",
"ats": "gros ventre",
"tri": "trió",
"zmz": "mbandjayî",
"yzg": "e'ma buyangî",
"bwa": "bwatûyî",
"bcw": "banayî",
"ywt": "xişanba laloyî",
"tsc": "tswayî",
"gmw-tsx": "saksoniya transylvanyayê",
"fap": "palorî",
"nwa": "nawathinehenayî",
"mue": "media lenguayî",
"kcx": "kaçama-ganjuleyî",
"dah": "gwahatikeyî",
"ekg": "ekariyî",
"cbc": "carapanayî",
"bxw": "bankayî",
"ygw": "yagwoiayî",
"tbr": "tumtumî",
"tgw": "tagwana senoufoyî",
"pnr": "panimî",
"njt": "ndyuka-trio pidginî",
"vnk": "lovonoyî",
"kma": "konniyî",
"hal": "halangî",
"awc": "cicipu",
"bch": "bariyayî",
"gfk": "patpatarî",
"ule": "luleyî",
"vkm": "kamakanî",
"xht": "hattîkî",
"btz": "batakiya alas-kluet",
"dti": "ana tinga dogonî",
"yre": "yaoureyî",
"udj": "ujirî",
"tpu": "tampuanî",
"ung": "ngarinyinî",
"xjb": "minjungbalî",
"slz": "ma'yayî",
"kpe": "kpelleyî",
"xla": "kamulayî",
"kpc": "curripacoyî",
"bvz": "bawziyî",
"ets": "yekheeyî",
"bbn": "uneapayî",
"tvw": "sedoayî",
"crp-spp": "pidginiya samoan plantation",
"ngq": "ngoremeyî",
"mil": "mixteciya peñoles",
"sai-chn": "çanayî",
"kvu": "yinbaw karenî",
"txx": "tatanayî",
"lva": "maku'ayî",
"gel": "fakkanciyî",
"bom": "beromî",
"cvn": "valle nacional çinantecî",
"sya": "siangî",
"bql": "bilakurayî",
"arv": "arbore",
"sai-yup": "yupuayî",
"vnp": "vunapuyî",
"sbb": "simboyî",
"gmw-pro": "proto-cermeniya rojava",
"nbn": "kurî",
"wbv": "wajarrî",
"mwh": "moûk-arîakî",
"bwp": "mandobo bawahî",
"fie": "fyerî",
"dal": "dahaloyî",
"aba": "abeyî",
"zpm": "zapotekiya mixtepec",
"wky": "wangkayutyuruyî",
"laq": "qabiaoyî",
"nja": "nzanyî",
"dmo": "kemezungî",
"dro": "daro-matu melanauyî",
"ato": "atong (Kamerun)",
"yif": "açeyî",
"zts": "zapotekiya tilquiapan",
"lah": "lahndayî",
"iry": "îrayayî",
"roa-bbn": "bourbonnais-berriçonî",
"aal": "afadeyî",
"czn": "zenzontepekiya çatîno",
"mpl": "watutiya navîn",
"lmg": "lamogayî",
"nlg": "gelayî",
"ayo": "ayoreoyî",
"zoh": "zoqueyiya çimalapa",
"mtp": "wiçi lhamtes noctenî",
"suv": "sulungî",
"xmt": "matbatî",
"zga": "kingayî",
"jbt": "jabutiyî",
"gof": "gofayî",
"rmt": "domarî",
"bwu": "bulî (Gana)",
"jod": "wojenakayî",
"yyu": "torricelli yauyî",
"sbf": "şaboyî",
"yan": "mayangnayî",
"kii": "kitsaiyî",
"trc": "trîkuyiya copala",
"shx": "şeyî",
"pgu": "paguyî",
"gwa": "mbatoyî",
"dyo": "jola-fonyiyî",
"yas": "gunuyî",
"igb": "ebirayî",
"plz": "paluanî",
"alv-gwa": "gwarayî",
"eke": "ekitî",
"cfd": "carayî",
"abb": "bankonî",
"amc": "amahuaca",
"rhp": "yahangî",
"lmb": "mereiyî",
"koa": "konomalayî",
"hlb": "halbiyî",
"eme": "emerillonî",
"nai-cig": "ciguayoyî",
"ael": "ambeleyî",
"jay": "yan-nhanguyî",
"tak": "talayî",
"mmy": "migaamayî",
"lmd": "lumunî",
"kfp": "korwayî",
"woi": "kamangî",
"akg": "anakalunguyî",
"nai-per": "pericú",
"nrl": "ngarlumayî",
"mew": "maakayî",
"hig": "kamweyî",
"hnd": "hindkoyiya başûrî",
"cuv": "cuvokî",
"ylg": "yeloguyî",
"une": "unemeyî",
"tpj": "tapieteyî",
"sos": "seenkuyî",
"nsh": "ngoşieyî",
"mit": "mixteciya pueblaya başûr",
"mxx": "mahouyî",
"bzk": "kreyoliya nîkaraguayî",
"esq": "esselenî",
"nbc": "çangî",
"anu": "anuak",
"snu": "senggî",
"mpu": "makurapî",
"hbb": "hubayî",
"cbg": "çimilayî",
"wti": "bertayî",
"app": "apma",
"spg": "sianî",
"snf": "noonî",
"mkp": "moikodî",
"viv": "idunayî",
"gem-pro": "proto-cermenî",
"omx": "moniya kevn",
"maw": "mamprulî",
"are": "arrernteya rojavayî",
"zah": "zangwalî",
"ssl": "sisaalayiya rojavayî",
"mpc": "mangarayî",
"qun": "kuynaultî",
"gyd": "kayardildî",
"ikx": "îkî",
"dij": "daiyî",
"bwq": "boboyiya başûrî",
"aum": "asu",
"axb": "abipon",
"zac": "zapotekiya ocotlan",
"xwk": "wangkumarayî",
"nzi": "nzimayî",
"mzv": "manzayî",
"kwe": "kwerbayî",
"sjk": "kemi samî",
"gmv": "gamoyî",
"bkt": "bolokî",
"atw": "atsugewî",
"zpk": "zapotekiya tlacolulita",
"wbe": "waritaî",
"ray": "rapayî",
"ojs": "ojibweyiya severnê",
"zmd": "maridanî",
"kxz": "kerewoyî",
"irr": "îrî",
"gbr": "gbagyiyî",
"bzx": "bozoyiya hainyaxo",
"aya": "awar",
"res": "reşeyî",
"oin": "oneyiya inebu",
"mwe": "mwerayî",
"ite": "îteneyî",
"gaf": "gendeyî",
"gdl": "diraşayî",
"nfd": "ahwayî",
"tlm": "tolomakoyî",
"mgv": "matengoyî",
"gqn": "kinikinaoyî",
"jah": "jah hutî",
"gog": "gogoyî",
"doy": "dompoyî",
"bfj": "bafanjî",
"xwc": "wokkonî",
"tei": "torricellî",
"sha": "şall-zwallî",
"stn": "owayî",
"emy": "mayaniya epigrafîk",
"azd": "durango nahuatliya rojavayî",
"bls": "balaesang",
"dul": "alabat island agtayî",
"xan": "xamtangayî",
"plk": "şinayiya kohistanî",
"sai-sac": "sacatayî",
"apf": "pahanan agta",
"npa": "nar phuyî",
"mfn": "mbembeyiya çema crossê",
"czk": "knaanicî",
"jow": "jowuluyî",
"cbb": "cabiyariyî",
"bpq": "banda malayî",
"sit-tsh": "tşobdunî",
"sbe": "salibayî (Gîneya nû)",
"mfj": "mefeleyî",
"lok": "lokoyî",
"kdu": "kadaruyî",
"ekp": "ekpeyeyî",
"bap": "bantawa",
"ali": "amaimonî",
"ynu": "yahunayî",
"tuf": "tuneboyiya navendî",
"ppu": "paporayî",
"dcr": "negerhollandsî",
"meq": "mereyî",
"nai-knm": "konomihuyî",
"ijn": "kalabariyî",
"hla": "haliayî",
"alm": "amblongî",
"ynn": "yanayî",
"ntj": "ngaanyatjarrayî",
"kbq": "kamanoyî",
"anm": "analî",
"ukg": "ukurigumayî",
"mav": "satere-maweyî",
"mfz": "mabaanî",
"kqq": "krenakî",
"hns": "hindustaniyiya karibî",
"taf": "tapirapeyî",
"mig": "mixteciya san miguel el grande",
"kni": "kanufiyî",
"sai-chp": "çapacurayî",
"cko": "anufoyî",
"wnu": "usanî",
"spe": "sepayî (Gîneya nû)",
"xrw": "karawayî",
"bnt-cmw": "çimwiinî",
"vam": "vanimoyî",
"sjr": "siar-lakî",
"poo": "pomoyiya navendî",
"mlz": "malaynonî",
"xks": "kumbewahayî",
"ldb": "idunî",
"tqb": "tembeyî",
"nai-sin": "sinacantanî",
"nur": "nuguriayî",
"mqx": "mamujuyî",
"unn": "kurnayî",
"bcn": "bîbaalî",
"ttr": "terayî",
"wkd": "moyî",
"kzl": "kayeliyî",
"ntk": "îkomayî",
"gdg": "ga'dangî",
"gbj": "bodo gadabayî",
"abi": "abîdjî",
"zao": "zapotekiya ozolotepec",
"sai-wnm": "wanhamî",
"thp": "thompsonî",
"cwe": "kwereyî",
"xbn": "kenaboî",
"gnq": "ganayî",
"tcc": "datoogayî",
"ztg": "zapotekiya xanaguia",
"zmj": "maridjabinî",
"lak": "lakayî",
"kvr": "kerînçî",
"ggu": "gbanî",
"anv": "denya",
"aof": "bragat",
"awr": "awera",
"zhb": "zhabayî",
"www": "wawayî",
"stb": "subaneniya bakurî",
"ret": "rettayî",
"oon": "öngeyî",
"mlv": "mwotlapî",
"mzr": "marúboyî",
"lag": "langiyî",
"kxc": "khonsoyî",
"itx": "îtikî",
"bja": "budza",
"ayu": "ayuyî",
"tba": "aikanayî",
"txm": "tominî",
"orx": "oroyî",
"nhq": "nahwatliya huaxcaleca",
"mpq": "matisî",
"kfk": "kinnauriyî",
"kzh": "dongolawiyî",
"bck": "bunabayî",
"ksf": "bafiayî",
==== Modul:zimanên etîmolojiyê====
{{Special:PrefixIndex/Modul:zimanên etîmolojiyê/|stripprefix=yes}}
==== Modul:etymology languages====
{{Special:PrefixIndex/Modul:etymology languages/|stripprefix=yes}}
==== Binêre herwiha ====
{{veşêre-ser}}
{| class="wikitable"
!wikilink
|-
|[[Pêvek:Bêçavkanî]]
|-
|[[Pêvek:Bêçavkanî/a]]
|-
|[[Pêvek:Bêçavkanî/a/alozbûn wekî wayra]]
|-
|[[Pêvek:Bêçavkanî/aloq]]
|-
|[[Pêvek:Bêçavkanî/alozbûn]]
|-
|[[Pêvek:Bêçavkanî/amerzandin]]
|-
|[[Pêvek:Bêçavkanî/asûm]]
|-
|[[Pêvek:Bêçavkanî/bester]]
|-
|[[Pêvek:Bêçavkanî/cewser]]
|-
|[[Pêvek:Bêçavkanî/derbest]]
|-
|[[Pêvek:Bêçavkanî/dogirme]]
|-
|[[Pêvek:Bêçavkanî/dolivandin]]
|-
|[[Pêvek:Bêçavkanî/dêziman]]
|-
|[[Pêvek:Bêçavkanî/girêmestî]]
|-
|[[Pêvek:Bêçavkanî/hesoskî]]
|-
|[[Pêvek:Bêçavkanî/hilinder]]
|-
|[[Pêvek:Bêçavkanî/ji barê ve]]
|-
|[[Pêvek:Bêçavkanî/kakilîk]]
|-
|[[Pêvek:Bêçavkanî/kedpîr]]
|-
|[[Pêvek:Bêçavkanî/kilûç]]
|-
|[[Pêvek:Bêçavkanî/nêremê]]
|-
|[[Pêvek:Bêçavkanî/nû]]
|-
|[[Pêvek:Bêçavkanî/oc bûn]]
|-
|[[Pêvek:Bêçavkanî/qomik]]
|-
|[[Pêvek:Bêçavkanî/rojol]]
|-
|[[Pêvek:Bêçavkanî/sîniyar]]
|-
|[[Pêvek:Bêçavkanî/tazîger]]
|-
|[[Pêvek:Bêçavkanî/tevilîn]]
|-
|[[Pêvek:Bêçavkanî/torecivîn]]
|-
|[[Pêvek:Bêçavkanî/zelîn]]
|-
|[[Pêvek:Bêçavkanî/şeebî]]
|}
{{veşêre-bin}}
7ene245unjzdbhi4eu4z4tbrn9bpmxy
6292083
6292081
2026-07-29T20:51:39Z
Wikihez
7344
/* lmea */
6292083
wikitext
text/x-wiki
==== Modul:zimanên etîmolojiyê====
{{Special:PrefixIndex/Modul:zimanên etîmolojiyê/|stripprefix=yes}}
==== Modul:etymology languages====
{{Special:PrefixIndex/Modul:etymology languages/|stripprefix=yes}}
==== Binêre herwiha ====
{{veşêre-ser}}
{| class="wikitable"
!wikilink
|-
|[[Pêvek:Bêçavkanî]]
|-
|[[Pêvek:Bêçavkanî/a]]
|-
|[[Pêvek:Bêçavkanî/a/alozbûn wekî wayra]]
|-
|[[Pêvek:Bêçavkanî/aloq]]
|-
|[[Pêvek:Bêçavkanî/alozbûn]]
|-
|[[Pêvek:Bêçavkanî/amerzandin]]
|-
|[[Pêvek:Bêçavkanî/asûm]]
|-
|[[Pêvek:Bêçavkanî/bester]]
|-
|[[Pêvek:Bêçavkanî/cewser]]
|-
|[[Pêvek:Bêçavkanî/derbest]]
|-
|[[Pêvek:Bêçavkanî/dogirme]]
|-
|[[Pêvek:Bêçavkanî/dolivandin]]
|-
|[[Pêvek:Bêçavkanî/dêziman]]
|-
|[[Pêvek:Bêçavkanî/girêmestî]]
|-
|[[Pêvek:Bêçavkanî/hesoskî]]
|-
|[[Pêvek:Bêçavkanî/hilinder]]
|-
|[[Pêvek:Bêçavkanî/ji barê ve]]
|-
|[[Pêvek:Bêçavkanî/kakilîk]]
|-
|[[Pêvek:Bêçavkanî/kedpîr]]
|-
|[[Pêvek:Bêçavkanî/kilûç]]
|-
|[[Pêvek:Bêçavkanî/nêremê]]
|-
|[[Pêvek:Bêçavkanî/nû]]
|-
|[[Pêvek:Bêçavkanî/oc bûn]]
|-
|[[Pêvek:Bêçavkanî/qomik]]
|-
|[[Pêvek:Bêçavkanî/rojol]]
|-
|[[Pêvek:Bêçavkanî/sîniyar]]
|-
|[[Pêvek:Bêçavkanî/tazîger]]
|-
|[[Pêvek:Bêçavkanî/tevilîn]]
|-
|[[Pêvek:Bêçavkanî/torecivîn]]
|-
|[[Pêvek:Bêçavkanî/zelîn]]
|-
|[[Pêvek:Bêçavkanî/şeebî]]
|}
{{veşêre-bin}}
gfr75qbiupuy9wa5ak4vpiarzfv0wpo
Bikarhêner:Wikihez/Gadget-start.css
2
1357891
6292087
6291872
2026-07-29T21:33:12Z
Wikihez
7344
6292087
css
text/css
/* Requires MediaWiki:Gadget-Palette.css for the --wikt-palette-* vars. */
/* ===================================================================
Base scale
Everything under the form is scaled down a notch and given a
tighter line-height. This is the single biggest lever on "too much
scrolling": at 100% + default line-height, ~30 form steps easily
doubles the page height compared to 92% + 1.35 line-height.
=================================================================== */
#wiktku-start-form,
#wiktku-preview-container {
font-size: 0.92em;
line-height: 1.35;
}
#wiktku-start-form * ,
#wiktku-preview-container * {
box-sizing: border-box;
}
.wiktku-addlang-notice {
margin: 0 0 0.8em;
padding: 0.6em 0.8em;
background: var(--wikt-palette-paleblue);
border: 1px solid var(--wikt-palette-lightgrey);
border-radius: 4px;
}
/* ===================================================================
Step cards
Was: padding: 1em 0 + border-bottom (a flat divider list).
Now: a compact card with a left accent bar, so each step reads as
a distinct unit without needing a full em of air above and below it.
=================================================================== */
.wiktku-start-step {
padding: 0.55em 0.7em;
margin-bottom: 0.4em;
border: 1px solid var(--wikt-palette-grey-3, #e0e0e0);
border-left: 3px solid var(--wikt-palette-blue-9, #3366cc);
border-radius: 3px;
background: var(--wikt-palette-white);
transition: border-left-color 0.15s ease;
}
.wiktku-start-step:focus-within {
border-left-color: var(--wikt-palette-blue-9, #3366cc);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
}
.wiktku-start-step-question {
font-size: 104%;
font-weight: 600;
margin: 0 0 0.35em;
line-height: 1.3;
}
.wiktku-start-step label {
padding-right: 1.2em;
font-size: 0.95em;
}
input[type="text"].wiktku-start-step-field {
width: 100%;
padding: 4px 6px;
border: 1px solid var(--wikt-palette-lightgrey);
border-radius: 2px;
}
input[type="text"].wiktku-start-step-field.wiktku-start-narrow {
width: 20em;
}
/* Only used by selects that opt out via .wiktku-plain-select; other
selects get their width from the searchable picker instead (see
input.wiktku-ac-input). */
select.wiktku-start-narrow,
input.wiktku-dfn-tpl-title {
width: 20em;
max-width: 100%;
box-sizing: border-box;
}
#wiktku-start-spinner {
float: right;
margin-left: 1em;
}
#wiktku-start-footer {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.5em;
padding: 0.6em 0.2em;
position: sticky;
bottom: 0;
background: var(--wikt-palette-white);
border-top: 1px solid var(--wikt-palette-grey-3, #e0e0e0);
z-index: 5;
}
/* ── "Bişîne" click feedback ──
A toast alone is easy to miss, and the disabled/spinner state only
appears once getWikitext resolves. This gives an instant, unmissable
confirmation the click registered, right at the point of contact. */
@keyframes wiktku-btn-flash-pulse {
0% { box-shadow: 0 0 0 0 rgba(51, 102, 204, 0.55); }
70% { box-shadow: 0 0 0 9px rgba(51, 102, 204, 0); }
100% { box-shadow: 0 0 0 0 rgba(51, 102, 204, 0); }
}
#wiktku-unhide-editform.wiktku-btn-flash {
animation: wiktku-btn-flash-pulse 0.5s ease-out;
}
/* Persistent state while the wikitext is being built/submitted, set
alongside OOUI's own setDisabled(true) so it reads clearly even if
the skin's default disabled style is subtle. */
#wiktku-unhide-editform.wiktku-btn-sending .oo-ui-buttonElement-button {
background-color: var(--wikt-palette-grey-9, #767676) !important;
border-color: var(--wikt-palette-grey-9, #767676) !important;
cursor: progress;
opacity: 1 !important;
}
#wiktku-start-form textarea.wiktku-start-step-field,
#wiktku-start-form textarea.wiktku-start-narrow,
#wiktku-start-form textarea.wiktku-dfn-subfield {
resize: vertical !important;
overflow: auto !important;
box-sizing: border-box !important;
vertical-align: top;
border: 1px solid var(--wikt-palette-lightgrey);
border-radius: 3px;
transition: border-color 0.1s ease, box-shadow 0.1s ease;
}
/* Modern focus state to match the searchable-picker inputs. */
#wiktku-start-form textarea.wiktku-start-step-field:focus,
#wiktku-start-form textarea.wiktku-start-narrow:focus,
#wiktku-start-form textarea.wiktku-dfn-subfield:focus {
border-color: var(--wikt-palette-blue-9, #3366cc);
box-shadow: inset 0 0 0 1px var(--wikt-palette-blue-9, #3366cc);
outline: 0;
}
#wiktku-start-form textarea.wiktku-start-narrow,
#wiktku-start-form textarea.wiktku-dfn-subfield.wiktku-start-narrow {
width: 20em;
max-width: 100%;
min-width: 8em;
height: calc(1.7em + 10px);
min-height: calc(1.7em + 10px);
padding-top: 4px !important;
padding-bottom: 4px !important;
line-height: 1.35 !important;
/* These are one-line fields (Etîket, Hevmane, Dijmane, Dûnde/Jê/Têkildar/
Binêre herwiha word boxes, citation source fields, …) — dragging them
taller/wider doesn't make sense and was the cause of boxes sticking out
past the step card on mobile. See .wiktku-dfn-quote-src-input--title
below for the one deliberate exception (citation title fields). */
resize: none !important;
}
/* Exception: "Sernav" / "Sernavê orjînal" citation-source fields (kitêb,
kovar, malper, …) — long enough to be worth 2 rows and manual resizing. */
#wiktku-start-form textarea.wiktku-dfn-quote-src-input.wiktku-dfn-quote-src-input--title {
height: calc(2 * 1.35em + 10px);
min-height: calc(2 * 1.35em + 10px);
}
/* ── Manual drag-to-resize handle ──
Native CSS `resize` is unreliable across browsers: iOS Safari has
never implemented the corner grip at all (a platform limitation —
there's no CSS-only fix), and some desktop Safari versions have
their own quirks with it. Desktop Chrome/Firefox and Android handle
the native grip fine, but rather than have Safari behave
differently we replace it everywhere with our own small JS-driven
grip (see wiktkuMakeManualResizable in start.js), so dragging works
the same on every platform. One-line fields (.wiktku-start-narrow)
are meant to stay a fixed height and are left alone. */
#wiktku-start-form textarea:not(.wiktku-start-narrow) {
resize: none !important;
}
.wiktku-resize-wrap {
position: relative;
display: block;
}
/* Independent of .wiktku-resize-wrap (created separately by
ensureLinebreakBackdrop() in start.js, only for textareas that ever
get flagged with a linebreak) so it doesn't depend on load order
relative to wiktkuMakeManualResizable(). Plain block, no size of its
own — purely a position:relative anchor for the backdrop. */
.wiktku-linebreak-wrap {
position: relative;
display: block;
}
.wiktku-resize-grip {
position: absolute;
right: 2px;
bottom: 2px;
width: 14px;
height: 14px;
cursor: ns-resize;
touch-action: none;
opacity: 0.5;
z-index: 2;
background-image: linear-gradient(135deg, transparent 0 50%, var(--wikt-palette-grey-9, #767676) 50% 100%);
background-repeat: no-repeat;
}
.wiktku-resize-grip:hover,
.wiktku-resize-grip:active {
opacity: 0.9;
}
/* ===================================================================
Searchable dropdown (wrapNativeSelect in start.js)
.wiktku-native-select-wrap > input.wiktku-ac-input (search box)
> ul.wiktku-ac-results (result list)
> select (hidden, holds the value)
=================================================================== */
.wiktku-native-select-wrap {
display: inline-block;
position: relative;
vertical-align: top;
}
/* Matches the width the native select would have had (see
select.wiktku-start-narrow). */
.wiktku-native-select-wrap input[type="search"],
input.wiktku-ac-input {
display: block;
width: 20em;
max-width: 100%;
box-sizing: border-box;
padding: 3px 6px;
border: 1px solid var(--wikt-palette-lightgrey);
border-radius: 2px;
background: var(--wikt-palette-white);
color: inherit;
font-size: inherit;
font-family: inherit;
transition: border-color 0.1s ease, box-shadow 0.1s ease;
}
input.wiktku-ac-input:focus {
border-color: var(--wikt-palette-blue-9);
box-shadow: inset 0 0 0 1px var(--wikt-palette-blue-9);
outline: 0;
}
input.wiktku-ac-input::placeholder {
color: var(--wikt-palette-grey-9);
opacity: 1;
}
/* Hide Safari/Chrome's built-in search decorations. */
input.wiktku-ac-input::-webkit-search-decoration,
input.wiktku-ac-input::-webkit-search-cancel-button,
input.wiktku-ac-input::-webkit-search-results-button {
-webkit-appearance: none;
appearance: none;
}
/* ── Result list ── */
/* top/bottom/max-height are overridden inline by showResults() when it
flips the list above the box; these are just its defaults. */
ul.wiktku-ac-results {
position: absolute;
z-index: 9999;
top: 100%;
bottom: auto;
left: 0;
margin: 0;
padding: 0;
list-style: none;
width: 20em;
max-width: 90vw;
max-height: 13em;
overflow-y: auto;
overscroll-behavior: contain;
-webkit-overflow-scrolling: touch;
background: var(--wikt-palette-white);
border: 1px solid var(--wikt-palette-lightgrey);
border-radius: 3px;
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.15);
}
ul.wiktku-ac-results li {
margin: 0;
padding: 4px 8px;
cursor: pointer;
font-size: 0.92em;
display: flex;
align-items: center;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* .wiktku-ac-active is the keyboard cursor; hover mirrors it; :active
covers the touch press state. */
ul.wiktku-ac-results li.wiktku-ac-active,
ul.wiktku-ac-results li:hover {
background: var(--wikt-palette-lightblue);
}
ul.wiktku-ac-results li:active {
background: var(--wikt-palette-blue-9);
color: var(--wikt-palette-white);
}
/* Touch devices: bigger tap targets, no sticky hover. */
@media (pointer: coarse) {
ul.wiktku-ac-results li {
padding: 6px 10px;
min-height: 2.2em;
font-size: 1em;
}
ul.wiktku-ac-results li:hover {
background: transparent;
}
ul.wiktku-ac-results li.wiktku-ac-active {
background: var(--wikt-palette-lightblue);
}
input.wiktku-ac-input {
/* >=16px stops iOS Safari zooming the page when the box is focused. */
font-size: 16px;
min-height: 2.2em;
}
}
/* Template pickers fill their container since the search box, not the
<select>, is what the user sees. */
.wiktku-pron-wrap .wiktku-native-select-wrap,
.wiktku-etym-wrap .wiktku-native-select-wrap,
.wiktku-pron-wrap .wiktku-native-select-wrap input.wiktku-ac-input,
.wiktku-etym-wrap .wiktku-native-select-wrap input.wiktku-ac-input {
width: 100%;
}
.wiktku-pron-wrap .wiktku-native-select-wrap input.wiktku-ac-input,
.wiktku-etym-wrap .wiktku-native-select-wrap input.wiktku-ac-input {
font-size: 0.88em;
}
.wiktku-cavkani-wrap .wiktku-native-select-wrap,
.wiktku-cavkani-wrap .wiktku-native-select-wrap input.wiktku-ac-input {
width: 100%;
}
/* Template selector inside a sense block. */
.wiktku-dfn-tpl-row .wiktku-native-select-wrap input.wiktku-ac-input {
font-size: 0.88em;
}
/* Language/dialect rows: picker must line up with the word field beside it. */
.wiktku-lang-row .wiktku-native-select-wrap {
flex: 0 0 auto;
}
/* ── Wikitext preview panel ── */
#wiktku-preview-panel {
margin-top: 0.8em;
padding: 0.7em;
background: var(--wikt-palette-paleblue);
border: 1px solid var(--wikt-palette-lightgrey);
border-radius: 3px;
white-space: pre-wrap;
word-break: break-word;
font-family: monospace;
font-size: 0.85em;
}
/* ── Live rendered preview panel (desktop only) ── */
#wiktku-live-preview-panel {
margin-top: 0.8em;
padding: 0.7em;
background: var(--wikt-palette-paleblue);
border: 1px solid var(--wikt-palette-lightgrey);
border-radius: 3px;
word-break: break-word;
min-height: 2em;
}
/* ── Preview container (holds wikitext + live panels) ── */
#wiktku-preview-container {
display: flex;
flex-wrap: wrap;
gap: 0.8em;
margin-top: 0.4em;
}
#wiktku-start-form textarea.wiktku-dfn-mane,
#wiktku-start-form textarea.wiktku-dfn-nimune-text,
#wiktku-start-form .wiktku-dfn-jeder-group textarea.wiktku-dfn-nimune-quote,
#wiktku-start-form .wiktku-dfn-nimune-sub textarea.wiktku-dfn-nimune-tr,
#wiktku-start-form .wiktku-dfn-nimune-sub textarea.wiktku-dfn-nimune-t,
#wiktku-start-form .wiktku-dfn-quote-sub textarea.wiktku-dfn-nimune-quote-tr,
#wiktku-start-form .wiktku-dfn-quote-sub textarea.wiktku-dfn-nimune-quote-t,
#wiktku-start-form textarea.wiktku-dfn-quote-src-manual,
#wiktku-start-form .wiktku-pron-wrap textarea.wiktku-pron-text,
#wiktku-start-form .wiktku-etym-wrap textarea.wiktku-etym-text,
#wiktku-start-form textarea.wiktku-cavkani-text,
#wiktku-start-form textarea.wiktku-dfn-tercime,
#wiktku-start-form textarea.wiktku-dfn-izah {
--wiktku-ta-rows: 2;
width: 100%;
box-sizing: border-box;
height: calc(var(--wiktku-ta-rows) * 1.35em + 6px);
min-height: calc(var(--wiktku-ta-rows) * 1.35em + 6px);
}
#wiktku-start-form .wiktku-pron-wrap textarea.wiktku-pron-text,
#wiktku-start-form .wiktku-etym-wrap textarea.wiktku-etym-text,
#wiktku-start-form textarea.wiktku-dfn-izah {
--wiktku-ta-rows: 3;
}
#wiktku-start-form textarea.wiktku-cavkani-text {
--wiktku-ta-rows: 4;
}
/* Nimûne + Jêgirtin (citation) boxes, and their tr/t sub-fields: at
least 4 rows so there's room to actually write an example/quote. */
#wiktku-start-form textarea.wiktku-dfn-nimune-text,
#wiktku-start-form .wiktku-dfn-nimune-sub textarea.wiktku-dfn-nimune-tr,
#wiktku-start-form .wiktku-dfn-nimune-sub textarea.wiktku-dfn-nimune-t,
#wiktku-start-form .wiktku-dfn-jeder-group textarea.wiktku-dfn-nimune-quote,
#wiktku-start-form .wiktku-dfn-quote-sub textarea.wiktku-dfn-nimune-quote-tr,
#wiktku-start-form .wiktku-dfn-quote-sub textarea.wiktku-dfn-nimune-quote-t,
#wiktku-start-form textarea.wiktku-dfn-quote-src-manual {
--wiktku-ta-rows: 4;
}
/* Nimûne/jêgirtin box currently contains a typed/pasted linebreak —
the border is nudged so the user notices before it's silently turned
into <br> on output. The break itself is marked precisely, not the
whole box, via a mirrored backdrop layer (see below and
highlightLinebreak()/buildLinebreakBackdropHtml() in start.js). */
#wiktku-start-form textarea.wiktku-has-linebreak {
border-color: var(--wikt-palette-yellow6, #ac6600) !important;
}
/* Backdrop layer: sits behind the textarea showing the same text, with
a highlighted marker at each line that's followed by a break. Its
font/padding/box-sizing/line-height are copied from the textarea via
computed style (see syncLinebreakBackdropMetrics() in start.js), not
shared CSS classes — most of this box's own rules are written as
"textarea.foo", which a <div> with the same class wouldn't match.
Only created lazily, the first time a given textarea actually has a
break — see ensureLinebreakBackdrop(). */
.wiktku-linebreak-backdrop {
position: absolute;
inset: 0;
z-index: 0;
margin: 0;
overflow: hidden;
white-space: pre-wrap;
word-wrap: break-word;
color: transparent;
background: transparent !important;
border-color: transparent !important;
box-shadow: none !important;
resize: none !important;
pointer-events: none;
}
/* Raise the real textarea above its backdrop so typing/selection/caret
behave completely normally; the backdrop's mark shows through only
where the real textarea's own background is transparent. */
#wiktku-start-form textarea.wiktku-has-linebreak-source {
position: relative;
z-index: 1;
background-color: transparent;
}
.wiktku-linebreak-mark {
background-color: var(--wikt-palette-yellow6, #ac6600);
color: var(--wikt-palette-white, #fff);
border-radius: 2px;
}
/* ── Tercime + Îzah boxes ── */
.wiktku-dfn-nonku-wrap {
display: flex;
flex-direction: column;
gap: 3px;
}
.wiktku-dfn-nimune-sub,
.wiktku-dfn-quote-sub {
margin-top: 3px;
margin-left: 1em;
padding-left: 0.6em;
border-left: 2px solid var(--wikt-palette-lightgrey);
display: flex;
flex-direction: column;
gap: 3px;
}
.wiktku-dfn-nimune-sub textarea.wiktku-dfn-nimune-tr,
.wiktku-dfn-nimune-sub textarea.wiktku-dfn-nimune-t {
min-width: 8em;
padding-top: 2px !important;
padding-bottom: 2px !important;
line-height: 1.35 !important;
font-size: 0.88em;
}
/* ── Template selector row inside a sense block ── */
.wiktku-dfn-tpl-row {
margin-bottom: 3px;
}
/* ── Sub-field titles (Etîket, Kategorî, Hevmane, Dijmane, Nimûne,
Jêgirtin, …) — previously plain unstyled run-on text. Each group
now reads as a small labelled field: the term stands out, the
izah hint stays quiet, and the block gets its own breathing room. ── */
.wiktku-dfn-subgroup {
margin-top: 0.5em;
padding-top: 0.4em;
border-top: 1px dashed var(--wikt-palette-grey-3, #e0e0e0);
}
.wiktku-dfn-subgroup:first-of-type {
margin-top: 0.3em;
padding-top: 0;
border-top: none;
}
.wiktku-dfn-sublabel {
display: block;
margin-bottom: 3px;
font-size: 0.88em;
}
.wiktku-dfn-sublabel-term {
font-weight: 600;
color: var(--wikt-palette-blue-9, #3366cc);
letter-spacing: 0.03em;
font-size: 0.92em;
}
.wiktku-dfn-sublabel-hint {
color: var(--wikt-palette-grey-9, #767676);
font-style: italic;
}
.wiktku-pron-wrap,
.wiktku-etym-wrap,
.wiktku-cavkani-wrap {
display: flex;
flex-direction: column;
gap: 3px;
}
/* ── POS section tabs ──
Modernized into rounded pills instead of flat file-folder tabs. */
#wiktku-section-tabs {
display: flex;
flex-wrap: wrap;
gap: 4px;
margin-bottom: 0.6em;
align-items: center;
}
#wiktku-section-tabs .wiktku-section-tab {
padding: 3px 12px;
border: 1px solid var(--wikt-palette-lightgrey);
border-radius: 999px;
background: var(--wikt-palette-dullcyan);
cursor: pointer;
font-size: 0.86em;
user-select: none;
transition: background 0.12s ease, border-color 0.12s ease;
}
#wiktku-section-tabs .wiktku-section-tab:hover {
border-color: var(--wikt-palette-blue-9, #3366cc);
}
#wiktku-section-tabs .wiktku-section-tab.wiktku-tab-active {
background: var(--wikt-palette-blue-9, #3366cc);
border-color: var(--wikt-palette-blue-9, #3366cc);
color: var(--wikt-palette-white);
font-weight: 600;
}
.wiktku-lang-row-list {
margin: 0;
padding: 0;
list-style: none;
}
.wiktku-lang-row {
display: flex;
align-items: flex-start;
gap: 6px;
margin-bottom: 3px;
flex-wrap: wrap;
}
.wiktku-lang-row-words {
margin: 0;
padding: 0;
list-style: none;
display: flex;
flex-direction: column;
gap: 3px;
}
/* Dûnde/Werger/Zarava rows: align the picker's height with the adjacent
word textarea (see .wiktku-start-narrow above). */
.wiktku-lang-row .wiktku-native-select-wrap input.wiktku-ac-input {
height: calc(1.7em + 10px);
min-height: calc(1.7em + 10px);
padding-top: 4px;
padding-bottom: 4px;
}
/* ── Werger / Bi zaravayên din groups: one per gloss, shared spacing ── */
#wiktku-start-trans .wiktku-trans-group,
#wiktku-start-zarava .wiktku-zarava-group {
margin-bottom: 0.6em;
}
#wiktku-start-trans .wiktku-trans-group:last-child,
#wiktku-start-zarava .wiktku-zarava-group:last-child {
margin-bottom: 0;
}
#wiktku-start-trans .wiktku-trans-group-label,
#wiktku-start-zarava .wiktku-zarava-group-label {
font-weight: 600;
font-size: 0.88em;
margin-bottom: 3px;
}
.wiktku-dfn-jeder-group {
margin-top: 3px;
}
.wiktku-dfn-quote-src-sel {
font-size: 0.88em;
margin-top: 3px;
display: block;
}
.wiktku-dfn-quote-src-fields {
display: flex;
flex-direction: column;
gap: 3px;
margin-top: 3px;
}
/* Stacked layout: textarea gets its own full-width row, button + status
sit below it on their own row. Simpler and more robust than sharing a
row with the button — that required the textarea's own resize-wrap
div (added by wiktkuMakeManualResizable in start.js) to correctly
inherit flex-grow, which kept being fragile across breakpoints. */
.wiktku-dfn-quote-citoid {
display: flex;
flex-direction: column;
align-items: stretch;
gap: 0.4em;
margin-top: 3px;
margin-bottom: 3px;
}
.wiktku-dfn-quote-citoid-input {
width: 100%;
max-width: 100%;
box-sizing: border-box;
}
/* Column flex + align-items:stretch (above) is what makes the textarea's
.wiktku-resize-wrap (see wiktkuMakeManualResizable in start.js) reach
full width automatically — stretch fills the cross axis for any block
child, no flex-grow needed on the wrap itself. The button and status
text, right below the textarea, opt back out of that stretch so they
stay their natural (small) size instead of also going full width. */
.wiktku-dfn-quote-citoid-btn,
.wiktku-dfn-quote-citoid-status {
align-self: flex-start;
}
.wiktku-dfn-quote-src-cat-status {
display: block;
font-size: 0.82em;
color: var(--wikt-palette-lightgrey, #767676);
margin-top: 2px;
}
.wiktku-dfn-quote-src-row {
display: flex;
align-items: baseline;
gap: 4px;
flex-wrap: wrap;
}
.wiktku-dfn-quote-src-row label {
font-size: 0.82em;
white-space: nowrap;
min-width: 8em;
}
textarea.wiktku-dfn-quote-src-input {
flex: 1 1 12em;
max-width: 100%;
box-sizing: border-box;
}
@media (max-width: 720px) {
.wiktku-lang-row {
flex-direction: column;
}
/* Single column: search box and list use the full width. Narrow
textareas (Etîket, Hevmane, Dûnde/Jê/Têkildar/Binêre herwiha word
boxes, citation source fields, …) join them here too — at a fixed
20em width they used to poke out past the step card on narrow
screens. */
.wiktku-native-select-wrap,
input.wiktku-ac-input,
ul.wiktku-ac-results,
#wiktku-start-form textarea.wiktku-start-narrow,
#wiktku-start-form textarea.wiktku-dfn-subfield.wiktku-start-narrow {
width: 100%;
max-width: 100%;
}
#wiktku-start-form textarea.wiktku-dfn-mane,
#wiktku-start-form .wiktku-pron-wrap textarea.wiktku-pron-text,
#wiktku-start-form .wiktku-etym-wrap textarea.wiktku-etym-text {
--wiktku-ta-rows: 3;
font-size: 1em;
}
#wiktku-start-form textarea.wiktku-cavkani-text {
--wiktku-ta-rows: 5;
font-size: 1em;
}
/* Nimûne + Jêgirtin and their tr/t sub-fields: keep at least 4 rows
on mobile too, rather than shrinking further than the desktop size. */
#wiktku-start-form textarea.wiktku-dfn-nimune-text,
#wiktku-start-form .wiktku-dfn-nimune-sub textarea.wiktku-dfn-nimune-tr,
#wiktku-start-form .wiktku-dfn-nimune-sub textarea.wiktku-dfn-nimune-t,
#wiktku-start-form .wiktku-dfn-jeder-group textarea.wiktku-dfn-nimune-quote,
#wiktku-start-form .wiktku-dfn-quote-sub textarea.wiktku-dfn-nimune-quote-tr,
#wiktku-start-form .wiktku-dfn-quote-sub textarea.wiktku-dfn-nimune-quote-t {
--wiktku-ta-rows: 4;
font-size: 1em;
}
/* Citoid URL/DOI/ISBN box: taller tap target (~2 lines) on mobile,
and now that this field is a <textarea> (see start.js) its
placeholder can actually wrap into that space — a plain <input>'s
placeholder can never wrap, no matter its height. */
.wiktku-dfn-quote-citoid-input {
min-height: calc(2 * 1.35em + 10px);
font-size: 1em;
}
.wiktku-dfn-nimune-sub,
.wiktku-dfn-quote-sub {
margin-left: 0.5em;
padding-left: 0.4em;
}
.wiktku-pron-wrap .wiktku-native-select-wrap input.wiktku-ac-input,
.wiktku-etym-wrap .wiktku-native-select-wrap input.wiktku-ac-input {
font-size: 1em;
min-height: 2.2em;
}
.wiktku-dfn-quote-src-row label {
min-width: 6em;
}
#wiktku-start-form textarea.wiktku-dfn-quote-src-input {
width: 100%;
flex: 1 1 100%;
}
.wiktku-start-step {
padding: 0.5em 0.6em;
}
}
/* ===================================================================
Night mode
Palette.css already flips every --wikt-palette-* var for night mode,
so rules built from those vars need nothing here. This hook is only
for real colours that can't be a palette var — here, the panel border,
since a drop shadow is invisible against an equally dark page.
Not needed: li:active's white text already flips to a dark colour at
night via --wikt-palette-white, so it stays legible on its own.
=================================================================== */
@media screen {
html.skin-theme-clientpref-night .wiktku-ac-results {
/* Border stands in for the shadow, invisible on a dark page. */
border-color: var(--wikt-palette-grey-5);
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.6);
}
html.skin-theme-clientpref-night .wiktku-start-step {
box-shadow: none;
}
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .wiktku-ac-results {
border-color: var(--wikt-palette-grey-5);
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.6);
}
}
/* "Zimanek lê zêde bike" portlet icon (Minerva/mobile) — Feather-core-edit.svg
via CSS mask, matching Minerva's own icon pattern. */
.minerva-icon-portletlink-ca-wiktku-addlang {
-webkit-mask-image: url("https://upload.wikimedia.org/wikipedia/commons/d/d7/Feather-core-edit.svg");
mask-image: url("https://upload.wikimedia.org/wikipedia/commons/d/d7/Feather-core-edit.svg");
-webkit-mask-repeat: no-repeat;
mask-repeat: no-repeat;
-webkit-mask-position: center;
mask-position: center;
-webkit-mask-size: 20px;
mask-size: 20px;
background-color: currentColor;
background-image: none;
}
qoyd3wgmwxm9cnkbl9qa3d4iiqwgeg4
6292090
6292087
2026-07-29T21:45:08Z
Wikihez
7344
6292090
css
text/css
/* Requires MediaWiki:Gadget-Palette.css for the --wikt-palette-* vars. */
/* ===================================================================
Base scale
Everything under the form is scaled down a notch and given a
tighter line-height. This is the single biggest lever on "too much
scrolling": at 100% + default line-height, ~30 form steps easily
doubles the page height compared to 92% + 1.35 line-height.
=================================================================== */
#wiktku-start-form,
#wiktku-preview-container {
font-size: 0.92em;
line-height: 1.35;
}
#wiktku-start-form * ,
#wiktku-preview-container * {
box-sizing: border-box;
}
.wiktku-addlang-notice {
margin: 0 0 0.8em;
padding: 0.6em 0.8em;
background: var(--wikt-palette-paleblue);
border: 1px solid var(--wikt-palette-lightgrey);
border-radius: 4px;
}
/* ===================================================================
Step cards
Was: padding: 1em 0 + border-bottom (a flat divider list).
Now: a compact card with a left accent bar, so each step reads as
a distinct unit without needing a full em of air above and below it.
=================================================================== */
.wiktku-start-step {
padding: 0.55em 0.7em;
margin-bottom: 0.4em;
border: 1px solid var(--wikt-palette-grey-3, #e0e0e0);
border-left: 3px solid var(--wikt-palette-blue-9, #3366cc);
border-radius: 3px;
background: var(--wikt-palette-white);
transition: border-left-color 0.15s ease;
}
.wiktku-start-step:focus-within {
border-left-color: var(--wikt-palette-blue-9, #3366cc);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
}
.wiktku-start-step-question {
font-size: 104%;
font-weight: 600;
margin: 0 0 0.35em;
line-height: 1.3;
}
.wiktku-start-step label {
padding-right: 1.2em;
font-size: 0.95em;
}
input[type="text"].wiktku-start-step-field {
width: 100%;
padding: 4px 6px;
border: 1px solid var(--wikt-palette-lightgrey);
border-radius: 2px;
}
input[type="text"].wiktku-start-step-field.wiktku-start-narrow {
width: 20em;
}
/* Only used by selects that opt out via .wiktku-plain-select; other
selects get their width from the searchable picker instead (see
input.wiktku-ac-input). */
select.wiktku-start-narrow,
input.wiktku-dfn-tpl-title {
width: 20em;
max-width: 100%;
box-sizing: border-box;
}
#wiktku-start-spinner {
float: right;
margin-left: 1em;
}
#wiktku-start-footer {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.5em;
padding: 0.6em 0.2em;
position: sticky;
bottom: 0;
background: var(--wikt-palette-white);
border-top: 1px solid var(--wikt-palette-grey-3, #e0e0e0);
z-index: 5;
}
/* ── "Bişîne" click feedback ──
A toast alone is easy to miss, and the disabled/spinner state only
appears once getWikitext resolves. This gives an instant, unmissable
confirmation the click registered, right at the point of contact. */
@keyframes wiktku-btn-flash-pulse {
0% { box-shadow: 0 0 0 0 rgba(51, 102, 204, 0.55); }
70% { box-shadow: 0 0 0 9px rgba(51, 102, 204, 0); }
100% { box-shadow: 0 0 0 0 rgba(51, 102, 204, 0); }
}
#wiktku-unhide-editform.wiktku-btn-flash {
animation: wiktku-btn-flash-pulse 0.5s ease-out;
}
/* Persistent state while the wikitext is being built/submitted, set
alongside OOUI's own setDisabled(true) so it reads clearly even if
the skin's default disabled style is subtle. */
#wiktku-unhide-editform.wiktku-btn-sending .oo-ui-buttonElement-button {
background-color: var(--wikt-palette-grey-9, #767676) !important;
border-color: var(--wikt-palette-grey-9, #767676) !important;
cursor: progress;
opacity: 1 !important;
}
#wiktku-start-form textarea.wiktku-start-step-field,
#wiktku-start-form textarea.wiktku-start-narrow,
#wiktku-start-form textarea.wiktku-dfn-subfield {
resize: vertical !important;
overflow: auto !important;
box-sizing: border-box !important;
vertical-align: top;
border: 1px solid var(--wikt-palette-lightgrey);
border-radius: 3px;
transition: border-color 0.1s ease, box-shadow 0.1s ease;
}
/* Modern focus state to match the searchable-picker inputs. */
#wiktku-start-form textarea.wiktku-start-step-field:focus,
#wiktku-start-form textarea.wiktku-start-narrow:focus,
#wiktku-start-form textarea.wiktku-dfn-subfield:focus {
border-color: var(--wikt-palette-blue-9, #3366cc);
box-shadow: inset 0 0 0 1px var(--wikt-palette-blue-9, #3366cc);
outline: 0;
}
#wiktku-start-form textarea.wiktku-start-narrow,
#wiktku-start-form textarea.wiktku-dfn-subfield.wiktku-start-narrow {
width: 20em;
max-width: 100%;
min-width: 8em;
height: calc(1.7em + 10px);
min-height: calc(1.7em + 10px);
padding-top: 4px !important;
padding-bottom: 4px !important;
line-height: 1.35 !important;
/* These are one-line fields (Etîket, Hevmane, Dijmane, Dûnde/Jê/Têkildar/
Binêre herwiha word boxes, citation source fields, …) — dragging them
taller/wider doesn't make sense and was the cause of boxes sticking out
past the step card on mobile. See .wiktku-dfn-quote-src-input--title
below for the one deliberate exception (citation title fields). */
resize: none !important;
}
/* Exception: "Sernav" / "Sernavê orjînal" citation-source fields (kitêb,
kovar, malper, …) — long enough to be worth 2 rows and manual resizing. */
#wiktku-start-form textarea.wiktku-dfn-quote-src-input.wiktku-dfn-quote-src-input--title {
height: calc(2 * 1.35em + 10px);
min-height: calc(2 * 1.35em + 10px);
}
/* ── Manual drag-to-resize handle ──
Native CSS `resize` is unreliable across browsers: iOS Safari has
never implemented the corner grip at all (a platform limitation —
there's no CSS-only fix), and some desktop Safari versions have
their own quirks with it. Desktop Chrome/Firefox and Android handle
the native grip fine, but rather than have Safari behave
differently we replace it everywhere with our own small JS-driven
grip (see wiktkuMakeManualResizable in start.js), so dragging works
the same on every platform. One-line fields (.wiktku-start-narrow)
are meant to stay a fixed height and are left alone. */
#wiktku-start-form textarea:not(.wiktku-start-narrow) {
resize: none !important;
}
.wiktku-resize-wrap {
position: relative;
display: block;
}
/* Independent of .wiktku-resize-wrap (created separately by
ensureLinebreakBackdrop() in start.js, only for textareas that ever
get flagged with a linebreak) so it doesn't depend on load order
relative to wiktkuMakeManualResizable(). Plain block, no size of its
own — purely a position:relative anchor for the backdrop. */
.wiktku-linebreak-wrap {
position: relative;
display: block;
}
.wiktku-resize-grip {
position: absolute;
right: 2px;
bottom: 2px;
width: 14px;
height: 14px;
cursor: ns-resize;
touch-action: none;
opacity: 0.5;
z-index: 2;
background-image: linear-gradient(135deg, transparent 0 50%, var(--wikt-palette-grey-9, #767676) 50% 100%);
background-repeat: no-repeat;
}
.wiktku-resize-grip:hover,
.wiktku-resize-grip:active {
opacity: 0.9;
}
/* ===================================================================
Searchable dropdown (wrapNativeSelect in start.js)
.wiktku-native-select-wrap > input.wiktku-ac-input (search box)
> ul.wiktku-ac-results (result list)
> select (hidden, holds the value)
=================================================================== */
.wiktku-native-select-wrap {
display: inline-block;
position: relative;
vertical-align: top;
}
/* Matches the width the native select would have had (see
select.wiktku-start-narrow). */
.wiktku-native-select-wrap input[type="search"],
input.wiktku-ac-input {
display: block;
width: 20em;
max-width: 100%;
box-sizing: border-box;
padding: 3px 6px;
border: 1px solid var(--wikt-palette-lightgrey);
border-radius: 2px;
background: var(--wikt-palette-white);
color: inherit;
font-size: inherit;
font-family: inherit;
transition: border-color 0.1s ease, box-shadow 0.1s ease;
}
input.wiktku-ac-input:focus {
border-color: var(--wikt-palette-blue-9);
box-shadow: inset 0 0 0 1px var(--wikt-palette-blue-9);
outline: 0;
}
input.wiktku-ac-input::placeholder {
color: var(--wikt-palette-grey-9);
opacity: 1;
}
/* Hide Safari/Chrome's built-in search decorations. */
input.wiktku-ac-input::-webkit-search-decoration,
input.wiktku-ac-input::-webkit-search-cancel-button,
input.wiktku-ac-input::-webkit-search-results-button {
-webkit-appearance: none;
appearance: none;
}
/* ── Result list ── */
/* top/bottom/max-height are overridden inline by showResults() when it
flips the list above the box; these are just its defaults. */
ul.wiktku-ac-results {
position: absolute;
z-index: 9999;
top: 100%;
bottom: auto;
left: 0;
margin: 0;
padding: 0;
list-style: none;
width: 20em;
max-width: 90vw;
max-height: 13em;
overflow-y: auto;
overscroll-behavior: contain;
-webkit-overflow-scrolling: touch;
background: var(--wikt-palette-white);
border: 1px solid var(--wikt-palette-lightgrey);
border-radius: 3px;
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.15);
}
ul.wiktku-ac-results li {
margin: 0;
padding: 4px 8px;
cursor: pointer;
font-size: 0.92em;
display: flex;
align-items: center;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* .wiktku-ac-active is the keyboard cursor; hover mirrors it; :active
covers the touch press state. */
ul.wiktku-ac-results li.wiktku-ac-active,
ul.wiktku-ac-results li:hover {
background: var(--wikt-palette-lightblue);
}
ul.wiktku-ac-results li:active {
background: var(--wikt-palette-blue-9);
color: var(--wikt-palette-white);
}
/* Touch devices: bigger tap targets, no sticky hover. */
@media (pointer: coarse) {
ul.wiktku-ac-results li {
padding: 6px 10px;
min-height: 2.2em;
font-size: 1em;
}
ul.wiktku-ac-results li:hover {
background: transparent;
}
ul.wiktku-ac-results li.wiktku-ac-active {
background: var(--wikt-palette-lightblue);
}
input.wiktku-ac-input {
/* >=16px stops iOS Safari zooming the page when the box is focused. */
font-size: 16px;
min-height: 2.2em;
}
}
/* Template pickers fill their container since the search box, not the
<select>, is what the user sees. */
.wiktku-pron-wrap .wiktku-native-select-wrap,
.wiktku-etym-wrap .wiktku-native-select-wrap,
.wiktku-pron-wrap .wiktku-native-select-wrap input.wiktku-ac-input,
.wiktku-etym-wrap .wiktku-native-select-wrap input.wiktku-ac-input {
width: 100%;
}
.wiktku-pron-wrap .wiktku-native-select-wrap input.wiktku-ac-input,
.wiktku-etym-wrap .wiktku-native-select-wrap input.wiktku-ac-input {
font-size: 0.88em;
}
.wiktku-cavkani-wrap .wiktku-native-select-wrap,
.wiktku-cavkani-wrap .wiktku-native-select-wrap input.wiktku-ac-input {
width: 100%;
}
/* Template selector inside a sense block. */
.wiktku-dfn-tpl-row .wiktku-native-select-wrap input.wiktku-ac-input {
font-size: 0.88em;
}
/* Language/dialect rows: picker must line up with the word field beside it. */
.wiktku-lang-row .wiktku-native-select-wrap {
flex: 0 0 auto;
}
/* ── Wikitext preview panel ── */
#wiktku-preview-panel {
margin-top: 0.8em;
padding: 0.7em;
background: var(--wikt-palette-paleblue);
border: 1px solid var(--wikt-palette-lightgrey);
border-radius: 3px;
white-space: pre-wrap;
word-break: break-word;
font-family: monospace;
font-size: 0.85em;
}
/* ── Live rendered preview panel (desktop only) ── */
#wiktku-live-preview-panel {
margin-top: 0.8em;
padding: 0.7em;
background: var(--wikt-palette-paleblue);
border: 1px solid var(--wikt-palette-lightgrey);
border-radius: 3px;
word-break: break-word;
min-height: 2em;
}
/* ── Preview container (holds wikitext + live panels) ── */
#wiktku-preview-container {
display: flex;
flex-wrap: wrap;
gap: 0.8em;
margin-top: 0.4em;
}
#wiktku-start-form textarea.wiktku-dfn-mane,
#wiktku-start-form textarea.wiktku-dfn-nimune-text,
#wiktku-start-form .wiktku-dfn-jeder-group textarea.wiktku-dfn-nimune-quote,
#wiktku-start-form .wiktku-dfn-nimune-sub textarea.wiktku-dfn-nimune-tr,
#wiktku-start-form .wiktku-dfn-nimune-sub textarea.wiktku-dfn-nimune-t,
#wiktku-start-form .wiktku-dfn-quote-sub textarea.wiktku-dfn-nimune-quote-tr,
#wiktku-start-form .wiktku-dfn-quote-sub textarea.wiktku-dfn-nimune-quote-t,
#wiktku-start-form textarea.wiktku-dfn-quote-src-manual,
#wiktku-start-form .wiktku-pron-wrap textarea.wiktku-pron-text,
#wiktku-start-form .wiktku-etym-wrap textarea.wiktku-etym-text,
#wiktku-start-form .wiktku-tewandin-wrap textarea.wiktku-tewandin-text,
#wiktku-start-form textarea.wiktku-cavkani-text,
#wiktku-start-form textarea.wiktku-dfn-tercime,
#wiktku-start-form textarea.wiktku-dfn-izah {
--wiktku-ta-rows: 2;
width: 100%;
box-sizing: border-box;
height: calc(var(--wiktku-ta-rows) * 1.35em + 6px);
min-height: calc(var(--wiktku-ta-rows) * 1.35em + 6px);
}
#wiktku-start-form .wiktku-pron-wrap textarea.wiktku-pron-text,
#wiktku-start-form .wiktku-etym-wrap textarea.wiktku-etym-text,
#wiktku-start-form textarea.wiktku-dfn-izah {
--wiktku-ta-rows: 3;
}
#wiktku-start-form textarea.wiktku-cavkani-text {
--wiktku-ta-rows: 4;
}
/* Nimûne + Jêgirtin (citation) boxes, and their tr/t sub-fields: at
least 4 rows so there's room to actually write an example/quote. */
#wiktku-start-form textarea.wiktku-dfn-nimune-text,
#wiktku-start-form .wiktku-dfn-nimune-sub textarea.wiktku-dfn-nimune-tr,
#wiktku-start-form .wiktku-dfn-nimune-sub textarea.wiktku-dfn-nimune-t,
#wiktku-start-form .wiktku-dfn-jeder-group textarea.wiktku-dfn-nimune-quote,
#wiktku-start-form .wiktku-dfn-quote-sub textarea.wiktku-dfn-nimune-quote-tr,
#wiktku-start-form .wiktku-dfn-quote-sub textarea.wiktku-dfn-nimune-quote-t,
#wiktku-start-form textarea.wiktku-dfn-quote-src-manual {
--wiktku-ta-rows: 4;
}
/* Nimûne/jêgirtin box currently contains a typed/pasted linebreak —
the border is nudged so the user notices before it's silently turned
into <br> on output. The break itself is marked precisely, not the
whole box, via a mirrored backdrop layer (see below and
highlightLinebreak()/buildLinebreakBackdropHtml() in start.js). */
#wiktku-start-form textarea.wiktku-has-linebreak {
border-color: var(--wikt-palette-yellow6, #ac6600) !important;
}
/* Backdrop layer: sits behind the textarea showing the same text, with
a highlighted marker at each line that's followed by a break. Its
font/padding/box-sizing/line-height are copied from the textarea via
computed style (see syncLinebreakBackdropMetrics() in start.js), not
shared CSS classes — most of this box's own rules are written as
"textarea.foo", which a <div> with the same class wouldn't match.
Only created lazily, the first time a given textarea actually has a
break — see ensureLinebreakBackdrop(). */
.wiktku-linebreak-backdrop {
position: absolute;
inset: 0;
z-index: 0;
margin: 0;
overflow: hidden;
white-space: pre-wrap;
word-wrap: break-word;
color: transparent;
background: transparent !important;
border-color: transparent !important;
box-shadow: none !important;
resize: none !important;
pointer-events: none;
}
/* Raise the real textarea above its backdrop so typing/selection/caret
behave completely normally; the backdrop's mark shows through only
where the real textarea's own background is transparent. */
#wiktku-start-form textarea.wiktku-has-linebreak-source {
position: relative;
z-index: 1;
background-color: transparent;
}
.wiktku-linebreak-mark {
background-color: var(--wikt-palette-yellow6, #ac6600);
color: var(--wikt-palette-white, #fff);
border-radius: 2px;
}
/* ── Tercime + Îzah boxes ── */
.wiktku-dfn-nonku-wrap {
display: flex;
flex-direction: column;
gap: 3px;
}
.wiktku-dfn-nimune-sub,
.wiktku-dfn-quote-sub {
margin-top: 3px;
margin-left: 1em;
padding-left: 0.6em;
border-left: 2px solid var(--wikt-palette-lightgrey);
display: flex;
flex-direction: column;
gap: 3px;
}
.wiktku-dfn-nimune-sub textarea.wiktku-dfn-nimune-tr,
.wiktku-dfn-nimune-sub textarea.wiktku-dfn-nimune-t {
min-width: 8em;
padding-top: 2px !important;
padding-bottom: 2px !important;
line-height: 1.35 !important;
font-size: 0.88em;
}
/* ── Template selector row inside a sense block ── */
.wiktku-dfn-tpl-row {
margin-bottom: 3px;
}
/* ── Sub-field titles (Etîket, Kategorî, Hevmane, Dijmane, Nimûne,
Jêgirtin, …) — previously plain unstyled run-on text. Each group
now reads as a small labelled field: the term stands out, the
izah hint stays quiet, and the block gets its own breathing room. ── */
.wiktku-dfn-subgroup {
margin-top: 0.5em;
padding-top: 0.4em;
border-top: 1px dashed var(--wikt-palette-grey-3, #e0e0e0);
}
.wiktku-dfn-subgroup:first-of-type {
margin-top: 0.3em;
padding-top: 0;
border-top: none;
}
.wiktku-dfn-sublabel {
display: block;
margin-bottom: 3px;
font-size: 0.88em;
}
.wiktku-dfn-sublabel-term {
font-weight: 600;
color: var(--wikt-palette-blue-9, #3366cc);
letter-spacing: 0.03em;
font-size: 0.92em;
}
.wiktku-dfn-sublabel-hint {
color: var(--wikt-palette-grey-9, #767676);
font-style: italic;
}
.wiktku-pron-wrap,
.wiktku-etym-wrap,
.wiktku-tewandin-wrap,
.wiktku-cavkani-wrap {
display: flex;
flex-direction: column;
gap: 3px;
}
/* ── POS section tabs ──
Modernized into rounded pills instead of flat file-folder tabs. */
#wiktku-section-tabs {
display: flex;
flex-wrap: wrap;
gap: 4px;
margin-bottom: 0.6em;
align-items: center;
}
#wiktku-section-tabs .wiktku-section-tab {
padding: 3px 12px;
border: 1px solid var(--wikt-palette-lightgrey);
border-radius: 999px;
background: var(--wikt-palette-dullcyan);
cursor: pointer;
font-size: 0.86em;
user-select: none;
transition: background 0.12s ease, border-color 0.12s ease;
}
#wiktku-section-tabs .wiktku-section-tab:hover {
border-color: var(--wikt-palette-blue-9, #3366cc);
}
#wiktku-section-tabs .wiktku-section-tab.wiktku-tab-active {
background: var(--wikt-palette-blue-9, #3366cc);
border-color: var(--wikt-palette-blue-9, #3366cc);
color: var(--wikt-palette-white);
font-weight: 600;
}
.wiktku-lang-row-list {
margin: 0;
padding: 0;
list-style: none;
}
.wiktku-lang-row {
display: flex;
align-items: flex-start;
gap: 6px;
margin-bottom: 3px;
flex-wrap: wrap;
}
.wiktku-lang-row-words {
margin: 0;
padding: 0;
list-style: none;
display: flex;
flex-direction: column;
gap: 3px;
}
/* Dûnde/Werger/Zarava rows: align the picker's height with the adjacent
word textarea (see .wiktku-start-narrow above). */
.wiktku-lang-row .wiktku-native-select-wrap input.wiktku-ac-input {
height: calc(1.7em + 10px);
min-height: calc(1.7em + 10px);
padding-top: 4px;
padding-bottom: 4px;
}
/* ── Werger / Bi zaravayên din groups: one per gloss, shared spacing ── */
#wiktku-start-trans .wiktku-trans-group,
#wiktku-start-zarava .wiktku-zarava-group {
margin-bottom: 0.6em;
}
#wiktku-start-trans .wiktku-trans-group:last-child,
#wiktku-start-zarava .wiktku-zarava-group:last-child {
margin-bottom: 0;
}
#wiktku-start-trans .wiktku-trans-group-label,
#wiktku-start-zarava .wiktku-zarava-group-label {
font-weight: 600;
font-size: 0.88em;
margin-bottom: 3px;
}
.wiktku-dfn-jeder-group {
margin-top: 3px;
}
.wiktku-dfn-quote-src-sel {
font-size: 0.88em;
margin-top: 3px;
display: block;
}
.wiktku-dfn-quote-src-fields {
display: flex;
flex-direction: column;
gap: 3px;
margin-top: 3px;
}
/* Stacked layout: textarea gets its own full-width row, button + status
sit below it on their own row. Simpler and more robust than sharing a
row with the button — that required the textarea's own resize-wrap
div (added by wiktkuMakeManualResizable in start.js) to correctly
inherit flex-grow, which kept being fragile across breakpoints. */
.wiktku-dfn-quote-citoid {
display: flex;
flex-direction: column;
align-items: stretch;
gap: 0.4em;
margin-top: 3px;
margin-bottom: 3px;
}
.wiktku-dfn-quote-citoid-input {
width: 100%;
max-width: 100%;
box-sizing: border-box;
}
/* Column flex + align-items:stretch (above) is what makes the textarea's
.wiktku-resize-wrap (see wiktkuMakeManualResizable in start.js) reach
full width automatically — stretch fills the cross axis for any block
child, no flex-grow needed on the wrap itself. The button and status
text, right below the textarea, opt back out of that stretch so they
stay their natural (small) size instead of also going full width. */
.wiktku-dfn-quote-citoid-btn,
.wiktku-dfn-quote-citoid-status {
align-self: flex-start;
}
.wiktku-dfn-quote-src-cat-status {
display: block;
font-size: 0.82em;
color: var(--wikt-palette-lightgrey, #767676);
margin-top: 2px;
}
.wiktku-dfn-quote-src-row {
display: flex;
align-items: baseline;
gap: 4px;
flex-wrap: wrap;
}
.wiktku-dfn-quote-src-row label {
font-size: 0.82em;
white-space: nowrap;
min-width: 8em;
}
textarea.wiktku-dfn-quote-src-input {
flex: 1 1 12em;
max-width: 100%;
box-sizing: border-box;
}
@media (max-width: 720px) {
.wiktku-lang-row {
flex-direction: column;
}
/* Single column: search box and list use the full width. Narrow
textareas (Etîket, Hevmane, Dûnde/Jê/Têkildar/Binêre herwiha word
boxes, citation source fields, …) join them here too — at a fixed
20em width they used to poke out past the step card on narrow
screens. */
.wiktku-native-select-wrap,
input.wiktku-ac-input,
ul.wiktku-ac-results,
#wiktku-start-form textarea.wiktku-start-narrow,
#wiktku-start-form textarea.wiktku-dfn-subfield.wiktku-start-narrow {
width: 100%;
max-width: 100%;
}
#wiktku-start-form textarea.wiktku-dfn-mane,
#wiktku-start-form .wiktku-pron-wrap textarea.wiktku-pron-text,
#wiktku-start-form .wiktku-etym-wrap textarea.wiktku-etym-text {
--wiktku-ta-rows: 3;
font-size: 1em;
}
#wiktku-start-form .wiktku-tewandin-wrap textarea.wiktku-tewandin-text,
#wiktku-start-form textarea.wiktku-cavkani-text {
--wiktku-ta-rows: 4;
font-size: 1em;
}
/* Nimûne + Jêgirtin and their tr/t sub-fields: keep at least 4 rows
on mobile too, rather than shrinking further than the desktop size. */
#wiktku-start-form textarea.wiktku-dfn-nimune-text,
#wiktku-start-form .wiktku-dfn-nimune-sub textarea.wiktku-dfn-nimune-tr,
#wiktku-start-form .wiktku-dfn-nimune-sub textarea.wiktku-dfn-nimune-t,
#wiktku-start-form .wiktku-dfn-jeder-group textarea.wiktku-dfn-nimune-quote,
#wiktku-start-form .wiktku-dfn-quote-sub textarea.wiktku-dfn-nimune-quote-tr,
#wiktku-start-form .wiktku-dfn-quote-sub textarea.wiktku-dfn-nimune-quote-t {
--wiktku-ta-rows: 4;
font-size: 1em;
}
/* Citoid URL/DOI/ISBN box: taller tap target (~2 lines) on mobile,
and now that this field is a <textarea> (see start.js) its
placeholder can actually wrap into that space — a plain <input>'s
placeholder can never wrap, no matter its height. */
.wiktku-dfn-quote-citoid-input {
min-height: calc(2 * 1.35em + 10px);
font-size: 1em;
}
.wiktku-dfn-nimune-sub,
.wiktku-dfn-quote-sub {
margin-left: 0.5em;
padding-left: 0.4em;
}
.wiktku-pron-wrap .wiktku-native-select-wrap input.wiktku-ac-input,
.wiktku-etym-wrap .wiktku-native-select-wrap input.wiktku-ac-input {
font-size: 1em;
min-height: 2.2em;
}
.wiktku-dfn-quote-src-row label {
min-width: 6em;
}
#wiktku-start-form textarea.wiktku-dfn-quote-src-input {
width: 100%;
flex: 1 1 100%;
}
.wiktku-start-step {
padding: 0.5em 0.6em;
}
}
/* ===================================================================
Night mode
Palette.css already flips every --wikt-palette-* var for night mode,
so rules built from those vars need nothing here. This hook is only
for real colours that can't be a palette var — here, the panel border,
since a drop shadow is invisible against an equally dark page.
Not needed: li:active's white text already flips to a dark colour at
night via --wikt-palette-white, so it stays legible on its own.
=================================================================== */
@media screen {
html.skin-theme-clientpref-night .wiktku-ac-results {
/* Border stands in for the shadow, invisible on a dark page. */
border-color: var(--wikt-palette-grey-5);
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.6);
}
html.skin-theme-clientpref-night .wiktku-start-step {
box-shadow: none;
}
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .wiktku-ac-results {
border-color: var(--wikt-palette-grey-5);
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.6);
}
}
/* "Zimanek lê zêde bike" portlet icon (Minerva/mobile) — Feather-core-edit.svg
via CSS mask, matching Minerva's own icon pattern. */
.minerva-icon-portletlink-ca-wiktku-addlang {
-webkit-mask-image: url("https://upload.wikimedia.org/wikipedia/commons/d/d7/Feather-core-edit.svg");
mask-image: url("https://upload.wikimedia.org/wikipedia/commons/d/d7/Feather-core-edit.svg");
-webkit-mask-repeat: no-repeat;
mask-repeat: no-repeat;
-webkit-mask-position: center;
mask-position: center;
-webkit-mask-size: 20px;
mask-size: 20px;
background-color: currentColor;
background-image: none;
}
kwocapylukaim9dagr15qqzac3lm15f
Modul:ku-tewîn-nav/ceribandin
828
1357955
6291987
6291953
2026-07-29T12:30:31Z
Ghybu
1393
6291987
Scribunto
text/plain
local export = {}
-- ==== Ferheng: ===============================================================
-- Declination (decl.) → Tewandin, tewîn
-- Definite (def.) → Binavkirî, diyar
-- Indefinite (indef.) → Nebinavkirî, nediyar
-- Singular (Sg.) → Yekjimar
-- Plural (Pl.) → Pirjimar
-- Masculine (m.) → Nêr (n.)
-- Feminine. (f.) → Mê (m.)
-- Case → Rewş, awa
-- Nominative (nom.) → Rewşa (awayê) navkî, netewandî, xwerû
-- Construct (constr.) → Îzafe, ravek
-- Oblique (obl.) → Rewşa (awayê) çemandî (tewandî)
-- Demonstrative oblique (demons. obl.) → Rewşa nîşandera çem.
-- Vocative (voc.) → Rewşa bangkirinê
-- Alternative (alt.) → Guherto
-- =============================================================================
local langKu = require("Modul:languages").getByCode("ku")
local link = require('Module:links').language_link
local gsub = mw.ustring.gsub
local find = mw.ustring.find
-- =============================================================================
-- NAVDÊRÊN HEVEDUDANÎ
-- Di peyvên hevedudanî de (mk. [[hespê avê]] (nêr), [[odeya nivistinê]] (mê)) tenê
-- peyva yekem li gor diyarîtiyê (binavkirî/nebinavkirî) û li gor hejmarê diguhere.
-- Ew li gor rewşê (navkî, çemandî, îzafe) naguherin: herdem di rewşa îzafeyî de ne.
-- Zayenda peyva hevedudanî, zayenda peyva yekem e ji ber ku li gor wê tê tewandin.
-- =============================================================================
function export.declCompoundNoun(noun)
local decl = {}
local nounTab = mw.text.split(noun, '%s')
local word1 = nounTab[1]
local word2 = table.concat(nounTab, ' ', 2)
decl.defSg = noun
decl.defPl = gsub(word1, '(.)$', 'ên').. ' ' .. word2
-- The last letter of a singular compound noun determines its gender.
-- If its ending is "-a", the compound noun is feminine;
-- if it's ending is "-ê", it's masculine.
if find(word1, 'a$') then
decl.gender ='mê'
decl.indefSg = gsub(word1, '(.)$', 'eke') .. ' ' .. word2
decl.indefPl = gsub(word1, '(.)$', 'ine') .. ' ' .. word2
elseif find(word1, 'ê$') then
decl.gender ='nêr'
decl.indefSg = gsub(word1, '(.)$', 'ekî') .. ' ' .. word2
decl.indefPl = gsub(word1, '(.)$', 'ine') .. ' ' .. word2
else
return 'Zayenda peyva yekem nayê zanîn!'
end
return decl
end
-- =============================================================================
-- NAVDÊRÊN SADE
-- =============================================================================
-- We need this function to create the demons. obl. case (nîşandera çem.)).
-- ex. wê sêvê (f.) / wî gundî (m.)
local function oblPronoun(gender)
if gender == 'mê' then return 'wê' end
if gender == 'nêr' then return 'wî' end
end
-- Function to make endings bold.
local function b(bold)
return '<b>' .. bold .. '</b>'
end
-- This function returns an array containing all possible declined forms of
-- the simple noun for every grammatical case (definite/indefinite):
-- nominative (navkî), construct (îzafe), oblique (çemandî).
-- The demons. obl. (nîşandera çem.) and vocative (bangkirin) only exists
-- in the definite form.
function export.declSimpleNoun(opts)
opts = opts or {}
local noun = opts[1]
local gender = opts[2] -- 'mê' or 'nêr'
-- By default, display the standard form of the declension (1)
-- '2' for the alternative form
local alt = opts.alt or '1'
-- By default, the tags are displayed(<br></br>, [[..]])..
-- tags='na' to disable it.
local tags = opts.tags or 'erê'
local decl = {}
decl.defNomSg = noun
decl.defNomPl = noun
if (find(noun, '[bcçdfghjklmnpqrsştvwxyz]$')) then
if (gender == 'nêr') then
decl.defConstrSg = noun .. b('ê')
decl.defConstrPl = noun .. b('ên')
decl.defOblSg = noun .. b('î')
decl.defOblPl = noun .. b('an')
decl.indefNomSg = noun .. b('ek')
decl.indefNomPl = noun .. b('in')
decl.indefConstrSg = noun .. b('ekî')
decl.indefConstrPl = noun .. b('ine')
decl.indefOblSg = noun .. b('ekî')
decl.indefOblPl = noun .. b('inan')
decl.vocSg = noun .. b('o')
decl.vocPl = noun .. b('ino')
elseif (gender == 'mê') then
decl.defConstrSg = noun .. b('a')
decl.defConstrPl = noun .. b('ên')
decl.defOblSg = noun .. b('ê')
decl.defOblPl = noun .. b('an')
decl.indefNomSg = noun .. b('ek')
decl.indefNomPl = noun .. b('in')
decl.indefConstrSg = noun .. b('eke')
decl.indefConstrPl = noun .. b('ine')
decl.indefOblSg = noun .. b('ekê')
decl.indefOblPl = noun .. b('inan')
decl.vocSg = noun .. b('ê')
decl.vocPl = noun .. b('ino')
end
elseif (find(noun, '[ae]$') and alt == '2') then
if (gender == 'nêr') then
decl.defConstrSg = gsub(noun, '(.)$', b('ê'))
decl.defConstrPl = gsub(noun, '(.)$', b('ên'))
decl.defOblSg = gsub(noun, '(.)$', b('î'))
decl.defOblPl = gsub(noun, '(.)$', b('an'))
decl.indefNomSg = gsub(noun, '(.)$', 'e' .. b('k'))
decl.indefNomPl = gsub(noun, '(.)$', b('in'))
decl.indefConstrSg = gsub(noun, '(.)$', 'e' .. b('kî'))
decl.indefConstrPl = gsub(noun, '(.)$', b('ine'))
decl.indefOblSg = gsub(noun, '(.)$', 'e' .. b('kî'))
decl.indefOblPl = gsub(noun, '(.)$', b('inan'))
decl.vocSg = gsub(noun, '(.)$', b('o'))
decl.vocPl = gsub(noun, '(.)$', b('ino'))
elseif (gender == 'mê') then
decl.defConstrSg = gsub(noun, '(.)$', b('a'))
decl.defConstrPl = gsub(noun, '(.)$', b('ên'))
decl.defOblSg = gsub(noun, '(.)$', b('ê'))
decl.defOblPl = gsub(noun, '(.)$', b('an'))
decl.indefNomSg = gsub(noun, '(.)$', 'e' .. b('k'))
decl.indefNomPl = gsub(noun, '(.)$', b('in'))
decl.indefConstrSg = gsub(noun, '(.)$', 'e' .. b('ke'))
decl.indefConstrPl = gsub(noun, '(.)$', b('ine'))
decl.indefOblSg = gsub(noun, '(.)$', 'e' .. b('kê'))
decl.indefOblPl = gsub(noun, '(.)$', b('inan'))
decl.vocSg = gsub(noun, '(.)$', b('ê'))
decl.vocPl = gsub(noun, '(.)$', b('ino'))
end
elseif (find(noun, '[aeiîouû]$')) then
if (gender == 'nêr') then
decl.defConstrSg = noun .. b('yê')
decl.defConstrPl = noun .. b('yên')
if (find(noun, '[î]$')) then
decl.defOblSg = noun
else
decl.defOblSg = noun .. b('yî')
end
decl.defOblPl = noun .. b('yan')
decl.indefNomSg = noun .. b('yek')
decl.indefNomPl = noun .. b('yin')
decl.indefConstrSg = noun .. b('yekî')
decl.indefConstrPl = noun .. b('yine')
decl.indefOblSg = noun .. b('yekî')
decl.indefOblPl = noun .. b('yinan')
decl.vocSg = noun .. b('yo')
decl.vocPl = noun .. b('yino')
elseif (gender == 'mê') then
decl.defConstrSg = noun .. b('ya')
decl.defConstrPl = noun .. b('yên')
decl.defOblSg = noun .. b('yê')
decl.defOblPl = noun .. b('yan')
decl.indefNomSg = noun .. b('yek')
decl.indefNomPl = noun .. b('yin')
decl.indefConstrSg = noun .. b('yeke')
decl.indefConstrPl = noun .. b('yine')
decl.indefOblSg = noun .. b('yekê')
decl.indefOblPl = noun .. b('yinan')
decl.vocSg = noun .. b('yê')
decl.vocPl = noun .. b('yino')
end
elseif (find(noun, '[ê]$')) then
if (alt == 2) then
if (gender == 'nêr') then
decl.defConstrSg = noun .. b('yê')
decl.defConstrPl = noun .. b('yên')
decl.defOblSg = noun .. b('yî')
decl.defOblPl = noun .. b('yan')
decl.indefNomSg = noun .. b('yek')
decl.indefNomPl = noun .. b('yin')
decl.indefConstrSg = noun .. b('yekî')
decl.indefConstrPl = noun .. b('yine')
decl.indefOblSg = noun .. b('yekî')
decl.indefOblPl = noun .. b('yinan')
decl.vocSg = noun .. b('yo')
decl.vocPl = noun .. b('yino')
elseif (gender == 'mê') then
decl.defConstrSg = noun .. b('ya')
decl.defConstrPl = noun .. b('yên')
decl.defOblSg = noun
decl.defOblPl = noun .. b('yan')
decl.indefNomSg = noun .. b('yek')
decl.indefNomPl = noun .. b('yin')
decl.indefConstrSg = noun .. b('yeke')
decl.indefConstrPl = noun .. b('yine')
decl.indefOblSg = noun .. b('yekê')
decl.indefOblPl = noun .. b('yinan')
decl.vocSg = noun .. b('yê')
decl.vocPl = noun .. b('yino')
end
else
if (gender == 'nêr') then
decl.defConstrSg = gsub(noun, '(.)$', b('iyê'))
decl.defConstrPl = gsub(noun, '(.)$', b('iyên'))
decl.defOblSg = gsub(noun, '(.)$', b('iyî'))
decl.defOblPl = gsub(noun, '(.)$', b('iyan'))
decl.indefNomSg = gsub(noun, '(.)$', b('iyek'))
decl.indefNomPl = gsub(noun, '(.)$', b('iyin'))
decl.indefConstrSg = gsub(noun, '(.)$', b('iyekî'))
decl.indefConstrPl = gsub(noun, '(.)$', b('iyine'))
decl.indefOblSg = gsub(noun, '(.)$', b('iyekî'))
decl.indefOblPl = gsub(noun, '(.)$', b('iyinan'))
decl.vocSg = gsub(noun, '(.)$', b('iyo'))
decl.vocPl = gsub(noun, '(.)$', b('iyino'))
elseif (gender == 'mê') then
decl.defConstrSg = gsub(noun, '(.)$', b('iya'))
decl.defConstrPl = gsub(noun, '(.)$', b('iyên'))
decl.defOblSg = noun
decl.defOblPl = gsub(noun, '(.)$', b('iyan'))
decl.indefNomSg = gsub(noun, '(.)$', b('iyek'))
decl.indefNomPl = gsub(noun, '(.)$', b('iyin'))
decl.indefConstrSg = gsub(noun, '(.)$', b('iyeke'))
decl.indefConstrPl = gsub(noun, '(.)$', b('iyine'))
decl.indefOblSg = gsub(noun, '(.)$', b('iyekê'))
decl.indefOblPl = gsub(noun, '(.)$', b('iyinan'))
decl.vocSg = gsub(noun, '(.)$', b('iyê'))
decl.vocPl = gsub(noun, '(.)$', b('iyino'))
end
end
end
-- Spelling correction (îy → iy) + link
for i, v in pairs(decl) do
if (tags == 'na') then
decl[i] = mw.ustring.gsub(decl[i], '<b>(.+)</b>', '%1')
decl[i] = gsub(decl[i], 'îy', 'iy')
else
decl[i] = gsub(decl[i], 'î<b>y', '<b>iy')
decl[i] = link{term=decl[i], lang=langKu}
end
end
-- Zêdekirina cînavên wê/wî/wan ji bo nîşandera çemandî.
decl.defDemonsOblSg = oblPronoun(gender) .. ' ' .. decl.defOblSg
decl.defDemonsOblPl = 'wan ' .. decl.defOblPl
return decl
end
-- =============================================================================
-- DAWÎ
-- =============================================================================
-- ─────────────────────────────────────────────────────────────────────────────
-- ÇÊKIRINA TABLOYA GOTARÊ: [[Şablon:ku-tewîn-nav]]
-- Bnr. [[sêv]], [[gund]], [[bajar]], [[rê]]
-- ─────────────────────────────────────────────────────────────────────────────
local function formatGenderHeader(gender)
if (gender == 'nêr') then return ' Zayenda nêr a'
elseif (gender == 'mê') then return ' Zayenda mê ya'
end
end
-- Converts a semicolon-separated list of forms into a formatted string.
-- Trims whitespace and uses ', ' as default separator.
local function formatForms(forms, sep)
if not forms or forms == "" then
return ""
end
sep = sep or ', '
local formTable = mw.text.split(forms, ';')
for i, v in ipairs(formTable) do
formTable[i] = link{term=mw.text.trim(v), lang=langKu}
end
return table.concat(formTable, sep)
end
function export.tewandin(frame)
local args = frame:getParent().args
local noun = args[1]
local gender = args[2]
local singular = args[3]
local alt = args['guherto']
-- Parametre ji bo formên ne standard
local vocSg = args['bang.yj']
local vocPl = args['bang.pj']
local altVocSg = args['alt.bang.yj']
local altVocPl = args['alt.bang.pj']
local defOblSg = args['çem.yj']
local altDefOblSg = args['alt.çem.yj']
local declMNtab = require('Modul:ku-tewîn-nav/mê û nêr/ceribandin').declMNtable
local declSingularTab = require('Modul:ku-tewîn-nav/yekjimar').declSingularTable
local tableHeader = mw.getCurrentFrame():expandTemplate{
title = 'tabloya-tewandinê-ser',
args = {
title = "Tewandina ''" .. noun .. "''",
palette = 'indigo',
tall = 'yes',
}
}
local tableFooter = mw.getCurrentFrame():expandTemplate{ title = 'tabloya-tewandinê-bin' }
if (gender == 'mê û nêr') then
return declMNtab(noun, alt)
elseif (singular == 'y') then
return declSingularTab(noun, gender, alt)
elseif gender == '-' then
local declCompoundNoun = export.declCompoundNoun(noun, gender)
return tableHeader
..'\n! colspan="3" class="outer" align="center" | Zayenda ' .. declCompoundNoun['gender'] .. ' '
..'\n|-'
..'\n! class="row-flip tewandin-header3" | Rewş'
..'\n! class="tewandin-header3" | Yekjimar'
..'\n! class="tewandin-header3" | Pirjimar'
..'\n|-'
..'\n! class="row-flip tewandin-rez"| Binavkirî'
..'\n|' .. link{lang=langKu, term=declCompoundNoun["defSg"]}
..'\n|' .. link{lang=langKu, term=declCompoundNoun["defPl"]}
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Nebinavkirî'
..'\n|' .. link{lang=langKu, term=declCompoundNoun["indefSg"]}
..'\n|' .. link{lang=langKu, term=declCompoundNoun["indefPl"]}
..'\n|-'
..'\n| colspan="3" align="center" style="font-size:x-small;" | <b style="color:green">Agahdarî</b>: Di peyvên <u>hevedudanî</u> de tenê peyva<br>yekem li gor diyarîtiyê û li gor hejmarê diguhere.'
..'\n' .. tableFooter
else
local declSimpleNoun = export.declSimpleNoun{noun, gender}
local altDeclSimpleNoun = export.declSimpleNoun{noun, gender, alt='2'}
-- Formên "Nîşandera çemandî" li gorî formên çemandî yên standard tên çêkirin:
-- Bo mînak "wî bajarî" rast e feqet "wî bajêr" nayê bikaranîn
-- Binêre gotûbêja [[Wîkîferheng:Dîwan/2023#dayê/diyê]]
if defOblSg then
declSimpleNoun["defOblSg"] = formatForms(args['çem.yj'])
altDeclSimpleNoun["defOblSg"] = formatForms(args['çem.yj'])
elseif altDefOblSg then
declSimpleNoun["defOblSg"] = declSimpleNoun["defOblSg"] .. ', '
.. link{term=args['alt.çem.yj'], lang=langKu}
altDeclSimpleNoun["defOblSg"] = altDeclSimpleNoun["defOblSg"] .. ', '
.. link{term=args['alt.çem.yj'], lang=langKu}
end
if vocSg then
declSimpleNoun["vocSg"] = formatForms(args['bang.yj'])
altDeclSimpleNoun["vocSg"] = formatForms(args['bang.yj'])
elseif altVocSg then
declSimpleNoun["vocSg"] = declSimpleNoun["vocSg"] .. ', '
.. link{term=args['alt.bang.yj'], lang=langKu}
altDeclSimpleNoun["vocSg"] = declSimpleNoun["vocSg"] .. ', '
.. link{term=args['alt.bang.yj'], lang=langKu}
end
if vocPl then
declSimpleNoun["vocPl"] = formatForms(args['bang.pj'])
altDeclSimpleNoun["vocPl"] = formatForms(args['bang.pj'])
elseif altVocPl then
declSimpleNoun["vocPl"] = declSimpleNoun["vocPl"] .. ', '
.. link{term=args['alt.bang.pl'], lang=langKu}
altDeclSimpleNoun["vocPl"] = declSimpleNoun["vocPl"] .. ', '
.. link{term=args['alt.bang.pl'], lang=langKu}
end
local function getDeclinedForm(case)
if alt == 'hemû' then
if (vocSg ~= nil or vocPl ~= nil or defOblSg ~= nil) then
return declSimpleNoun[case]
else
return declSimpleNoun[case] .. '<br>' .. altDeclSimpleNoun[case]
end
elseif alt == '2' then
return altDeclSimpleNoun[case]
else
return declSimpleNoun[case]
end
end
return tableHeader
..'\n! colspan="3" class="outer" align="center" |' .. formatGenderHeader(gender) .. ' binavkirî'
..'\n|-'
..'\n! class="row-flip tewandin-header3" | Rewş'
..'\n! class="tewandin-header3" | Yekjimar'
..'\n! class="tewandin-header3" | Pirjimar'
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Navkî'
..'\n|' .. declSimpleNoun["defNomSg"]
..'\n|' .. declSimpleNoun["defNomPl"]
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Îzafe'
..'\n|' .. getDeclinedForm("defConstrSg")
..'\n|' .. getDeclinedForm("defConstrPl")
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Çemandî'
..'\n|' .. getDeclinedForm("defOblSg")
..'\n|' .. getDeclinedForm("defOblPl")
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Nîşandera çem.'
..'\n|' .. getDeclinedForm("defDemonsOblSg")
..'\n|' .. getDeclinedForm("defDemonsOblPl")
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Bangkirin'
..'\n|' .. getDeclinedForm("vocSg")
..'\n|' .. getDeclinedForm("vocPl")
..'\n|-'
..'\n! colspan="3" class="outer" align="center" |' .. formatGenderHeader(gender) .. ' nebinavkirî'
..'\n|-'
..'\n! class="row-flip tewandin-header3" | Rewş'
..'\n! class="tewandin-header3" | Yekjimar'
..'\n! class="tewandin-header3" | Pirjimar'
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Navkî'
..'\n|' .. getDeclinedForm("indefNomSg")
..'\n|' .. getDeclinedForm("indefNomPl")
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Îzafe'
..'\n|' .. getDeclinedForm("indefConstrSg")
..'\n|' .. getDeclinedForm("indefConstrPl")
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Çemandî'
..'\n|' .. getDeclinedForm("indefOblSg")
..'\n|' .. getDeclinedForm("indefOblPl")
..'\n' .. tableFooter
end
end
-- ─────────────────────────────────────────────────────────────────────────────
-- Bikaranîn:
-- 1. {{#invoke:ku-tewîn-nav|tew|rewş=indefOblSg}}
-- 2. {{#invoke:ku-tewîn-nav|tew|nêr|rewş=indefConstrSg}}
-- ─────────────────────────────────────────────────────────────────────────────
function export.tew(frame)
local args = frame:getParent().args
local noun = args[1]
local gender = frame.args[1] or args[2]
local alt = args['guherto']
local case = frame.args['rewş']
if alt == 'hemû' then
local tew_hemu = export.declSimpleNoun{noun, gender, alt='1'}[case] .. '<br>' .. export.declSimpleNoun{noun, gender, alt='2'}[case]
return tew_hemu
else
return export.declSimpleNoun{noun, gender, alt=alt}[case]
end
end
-- ─────────────────────────────────────────────────────────────────────────────
-- Get comma separated forms
-- Bnr. [[MediaWiki:Gadget-QQ.js]]
-- ─────────────────────────────────────────────────────────────────────────────
function export.get_comma_separated_forms(frame)
local noun = frame.args[1]
local gender = frame.args[2]
local declResults
local declResults2
local forms = {}
if gender == "mê û nêr" then
declResults = export.declSimpleNoun{noun, 'nêr', tags='na'}
declResults2 = export.declSimpleNoun{noun, 'mê', alt="2", tags='na'}
for k, v in pairs(declResults2) do
table.insert(forms, v)
end
else
declResults = export.declSimpleNoun{noun, gender, tags='na'}
end
for k, v in pairs(declResults) do
table.insert(forms, v)
end
-- Remove duplicate elements
local newForms = {}
local checkForms = {}
for _, v in ipairs(forms) do
if not checkForms[v] then
checkForms[v] = true
table.insert(newForms, v)
end
end
return table.concat(newForms, ',')
end
return export
ckbv6086efp2qjqajpizjzhccp9axh7
6291991
6291987
2026-07-29T13:06:40Z
Ghybu
1393
6291991
Scribunto
text/plain
local export = {}
-- ==== Ferheng: ===============================================================
-- Declination (decl.) → Tewandin, tewîn
-- Definite (def.) → Binavkirî, diyar
-- Indefinite (indef.) → Nebinavkirî, nediyar
-- Singular (Sg.) → Yekjimar
-- Plural (Pl.) → Pirjimar
-- Masculine (m.) → Nêr (n.)
-- Feminine. (f.) → Mê (m.)
-- Case → Rewş, awa
-- Nominative (nom.) → Rewşa (awayê) navkî, netewandî, xwerû
-- Construct (constr.) → Îzafe, ravek
-- Oblique (obl.) → Rewşa (awayê) çemandî (tewandî)
-- Demonstrative oblique (demons. obl.) → Rewşa nîşandera çem.
-- Vocative (voc.) → Rewşa bangkirinê
-- Alternative (alt.) → Guherto
-- =============================================================================
local langKu = require("Modul:languages").getByCode("ku")
local link = require('Module:links').language_link
local gsub = mw.ustring.gsub
local find = mw.ustring.find
-- =============================================================================
-- NAVDÊRÊN HEVEDUDANÎ
-- Di peyvên hevedudanî de (mk. [[hespê avê]] (nêr), [[odeya nivistinê]] (mê)) tenê
-- peyva yekem li gor diyarîtiyê (binavkirî/nebinavkirî) û li gor hejmarê diguhere.
-- Ew li gor rewşê (navkî, çemandî, îzafe) naguherin: herdem di rewşa îzafeyî de ne.
-- Zayenda peyva hevedudanî, zayenda peyva yekem e ji ber ku li gor wê tê tewandin.
-- =============================================================================
function export.declCompoundNoun(noun)
local decl = {}
local nounTab = mw.text.split(noun, '%s')
local word1 = nounTab[1]
local word2 = table.concat(nounTab, ' ', 2)
decl.defSg = noun
decl.defPl = gsub(word1, '(.)$', 'ên').. ' ' .. word2
-- The last letter of a singular compound noun determines its gender.
-- If its ending is "-a", the compound noun is feminine;
-- if it's ending is "-ê", it's masculine.
if find(word1, 'a$') then
decl.gender ='mê'
decl.indefSg = gsub(word1, '(.)$', 'eke') .. ' ' .. word2
decl.indefPl = gsub(word1, '(.)$', 'ine') .. ' ' .. word2
elseif find(word1, 'ê$') then
decl.gender ='nêr'
decl.indefSg = gsub(word1, '(.)$', 'ekî') .. ' ' .. word2
decl.indefPl = gsub(word1, '(.)$', 'ine') .. ' ' .. word2
else
return 'Zayenda peyva yekem nayê zanîn!'
end
return decl
end
-- =============================================================================
-- NAVDÊRÊN SADE
-- =============================================================================
-- We need this function to create the demons. obl. case (nîşandera çem.)).
-- ex. wê sêvê (f.) / wî gundî (m.)
local function oblPronoun(gender)
if gender == 'mê' then return 'wê' end
if gender == 'nêr' then return 'wî' end
end
-- Function to make endings bold.
local function b(bold)
return '<b>' .. bold .. '</b>'
end
-- This function returns an array containing all possible declined forms of
-- the simple noun for every grammatical case (definite/indefinite):
-- nominative (navkî), construct (îzafe), oblique (çemandî).
-- The demons. obl. (nîşandera çem.) and vocative (bangkirin) only exists
-- in the definite form.
function export.declSimpleNoun(opts)
opts = opts or {}
local noun = opts[1]
local gender = opts[2] -- 'mê' or 'nêr'
-- By default, display the standard form of the declension (1)
-- '2' for the alternative form
local alt = opts.alt or '1'
-- By default, the tags are displayed(<br></br>, [[..]])..
-- tags='na' to disable it.
local tags = opts.tags or 'erê'
local decl = {}
decl.defNomSg = noun
decl.defNomPl = noun
if (find(noun, '[bcçdfghjklmnpqrsştvwxyz]$')) then
if (gender == 'nêr') then
decl.defConstrSg = noun .. b('ê')
decl.defConstrPl = noun .. b('ên')
decl.defOblSg = noun .. b('î')
decl.defOblPl = noun .. b('an')
decl.indefNomSg = noun .. b('ek')
decl.indefNomPl = noun .. b('in')
decl.indefConstrSg = noun .. b('ekî')
decl.indefConstrPl = noun .. b('ine')
decl.indefOblSg = noun .. b('ekî')
decl.indefOblPl = noun .. b('inan')
decl.vocSg = noun .. b('o')
decl.vocPl = noun .. b('ino')
elseif (gender == 'mê') then
decl.defConstrSg = noun .. b('a')
decl.defConstrPl = noun .. b('ên')
decl.defOblSg = noun .. b('ê')
decl.defOblPl = noun .. b('an')
decl.indefNomSg = noun .. b('ek')
decl.indefNomPl = noun .. b('in')
decl.indefConstrSg = noun .. b('eke')
decl.indefConstrPl = noun .. b('ine')
decl.indefOblSg = noun .. b('ekê')
decl.indefOblPl = noun .. b('inan')
decl.vocSg = noun .. b('ê')
decl.vocPl = noun .. b('ino')
end
elseif (find(noun, '[ae]$') and alt == '2') then
if (gender == 'nêr') then
decl.defConstrSg = gsub(noun, '(.)$', b('ê'))
decl.defConstrPl = gsub(noun, '(.)$', b('ên'))
decl.defOblSg = gsub(noun, '(.)$', b('î'))
decl.defOblPl = gsub(noun, '(.)$', b('an'))
decl.indefNomSg = gsub(noun, '(.)$', 'e' .. b('k'))
decl.indefNomPl = gsub(noun, '(.)$', b('in'))
decl.indefConstrSg = gsub(noun, '(.)$', 'e' .. b('kî'))
decl.indefConstrPl = gsub(noun, '(.)$', b('ine'))
decl.indefOblSg = gsub(noun, '(.)$', 'e' .. b('kî'))
decl.indefOblPl = gsub(noun, '(.)$', b('inan'))
decl.vocSg = gsub(noun, '(.)$', b('o'))
decl.vocPl = gsub(noun, '(.)$', b('ino'))
elseif (gender == 'mê') then
decl.defConstrSg = gsub(noun, '(.)$', b('a'))
decl.defConstrPl = gsub(noun, '(.)$', b('ên'))
decl.defOblSg = gsub(noun, '(.)$', b('ê'))
decl.defOblPl = gsub(noun, '(.)$', b('an'))
decl.indefNomSg = gsub(noun, '(.)$', 'e' .. b('k'))
decl.indefNomPl = gsub(noun, '(.)$', b('in'))
decl.indefConstrSg = gsub(noun, '(.)$', 'e' .. b('ke'))
decl.indefConstrPl = gsub(noun, '(.)$', b('ine'))
decl.indefOblSg = gsub(noun, '(.)$', 'e' .. b('kê'))
decl.indefOblPl = gsub(noun, '(.)$', b('inan'))
decl.vocSg = gsub(noun, '(.)$', b('ê'))
decl.vocPl = gsub(noun, '(.)$', b('ino'))
end
elseif (find(noun, '[aeiîouû]$')) then
if (gender == 'nêr') then
decl.defConstrSg = noun .. b('yê')
decl.defConstrPl = noun .. b('yên')
if (find(noun, '[î]$')) then
decl.defOblSg = noun
else
decl.defOblSg = noun .. b('yî')
end
decl.defOblPl = noun .. b('yan')
decl.indefNomSg = noun .. b('yek')
decl.indefNomPl = noun .. b('yin')
decl.indefConstrSg = noun .. b('yekî')
decl.indefConstrPl = noun .. b('yine')
decl.indefOblSg = noun .. b('yekî')
decl.indefOblPl = noun .. b('yinan')
decl.vocSg = noun .. b('yo')
decl.vocPl = noun .. b('yino')
elseif (gender == 'mê') then
decl.defConstrSg = noun .. b('ya')
decl.defConstrPl = noun .. b('yên')
decl.defOblSg = noun .. b('yê')
decl.defOblPl = noun .. b('yan')
decl.indefNomSg = noun .. b('yek')
decl.indefNomPl = noun .. b('yin')
decl.indefConstrSg = noun .. b('yeke')
decl.indefConstrPl = noun .. b('yine')
decl.indefOblSg = noun .. b('yekê')
decl.indefOblPl = noun .. b('yinan')
decl.vocSg = noun .. b('yê')
decl.vocPl = noun .. b('yino')
end
elseif (find(noun, '[ê]$')) then
if (alt == 2) then
if (gender == 'nêr') then
decl.defConstrSg = noun .. b('yê')
decl.defConstrPl = noun .. b('yên')
decl.defOblSg = noun .. b('yî')
decl.defOblPl = noun .. b('yan')
decl.indefNomSg = noun .. b('yek')
decl.indefNomPl = noun .. b('yin')
decl.indefConstrSg = noun .. b('yekî')
decl.indefConstrPl = noun .. b('yine')
decl.indefOblSg = noun .. b('yekî')
decl.indefOblPl = noun .. b('yinan')
decl.vocSg = noun .. b('yo')
decl.vocPl = noun .. b('yino')
elseif (gender == 'mê') then
decl.defConstrSg = noun .. b('ya')
decl.defConstrPl = noun .. b('yên')
decl.defOblSg = noun
decl.defOblPl = noun .. b('yan')
decl.indefNomSg = noun .. b('yek')
decl.indefNomPl = noun .. b('yin')
decl.indefConstrSg = noun .. b('yeke')
decl.indefConstrPl = noun .. b('yine')
decl.indefOblSg = noun .. b('yekê')
decl.indefOblPl = noun .. b('yinan')
decl.vocSg = noun .. b('yê')
decl.vocPl = noun .. b('yino')
end
else
if (gender == 'nêr') then
decl.defConstrSg = gsub(noun, '(.)$', b('iyê'))
decl.defConstrPl = gsub(noun, '(.)$', b('iyên'))
decl.defOblSg = gsub(noun, '(.)$', b('iyî'))
decl.defOblPl = gsub(noun, '(.)$', b('iyan'))
decl.indefNomSg = gsub(noun, '(.)$', b('iyek'))
decl.indefNomPl = gsub(noun, '(.)$', b('iyin'))
decl.indefConstrSg = gsub(noun, '(.)$', b('iyekî'))
decl.indefConstrPl = gsub(noun, '(.)$', b('iyine'))
decl.indefOblSg = gsub(noun, '(.)$', b('iyekî'))
decl.indefOblPl = gsub(noun, '(.)$', b('iyinan'))
decl.vocSg = gsub(noun, '(.)$', b('iyo'))
decl.vocPl = gsub(noun, '(.)$', b('iyino'))
elseif (gender == 'mê') then
decl.defConstrSg = gsub(noun, '(.)$', b('iya'))
decl.defConstrPl = gsub(noun, '(.)$', b('iyên'))
decl.defOblSg = noun
decl.defOblPl = gsub(noun, '(.)$', b('iyan'))
decl.indefNomSg = gsub(noun, '(.)$', b('iyek'))
decl.indefNomPl = gsub(noun, '(.)$', b('iyin'))
decl.indefConstrSg = gsub(noun, '(.)$', b('iyeke'))
decl.indefConstrPl = gsub(noun, '(.)$', b('iyine'))
decl.indefOblSg = gsub(noun, '(.)$', b('iyekê'))
decl.indefOblPl = gsub(noun, '(.)$', b('iyinan'))
decl.vocSg = gsub(noun, '(.)$', b('iyê'))
decl.vocPl = gsub(noun, '(.)$', b('iyino'))
end
end
end
-- Spelling correction (îy → iy) + link
for i, v in pairs(decl) do
if (tags == 'na') then
decl[i] = mw.ustring.gsub(decl[i], '<b>(.+)</b>', '%1')
decl[i] = gsub(decl[i], 'îy', 'iy')
else
decl[i] = gsub(decl[i], 'î<b>y', '<b>iy')
decl[i] = link{term=decl[i], lang=langKu}
end
end
-- Zêdekirina cînavên wê/wî/wan ji bo nîşandera çemandî.
decl.defDemonsOblSg = oblPronoun(gender) .. ' ' .. decl.defOblSg
decl.defDemonsOblPl = 'wan ' .. decl.defOblPl
return decl
end
-- =============================================================================
-- DAWÎ
-- =============================================================================
-- ─────────────────────────────────────────────────────────────────────────────
-- ÇÊKIRINA TABLOYA GOTARÊ: [[Şablon:ku-tewîn-nav]]
-- Bnr. [[sêv]], [[gund]], [[bajar]], [[rê]]
-- ─────────────────────────────────────────────────────────────────────────────
local function formatGenderHeader(gender)
if (gender == 'nêr') then return ' Zayenda nêr a'
elseif (gender == 'mê') then return ' Zayenda mê ya'
end
end
-- Converts a semicolon-separated list of forms into a formatted string.
-- Trims whitespace and uses ', ' as default separator.
local function formatForms(forms, sep)
if not forms or forms == "" then
return ""
end
sep = sep or ', '
local formTable = mw.text.split(forms, ';')
for i, v in ipairs(formTable) do
formTable[i] = link{term=mw.text.trim(v), lang=langKu}
end
return table.concat(formTable, sep)
end
function export.tewandin(frame)
local args = frame:getParent().args
local noun = args[1]
local gender = args[2]
local singular = args[3]
local alt = args['guherto']
-- Parametre ji bo formên ne standard
local vocSg = args['bang.yj']
local vocPl = args['bang.pj']
local altVocSg = args['alt.bang.yj']
local altVocPl = args['alt.bang.pj']
local defOblSg = args['çem.yj']
local altDefOblSg = args['alt.çem.yj']
local declMNtab = require('Modul:ku-tewîn-nav/mê û nêr/ceribandin').declMNtable
local declSingularTab = require('Modul:ku-tewîn-nav/yekjimar').declSingularTable
local tableHeader = mw.getCurrentFrame():expandTemplate{
title = 'tabloya-tewandinê-ser',
args = {
title = "Tewandina ''" .. noun .. "''",
palette = 'indigo',
tall = 'yes',
}
}
local tableFooter = mw.getCurrentFrame():expandTemplate{ title = 'tabloya-tewandinê-bin' }
if (gender == 'mê û nêr') then
return declMNtab(noun, alt)
elseif (singular == 'y') then
return declSingularTab(noun, gender, alt)
elseif gender == '-' then
local declCompoundNoun = export.declCompoundNoun(noun, gender)
return tableHeader
..'\n! colspan="3" class="outer" align="center" | Zayenda ' .. declCompoundNoun['gender'] .. ' '
..'\n|-'
..'\n! class="row-flip tewandin-header3" | Rewş'
..'\n! class="tewandin-header3" | Yekjimar'
..'\n! class="tewandin-header3" | Pirjimar'
..'\n|-'
..'\n! class="row-flip tewandin-rez"| Binavkirî'
..'\n|' .. link{lang=langKu, term=declCompoundNoun["defSg"]}
..'\n|' .. link{lang=langKu, term=declCompoundNoun["defPl"]}
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Nebinavkirî'
..'\n|' .. link{lang=langKu, term=declCompoundNoun["indefSg"]}
..'\n|' .. link{lang=langKu, term=declCompoundNoun["indefPl"]}
..'\n|-'
..'\n| colspan="3" align="center" style="font-size:x-small;" | <b style="color:green">Agahdarî</b>: Di peyvên <u>hevedudanî</u> de tenê peyva<br>yekem li gor diyarîtiyê û li gor hejmarê diguhere.'
..'\n' .. tableFooter
else
local declSimpleNoun = export.declSimpleNoun{noun, gender}
local altDeclSimpleNoun = export.declSimpleNoun{noun, gender, alt='2'}
-- Formên "Nîşandera çemandî" li gorî formên çemandî yên standard tên çêkirin:
-- Bo mînak "wî bajarî" rast e feqet "wî bajêr" nayê bikaranîn
-- Binêre gotûbêja [[Wîkîferheng:Dîwan/2023#dayê/diyê]]
if defOblSg then
declSimpleNoun["defOblSg"] = formatForms(args['çem.yj'])
altDeclSimpleNoun["defOblSg"] = formatForms(args['çem.yj'])
elseif altDefOblSg then
declSimpleNoun["defOblSg"] = declSimpleNoun["defOblSg"] .. ', '
.. link{term=args['alt.çem.yj'], lang=langKu}
altDeclSimpleNoun["defOblSg"] = altDeclSimpleNoun["defOblSg"] .. ', '
.. link{term=args['alt.çem.yj'], lang=langKu}
end
if vocSg then
declSimpleNoun["vocSg"] = formatForms(args['bang.yj'])
altDeclSimpleNoun["vocSg"] = formatForms(args['bang.yj'])
elseif altVocSg then
declSimpleNoun["vocSg"] = declSimpleNoun["vocSg"] .. ', '
.. link{term=args['alt.bang.yj'], lang=langKu}
altDeclSimpleNoun["vocSg"] = declSimpleNoun["vocSg"] .. ', '
.. link{term=args['alt.bang.yj'], lang=langKu}
end
if vocPl then
declSimpleNoun["vocPl"] = formatForms(args['bang.pj'])
altDeclSimpleNoun["vocPl"] = formatForms(args['bang.pj'])
elseif altVocPl then
declSimpleNoun["vocPl"] = declSimpleNoun["vocPl"] .. ', '
.. link{term=args['alt.bang.pl'], lang=langKu}
altDeclSimpleNoun["vocPl"] = declSimpleNoun["vocPl"] .. ', '
.. link{term=args['alt.bang.pl'], lang=langKu}
end
local function getDeclinedForm(case)
if alt == 'hemû' then
if (vocSg or vocPl or defOblSg) then
return declSimpleNoun[case]
else
return declSimpleNoun[case] .. '<br>' .. altDeclSimpleNoun[case]
end
elseif alt == '2' then
return altDeclSimpleNoun[case]
else
return declSimpleNoun[case]
end
end
return tableHeader
..'\n! colspan="3" class="outer" align="center" |' .. formatGenderHeader(gender) .. ' binavkirî'
..'\n|-'
..'\n! class="row-flip tewandin-header3" | Rewş'
..'\n! class="tewandin-header3" | Yekjimar'
..'\n! class="tewandin-header3" | Pirjimar'
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Navkî'
..'\n|' .. declSimpleNoun["defNomSg"]
..'\n|' .. declSimpleNoun["defNomPl"]
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Îzafe'
..'\n|' .. getDeclinedForm("defConstrSg")
..'\n|' .. getDeclinedForm("defConstrPl")
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Çemandî'
..'\n|' .. getDeclinedForm("defOblSg")
..'\n|' .. getDeclinedForm("defOblPl")
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Nîşandera çem.'
..'\n|' .. getDeclinedForm("defDemonsOblSg")
..'\n|' .. getDeclinedForm("defDemonsOblPl")
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Bangkirin'
..'\n|' .. getDeclinedForm("vocSg")
..'\n|' .. getDeclinedForm("vocPl")
..'\n|-'
..'\n! colspan="3" class="outer" align="center" |' .. formatGenderHeader(gender) .. ' nebinavkirî'
..'\n|-'
..'\n! class="row-flip tewandin-header3" | Rewş'
..'\n! class="tewandin-header3" | Yekjimar'
..'\n! class="tewandin-header3" | Pirjimar'
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Navkî'
..'\n|' .. getDeclinedForm("indefNomSg")
..'\n|' .. getDeclinedForm("indefNomPl")
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Îzafe'
..'\n|' .. getDeclinedForm("indefConstrSg")
..'\n|' .. getDeclinedForm("indefConstrPl")
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Çemandî'
..'\n|' .. getDeclinedForm("indefOblSg")
..'\n|' .. getDeclinedForm("indefOblPl")
..'\n' .. tableFooter
end
end
-- ─────────────────────────────────────────────────────────────────────────────
-- Bikaranîn:
-- 1. {{#invoke:ku-tewîn-nav|tew|rewş=indefOblSg}}
-- 2. {{#invoke:ku-tewîn-nav|tew|nêr|rewş=indefConstrSg}}
-- ─────────────────────────────────────────────────────────────────────────────
function export.tew(frame)
local args = frame:getParent().args
local noun = args[1]
local gender = frame.args[1] or args[2]
local alt = args['guherto']
local case = frame.args['rewş']
if alt == 'hemû' then
local tew_hemu = export.declSimpleNoun{noun, gender, alt='1'}[case] .. '<br>' .. export.declSimpleNoun{noun, gender, alt='2'}[case]
return tew_hemu
else
return export.declSimpleNoun{noun, gender, alt=alt}[case]
end
end
-- ─────────────────────────────────────────────────────────────────────────────
-- Get comma separated forms
-- Bnr. [[MediaWiki:Gadget-QQ.js]]
-- ─────────────────────────────────────────────────────────────────────────────
function export.get_comma_separated_forms(frame)
local noun = frame.args[1]
local gender = frame.args[2]
local declResults
local declResults2
local forms = {}
if gender == "mê û nêr" then
declResults = export.declSimpleNoun{noun, 'nêr', tags='na'}
declResults2 = export.declSimpleNoun{noun, 'mê', alt="2", tags='na'}
for k, v in pairs(declResults2) do
table.insert(forms, v)
end
else
declResults = export.declSimpleNoun{noun, gender, tags='na'}
end
for k, v in pairs(declResults) do
table.insert(forms, v)
end
-- Remove duplicate elements
local newForms = {}
local checkForms = {}
for _, v in ipairs(forms) do
if not checkForms[v] then
checkForms[v] = true
table.insert(newForms, v)
end
end
return table.concat(newForms, ',')
end
return export
8enlcubourdw218b0x0o9apypt680af
Modul:ku-tewîn-nav/mê û nêr/ceribandin
828
1358208
6291988
6291944
2026-07-29T12:31:42Z
Ghybu
1393
6291988
Scribunto
text/plain
local export = {}
local decl = require('Modul:ku-tewîn-nav').declSimpleNoun
local function abbr(word, abbreviation)
return ' (<span style="cursor:help;" title="' .. word .. '"><span style="border-bottom: 1px dotted #555555; ">' .. abbreviation .. '</span></span>)'
end
function export.declMNtable(noun, alt)
local tableHeader = mw.getCurrentFrame():expandTemplate{
title = 'tewandin-ser',
args = {
title = "Tewandina ''" .. noun .. "''",
palette = 'indigo',
tall = 'yes',
}
}
local tableFooter = mw.getCurrentFrame():expandTemplate{ title = 'tewandin-bin' }
return tableHeader
..'\n! colspan="4" class="outer" align="center" | Zayendên mê û nêr ên binavkirî'
..'\n|-'
..'\n! class="row-flip tewandin-header3" | Rewş'
..'\n! class="tewandin-header3" | Mê' .. abbr('yekjimar', 'yj.')
..'\n! class="tewandin-header3" | Nêr' .. abbr('yekjimar', 'yj.')
..'\n! class="tewandin-header3" | Mê û nêr' .. abbr('pirjimar', 'pj.')
..'\n|-'
..'\n! class="row-flip tewandin-rez"" | Navkî'
..'\n|' .. decl{noun, 'mê', alt=alt}["defNomSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["defNomSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["defNomPl"]
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Îzafe'
..'\n|' .. decl{noun, 'mê', alt=alt}["defConstrSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["defConstrSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["defConstrPl"]
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Çemandî'
..'\n|' .. decl{noun, 'mê', alt=alt}["defOblSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["defOblSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["defOblPl"]
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Nîşandera çem.'
..'\n|' .. decl{noun, 'mê', alt=alt}["defDemonsOblSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["defDemonsOblSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["defDemonsOblPl"]
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Bangkirin'
..'\n|' .. decl{noun, 'mê', alt=alt}["vocSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["vocSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["vocPl"]
..'\n|-'
..'\n! colspan="4" class="outer" align="center" | Zayendên mê û nêr ên nebinavkirî'
..'\n|-'
..'\n! class="row-flip tewandin-header3" | Rewş'
..'\n! class="tewandin-header3" | Mê' .. abbr('yekjimar', 'yj.')
..'\n! class="tewandin-header3" | Nêr' .. abbr('yekjimar', 'yj.')
..'\n! class="tewandin-header3" | Mê û nêr' .. abbr('pirjimar', 'pj.')
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Navkî'
..'\n|' .. decl{noun, 'mê', alt=alt}["indefNomSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["indefNomSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["indefNomPl"]
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Îzafe'
..'\n|' .. decl{noun, 'mê', alt=alt}["indefConstrSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["indefConstrSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["indefConstrPl"]
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Çemandî'
..'\n|' .. decl{noun, 'mê', alt=alt}["indefOblSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["indefOblSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["indefOblPl"]
..'\n' .. tableFooter
end
return export
rd2bi2ply8kpuqyg9aclpfx4lznq088
6291989
6291988
2026-07-29T12:33:52Z
Ghybu
1393
6291989
Scribunto
text/plain
local export = {}
local decl = require('Modul:ku-tewîn-nav').declSimpleNoun
local function abbr(word, abbreviation)
return ' (<span style="cursor:help;" title="' .. word .. '"><span style="border-bottom: 1px dotted #555555; ">' .. abbreviation .. '</span></span>)'
end
function export.declMNtable(noun, alt)
local tableHeader = mw.getCurrentFrame():expandTemplate{
title = 'tabloya-tewandinê-ser',
args = {
title = "Tewandina ''" .. noun .. "''",
palette = 'indigo',
tall = 'yes',
}
}
local tableFooter = mw.getCurrentFrame():expandTemplate{ title = 'tewandin-bin' }
return tableHeader
..'\n! colspan="4" class="outer" align="center" | Zayendên mê û nêr ên binavkirî'
..'\n|-'
..'\n! class="row-flip tewandin-header3" | Rewş'
..'\n! class="tewandin-header3" | Mê' .. abbr('yekjimar', 'yj.')
..'\n! class="tewandin-header3" | Nêr' .. abbr('yekjimar', 'yj.')
..'\n! class="tewandin-header3" | Mê û nêr' .. abbr('pirjimar', 'pj.')
..'\n|-'
..'\n! class="row-flip tewandin-rez"" | Navkî'
..'\n|' .. decl{noun, 'mê', alt=alt}["defNomSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["defNomSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["defNomPl"]
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Îzafe'
..'\n|' .. decl{noun, 'mê', alt=alt}["defConstrSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["defConstrSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["defConstrPl"]
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Çemandî'
..'\n|' .. decl{noun, 'mê', alt=alt}["defOblSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["defOblSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["defOblPl"]
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Nîşandera çem.'
..'\n|' .. decl{noun, 'mê', alt=alt}["defDemonsOblSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["defDemonsOblSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["defDemonsOblPl"]
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Bangkirin'
..'\n|' .. decl{noun, 'mê', alt=alt}["vocSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["vocSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["vocPl"]
..'\n|-'
..'\n! colspan="4" class="outer" align="center" | Zayendên mê û nêr ên nebinavkirî'
..'\n|-'
..'\n! class="row-flip tewandin-header3" | Rewş'
..'\n! class="tewandin-header3" | Mê' .. abbr('yekjimar', 'yj.')
..'\n! class="tewandin-header3" | Nêr' .. abbr('yekjimar', 'yj.')
..'\n! class="tewandin-header3" | Mê û nêr' .. abbr('pirjimar', 'pj.')
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Navkî'
..'\n|' .. decl{noun, 'mê', alt=alt}["indefNomSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["indefNomSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["indefNomPl"]
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Îzafe'
..'\n|' .. decl{noun, 'mê', alt=alt}["indefConstrSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["indefConstrSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["indefConstrPl"]
..'\n|-'
..'\n! class="row-flip tewandin-rez" | Çemandî'
..'\n|' .. decl{noun, 'mê', alt=alt}["indefOblSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["indefOblSg"]
..'\n|' .. decl{noun, 'nêr', alt=alt}["indefOblPl"]
..'\n' .. tableFooter
end
return export
eqkohzd4vuazm9jcgrbtbc9wxo64sz8
MediaWiki:Gadget-linkify
8
1358212
6291980
2026-07-29T12:06:02Z
Wikihez
7344
Rûpel bi "Amûrên wîkîlînkkirin, rakirina wîkîlînkan û MEZIN/biçûkkirina herfan li [[Extension:WikiEditor|toolbarê]] zêde dike." hat çêkirin
6291980
wikitext
text/x-wiki
Amûrên wîkîlînkkirin, rakirina wîkîlînkan û MEZIN/biçûkkirina herfan li [[Extension:WikiEditor|toolbarê]] zêde dike.
7ilra6n3n2mkpxj8zwla32a6s7lo6bx
6291981
6291980
2026-07-29T12:06:18Z
Wikihez
7344
6291981
wikitext
text/x-wiki
Amûrên wîkîlînkkirin, rakirina wîkîlînkan û MEZIN/biçûkkirina herfan li [[:mw:Extension:WikiEditor|toolbarê]] zêde dike.
lxx34ct8ok3f1fdwafg322ennc2nzkv
6291982
6291981
2026-07-29T12:07:27Z
Wikihez
7344
6291982
wikitext
text/x-wiki
[[MediaWiki:Gadget-linkify.js|Amûrên]] wîkîlînkkirin, rakirina wîkîlînkan û MEZIN/biçûkkirina herfan li [[:mw:Extension:WikiEditor|toolbarê]] zêde dike.
isrx8xo31c2lor07egwflitji4dk0n5
Şablon:tewandin-ser
10
1358213
6291984
2026-07-29T12:24:39Z
Ghybu
1393
Ghybuî/ê navê [[Şablon:tewandin-ser]] weke [[Şablon:tabloya-tewandinê-ser]] guhart
6291984
wikitext
text/x-wiki
#BERALÎKIRIN [[Şablon:tabloya-tewandinê-ser]]
5yymzvj4ybbw4zvuotg3gk7fkvk694e
Şablon:tewandin-bin
10
1358214
6291986
2026-07-29T12:25:22Z
Ghybu
1393
Ghybuî/ê navê [[Şablon:tewandin-bin]] weke [[Şablon:tabloya-tewandinê-bin]] guhart
6291986
wikitext
text/x-wiki
#BERALÎKIRIN [[Şablon:tabloya-tewandinê-bin]]
5eeayhhvopn959tvn67prmqzr9zv0py
Şablon:tabloya-tewandinê-bin/belge
10
1358215
6291990
2026-07-29T12:38:48Z
Ghybu
1393
belge
6291990
wikitext
text/x-wiki
{{belgekirin/binrûpel}}
== Bikaranîn ==
''Binêre'' {{ş|tabloya-tewandinê-ser}}
<includeonly>
[[Kategorî:Şablon]]
</includeonly>
owg2360uz0e3ndncjd7yfm3xbpxrcdj
Gotûbêja bikarhêner:Nenas nepênî
3
1358216
6292007
2026-07-29T13:47:44Z
Wikihez
7344
xêrhatin lê zêde kir
6292007
wikitext
text/x-wiki
{{bixêrhatin}}
== Xêrhatin ==
Merheba bikarhênera/ê me ya/ê hêja: ''Nenas nepênî'',
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, dikarî li ser [[WF:Dîwan]]ê bipirsî.
Xebatxweş.
:—[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 13:47, 29 tîrmeh 2026 (UTC)
70rxw4hx4ljcj229iqck7zt2fx74df4
Şablon:kiu-tewîn-lk
10
1358217
6292013
2026-07-29T14:21:00Z
Kurdanparez
14556
Şablon
6292013
wikitext
text/x-wiki
<templatestyles src="ku-tewîn/style.css"/>
<includeonly><div class="NavFrame" style="font-size:100%; background-color: #f8f9fa; width: fit-content; margin: 0.5em 0;">
<div class="NavHead" style="background-color: #f8f9fa;">Tewandina ''{{{1|{{SUBPAGENAME}}}}}''</div>
<div class="NavContent ckb-tewin-nav" style="display: none; border-top-color: transparent; padding: 3px";>
{| class="wikitable tab1" style="width: 100%; margin: 0; background-color: #ffffff;"
|-
! colspan="6" class="tewandin-header3" align="center" style="font-size:85%;" | {{nobold|Rehê dema niha:}} '''{{{reh|}}}-''' </br> {{nobold|Navbenda dema niha:}} '''-{{{infix|n}}}-'''
|-
! style="font-size:85%;" | Dem
! colspan="2" style="font-size:85%;" | Kes
! style="font-size:85%;" | {{w|Kirmanckî}} (''Dêrsim'')
|-
! rowspan="10" | Niha
|-
! rowspan="2" style="background-color:#f2f2f2" | ez
! style="background-color:#f2f2f2"| {{nobold|''nêr''}}
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_1s|a}}}(ne)/<br/>{{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_1s|u}}}(ne)
|-
! style="background-color:#f2f2f2"| {{nobold|''mê''}}
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_1s|a}}}(ne)/<br/>{{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_1s|u}}}(ne)
|-
! rowspan="2" style="background-color:#f2f2f2"| ti
! style="background-color:#f2f2f2"| {{nobold|''nêr''}}
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_2s|a}}}
|-
! style="background-color:#f2f2f2"| {{nobold|''mê''}}
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_2s|a}}}
|-
! rowspan="2" style="background-color:#f2f2f2"| <span style="cursor:help; border-bottom: 1px dotted #555555;" title="Kesê 3em yekjimar">3y</span>
! style="background-color:#f2f2f2" | o {{nobold|''(nêr)''}}
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_3sm|o}}}
|-
! style="background-color:#f2f2f2" | a {{nobold|''(mê)''}}
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_3sf|a}}}
|-
!colspan="2" style="background-color:#f2f2f2" | ma
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_1p|îme}}}
|-
! colspan="2" style="background-color:#f2f2f2" | şima
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_2p|ê}}}
|-
! colspan="2" style="background-color:#f2f2f2" | ê
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_3p|ê}}}
|-
! rowspan="3" | Fermanî
|-
! colspan="2" style="background-color:#f2f2f2" | <small>{{nobold|Yekjimar}}</small>
| {{#if:{{{kiu.imp.y|}}} | {{{kiu.imp.y}}} | {{{aux|}}} {{#if: {{{aux|}}} {{{prefix|}}} | {{{prefix|}}} | bi}}{{{reh|}}}{{#ifeq: {{#invoke:String|len|s={{{reh|}}} }} | 1
| e
| {{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û =
| #default =
}}}} }}
|-
! colspan="2" style="background-color:#f2f2f2" | <small>{{nobold|Pirjimar}}</small>
| {{#if:{{{kiu.imp.p|}}} | {{{kiu.imp.p}}} | {{{aux|}}} {{#if: {{{aux|}}} {{{prefix|}}} | {{{prefix|}}} | bi}}{{{reh|}}}{{#ifeq: {{#invoke:String|len|s={{{reh|}}} }} | 1
| erê
| {{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = rê
| #default = ê
}} }} }}
|}</div></div></div></includeonly><noinclude>{{kiu-tewîn-lk}}</noinclude>
850cpo9bufndodzs8vi29f2jzelgsve
6292015
6292013
2026-07-29T15:02:31Z
Ghybu
1393
{{tabloya-tewandinê-ser}}
6292015
wikitext
text/x-wiki
<includeonly>{{tabloya-tewandinê-ser|title=Tewandina ''{{{1|{{SUBPAGENAME}}}}}''|palette=purple|tall=yes}}
! colspan="6" class="outer" style="font-size:95%;" | {{nobold|Rehê dema niha:}} '''{{{reh|}}}-''' </br> {{nobold|Navbenda dema niha:}} '''-{{{infix|n}}}-'''
|-
! style="font-size:85%;" | Dem
! colspan="2" style="font-size:85%;" | Kes
! style="font-size:85%;" | {{w|Kirmanckî}} (''Dêrsim'')
|-
! rowspan="10" | Niha
|-
! rowspan="2" style="background-color:#f2f2f2" | ez
! style="background-color:#f2f2f2"| {{nobold|''nêr''}}
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_1s|a}}}(ne)/<br/>{{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_1s|u}}}(ne)
|-
! style="background-color:#f2f2f2"| {{nobold|''mê''}}
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_1s|a}}}(ne)/<br/>{{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_1s|u}}}(ne)
|-
! rowspan="2" style="background-color:#f2f2f2"| ti
! style="background-color:#f2f2f2"| {{nobold|''nêr''}}
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_2s|a}}}
|-
! style="background-color:#f2f2f2"| {{nobold|''mê''}}
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_2s|a}}}
|-
! rowspan="2" style="background-color:#f2f2f2"| <span style="cursor:help; border-bottom: 1px dotted #555555;" title="Kesê 3em yekjimar">3y</span>
! style="background-color:#f2f2f2" | o {{nobold|''(nêr)''}}
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_3sm|o}}}
|-
! style="background-color:#f2f2f2" | a {{nobold|''(mê)''}}
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_3sf|a}}}
|-
!colspan="2" style="background-color:#f2f2f2" | ma
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_1p|îme}}}
|-
! colspan="2" style="background-color:#f2f2f2" | şima
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_2p|ê}}}
|-
! colspan="2" style="background-color:#f2f2f2" | ê
| {{{aux|}}} {{{prefix|}}}{{{reh|}}}{{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = n
| #default = en
}}{{{kmj_3p|ê}}}
|-
! rowspan="3" | Fermanî
|-
! colspan="2" style="background-color:#f2f2f2" | <small>{{nobold|Yekjimar}}</small>
| {{#if:{{{kiu.imp.y|}}} | {{{kiu.imp.y}}} | {{{aux|}}} {{#if: {{{aux|}}} {{{prefix|}}} | {{{prefix|}}} | bi}}{{{reh|}}}{{#ifeq: {{#invoke:String|len|s={{{reh|}}} }} | 1
| e
| {{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û =
| #default =
}}}} }}
|-
! colspan="2" style="background-color:#f2f2f2" | <small>{{nobold|Pirjimar}}</small>
| {{#if:{{{kiu.imp.p|}}} | {{{kiu.imp.p}}} | {{{aux|}}} {{#if: {{{aux|}}} {{{prefix|}}} | {{{prefix|}}} | bi}}{{{reh|}}}{{#ifeq: {{#invoke:String|len|s={{{reh|}}} }} | 1
| erê
| {{#switch: {{#invoke:String|match|s={{{reh|}}}|pattern=(.)$|plain=false}}
| a | e | i | o | u | ê | î | û = rê
| #default = ê
}} }} }}
{{tabloya-tewandinê-bin}}</includeonly><noinclude>{{kiu-tewîn-lk}}</noinclude>
75zgij1j0a2yomxeepbvcbf8480jrvl
ئاشاو
0
1358218
6292057
2026-07-29T19:38:03Z
حوسێن
9221
Rûpel bi "== {{ziman|ckb}} == === Bilêvkirin === * {{ckb-IPA}} === Navdêr === {{navdêr|ckb}} # [[aşav]] #* {{bêmînak|ckb}} ==== Etîmolojî ==== Ji {{heve|ckb|ئاش|ئاو}}." hat çêkirin
6292057
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
* {{ckb-IPA}}
=== Navdêr ===
{{navdêr|ckb}}
# [[aşav]]
#* {{bêmînak|ckb}}
==== Etîmolojî ====
Ji {{heve|ckb|ئاش|ئاو}}.
p0v1e5qmcnavafq8fre51xsgfzxngt2
6292068
6292057
2026-07-29T20:00:26Z
حوسێن
9221
6292068
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
{{ckb-IPA}}
=== Navdêr ===
{{navdêr|ckb}}
# [[aşav]]
#* {{bêmînak|ckb}}
==== Etîmolojî ====
Ji {{heve|ckb|ئاش|ئاو}}.
2jatc4tnuouu6kztwacy86yc84tdee5
بەرداش
0
1358219
6292065
2026-07-29T19:48:09Z
حوسێن
9221
Rûpel bi "== {{ziman|ckb}} == === Bilêvkirin === * {{ckb-IPA}} === Navdêr === {{navdêr|ckb}} # [[beraş]] #* {{bêmînak|ckb}} ==== Etîmolojî ==== Ji {{heve|ckb|بەرد|ئاش}}." hat çêkirin
6292065
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
* {{ckb-IPA}}
=== Navdêr ===
{{navdêr|ckb}}
# [[beraş]]
#* {{bêmînak|ckb}}
==== Etîmolojî ====
Ji {{heve|ckb|بەرد|ئاش}}.
1jrohb5pqp01bjgs48b5rqmtqa0p7dt
6292067
6292065
2026-07-29T20:00:12Z
حوسێن
9221
6292067
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
{{ckb-IPA}}
=== Navdêr ===
{{navdêr|ckb}}
# [[beraş]]
#* {{bêmînak|ckb}}
==== Etîmolojî ====
Ji {{heve|ckb|بەرد|ئاش}}.
du269s4nb7s0s1qw6dss96tw7y8v18w
6292070
6292067
2026-07-29T20:01:06Z
Ghybu
1393
/* Bilêvkirin */
6292070
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
* {{ckb-IPA}}
=== Navdêr ===
{{navdêr|ckb}}
# [[beraş]]
#* {{bêmînak|ckb}}
==== Etîmolojî ====
Ji {{heve|ckb|بەرد|ئاش}}.
1jrohb5pqp01bjgs48b5rqmtqa0p7dt
ئاشەوان
0
1358220
6292066
2026-07-29T19:59:51Z
حوسێن
9221
Rûpel bi "== {{ziman|ckb}} == === Bilêvkirin === {{ckb-IPA}} === Navdêr === {{navdêr|ckb}} # [[aşvan]] #* {{bêmînak|ckb}} ==== Etîmolojî ==== Ji {{qertaf|ckb|ئاش|ـەوان|tr2=-ewan}}." hat çêkirin
6292066
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
{{ckb-IPA}}
=== Navdêr ===
{{navdêr|ckb}}
# [[aşvan]]
#* {{bêmînak|ckb}}
==== Etîmolojî ====
Ji {{qertaf|ckb|ئاش|ـەوان|tr2=-ewan}}.
9saf7zdye7sgu0qtwl4ib5ds0gnxokg
6292069
6292066
2026-07-29T20:00:45Z
Ghybu
1393
/* Bilêvkirin */
6292069
wikitext
text/x-wiki
== {{ziman|ckb}} ==
=== Bilêvkirin ===
* {{ckb-IPA}}
=== Navdêr ===
{{navdêr|ckb}}
# [[aşvan]]
#* {{bêmînak|ckb}}
==== Etîmolojî ====
Ji {{qertaf|ckb|ئاش|ـەوان|tr2=-ewan}}.
sogbxababwv1ki8z9t68viebn0f26sl
Kategorî:Peyvên soranî bi paşgira ـەوان
14
1358221
6292071
2026-07-29T20:02:31Z
Wikihez
7344
Bi riya [[Bikarhêner:Wikihez/skrîpt/js/addAutoCat.js/belge|JS]]: {{katbike}} û înterwîkî
6292071
wikitext
text/x-wiki
{{katbike}}
1dpx16ue3vl1l6c1hkqu0q6ftpl2ezh
Kategorî:Formên serenavan bi almanî
14
1358222
6292108
2026-07-29T22:10:26Z
Wikihez
7344
Bi riya [[Bikarhêner:Wikihez/skrîpt/js/addAutoCat.js/belge|JS]]: {{katbike}} û înterwîkî
6292108
wikitext
text/x-wiki
{{katbike}}
1dpx16ue3vl1l6c1hkqu0q6ftpl2ezh
Kategorî:Madeyên zimanekî xelet bi kar tînin bi îngilîzî
14
1358223
6292119
2026-07-29T22:19:09Z
Wikihez
7344
Bi riya [[Bikarhêner:Wikihez/skrîpt/js/addAutoCat.js/belge|JS]]: {{katbike}} (bêyî înterwîkî)
6292119
wikitext
text/x-wiki
{{katbike}}
1dpx16ue3vl1l6c1hkqu0q6ftpl2ezh
Kategorî:Madeyên zimanekî xelet bi kar tînin
14
1358224
6292120
2026-07-29T22:21:16Z
Wikihez
7344
Bi riya [[Bikarhêner:Wikihez/skrîpt/js/addAutoCat.js/belge|JS]]: {{katbike}} û înterwîkî
6292120
wikitext
text/x-wiki
{{katbike}}
1dpx16ue3vl1l6c1hkqu0q6ftpl2ezh
Kategorî:Madeyên zimanekî xelet bi kar tînin bi almanî
14
1358225
6292141
2026-07-30T07:55:08Z
Wikihez
7344
Bi riya [[Bikarhêner:Wikihez/skrîpt/js/addAutoCat.js/belge|JS]]: {{katbike}} (bêyî înterwîkî)
6292141
wikitext
text/x-wiki
{{katbike}}
1dpx16ue3vl1l6c1hkqu0q6ftpl2ezh
thinner
0
1358226
6292145
2026-07-30T08:18:01Z
Wikihez
7344
Çêkirina formên [[thin]] ([[WF:BILEZ|Bi lez]])
6292145
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Formeke rengdêrê ===
{{rengdêr|en|form=erê}}
# {{komparatîv|en|thin}}
atw7at99oz6uzk7w5ni9xjuj8bop2gb
thinnest
0
1358227
6292146
2026-07-30T08:18:04Z
Wikihez
7344
Çêkirina formên [[thin]] ([[WF:BILEZ|Bi lez]])
6292146
wikitext
text/x-wiki
== {{ziman|en}} ==
=== Formeke rengdêrê ===
{{rengdêr|en|form=erê}}
# {{sûperlatîv|en|thin}}
t7ksfwtn4g4l8cccafzm36a0kyszgr2